Как заполнить значение дополнительного реквизита по умолчанию при создании документа в 1С 8.3?

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

При разработке и доработке конфигураций 1С часто возникает задача предзаполнения реквизитов документа предопределенными или стандартными значениями. Когда речь идет о стандартных реквизитах, достаточно прописать присвоение значений в обработчике ОбработкаЗаполнения или ПриСозданииНаСервере. Однако при работе с дополнительными реквизитами и сведениями (подсистема БСП или отраслевые решения) разработчики нередко сталкиваются с ситуацией, когда значение в коде присваивается, но на форме документа остается пустым.

Разберем подробно причины такого поведения и рассмотрим проверенные способы правильного заполнения дополнительных реквизитов при создании нового документа.

Почему значение не отображается на форме: анализ проблемы

Выясним причину, по которой прямое присвоение вида Объект.ИмяРеквизита = НужноеЗначение может не сработать на форме:

  1. Использование промежуточных таблиц и элементов формы. Во многих конфигурациях (включая отраслевые решения на базе 1С:Розницы) дополнительные реквизиты не привязаны напрямую к полям формы объекта. Форма генерирует временную таблицу значений или набор динамических реквизитов при инициализации. Если мы присвоим значение только объекту, элементы формы не обновятся, так как они считывают данные по собственному алгоритму.
  2. Порядок выполнения процедур. Если заполнение выполняется в обработчике формы ПриСозданииНаСервере до того, как отработал алгоритм построения дополнительных реквизитов, типовой механизм просто перезатрет установленные данные пустыми значениями.
  3. Специфика справочника «Значения свойств объектов». Этот справочник подчинен плану видов характеристик ДополнительныеРеквизитыИСведения. При программном поиске значения без указания владельца метод может вернуть пустое значение или ссылку из другого свойства.

Способ 1. Заполнение через форму документа с поиском значения свойства

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

Посмотрим на пример правильного получения ссылки на значение дополнительного реквизита. Для поиска нужного значения по наименованию обязательно передаем четвертым параметром владельца свойства — соответствующий элемент плана видов характеристик:


ПВХ_Орбита = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.Орбита;
НужноеЗначение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Норма", Истина, , ПВХ_Орбита);

Разберем по шагам, как встроить заполнение по умолчанию в процедуру формирования строк таблицы формы:

  1. Проверяем, что документ является новым, используя условие Объект.Ссылка.Пустая(). Для уже записанных документов автозаполнение выполнять нельзя, чтобы не затереть ранее введенные пользователем данные.
  2. Находим нужное значение в подчиненном справочнике ЗначенияСвойствОбъектов.
  3. Заполняем колонки сформированной строки таблицы формы.

Посмотрим, как выглядит итоговый фрагмент кода при создании строки таблицы формы:


Если Объект.Ссылка.Пустая() Тогда
    Если НоваяСтрока.ИмяРеквизита = "Орбита" Тогда
        ЗначениеПоУмолчанию = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Норма", Истина, , ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.Орбита);
        
        НоваяСтрока.ЗначениеПравыйГлаз = ЗначениеПоУмолчанию;
        НоваяСтрока.ЗначениеЛевыйГлаз  = ЗначениеПоУмолчанию;
    КонецЕсли;
КонецЕсли;

Способ 2. Заполнение в модуле объекта через «ОбработкаЗаполнения» (типовой механизм БСП)

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

Кроме того, данный способ гарантирует, что реквизит будет заполнен даже при программном создании документов без открытия формы.

Разберем реализацию в модуле объекта документа:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    // Вызываем базовую логику заполнения
    // ...
    
    // Заполняем дополнительный реквизит по умолчанию
    СвойствоОрбита = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.Орбита;
    ЗначениеПоУмолчанию = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Норма", Истина, , СвойствоОрбита);
    
    Если ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
        СтрокаДопРеквизита = ДополнительныеРеквизиты.Добавить();
        СтрокаДопРеквизита.Свойство = СвойствоОрбита;
        СтрокаДопРеквизита.Значение = ЗначениеПоУмолчанию;
    КонецЕсли;

КонецПроцедуры

Важные рекомендации при работе с дополнительными реквизитами

  1. Отказ от поиска по наименованию в пользу предопределенных данных или настроек. Метод НайтиПоНаименованию чувствителен к действиям пользователей в режиме предприятия: если наименование элемента изменят, код перестанет находить значение. Для критически важной логики безопаснее использовать предопределенные элементы, константы или регистры сведений с настройками по умолчанию.
  2. Использование расширений конфигурации. Чтобы не снимать конфигурацию с поддержки, переопределение логики заполнения рекомендуется реализовывать в расширении с помощью аннотации &После("ОбработкаЗаполнения") в модуле объекта или &После("ПриСозданииНаСервере") в модуле формы.
  3. Синхронизация данных при записи. Если данные заполняются во временные элементы формы, обязательно проверяем, что в событии ПередЗаписьюНаСервере предусмотрен перенос этих значений обратно в реквизиты или табличные части объекта для сохранения в базе данных.
← На главную