Механизм дополнительных реквизитов и сведений Библиотеки стандартных подсистем (БСП) позволяет расширять состав данных объектов без изменения структуры метаданных в конфигураторе. Однако при работе с управляемыми формами разработчики нередко сталкиваются с ситуацией: дополнительный реквизит выводится на форму, пользователь заполняет его значение, но после нажатия кнопки записи и повторного открытия элемента поле снова оказывается пустым. Разберем подробнее, почему возникает такое поведение платформы и как правильно работать с дополнительными реквизитами как интерактивно, так и программно.
Проанализируем механику работы дополнительных реквизитов в управляемом приложении. Элементы для ввода значений дополнительных реквизитов создаются на форме динамически в момент ее открытия, а сами значения временно помещаются в реквизиты формы. Чтобы введенные пользователем данные перенеслись обратно в табличную часть ДополнительныеРеквизиты объекта перед его непосредственной записью в базу данных, должен отработать специальный обработчик подсистемы БСП.
Если в типовой или доработанной конфигурации этот вызов отсутствует, данные формы просто не переносятся в объект при сохранении. Выясним, как восстановить корректную работу формы.
Разберем по шагам порядок исправления модуля формы элемента справочника:
Номенклатура).ПередЗаписьюНаСервере.
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Перенос значений дополнительных реквизитов из элементов формы в табличную часть объекта
УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект);
КонецПроцедуры
Важно: Для полноценной интеграции механизма свойств в произвольную форму объекта необходимо также проверить наличие вызовов подсистемы в других ключевых событиях формы:
ПриСозданииНаСервере должен вызываться метод инициализации и динамического создания элементов формы: УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма, ГруппаДляРеквизитов);ПриЧтенииСозданииНаСервере или ПослеЗаписиНаСервере — методы заполнения и обновления значений;ОбработкаОповещения — обновление состава отображаемых свойств при их изменении в общих настройках программы.Если код формы содержит все необходимые вызовы, но реквизит по-прежнему сбрасывается или скрывается, рассмотрим системные настройки наборов свойств:
1С:Управление торговлей, 1С:ERP и 1С:Комплексная автоматизация состав дополнительных реквизитов определяется реквизитом ВидНоменклатуры. Если реквизит добавлен в общий набор или в другой вид, при открытии номенклатуры с иным видом реквизит отображаться не будет.ДополнительныеРеквизитыИСведения и справочника ЗначенияСвойствОбъектов.Рассмотрим частую прикладную задачу: как программно создать или обновить значение дополнительного реквизита у элемента справочника без использования экранных форм.
В объектах конфигурации значения дополнительных реквизитов хранятся в табличной части ДополнительныеРеквизиты. Для установки значения необходимо найти строку с нужным свойством (или добавить новую) и присвоить значение соответствующего типа.
Посмотрим на пример программной установки дополнительного реквизита:
// Получаем объект номенклатуры для редактирования
ОбъектНоменклатура = СсылкаНаНоменклатуру.ПолучитьОбъект();
// СсылкаНаСвойство — это ссылка на элемент ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения
// 1. Ищем существующую строку со свойством в табличной части
СтрокаТЧ = ОбъектНоменклатура.ДополнительныеРеквизиты.Найти(СсылкаНаСвойство, "Свойство");
Если СтрокаТЧ = Неопределено Тогда
// Если свойства еще нет у объекта, добавляем новую строку
СтрокаТЧ = ОбъектНоменклатура.ДополнительныеРеквизиты.Добавить();
СтрокаТЧ.Свойство = СсылкаНаСвойство;
КонецЕсли;
// 2. Устанавливаем значение
// Если реквизит имеет тип "Значения свойств объектов", значение должно быть ссылкой на этот справочник
// Если реквизит числовой, строковый или булево — передается соответствующее примитивное значение
СтрокаТЧ.Значение = ЗначениеРеквизита;
// 3. Записываем объект
ОбъектНоменклатура.Записать();
Обратите внимание: если дополнительный реквизит имеет ссылочный тип (например, подчиненный справочнику свойств ЗначенияСвойствОбъектов), передача простого текста вместо ссылки приведет к ошибке типа или очистке значения при валидации. Значение свойства должно быть предварительно найдено или создано в справочнике ЗначенияСвойствОбъектов с указанием владельца — соответствующего элемента плана видов характеристик.