Как отобразить и заполнить дополнительные реквизиты незаписанного элемента справочника в 1С

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

При разработке функционала в типовых конфигурациях (например, 1С:Управление торговлей 11) часто возникает задача заполнить дополнительные реквизиты объекта еще до его записи в базу данных. Попытки просто изменить табличную часть ДополнительныеРеквизиты объекта на сервере и вызвать метод ЭтаФорма.ОбновитьОтображениеДанных() не дают результата — значения на форме не отображаются.

Проанализируем причину такого поведения подсистемы и разберем практические способы решения этой проблемы.

Почему не обновляются дополнительные реквизиты

Выясним причину, почему стандартное обновление данных формы не работает для дополнительных реквизитов:

  1. Особенность подсистемы «Свойства» (БСП): Элементы формы для дополнительных реквизитов не привязаны напрямую к табличной части Объект.ДополнительныеРеквизиты. При открытии формы подсистема динамически генерирует реквизиты формы и создает соответствующие элементы интерфейса.
  2. Ограничения метода обновления: Метод ОбновитьОтображениеДанных() перечитывает только те данные, которые жестко связанны с элементами формы. Динамические реквизиты формы, созданные БСП, он не затрагивает.

Способ 1. Обновление элементов через модуль «УправлениеСвойствами» (БСП)

Рассмотрим штатное решение с использованием подсистемы БСП. Если табличная часть ДополнительныеРеквизиты уже заполнена на сервере, необходимо принудительно обновить динамические элементы формы.

Для обновления значений на форме при сохранении текущего состава реквизитов выполним следующий код:


&НаСервере
Процедура ЗаполнитьИОбновитьДопРеквизитыНаСервере()
    // Заполняем табличную часть объекта нужными значениями
    // ...
    
    // Обновляем динамические элементы формы БСП
    УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьДопРеквизиты(Команда)
    ЗаполнитьИОбновитьДопРеквизитыНаСервере();
    УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтаФорма);
КонецПроцедуры

Если при изменении данных (например, при выборе вида номенклатуры или родителя) меняется сам набор свойств, необходимо полностью пересоздать элементы формы на сервере с помощью процедуры:

УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтаФорма);

Способ 2. Заполнение в событии ОбработкаЗаполнения

Посмотрим на вариант, когда данные для заполнения известны в момент создания объекта. В этом случае логику заполнения табличной части ДополнительныеРеквизиты рекомендуется переносить в модуль объекта в процедуру ОбработкаЗаполнения.

Если объект создается с уже заполненной табличной частью до момента открытия формы, подсистема БСП при инициализации формы автоматически построит динамические элементы и отобразит нужные значения пользователю.

Способ 3. Использование промежуточных реквизитов формы

Разберем еще один подход, когда данные до момента записи хранятся в обычных реквизитах формы.

  1. Создаем на управляемой форме пользовательские реквизиты для отображения необходимых данных.
  2. Пользователь заполняет или выбирает значения в этих реквизитах на форме.
  3. В обработчике события ПередЗаписьюНаСервере или ПриЗаписи переносим значения из реквизитов формы в табличную часть Объект.ДополнительныеРеквизиты перед непосредственным сохранением объекта в базу данных.
← На главную