1С:Предприятие 8
Система программ

Где описать собственный алгоритм заполнения реквизитов нового документа?

25.06.2012

Частая задача - сделать так, чтобы форма нового объекта открывалась не "пустая", а уже заполненная некоторыми начальными данными.

Для самых простых случаев можно использовать свойство ЗначениеЗаполнения, которое есть у реквизитов объектов конфигурации (см. Как сделать, чтобы при создании новой накладной автоматически подставлялся главный склад?).

В более сложных случаях можно использовать данные заполнения (см. Как сделать, чтобы при вводе новой накладной в нее сразу же подставлялись те значения склада и поставщика, по которым отобран список накладных?).

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

Это событие можно обработать в модуле объекта в процедуре со стандартным именем ОбработкаЗаполнения.

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

Например:

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

Параметр СтандартнаяОбработка позволяет управлять дальнейшим развитием событий. Если ему присвоить значение Ложь, то никаких других действий по заполнению реквизитов формы платформа предпринимать не будет, а сразу создаст форму и вызовет ее серверное событие ПриСозданииНаСервере.

Если же не менять стандартное значение этого параметра, то после выхода из этого обработчика платформа попытается самостоятельно заполнить реквизиты объекта, подлежащие заполнению. Незаполненными она будет считать те реквизиты, которые имеют стандартное значение своего типа. Например, для типа Число это значение 0, для типа Строка - "", а для типа ссылки - пустая ссылка.

Для простоты предположим, что у объекта всего один реквизит, подлежащий заполнению. Тогда платформа будет действовать по следующему алгоритму:

  • Реквизит заполнен - сразу будет вызван обработчик события ПриСозданииНаСервере.
  • Реквизит не заполнен - платформа попытается заполнить его из данных заполнения. После этого снова проверит, заполнен реквизит или нет:
    • Реквизит заполнен - сразу будет вызван обработчик события ПриСозданииНаСервере.
    • Реквизит не заполнен - платформа попытается заполнить его из значения заполнения. После этого будет вызван обработчик события ПриСозданииНаСервере.