Подписка на событие в 1С 8.3

Курс

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

Подписки на событие позволяют добавить обработчик на события модуля объекта, модуля менеджера или модуля набора записей. Они находятся в разделе Общие — Подписки на события:

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

При создании новой подписки на событие в свойствах нужно указать источник, событие и обработчик:

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

В качестве источника может выступать объект, набор записей или менеджер. Можно выбрать составной тип, например СправочникОбъект.Товары, СправочникОбъект.Контрагенты. Можно выбрать набор типов, например СправочникОбъект, ДокументОбъект.

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

В свойстве Событие нужно выбрать событие источника. Если в качестве источника был выбран объект, то это события модуля объекта. Если в качестве источника был выбран менеджер — то события модуля менеджера. Если набор записей — то события модуля набора записей.

Событие подписки на событие

Если выбран составной источник, то будут доступны только те события, которые есть у всех выбранных источников. Например, если выбрать СправочникОбъект и ДокументОбъект, то можно будет выбрать только те события, которые есть и в модуле объекта справочника и в модуле объекта документа:

Событие подписки на событие

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

В свойстве обработчик нужно выбрать модуль, в котором будет создана процедура для обработки события. Для выбора доступны все серверные общие модули. Но правильно выбирать тот общий модуль, у которого в свойствах установлены флажки:

  • Сервер
  • Внешнее соединение
  • Клиент (обычное приложение), если конфигурация позволяет работать в режиме обычного приложения
Общий модуль для подписок на события
Обработчик подписки на событие

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

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

При наступлении события сначала выполняется обработчик в модуле объекта, а потом вызывается процедура подписки на событие. Если в типовом обработчике был установлен параметр Отказ = Истина или было выброшено исключение, то процедура подписки на событие не будет вызвана. Если в процедуре подписки на событие установить параметр Отказ = Истина или вызвать исключение, то действие будет прервано.

Подписки на событие нельзя использовать для событий формы.

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

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

А также добавим подписку на событие:

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

В общий модуль добавим процедуру для подписки на событие:

Запишем любой элемент справочника и увидим два сообщения:

  1. ПередЗаписью
  2. ПодпискаНаСобытие
Сообщения

Теперь добавим в модуль объект Отказ = Истина:

Снова запишем элемент справочника. Он не будет записан, но теперь будет выведено только одно сообщение «ПередЗаписью». Код из процедуры подписки на событие даже не вызывался.

Сообщения

Уберем Отказ = Истина из модуля объекта и добавим его в процедуру подписки на событие:

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

Сообщения

Если нужно передать в подписку на событие дополнительные параметры, то можно использовать ДополнительныеСвойства объекта:

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

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

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

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

А также три события где в качестве источника укажем СправочникОбъект:

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

В каждой подписке будем сообщать ее имя:

В дереве метаданных подписки расположены в следующем порядке:

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

Запишем элемент справочника. Сообщения будут выведены в следующем порядке:

  1. ПодпискаНаСобытие1
  2. ПодпискаНаСобытие2
  3. ПодпискаНаСобытие3
  4. ПодпискаНаСобытиеДляВсех1
  5. ПодпискаНаСобытиеДляВсех2
  6. ПодпискаНаСобытиеДляВсех3

Теперь поменяем местами первую и вторую подписку, как для одного справочника, так и для всех:

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

Теперь сообщения выведены в другом порядке:

  1. ПодпискаНаСобытие2
  2. ПодпискаНаСобытие1
  3. ПодпискаНаСобытие3
  4. ПодпискаНаСобытиеДляВсех2
  5. ПодпискаНаСобытиеДляВсех1
  6. ПодпискаНаСобытиеДляВсех3

Из этого можно сделать вывод, что сначала вызываются те подписки, где в качестве источника указан сам объект. Подписки вызываются в порядке их следования в дереве метаданных. А потом вызываются подписки на событие, где источником указан СправочникОбъект, тоже в порядке их следования в дереве метаданных.

Но лучше на это не полагаться, так как такое может наблюдаться не в 100% случаев, да и в новой версии платформы это может измениться. Если важен порядок вызова подписок на событие, то можно создать одну подписку с источником СправочникОбъект, а в ней анализировать тип источника и вызывать в нужном порядке процедуры:


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok