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

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

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

Работа с подписками на события

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

Чтобы начать работу, выполним следующие шаги:

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

Использование параметра Источник

Ключевым моментом в обработчике события является параметр Источник. Это и есть наш документ, который записывается в данный момент. Все методы и свойства этого документа доступны нам через этот параметр.

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


Процедура ЗаказПриЗаписи(Источник, Отказ) Экспорт
    // Источник — это наш объект ДокументОбъект.ЗаказПокупателя
    Если Источник.Проведен Тогда
        // Выполняем нашу логику
    КонецЕсли;
КонецПроцедуры

Как определить, что документ создается впервые?

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

В событии ПриЗаписи метод Источник.ЭтоНовый() уже вернет Ложь, так как транзакция записи уже прошла и объект получил ссылку. Чтобы решить эту задачу, мы комбинируем события ПередЗаписью и ПриЗаписи, используя ДополнительныеСвойства.

Реализация через ДополнительныеСвойства

Коллекция ДополнительныеСвойства позволяет передавать данные из одного этапа записи в другой. Разберем по шагам, как это реализовать правильно:

  1. В обработчике ПередЗаписью мы определяем статус нового документа и сохраняем его в коллекцию.
  2. В обработчике ПриЗаписи мы считываем это значение из коллекции.

Рассмотрим пример кода:


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

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

Почему использование ДополнительныеСвойства надежнее?

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

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


Если ТипЗнч(Источник) <> Тип("ДокументОбъект.ЗаказПокупателя") Тогда
    Возврат;
КонецЕсли;

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

← На главную