Почему в подписке на события нельзя выбрать событие для определяемого типа в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке подсистем на платформе 1С:Предприятие часто возникает задача унифицировать обработку событий сразу для нескольких однотипных объектов. Для этого удобно использовать метаданные ОпределяемыйТип, объединяющий требуемые объекты, и указывать его в качестве источника в объекте ПодпискаНаСобытия. Однако разработчики нередко сталкиваются с ситуацией: в окне настройки подписки источник выбрать удается, но поле Событие остается недоступным для выбора либо список доступных событий оказывается пустым.

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

Причина поведения платформы

Проанализируем архитектуру работы подписок на события в 1С:Предприятии:

  1. Разделение ссылочных и объектных типов: События жизненного цикла данных (такие как ПередЗаписью, ПриЗаписи, ОбработкаПроверкиЗаполнения, ПередУдалением) генерируются только объектными типами данных — например, СправочникОбъект.<Имя> или ДокументОбъект.<Имя>. Ссылочные типы данных (СправочникСсылка.<Имя>, ДокументСсылка.<Имя>) являются лишь идентификаторами записей в базе данных и собственных событий записи не имеют. Если в состав определяемого типа включены только ссылки, платформа не может сопоставить им ни одного события модификации данных.
  2. Принцип пересечения доступных событий: При указании составного источника (включая определяемый тип) список отображаемых событий формируется по принципу логического пересечения. Событие будет доступно в подписке только в том случае, если оно поддерживается всеми типами, входящими в состав источника. Если в тип случайно попадет примитивный тип (число, строка) или ссылка, список событий сразу станет пустым.

Способ 1. Замена типов в определяемом типе на объектные

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

  1. Откроем ветку конфигурации Общие > Определяемые типы и найдем нужный тип.
  2. Перейдем в палитру свойств и откроем окно редактирования состава типов.
  3. Снимем флажки с типов СправочникСсылка.<ИмяСправочника>.
  4. Установим флажки напротив соответствующих типов СправочникОбъект.<ИмяСправочника>.
  5. Сохраним изменения и вернемся к редактированию свойств объекта ПодпискаНаСобытия.
  6. Укажем наш определяемый тип в поле Источник — теперь в выпадающем списке Событие появятся стандартные события объектов (ПриЗаписи, ПередЗаписью и др.).

Посмотрим на пример правильного назначения типов: если подписка создается для справочников «Кассы» и «РасчетныеСчета», состав определяемого типа должен содержать СправочникОбъект.Кассы и СправочникОбъект.РасчетныеСчета.

Способ 2. Выбор нескольких объектов напрямую в подписке

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

  1. Откроем свойства подписки на события.
  2. В поле Источник нажмем кнопку выбора типа.
  3. В дереве типов отметим флажками нужные объектные типы (например, СправочникОбъект.Кассы и СправочникОбъект.РасчетныеСчета).
  4. Выберем требуемое событие в поле Событие.

Особенности написания обработчика подписки

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

Разберем правильный формат процедуры для события ПриЗаписи справочника:


Процедура ПриЗаписиОбъектовОпределяемогоТипаПриЗаписи(Источник, Отказ) Экспорт
    
    // Проверяем тип переданного объекта при необходимости
    Если ТипЗнч(Источник) = Тип("СправочникОбъект.Кассы") Тогда
        // Специфичная логика для касс
    КонецЕсли;
    
КонецПроцедуры

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

← На главную