Почему при программном заполнении номенклатуры визуально не появляется единица измерения на форме в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет
← На главную

Разберем распространенную проблему, с которой сталкиваются разработчики при программном формировании номенклатуры в конфигурации «1С:Управление автотранспортом» (УАТ) и других отраслевых решениях. Вы создаете новый элемент справочника Номенклатура, программно формируете подчиненный элемент справочника ЕдиницыИзмерения, прописываете его в реквизит ЕдиницаХраненияОстатков и записываете объект. При проверке в отладчике все реквизиты объекта заполнены, однако при открытии формы элемента реквизит визуально остается пустым.

Выясняем причину проблемы

Проанализируем, почему возникает такое поведение платформы. Во многих отраслевых конфигурациях на базе платформы «1С:Предприятие 8.3» отображение данных на форме элемента номенклатуры связано не только с реквизитами самого справочника, но и с дополнительными регистрами сведений.

В частности, в конфигурации «Управление автотранспортом Проф» визуальные данные о характеристиках груза и единицах измерения вызовом динамических связей считываются из регистра сведений РегистрыСведений.уатНоменклатураГрузов. Если при программной загрузке создать только номенклатуру и единицу измерения, но не добавить запись в этот регистр, визуальное представление на форме не сформируется.

Алгоритм программного создания номенклатуры и подчиненных объектов

Рассмотрим по шагам правильную последовательность действий при программном создании связанных объектов:

  1. Открываем транзакцию через НачатьТранзакцию() для обеспечения целостности данных.
  2. Генерируем ссылку для еще не записанного элемента номенклатуры с помощью метода ПолучитьСсылку() и устанавливаем ее вызовом УстановитьСсылкуНового().
  3. Создаем объект единицы измерения и связываем его с владельцем через ссылку ПолучитьСсылкуНового().
  4. Записываем объект единицы измерения.
  5. Присваиваем созданную единицу измерения реквизиту ЕдиницаХраненияОстатков номенклатуры и записываем элемент номенклатуры.
  6. Создаем и записываем запись в регистре сведений уатНоменклатураГрузов с обязательной активностью записи.
  7. Зафиксируем транзакцию через ЗафиксироватьТранзакцию().

Пример программного кода

Посмотрим на практический пример кода, который решает задачу полного программного создания номенклатуры с регистрацией записи в регистре сведений:


НачатьТранзакцию();

НовыйЭлемент = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор);
НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НоменклатураОбъект.УстановитьСсылкуНового(НовыйЭлемент);
НоменклатураОбъект.Наименование = "Груз СТ-111";

ЕдИзм = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
ЕдИзм.Владелец = НоменклатураОбъект.ПолучитьСсылкуНового();
ЕдИзм.ЕдиницаПоКлассификатору = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796");
ЕдИзм.Коэффициент = 1;
ЕдИзм.Наименование = "шт";
ЕдИзм.УстановитьНовыйКод();
ЕдИзм.Записать();

НоменклатураОбъект.ЕдиницаХраненияОстатков = ЕдИзм.Ссылка;
НоменклатураОбъект.ЕдиницаИзмерения = ЕдИзм.ЕдиницаПоКлассификатору;
НоменклатураОбъект.УстановитьНовыйКод();
НоменклатураОбъект.Записать();

НовРег = РегистрыСведений.уатНоменклатураГрузов.СоздатьМенеджерЗаписи();
НовРег.Номенклатура = НоменклатураОбъект.Ссылка;
НовРег.ЕдиницаИзмерения = ЕдИзм.Ссылка;
НовРег.Активность = Истина;
НовРег.Вес = 0;
НовРег.ВысотаГруза = 0;
НовРег.ДлинаГруза = 0;
НовРег.Класс = 0;
НовРег.КоличествоМест = 0;
НовРег.Объем = 0;
НовРег.ОпасныйГруз = 0;
НовРег.Записать();

ЗафиксироватьТранзакцию();

Важные детали при работе с регистрами сведений

Обратим внимание на реквизит Активность при формировании записи регистра. Обязательно передаем значению реквизита Истина. Если установить флаг активности в Ложь (или 0), запись сохранится в базе данных, однако платформа проигнорирует ее при выборе среза последних, и поле формы останется незаполненным.

Кроме того, если при программной загрузке используется режим ОбменДанными.Загрузка = Истина, встроенные обработчики событий ПриЗаписи справочника отключаются. В таком случае явное создание менеджера записи регистра СоздатьМенеджерЗаписи() становится единственным способом корректно зарегистрировать характеристики номенклатуры.

← На главную