Разберем распространенную проблему, с которой сталкиваются разработчики при программном формировании номенклатуры в конфигурации «1С:Управление автотранспортом» (УАТ) и других отраслевых решениях. Вы создаете новый элемент справочника Номенклатура, программно формируете подчиненный элемент справочника ЕдиницыИзмерения, прописываете его в реквизит ЕдиницаХраненияОстатков и записываете объект. При проверке в отладчике все реквизиты объекта заполнены, однако при открытии формы элемента реквизит визуально остается пустым.
Проанализируем, почему возникает такое поведение платформы. Во многих отраслевых конфигурациях на базе платформы «1С:Предприятие 8.3» отображение данных на форме элемента номенклатуры связано не только с реквизитами самого справочника, но и с дополнительными регистрами сведений.
В частности, в конфигурации «Управление автотранспортом Проф» визуальные данные о характеристиках груза и единицах измерения вызовом динамических связей считываются из регистра сведений РегистрыСведений.уатНоменклатураГрузов. Если при программной загрузке создать только номенклатуру и единицу измерения, но не добавить запись в этот регистр, визуальное представление на форме не сформируется.
Рассмотрим по шагам правильную последовательность действий при программном создании связанных объектов:
НачатьТранзакцию() для обеспечения целостности данных.ПолучитьСсылку() и устанавливаем ее вызовом УстановитьСсылкуНового().ПолучитьСсылкуНового().ЕдиницаХраненияОстатков номенклатуры и записываем элемент номенклатуры.уатНоменклатураГрузов с обязательной активностью записи.ЗафиксироватьТранзакцию().Посмотрим на практический пример кода, который решает задачу полного программного создания номенклатуры с регистрацией записи в регистре сведений:
НачатьТранзакцию();
НовыйЭлемент = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор);
НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НоменклатураОбъект.УстановитьСсылкуНового(НовыйЭлемент);
НоменклатураОбъект.Наименование = "Груз СТ-111";
ЕдИзм = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
ЕдИзм.Владелец = НоменклатураОбъект.ПолучитьСсылкуНового();
ЕдИзм.ЕдиницаПоКлассификатору = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796");
ЕдИзм.Коэффициент = 1;
ЕдИзм.Наименование = "шт";
ЕдИзм.УстановитьНовыйКод();
ЕдИзм.Записать();
НоменклатураОбъект.ЕдиницаХраненияОстатков = ЕдИзм.Ссылка;
НоменклатураОбъект.ЕдиницаИзмерения = ЕдИзм.ЕдиницаПоКлассификатору;
НоменклатураОбъект.УстановитьНовыйКод();
НоменклатураОбъект.Записать();
НовРег = РегистрыСведений.уатНоменклатураГрузов.СоздатьМенеджерЗаписи();
НовРег.Номенклатура = НоменклатураОбъект.Ссылка;
НовРег.ЕдиницаИзмерения = ЕдИзм.Ссылка;
НовРег.Активность = Истина;
НовРег.Вес = 0;
НовРег.ВысотаГруза = 0;
НовРег.ДлинаГруза = 0;
НовРег.Класс = 0;
НовРег.КоличествоМест = 0;
НовРег.Объем = 0;
НовРег.ОпасныйГруз = 0;
НовРег.Записать();
ЗафиксироватьТранзакцию();
Обратим внимание на реквизит Активность при формировании записи регистра. Обязательно передаем значению реквизита Истина. Если установить флаг активности в Ложь (или 0), запись сохранится в базе данных, однако платформа проигнорирует ее при выборе среза последних, и поле формы останется незаполненным.
Кроме того, если при программной загрузке используется режим ОбменДанными.Загрузка = Истина, встроенные обработчики событий ПриЗаписи справочника отключаются. В таком случае явное создание менеджера записи регистра СоздатьМенеджерЗаписи() становится единственным способом корректно зарегистрировать характеристики номенклатуры.