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