6. Объектная модель прикладного решения
#37

Готовишься к экзамену?

Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.

Перейти в бота

В платформе 1С при использовании объекта конфигурации «Подписка на событие» (обработчик события задан как экспортируемая процедура общего модуля), сколько параметров должно быть у процедуры-обработчика по сравнению с «обычным» обработчиком этого же события в модуле объекта?

Параметров столько же, сколько у обработчика этого события в модуле объекта.
Неправильно: Для подписки на событие платформа дополнительно передает в обработчик сам объект-источник события. Поэтому сигнатура процедуры подписки не совпадает один-в-один с обработчиком в модуле объекта.
Параметров на один больше: первым параметром передается объект (источник события).
Правильно: В процедуру подписки платформа передает те же параметры события, что и в модуль объекта, плюс добавляет параметр с объектом-источником события. Этот дополнительный параметр идет первым, поэтому общее число параметров увеличивается на один.
Параметров на один больше: последним параметром передается объект (источник события).
Неправильно: Дополнительный параметр действительно появляется, но он добавляется в начало списка, а не в конец. Это важно, потому что иначе нарушилась бы ожидаемая структура параметров события.
У процедуры-обработчика подписки параметров нет - все берется из контекста.
Неправильно: Подписка на событие вызывается с параметрами события, и они должны быть приняты процедурой, иначе обработчик не подойдет по сигнатуре. Минимум будет передан объект-источник, а чаще еще и параметры самого события (например, Отказ и др.).
Всегда один параметр - только объект, для которого определили подписку.
Неправильно: Помимо объекта-источника, платформа передает параметры самого события (например, для «ПередЗаписью» это может быть Отказ и дополнительные параметры режима). Поэтому количество параметров зависит от конкретного события и обычно больше одного.

Пояснение

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