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