Как найти источник сообщения об ошибке в 1С, если не помогает глобальный поиск?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Рассмотрим одну из самых неприятных ситуаций, с которой сталкивается каждый разработчик 1С: при попытке записать документ система выдает ошибку с определенным текстом, но глобальный поиск по конфигурации (Ctrl+Shift+F) по этому тексту ничего не находит. Более того, точка останова в обработчике события ПриЗаписи документа даже не срабатывает. Кажется, что сообщение появляется из ниоткуда, но, конечно, это не так. Давайте вместе разберемся, как системно подойти к поиску такого «скрытого» кода и выявить причину проблемы.

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

Почему отладчик не доходит до события «ПриЗаписи»?

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

Рассмотрим упрощенную последовательность серверных событий для документа:

  1. ОбработкаПроверкиЗаполнения. Этот обработчик вызывается одним из первых и предназначен для проверки корректности и полноты данных. Если здесь обнаруживается ошибка, генерируется исключение (через вызов ВызватьИсключение) или массив с ошибками добавляется в специальный параметр. В любом случае, дальнейшая процедура записи прерывается. Это самый вероятный кандидат на источник нашей проблемы.
  2. ПередЗаписью. Этот обработчик выполняется непосредственно перед транзакцией записи в базу данных. Здесь также выполняются многочисленные проверки. Если какая-то из них не проходит, разработчик устанавливает параметр Отказ = Истина. Это штатный способ отменить запись, и после этого ПриЗаписи вызван не будет.
  3. ПриЗаписи. Этот обработчик срабатывает, только если все предыдущие проверки успешно пройдены. Он выполняется уже внутри транзакции записи и предназначен для выполнения сопутствующих действий, а не для проверок и отказов.

Таким образом, наша задача — найти код, который выполняется в обработчиках ОбработкаПроверкиЗаполнения или ПередЗаписью и отменяет запись.

Метод 1: Анализ подписок на события

Это самый частый источник «невидимого» кода в типовых конфигурациях. Подписка на событие — это механизм платформы, который позволяет выполнить процедуру из общего модуля при возникновении определенного события у объекта (например, перед записью документа). Это позволяет дорабатывать систему, не внося изменений в сам объект конфигурации, что удобно при обновлениях.

Разберем по шагам, как их найти:

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

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

Метод 2: Мощный инструмент — Замер производительности

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

Как его использовать для нашей задачи:

  1. В режиме предприятия откройте меню Сервис и настройки -> Функции для технического специалиста.
  2. В открывшемся окне найдите и запустите обработку «Оценка производительности».
  3. Нажмите на кнопку «Включить замер производительности».
  4. Теперь вернитесь к вашей обработке или форме документа и выполните действие, которое вызывает ошибку (например, нажмите кнопку «Записать»).
  5. Сразу после появления сообщения об ошибке вернитесь в окно «Оценка производительности» и нажмите «Выключить замер производительности».
  6. В отчете, который сформирует система, вы увидите дерево всех выполненных вызовов. Внимательно проанализируйте его снизу вверх или поиском по ключевым словам. Вы гарантированно увидите, какая именно процедура была последней перед отменой операции, и сможете перейти к ее коду прямо из отчета.

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

Метод 3: «Умный» глобальный поиск

Иногда глобальный поиск все же может помочь, если использовать его правильно. Прямой поиск полной фразы сообщения часто не работает по одной простой причине: строка сообщения может формироваться динамически из нескольких частей.

Например, код может выглядеть так:


ТекстСообщения = "Запрещено создавать документ %1, если контрагент %2";
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%1", "в заказе клиента");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%2", "является головным");
ВызватьИсключение ТекстСообщения;

В этом случае поиск по полной фразе ничего не даст. Что делать?

Метод 4: Проверка нетипичных мест хранения кода и текста

Если ничего из вышеперечисленного не помогло, возможно, вы столкнулись с более изощренным способом реализации. Рассмотрим редкие, но возможные варианты.

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

← На главную