Skip to content

Latest commit

 

History

History
132 lines (103 loc) · 10.2 KB

ПодпискиНаСобытия.md

File metadata and controls

132 lines (103 loc) · 10.2 KB

Подсистема "Подписки на события"

Подписки на события применяются для реализации дополнительной постобработки или проверок, которые активируются после определённых событий в типовых объектах или модулях менеджера. В случае отсутствия типовой подписки используется подсистема "Подписки на события". Если нужно внести изменения в типовую логику работы подписки, используется заимствование методов в расширении с аннотацией &ИзменениеИКонтроль.

Общая структура подписок на события:

  • Для каждого класса общий модуль (пример: "пбп_ДокументыОбработкаСобытий")
    • В каждом общем модуле распологаются процедуры-обработчики для данного класса (пример: "ОбработкаПроведения", "ПриЗаписи")
    • В области СлужебныйПрограммныйИнтерфейс добавляются одноименные процедуры для обработки конкретных событий (пример: "СписаниеБезналичныхДенежныхСредствПриЗаписи")
    • В общем модуле пбп_ОбщегоНазначенияПовтИсп необходимо добавить соответствие типа объекта и вызываемой процедуры в одноименной функции (Указывать только имя процедуры!)

Важно!
- В одноимённых обработчиках событий необходимо после выполнения метода конфигурации делать обратное присвоение параметров из массива "ПараметрыМетода", так как они могут быть изменены в выполняемом методе.
- В обработчиках, указанных в подписках на события, реализован возврат параметра Отказ согласно концепции фирмы 1С. При необходимости ускорить работу и избежать выполнения кода при условии Отказ = Истина, добавьте проверку этого условия в место проверки ОбменДанными.Загрузка.
Пример:

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

Пример обратного присвоения:

Процедура ПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// ...
    ПараметрыМетода = Новый Массив;
    ПараметрыМетода.Добавить(Источник);
    ПараметрыМетода.Добавить(Отказ);
			
    пбп_ОбщегоНазначенияСервер.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);
			
    Источник = ПараметрыМетода[0];
    Отказ = ПараметрыМетода[1];
// ...
КонецПроцедуры

Порядок действий при работе с подсистемой:

  • Необходимо проверить, существует ли общая подписка на нужный тип объекта и событие. Например: ОбработкаПроведения, ПриЗаписи и так далее.
    Важно! Не допускается смешение типов объектов и событий в одной подписке. Если подписка не существует, нужно её создать, а так же добавить общий модуль с аналогичным названием (напр. пбп_ДокументыПриЗаписи - подписка, пбп_ДокументыОбработкаСобытий - общий модуль). Добавить их в подсистему пбп_ПодпискиНаСобытия.
  • Если создана новая подписка и модуль, то в модуле создается обработчик для подписки и выбрать его в подписке. У каждого события свой набор параметров.
  • Структура общего модуля обработчиков:
    • В области СлужебныйПрограммныйИнтерфейс располагаются обработчики объектов. Внутри этой области могут быть подобласти по обработчикам. Допустимо добавлению произвольных областей внутри СлужебныйПрограммныйИнтерфейс для группировки по подсистемам.
#Область ПрограммныйИнтерфейс

Процедура ПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
КонецПроцедуры

Процедура ПриЗаписи(Источник, Отказ) Экспорт
КонецПроцедуры

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Добавить процедуры обработчиков объектов в эту область

#Область ПередЗаписью
#КонецОбласти

#Область ПриЗаписи

Процедура СписаниеБезналичныхДенежныхСредствПриЗаписи(Источник, Отказ) Экспорт
КонецПроцедуры

#КонецОбласти

// Конец добавления
 
#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#КонецОбласти

Пример обработчика общего модуля "пбп_ДокументыОбработкаСобытий":

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

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

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

Процедура ОбработатьСоответствие<ИмяКласса>(Соответствие)
    ЗаполнитьПолныеПутиВызоваМетодов(<ИмяОбщегоМодуля>, Соответствие);
КонецПроцедуры

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

Функция ДокументыПриЗаписи() Экспорт
    Соответствие = Новый Соответствие;

    // Добавление соответствий между типами объектов и методами
    Соответствие.Вставить(Тип("ДокументОбъект.СписаниеБезналичныхДенежныхСредств"),
        "СписаниеБезналичныхДенежныхСредствПриЗаписи");
    Соответствие.Вставить(Тип("ДокументОбъект.ПоступлениеБезналичныхДенежныхСредств"),
        "ПоступлениеБезналичныхДенежныхСредствПриЗаписи");
    // КонецДобавления

    ОбработатьСоответствиеДокументы(Соответствие);
    Возврат Соответствие;
КонецФункции