Разработка и Конфигурация · 11 мин
Как найти все подписки на события к документу 1С
Как найти все подписки на события, привязанные к документу в 1С: конфигуратор, поиск по метаданным, отладчик, типовые инструменты БСП и проверка результата.
Подписка на событие в 1С — это механизм, который запускает произвольный код при записи, проведении или других действиях с объектом, при этом сам документ в конфигураторе никак не «знает» о существующих подписках. Из-за этого разработчики и администраторы регулярно сталкиваются с ситуацией: документ ведёт себя странно — медленно проводится, создаёт лишние движения, ругается непонятными ошибками — а причина скрыта в подписке, о которой никто не помнит.
Найти все подписки к конкретному виду документа можно несколькими способами: через конфигуратор, поиском по коду, отладчиком или программно через метаданные. Ниже разобраны все рабочие варианты — от самого простого до универсального, а также способы проверить, что найдены действительно все обработчики, включая те, что добавлены расширениями.
Где хранятся подписки и почему их трудно заметить
Подписки на события находятся в дереве конфигурации по пути Общие → Подписки на события. Каждая подписка содержит три ключевых свойства: Источник (на какие объекты реагирует), Событие (ПриЗаписи, ОбработкаПроведения, ПередЗаписью и т.д.) и Обработчик (процедура в общем модуле, которая будет вызвана).
Сложность в том, что у одного документа может быть несколько подписок на одно и то же событие, и все они отработают последовательно в неопределённом порядке. Кроме того, в типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) часть логики вызывается через переопределяемые модули, и «цепочка» обработчиков может быть длинной.
Ещё один источник сюрпризов — расширения конфигурации. Подписка, добавленная расширением, не видна в основной конфигурации, но исполняется наравне с остальными. Поэтому проверять нужно оба слоя.
Способ 1: ручной просмотр подписок в конфигураторе
Самый прямой метод подходит, когда подписок в конфигурации немного (обычно до нескольких десятков). Откройте конфигуратор, разверните ветку «Общие → Подписки на события» и поочерёдно открывайте каждую подписку двойным щелчком или через палитру свойств.
В свойстве «Источник» отображается список типов объектов, на которые подписан обработчик. Найдите в нём нужный вид документа — например, «ДокументОбъект.РеализацияТоваровУслуг». Если документ есть в списке — подписка к нему относится. Запишите название подписки, событие и обработчик.
Недостаток метода очевиден: в крупных типовых конфигурациях подписок могут быть сотни, и ручной перебор займёт много времени с высоким риском пропустить нужную. В таком случае переходите к программному поиску.
- 1Откройте конфигуратор и дерево конфигурации
- 2Разверните Общие → Подписки на события
- 3Откройте свойства каждой подписки и проверьте поле «Источник»
- 4Выпишите подписки, где источник содержит нужный документ
- 5Перейдите по имени обработчика в общий модуль и изучите код
Способ 2: программный перебор метаданных
Универсальный и самый надёжный способ — пройтись по всем подпискам кодом и отобрать те, чей источник включает нужный тип документа. Это можно сделать в консоли кода (внешней обработке «Консоль кода» из состава ИР или аналогичной) либо во временной внешней обработке.
ИскомыйТип = Тип("ДокументОбъект.РеализацияТоваровУслуг");
Для Каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл
Если Подписка.Источник.СодержитТип(ИскомыйТип) Тогда
Сообщить(Подписка.Имя + " | " + Подписка.Событие + " | " + Подписка.Обработчик);
КонецЕсли;
КонецЦикла;Код выведет список всех подписок с указанием события и имени процедуры-обработчика. Обратите внимание: метод СодержитТип() проверяет именно вхождение типа в описание источника, поэтому подписки, у которых источник задан широко (например, «ДокументОбъект» без конкретизации), тоже попадут в выборку — и это правильно, они тоже сработают на вашем документе.
Для поиска по расширениям тот же код выполняется без изменений: коллекция Метаданные.ПодпискиНаСобытия в сеансе уже включает объекты подключённых расширений, если у пользователя есть права на их просмотр.
Способ 3: глобальный поиск по конфигурации
Если программный доступ затруднён, используйте глобальный поиск в конфигураторе (меню «Правка → Глобальный поиск» или Ctrl+Shift+F). Ищите имя документа, например РеализацияТоваровУслуг, с включённым поиском по свойствам метаданных.
Однако результаты нужно фильтровать вручную: имя документа встретится в правах, отчётах, критериях отбора и коде модулей. Вас интересуют только строки, относящиеся к объектам «ПодпискаНаСобытие». Метод полезен как дополнительный — он заодно покажет, где ещё в коде упоминается документ, что помогает найти «скрытую» логику, вызываемую из обработчиков подписок.
Способ 4: отладчик на реальном событии
Когда нужно понять не просто «какие подписки есть», а «что реально выполняется при проведении», самый наглядный способ — отладка. Включите отладку в конфигураторе (Сервис → Параметры → отладка), подключите нужный сеанс и установите точку останова.
Проблема в том, что точку нужно куда-то поставить. Практичный приём: поставьте точку останова на первой строке процедуры-обработчика любой найденной подписки, затем проведите документ. Когда отладчик остановится, изучите стек вызовов и пошагово пройдите дальше — вы увидите, какие ещё обработчики вызываются и в каком порядке.
Альтернатива — включить в конфигураторе остановку по ошибке и воспроизвести проблемное проведение: если подписка падает с ошибкой, отладчик покажет точное место и модуль.
Проверка расширений конфигурации
Подписки из расширений — частая причина «фантомного» поведения документов. Откройте в конфигураторе список расширений (Конфигурация → Расширения конфигурации), по очереди активируйте каждое расширение и посмотрите его дерево метаданных: ветка «Подписки на события» там тоже присутствует.
Программно список подключённых расширений можно получить через РасширенияКонфигурации.Получить(). Если расширений много, временно отключайте их по одному и проверяйте, исчезло ли аномальное поведение документа — так вы быстро локализуете источник проблемы.
Как убедиться, что найдены все обработчики
Признак полного результата — совпадение трёх независимых проверок: программный перебор метаданных, список подписок в расширениях и фактическое поведение в отладчике. Если в отладке срабатывает обработчик, которого нет в первых двух списках, — ищите дальше: возможно, код вызывается не через подписку, а из модуля объекта документа или из переопределяемых процедур БСП.
Дополнительно проверьте модуль объекта самого документа (процедуры ПередЗаписью, ПриЗаписи, ОбработкаПроведения) — часть логики может быть там, и её легко спутать с подпиской. Также в типовых решениях встречаются вызовы через «Выполнить» по имени процедуры, которые не видны статическим анализом.
Как проверить результат
Список стабилен при повторном запуске
Список меняется между сеансами — проверьте расширения
Сработали только найденные обработчики
Срабатывает код из неизвестного модуля
Логика учтена в общей картине
В модуле объекта есть неучтённые вызовы
Типичные ошибки при поиске подписок
Отдельно отметим ошибку с анализом только конфигуратора без запуска кода. Статический просмотр не показывает фактическую цепочку вызовов: обработчик подписки «ПередЗаписью» может вызывать регистрацию в планах обмена, проверку блокировок и ещё несколько механизмов. Полная картина получается только в связке «метаданные + отладка».
Что делать с найденными подписками дальше
Если цель — диагностика, зафиксируйте список подписок с событиями и обработчиками в отдельном документе: это ускорит будущие расследования. Если цель — изменение поведения, предпочтительный путь в типовых конфигурациях — не править типовую подписку, а создать собственную или использовать расширение: так изменения переживут обновления.
При добавлении своей подписки помните о производительности: обработчик срабатывает на каждое событие каждого объекта из источника. Тяжёлые запросы внутри обработчика «ПередЗаписью» заметно замедлят запись документов для всех пользователей.
Что важно запомнить
Все подписки к документу находятся перебором Метаданные.ПодпискиНаСобытия с проверкой Источник.СодержитТип(). Обязательно проверьте расширения и модуль объекта, а фактическую цепочку вызовов подтвердите отладчиком. Изменения вносятся через собственную подписку или расширение, после теста на копии базы.
Частые вопросы
Можно ли посмотреть подписки без конфигуратора, из пользовательского режима?
Напрямую — нет, в пользовательском интерфейсе такого инструмента нет. Но через внешнюю обработку «Консоль кода» или аналогичный инструмент разработчика можно выполнить программный перебор метаданных и получить полный список подписок прямо в режиме Предприятия, если у пользователя есть соответствующие права.
Почему подписка есть в списке, но обработчик не срабатывает?
Частые причины: общий модуль обработчика скомпилирован только для сервера, а вызов идёт в другом контексте; у пользователя нет прав на модуль; событие не наступает (например, документ записывается, а подписка на ОбработкаПроведения); либо внутри обработчика есть условие, которое отсекает ваш документ. Проверяйте отладчиком.
Как узнать, в каком порядке сработают несколько подписок на одно событие?
Платформа не гарантирует определённый порядок вызова подписок на одно событие. Фактический порядок можно увидеть только в отладчике в конкретном сеансе, но полагаться на него в логике нельзя — он может измениться после обновления конфигурации или подключения расширений.
Влияют ли подписки на скорость проведения документов?
Да. Каждый обработчик выполняется синхронно в транзакции записи или проведения. Если внутри подписки выполняются тяжёлые запросы или обходы больших выборок, это напрямую увеличивает время проведения для всех пользователей. Замерить вклад каждого обработчика можно через замеры производительности в конфигураторе.
Как временно отключить подписку для теста?
Безопасный способ — снять тип документа из свойства «Источник» на копии базы либо добавить в начало обработчика условие выхода. Не удаляйте подписку целиком: восстановить типовой объект бывает сложнее, чем вернуть источник. Все эксперименты проводите только на тестовой копии.
Подписки и обработчики в модуле объекта — в чём разница?
Обработчики в модуле объекта (ПередЗаписью, ПриЗаписи и др.) относятся только к этому виду документа и редактируются в его модуле. Подписка — внешний механизм: один обработчик в общем модуле может обслуживать сразу десятки видов документов и справочников. При записи объекта сначала отрабатывают события модуля объекта и подписки в переплетении, определяемом платформой.