Готовишься к экзамену?
Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.
В платформе 1С при использовании объекта конфигурации «Подписка на событие» (обработчик события задан как экспортируемая процедура общего модуля), сколько параметров должно быть у процедуры-обработчика по сравнению с «обычным» обработчиком этого же события в модуле объекта?
Параметров столько же, сколько у обработчика этого события в модуле объекта.
Неправильно: Для подписки на событие платформа дополнительно передает в обработчик сам объект-источник события. Поэтому сигнатура процедуры подписки не совпадает один-в-один с обработчиком в модуле объекта.
Параметров на один больше: первым параметром передается объект (источник события).
Правильно: В процедуру подписки платформа передает те же параметры события, что и в модуль объекта, плюс добавляет параметр с объектом-источником события. Этот дополнительный параметр идет первым, поэтому общее число параметров увеличивается на один.
Параметров на один больше: последним параметром передается объект (источник события).
Неправильно: Дополнительный параметр действительно появляется, но он добавляется в начало списка, а не в конец. Это важно, потому что иначе нарушилась бы ожидаемая структура параметров события.
У процедуры-обработчика подписки параметров нет - все берется из контекста.
Неправильно: Подписка на событие вызывается с параметрами события, и они должны быть приняты процедурой, иначе обработчик не подойдет по сигнатуре. Минимум будет передан объект-источник, а чаще еще и параметры самого события (например, Отказ и др.).
Всегда один параметр - только объект, для которого определили подписку.
Неправильно: Помимо объекта-источника, платформа передает параметры самого события (например, для «ПередЗаписью» это может быть Отказ и дополнительные параметры режима). Поэтому количество параметров зависит от конкретного события и обычно больше одного.
Пояснение
Как запомнить правило: у подписки на событие сигнатура = «Источник + параметры события».
1) Почему так:
Подписка - это внешний обработчик, который выполняется после штатного обработчика события в модуле объекта/менеджера/набора записей. Чтобы универсально использовать один обработчик для разных объектов, платформе нужно передать в него, от какого именно объекта пришло событие - поэтому добавляется параметр «Источник».
2) Где стоит дополнительный параметр:
Он добавляется первым. Далее идут параметры события в том же порядке, в каком они идут в обработчике события модуля объекта.
3) Пример (типовая ситуация):
- В модуле объекта документа обработчик события может выглядеть так:
ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
- В подписке на то же событие процедура общего модуля должна принять на один параметр больше:
Подпись_ПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Здесь «Источник» - это тот самый объект документа, который сейчас записывается.
4) Практический лайфхак в конфигураторе:
Если при выборе обработчика подписки нажать «лупу/создать», система обычно сама создаст процедуру в общем модуле с корректным набором параметров (включая «Источник» первым).
5) Дополнительные нюансы, которые часто спрашивают:
- Процедура обработчика должна быть экспортируемой и находиться в общем модуле, у которого заданы подходящие свойства (обычно модуль не глобальный, включены нужные контексты выполнения и внешнее соединение).
- Если на одно событие назначено несколько подписок, они могут вызываться в произвольном порядке, поэтому не стоит рассчитывать на «очередность».
- Если в обработчике (или в самом событии) устанавливается Отказ = Истина или возникает исключение, дальнейшая обработка события может быть прервана.