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

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

Подписка объявляется с помощью аннотации @Подписка с параметром. В качестве параметра используется литерал события вида Событие{<ИмяТипа>.<ИмяСобытия>}.

Поддерживаются следующие типы и события:

  • Справочник.Объект — ПередЗаписью, ПослеЗаписи, ПередУдалением, ПослеУдаления;
  • Документ.Объект — ПередЗаписью, ПослеЗаписи, ПередУдалением, ПослеУдаления;
  • ПланыОбмена.Объект — ПередЗаписью, ПослеЗаписи, ПередУдалением, ПослеУдаления;
  • РегистрСведений.НаборЗаписей — ПередЗаписью, ПослеЗаписи;
  • ХранилищеНастроек.Объект — ПередЗаписью, ПослеЗаписи, ПередУдалением, ПослеУдаления;
  • Пользователи.Объект — ПослеИзменения, ПослеПодключения, ПослеОтключения;
  • КонтрактСущности.Объект — ПередЗаписью, ПослеЗаписи, ПередУдалением, ПослеУдаления.

Подписку можно добавить только к статическим методам или методам модулей типов-одиночек. На одно событие можно создать несколько подписок в одном или нескольких проектах.

Внимание: Подписки на события запускаются после обработчика событий, который задан в модуле элемента. Порядок запуска подписок не определен.

Примеры

Пример 1. Элемент справочника Товары (Товары.Объект) имеет событие ПередЗаписью, в котором описан некоторый стандартный алгоритм количественного учета.

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

Если каждый раз менять обработчик ПередЗаписью() элемента справочника Товары, это будет создавать лишние зависимости на другие подсистемы проекта.

Поэтому вы можете создать подписку на событие ПередЗаписью в каждой из перечисленных подсистем.

Тогда модуль объекта справочника Товары, Товары.Объект.xbsl, выглядит следующим образом:
// Описывает действия, которые выполняются при записи нового объекта справочника Товары
@Обработчик
метод ПередЗаписью(Источник: Товары.Данные,
                   ПредыдущееЗначение: Товары.Данные,
                   ПараметрыЗаписи: Товары.ПараметрыЗаписи)
    // Собственный алгоритм справочника "Товары"
;
Модуль Подписка1.xbsl из подсистемы ценового учета:
// Описывает действия, которые необходимо выполнить для учета изменения цены
// при записи нового объекта справочника Товары
@НаСервере
@ВПроекте
@Подписка(Событие{Товары.Объект.ПередЗаписью})
статический метод ЦеновойУчет(Источник: Товары.Данные,
                              ПредыдущееЗначение: Товары.Данные,
                              ПараметрыЗаписи: Товары.ПараметрыЗаписи)
    // Алгоритм учета изменения цены
;
Модуль Подсписка2.xbsl из подсистемы складского учета:
// Описывает действия, которые необходимо выполнить для складского учета
// при записи нового объекта справочника Товары
@НаСервере
@ВПроекте
@Подписка(Событие{Товары.Объект.ПередЗаписью})
статический метод СкладскойУчет(Источник: Товары.Данные,
                                ПредыдущееЗначение: Товары.Данные,
                                ПараметрыЗаписи: Товары.ПараметрыЗаписи)
    // Алгоритм складского учета
;
Пример 2. Подписка на событие ПослеУдаления для плана обмена ПланОбмена1:
// Описывает действия, которые необходимо выполнить после удаления объекта ПланОбмена1
@НаСервере
@Подписка(Событие{ПланОбмена1.Объект.ПослеУдаления})
статический метод ПослеУдаленияПланаОбмена1(
    Источник: ПланОбмена1.Данные,
    Параметры: ПланОбмена1.ПараметрыУдаления)
    // Обработка события
;

Пример 3. Подписка на событие нескольких объектов одного типа, например на событие ПередЗаписью двух справочников Справочник1 и Справочник2:

// Обработка события ПередЗаписью для Справочника1
@НаСервере
@Подписка(Событие{Справочник1.Объект.ПередЗаписью})
статический метод ПередЗаписью(
    Источник: Справочник1.Данные,
    ПредыдущееЗначение: Справочник1.Данные,
    Параметры: Справочник1.ПараметрыЗаписи)
    // Обработка события
;

// Обработка события ПередЗаписью для Справочника2
@НаСервере
@Подписка(Событие{Справочник2.Объект.ПередЗаписью})
статический метод ПередЗаписью(
    Источник: Справочник2.Данные,
    ПредыдущееЗначение: Справочник2.Данные,
    Параметры: Справочник2.ПараметрыЗаписи)
    // Обработка события
;

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

С помощью механизма подписок можно подписаться на события всех элементов, которые реализуют определенный контракт. Например, если Справочник1 и Справочник2 реализуют контракт КонтрактСущности1, то метод подписки на событие КонтрактСущности1.Объект.ПередЗаписью сработает при наступлении события ПередЗаписью и у Справочника1, и у Справочника2.

Вы можете подписаться на следующие события объекта контракта сущности вида <ИмяКонтракта>.Объект:

  • ПередЗаписью;
  • ПослеЗаписи;
  • ПередУдалением;
  • ПослеУдаления.
Пример подписки на событие ПередЗаписью контракта сущности КонтрактСущности1:
@Подписка(Событие{КонтрактСущности1.Объект.ПередЗаписью})
метод ПодпискаНаСобытиеКонтракта(
    Источник: КонтрактСущности1.Данные,
    ПредыдущееЗначение: КонтрактСущности1.Данные,
    ПараметрыЗаписи: КонтрактСущности1.ПараметрыЗаписи)
    // Обработка события
;