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