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

Программист 1С v8.3 (Обычные формы)
← На главную

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

1. Активация режима «Остановка по ошибке»

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

  1. Перейдем в режим Конфигуратор.
  2. В главном меню выберем пункт Отладка, затем — Остановка по ошибке.
  3. В открывшемся окне установим флажок Останавливаться по ошибке.
  4. Рекомендуется также установить флажок Останавливаться по ошибке с отображением текста, чтобы сразу понимать контекст проблемы.

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

2. Проверка серверной отладки

Одной из наиболее частых причин, по которым точки останова в модуле объекта (где находится ОбработкаПроведения) не срабатывают, является выполнение кода на стороне сервера без включенного режима отладки. В платформе 8.2 и 8.3 код модуля объекта почти всегда исполняется на сервере. Если служба 1С:Предприятия запущена без ключа -debug, отладчик будет игнорировать все, что происходит вне клиентского сеанса.

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

  1. Остановить службу 1С:Предприятия на сервере.
  2. Добавить параметр -debug в строку запуска службы в реестре Windows.
  3. Запустить службу заново.

Только после этого точки останова в ОбработкаПроведения станут активными для серверных вызовов.

3. Анализ подписок на события

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

Если ошибка происходит внутри обработчика подписки, ваша точка останова в модуле документа вам не поможет, так как выполнение уходит в общий модуль подписки. Посмотрим, как найти такие подписки:

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

4. Проблема «тихих» исключений в блоках Попытка...Исключение

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

Рассмотрим пример кода, который может скрывать проблему:


Попытка
    // Какой-то сложный код проведения, например, расчет себестоимости
    ВыполнитьСложныйРасчет();
Исключение
    // Ошибка просто записывается в переменную, но не прерывает выполнение
    ТекстОшибки = ОписаниеОшибки();
    // Сообщение пользователю может быть неявным или вообще отсутствовать
КонецПопытки;

В этой ситуации проанализируем весь модуль на наличие конструкций Попытка...Исключение. Рекомендуется временно закомментировать эти блоки или добавить внутрь секции Исключение точку останова, чтобы поймать момент «тихого» сбоя.

5. Отладка фоновых заданий

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

  1. В конфигураторе откроем меню Отладка -> Подключения....
  2. Нажмем кнопку Автоматическое подключение.
  3. Установим флажок Фоновые задания.
  4. Теперь при запуске фонового процесса проведения отладчик автоматически «зацепится» за него и остановится на ваших точках останова.

6. Ошибки при завершении транзакции

Бывают случаи, когда весь код процедуры ОбработкаПроведения проходит успешно, и точка останова на последней строке срабатывает. Однако при выходе из процедуры (в момент фиксации транзакции базой данных) вылетает ошибка. Это может быть связано с проверкой уникальности записей в регистрах, нарушением ссылочной целостности или блокировками SQL.

Посмотрим на пример ситуации: вы записываете данные в регистр сведений, где установлен запрет на дублирование записей в рамках одного периода. Код 1С отрабатывает без ошибок, но СУБД отклоняет COMMIT. В этом случае поможет только Технологический журнал. Настроим файл logcfg.xml для сбора событий EXCP (Exceptions):


<config xmlns="http://v8.1c.ru/7.4/config/log">
  <log location="C:\v8_logs" history="24">
    <event>
      <eq property="Name" value="EXCP"/>
    </event>
    <property name="all"/>
  </log>
</config>

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

7. Различие событий формы и объекта

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

Резюмируем: для успешного «отлова» ошибки всегда начинайте с проверки ключа -debug на сервере и включения режима Остановка по ошибке. Если это не помогает — переходите к анализу подписок на события и проверке автоматического подключения к фоновым заданиям.

← На главную