К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как найти все подписки на события к документу 1С

Как найти все подписки на события, привязанные к документу в 1С: конфигуратор, поиск по метаданным, отладчик, типовые инструменты БСП и проверка результата.

Подписка на событие в 1С — это механизм, который запускает произвольный код при записи, проведении или других действиях с объектом, при этом сам документ в конфигураторе никак не «знает» о существующих подписках. Из-за этого разработчики и администраторы регулярно сталкиваются с ситуацией: документ ведёт себя странно — медленно проводится, создаёт лишние движения, ругается непонятными ошибками — а причина скрыта в подписке, о которой никто не помнит.

Найти все подписки к конкретному виду документа можно несколькими способами: через конфигуратор, поиском по коду, отладчиком или программно через метаданные. Ниже разобраны все рабочие варианты — от самого простого до универсального, а также способы проверить, что найдены действительно все обработчики, включая те, что добавлены расширениями.

Где хранятся подписки и почему их трудно заметить

Подписки на события находятся в дереве конфигурации по пути Общие → Подписки на события. Каждая подписка содержит три ключевых свойства: Источник (на какие объекты реагирует), Событие (ПриЗаписи, ОбработкаПроведения, ПередЗаписью и т.д.) и Обработчик (процедура в общем модуле, которая будет вызвана).

Сложность в том, что у одного документа может быть несколько подписок на одно и то же событие, и все они отработают последовательно в неопределённом порядке. Кроме того, в типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) часть логики вызывается через переопределяемые модули, и «цепочка» обработчиков может быть длинной.

Ещё один источник сюрпризов — расширения конфигурации. Подписка, добавленная расширением, не видна в основной конфигурации, но исполняется наравне с остальными. Поэтому проверять нужно оба слоя.

Способ 1: ручной просмотр подписок в конфигураторе

Самый прямой метод подходит, когда подписок в конфигурации немного (обычно до нескольких десятков). Откройте конфигуратор, разверните ветку «Общие → Подписки на события» и поочерёдно открывайте каждую подписку двойным щелчком или через палитру свойств.

В свойстве «Источник» отображается список типов объектов, на которые подписан обработчик. Найдите в нём нужный вид документа — например, «ДокументОбъект.РеализацияТоваровУслуг». Если документ есть в списке — подписка к нему относится. Запишите название подписки, событие и обработчик.

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

Порядок действий в конфигураторе
  1. 1
    Откройте конфигуратор и дерево конфигурации
  2. 2
    Разверните Общие → Подписки на события
  3. 3
    Откройте свойства каждой подписки и проверьте поле «Источник»
  4. 4
    Выпишите подписки, где источник содержит нужный документ
  5. 5
    Перейдите по имени обработчика в общий модуль и изучите код

Способ 2: программный перебор метаданных

Универсальный и самый надёжный способ — пройтись по всем подпискам кодом и отобрать те, чей источник включает нужный тип документа. Это можно сделать в консоли кода (внешней обработке «Консоль кода» из состава ИР или аналогичной) либо во временной внешней обработке.

bsl
ИскомыйТип = Тип("ДокументОбъект.РеализацияТоваровУслуг");
Для Каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл
    Если Подписка.Источник.СодержитТип(ИскомыйТип) Тогда
        Сообщить(Подписка.Имя + " | " + Подписка.Событие + " | " + Подписка.Обработчик);
    КонецЕсли;
КонецЦикла;

Код выведет список всех подписок с указанием события и имени процедуры-обработчика. Обратите внимание: метод СодержитТип() проверяет именно вхождение типа в описание источника, поэтому подписки, у которых источник задан широко (например, «ДокументОбъект» без конкретизации), тоже попадут в выборку — и это правильно, они тоже сработают на вашем документе.

Для поиска по расширениям тот же код выполняется без изменений: коллекция Метаданные.ПодпискиНаСобытия в сеансе уже включает объекты подключённых расширений, если у пользователя есть права на их просмотр.

Способ 3: глобальный поиск по конфигурации

Если программный доступ затруднён, используйте глобальный поиск в конфигураторе (меню «Правка → Глобальный поиск» или Ctrl+Shift+F). Ищите имя документа, например РеализацияТоваровУслуг, с включённым поиском по свойствам метаданных.

Однако результаты нужно фильтровать вручную: имя документа встретится в правах, отчётах, критериях отбора и коде модулей. Вас интересуют только строки, относящиеся к объектам «ПодпискаНаСобытие». Метод полезен как дополнительный — он заодно покажет, где ещё в коде упоминается документ, что помогает найти «скрытую» логику, вызываемую из обработчиков подписок.

Способ 4: отладчик на реальном событии

Когда нужно понять не просто «какие подписки есть», а «что реально выполняется при проведении», самый наглядный способ — отладка. Включите отладку в конфигураторе (Сервис → Параметры → отладка), подключите нужный сеанс и установите точку останова.

Проблема в том, что точку нужно куда-то поставить. Практичный приём: поставьте точку останова на первой строке процедуры-обработчика любой найденной подписки, затем проведите документ. Когда отладчик остановится, изучите стек вызовов и пошагово пройдите дальше — вы увидите, какие ещё обработчики вызываются и в каком порядке.

Альтернатива — включить в конфигураторе остановку по ошибке и воспроизвести проблемное проведение: если подписка падает с ошибкой, отладчик покажет точное место и модуль.

Проверка расширений конфигурации

Подписки из расширений — частая причина «фантомного» поведения документов. Откройте в конфигураторе список расширений (Конфигурация → Расширения конфигурации), по очереди активируйте каждое расширение и посмотрите его дерево метаданных: ветка «Подписки на события» там тоже присутствует.

Программно список подключённых расширений можно получить через РасширенияКонфигурации.Получить(). Если расширений много, временно отключайте их по одному и проверяйте, исчезло ли аномальное поведение документа — так вы быстро локализуете источник проблемы.

Как убедиться, что найдены все обработчики

Признак полного результата — совпадение трёх независимых проверок: программный перебор метаданных, список подписок в расширениях и фактическое поведение в отладчике. Если в отладке срабатывает обработчик, которого нет в первых двух списках, — ищите дальше: возможно, код вызывается не через подписку, а из модуля объекта документа или из переопределяемых процедур БСП.

Дополнительно проверьте модуль объекта самого документа (процедуры ПередЗаписью, ПриЗаписи, ОбработкаПроведения) — часть логики может быть там, и её легко спутать с подпиской. Также в типовых решениях встречаются вызовы через «Выполнить» по имени процедуры, которые не видны статическим анализом.

Контрольные точки

Как проверить результат

Программный перебор подписок
Норма

Список стабилен при повторном запуске

Тревожный признак

Список меняется между сеансами — проверьте расширения

Отладка проведения
Норма

Сработали только найденные обработчики

Тревожный признак

Срабатывает код из неизвестного модуля

Модуль объекта документа
Норма

Логика учтена в общей картине

Тревожный признак

В модуле объекта есть неучтённые вызовы

Типичные ошибки при поиске подписок

Типичные ошибки
01
Искать подписки только в модуле документа — подписки живут в общих модулях и в дереве метаданных, а не в объекте
02
Забыть про расширения — обработчик из расширения исполняется, но не виден в основной конфигурации
03
Искать только по точному типу документа — подписка с источником «ДокументОбъект» общего вида тоже сработает
04
Считать, что одна подписка = один обработчик: сам обработчик может вызывать десятки процедур из других модулей
05
Менять типовую подписку вместо создания своей — при обновлении конфигурации изменения будут потеряны

Отдельно отметим ошибку с анализом только конфигуратора без запуска кода. Статический просмотр не показывает фактическую цепочку вызовов: обработчик подписки «ПередЗаписью» может вызывать регистрацию в планах обмена, проверку блокировок и ещё несколько механизмов. Полная картина получается только в связке «метаданные + отладка».

Что делать с найденными подписками дальше

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

При добавлении своей подписки помните о производительности: обработчик срабатывает на каждое событие каждого объекта из источника. Тяжёлые запросы внутри обработчика «ПередЗаписью» заметно замедлят запись документов для всех пользователей.

Итог

Что важно запомнить

Все подписки к документу находятся перебором Метаданные.ПодпискиНаСобытия с проверкой Источник.СодержитТип(). Обязательно проверьте расширения и модуль объекта, а фактическую цепочку вызовов подтвердите отладчиком. Изменения вносятся через собственную подписку или расширение, после теста на копии базы.

Частые вопросы

Можно ли посмотреть подписки без конфигуратора, из пользовательского режима?

Напрямую — нет, в пользовательском интерфейсе такого инструмента нет. Но через внешнюю обработку «Консоль кода» или аналогичный инструмент разработчика можно выполнить программный перебор метаданных и получить полный список подписок прямо в режиме Предприятия, если у пользователя есть соответствующие права.

Почему подписка есть в списке, но обработчик не срабатывает?

Частые причины: общий модуль обработчика скомпилирован только для сервера, а вызов идёт в другом контексте; у пользователя нет прав на модуль; событие не наступает (например, документ записывается, а подписка на ОбработкаПроведения); либо внутри обработчика есть условие, которое отсекает ваш документ. Проверяйте отладчиком.

Как узнать, в каком порядке сработают несколько подписок на одно событие?

Платформа не гарантирует определённый порядок вызова подписок на одно событие. Фактический порядок можно увидеть только в отладчике в конкретном сеансе, но полагаться на него в логике нельзя — он может измениться после обновления конфигурации или подключения расширений.

Влияют ли подписки на скорость проведения документов?

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

Как временно отключить подписку для теста?

Безопасный способ — снять тип документа из свойства «Источник» на копии базы либо добавить в начало обработчика условие выхода. Не удаляйте подписку целиком: восстановить типовой объект бывает сложнее, чем вернуть источник. Все эксперименты проводите только на тестовой копии.

Подписки и обработчики в модуле объекта — в чём разница?

Обработчики в модуле объекта (ПередЗаписью, ПриЗаписи и др.) относятся только к этому виду документа и редактируются в его модуле. Подписка — внешний механизм: один обработчик в общем модуле может обслуживать сразу десятки видов документов и справочников. При записи объекта сначала отрабатывают события модуля объекта и подписки в переплетении, определяемом платформой.