Перейти к основному содержимому

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

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

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

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

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

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

важно

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

Примеры

Пример 1

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

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

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

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

Тогда модуль набора записей регистра сведений Товары, Товары.НаборЗаписей.xbsl, выглядит следующим образом:

Товары.НаборЗаписей.xbsl
// Описывает действия, которые выполняются перед записью нового набора записей регистра сведений Товары
@Обработчик
метод ПередЗаписью(Замещать: Булево,
ПараметрыЗаписи: Товары.ПараметрыЗаписи)
// Собственный алгоритм регистра сведений "Товары"
;

Модуль Подписка1.xbsl из подсистемы ценового учета:

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

Модуль Подсписка2.xbsl из подсистемы складского учета:

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

Пример 2

Подписка на событие ПослеУдаления для плана обмена ПланОбмена1:

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

Пример 3

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

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

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

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

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

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

  • ПередЗаписью;
  • ПослеЗаписи;
  • ПередУдалением;
  • ПослеУдаления.

Пример подписки на событие ПередЗаписью контракта сущности КонтрактСущности1:

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