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