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

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

При разработке конфигураций в среде 1С:Предприятие 8 часто возникает задача: выполнить определенный программный код (например, заполнить значения реквизитов по умолчанию или настроить элементы интерфейса) строго при создании нового документа, который еще ни разу не был записан в базу данных. Разберем по шагам, какие события и методы платформы предназначены для решения этой задачи и где именно их следует применять.

Способ 1. Инициализация данных в модуле объекта через ОбработкаЗаполнения

Если наша цель — заполнить реквизиты объекта начальными данными при его создании, наиболее правильным и рекомендованным стандартом разработки является использование предопределенного события ОбработкаЗаполнения в модуле объекта.

Проанализируем особенности работы этого события:

  1. Оно автоматически вызывается на сервере при интерактивном создании нового документа пользователем (из формы списка, журнала или командного интерфейса), а также при вводе на основании.
  2. Событие не вызывается при обычном открытии или чтении уже существующего документа из базы с помощью метода ПолучитьОбъект().

Посмотрим на пример реализации процедуры в модуле объекта:


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

Способ 2. Проверка нового объекта в управляемой форме через Параметры.Ключ

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

Выясним причину, почему в контексте формы нельзя использовать метод ЭтоНовый(): основной реквизит Объект на форме имеет тип ДанныеФормыСтруктураДляОбъекта, у которого нет такого метода. Обращение к Объект.ЭтоНовый() приведет к ошибке времени выполнения.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Если Ключ не заполнен — форма открывается для нового объекта
    Если Не ЗначениеЗаполнено(Параметры.Ключ) Тогда
        // Логика настройки интерфейса для нового документа
        Элементы.ГруппаСогласование.Видимость = Ложь;
    КонецЕсли;
    
КонецПроцедуры

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

Способ 3. Проверка метода ЭтоНовый() в модуле объекта

В модуле объекта доступен встроенный метод ЭтоНовый(). Он возвращает Истина, если объект еще не был записан в базу данных.

Рассмотрим, в каких сценариях применяется этот метод:

  1. В обработчике ПередЗаписью модуля объекта, когда требуется выполнить финальные проверки или расчеты строго перед первой записью в базу данных:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если ЭтоНовый() Тогда
        // Код, выполняемый единожды при первой записи документа
        ДатаСозданияДокумента = ТекущаяДатаСеанса();
    КонецЕсли;
    
КонецПроцедуры

Важный момент: метод ЭтоНовый() надежнее, чем проверка Ссылка.Пустая(), так как документ может получить ссылку еще до записи в базу (например, если ссылка была сгенерирована программно через ПолучитьСсылку()).

Типичные ошибки при инициализации новых объектов

Разберем распространенные ошибки, которых следует избегать:

  1. Размещение кода в теле модуля объекта вне процедур: код вне процедур модуля объекта выполняется при каждом получении объекта в память (через ПолучитьОбъект(), в веб-сервисах, фоновых заданиях или при вызове РеквизитФормыВЗначение()). Помещение туда логики инициализации приводит к падению производительности и нежелательным перезаписям данных.
  2. Использование ПередЗаписью для заполнения реквизитов формы: событие ПередЗаписью срабатывает только в момент сохранения документа, поэтому пользователь не увидит предзаполненных значений на форме во время редактирования.
← На главную