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