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