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