Подписки на события применяются для реализации дополнительной постобработки или проверок, которые активируются после определённых событий в типовых объектах или модулях менеджера. В случае отсутствия типовой подписки используется подсистема "Подписки на события". Если нужно внести изменения в типовую логику работы подписки, используется заимствование методов в расширении с аннотацией &ИзменениеИКонтроль.
Общая структура подписок на события:
- Для каждого класса общий модуль (пример: "пбп_ДокументыОбработкаСобытий")
- В каждом общем модуле распологаются процедуры-обработчики для данного класса (пример: "ОбработкаПроведения", "ПриЗаписи")
- В области СлужебныйПрограммныйИнтерфейс добавляются одноименные процедуры для обработки конкретных событий (пример: "СписаниеБезналичныхДенежныхСредствПриЗаписи")
- В общем модуле пбп_ОбщегоНазначенияПовтИсп необходимо добавить соответствие типа объекта и вызываемой процедуры в одноименной функции (Указывать только имя процедуры!)
Важно!
- В одноимённых обработчиках событий необходимо после выполнения метода конфигурации делать обратное присвоение параметров из массива "ПараметрыМетода", так как они могут быть изменены в выполняемом методе.
- В обработчиках, указанных в подписках на события, реализован возврат параметра Отказ согласно концепции фирмы 1С. При необходимости ускорить работу и избежать выполнения кода при условии Отказ = Истина, добавьте проверку этого условия в место проверки ОбменДанными.Загрузка.
Пример:
Процедура ПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Источник.ОбменДанными.Загрузка Или Отказ Тогда
Возврат;
КонецЕсли;
КонецПроцедуры
Пример обратного присвоения:
Процедура ПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// ...
ПараметрыМетода = Новый Массив;
ПараметрыМетода.Добавить(Источник);
ПараметрыМетода.Добавить(Отказ);
пбп_ОбщегоНазначенияСервер.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);
Источник = ПараметрыМетода[0];
Отказ = ПараметрыМетода[1];
// ...
КонецПроцедуры
Порядок действий при работе с подсистемой:
- Необходимо проверить, существует ли общая подписка на нужный тип объекта и событие. Например: ОбработкаПроведения, ПриЗаписи и так далее.
Важно! Не допускается смешение типов объектов и событий в одной подписке. Если подписка не существует, нужно её создать, а так же добавить общий модуль с аналогичным названием (напр. пбп_ДокументыПриЗаписи - подписка, пбп_ДокументыОбработкаСобытий - общий модуль). Добавить их в подсистему пбп_ПодпискиНаСобытия. - Если создана новая подписка и модуль, то в модуле создается обработчик для подписки и выбрать его в подписке. У каждого события свой набор параметров.
- Структура общего модуля обработчиков:
- В области СлужебныйПрограммныйИнтерфейс располагаются обработчики объектов. Внутри этой области могут быть подобласти по обработчикам. Допустимо добавлению произвольных областей внутри СлужебныйПрограммныйИнтерфейс для группировки по подсистемам.
#Область ПрограммныйИнтерфейс
Процедура ПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
КонецПроцедуры
Процедура ПриЗаписи(Источник, Отказ) Экспорт
КонецПроцедуры
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Добавить процедуры обработчиков объектов в эту область
#Область ПередЗаписью
#КонецОбласти
#Область ПриЗаписи
Процедура СписаниеБезналичныхДенежныхСредствПриЗаписи(Источник, Отказ) Экспорт
КонецПроцедуры
#КонецОбласти
// Конец добавления
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти
Пример обработчика общего модуля "пбп_ДокументыОбработкаСобытий":
Процедура ПриЗаписи(Источник, Отказ) Экспорт
Если Отказ Или Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Получение имени метода для исполнения
ИмяМетода = пбп_ОбщегоНазначенияПовтИсп.ДокументыПриЗаписи().Получить(ТипЗнч(Источник));
// Выполнение метода, если он определён
Если ЗначениеЗаполнено(ИмяМетода) Тогда
// Попытка выполнения метода с необходимыми параметрами
Попытка
ПараметрыМетода = Новый Массив;
ПараметрыМетода.Добавить(Источник);
ПараметрыМетода.Добавить(Отказ);
ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);
Исключение
// В случае ошибки вывод информации о ней
ВызватьИсключение СтрШаблон("%1%2Имя метода: %3", ОписаниеОшибки(), Символы.ПС, ИмяМетода);
КонецПопытки;
КонецЕсли;
КонецПроцедуры
- В общем модуле пбп_ОбщегоНазначенияПовтИсп найдите функцию с названием объекта и события, и добавить в соответствие тип объекта и вызываемую процедуру (Указывать только имя процедуры!). Если функции для данного набора нет, создать её, перед возвратом добавить вызов заранее созданной процедуры:
Пример вызова процедуры для заполнения соответствия:
Процедура ОбработатьСоответствие<ИмяКласса>(Соответствие)
ЗаполнитьПолныеПутиВызоваМетодов(<ИмяОбщегоМодуля>, Соответствие);
КонецПроцедуры
Пример заполнения соответствия типа объекта и вызываемой процедуры:
Функция ДокументыПриЗаписи() Экспорт
Соответствие = Новый Соответствие;
// Добавление соответствий между типами объектов и методами
Соответствие.Вставить(Тип("ДокументОбъект.СписаниеБезналичныхДенежныхСредств"),
"СписаниеБезналичныхДенежныхСредствПриЗаписи");
Соответствие.Вставить(Тип("ДокументОбъект.ПоступлениеБезналичныхДенежныхСредств"),
"ПоступлениеБезналичныхДенежныхСредствПриЗаписи");
// КонецДобавления
ОбработатьСоответствиеДокументы(Соответствие);
Возврат Соответствие;
КонецФункции