Подписки на события в 1С 8.х

Зачем нужны подписки на события в 1с?

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

Как реализовать это без использования подписок - открыть модуль соответствующего объекта, найти событие "ПриЗаписи", в конце соответствующей процедуры вставить ваш код проверки на дату запрета, повторить действие для всех документов в дереве конфигурации (!!). Как реализовать с помощью подписки - один раз создать процедуру, отметить флажками внутри подписки для каких объектов надо ее вызывать, готово!

Как видим использование подписки значительно сокращает написание кода, также многократно упрощается поддержка, весь ваш код содержится в каком-нибудь вашем же модуле, а в модулях объектов ни одной строчки кода не поменялось.

Как добавить свою подписку на событие

  1. В дереве конфигурации найти "подписки на события"
  2. Добавить новый узел (новую подписку)
  3. Задать название произвольно
  4. Выбрать "источники" (на что будет действовать ваша подписка)
  5. Выбрать тип события, в каком случае должен срабатывать ваш код "перед записью", "при записи", "при проведении" и т.д.
  6. Нажать на лупу чтобы выбрать модуль где будет создана ваша процедура с полезной нагрузкой
  7. Готово

В указанном общем модуле появится процедура, остается реализовать поставленную задачу в коде, например так

Проверим результат наших доработок, попробуем ввести документ в базу "задним числом":


Когда имеет смысл использовать подписку на события

Во первых когда надо реализовать какие-то системные вещи, как сказано выше для регистрации изменений, логов, проверок дат запрета и прочего, т.е. универсальные действия и проверки сразу для нескольких видов документов или\и справочников.

Во вторых имеет смысл если документ стоит на поддержке и не хочется открывать его на редактирование, но необходимо, например, добавить проведение по своему регистру, делаем подписку на событие "проведение" - пишем движения в регистр через свою процедуру в общем модуле - профит.

Замечания

1. Следует учитывать что если вы выбрали несколько разношерстных типов объектов, но в списке доступных событий будут только те что присутствуют у всех выбранных:

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

2. Обработчики событий вызываются всегда после основной процедуры, по другому выглядит это так как будто мы свой код дописали в конце процедуры этого события в модуле объекта, например, в конце "ПриЗаписи()". Подписки на события для одинаковых источников и действий выполняются в порядке размещения подписок в конфигураторе сверху вниз (т.е. в таком же порядке, как и в дереве метаданных). Если для какого-то документа в конфигурации есть две подписки на событие ПриЗаписи, то в начале выполнится та, которая расположена выше. В общем про очередность вызовов можно почитать здесь и здесь .

3. Обработчики событий можно добавлять программно.

Процедура СоздатьЗаказПрограммноНажатие(Элемент)
	ДокументЗаказ = Документы.ЗаказКлиента.СоздатьДокумент();
	ДокументЗаказ.Дата = ТекущаяДата() - 7*86400; //намерено разместим в прошлом
	ДобавитьОбработчик ДокументЗаказ.ПриЗаписи, ПриЗаписиДокументаПроверкаДаты;
	ДокументЗаказ.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры

Процедура ПриЗаписиДокументаПроверкаДаты(Источник, Отказ)
	ОбщийМодульПодпискиНаСобытия.ПриЗаписиДокументаПроверкаДатыПриЗаписи(Источник, Отказ);
КонецПроцедуры

В результате в момент записи заказа сначала будет вызвана "приЗаписи" из модуля заказа, вслед за ней сразу же будет вызвано указанное нами событие.

Добавить комментарий