Как получить описание ошибки при программной записи документа в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Базовый перехват ошибки через Попытка — Исключение

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

Посмотрим на пример базовой конструкции:


Попытка
    ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Исключение
    ТекстОшибки = ОписаниеОшибки();
    Сообщить("Не удалось записать документ: " + ТекстОшибки);
КонецПопытки;

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

Получение расширенной информации и стека вызовов

В современной платформе 1С:Предприятие 8.3 для получения максимально полной картины рекомендуется использовать специализированные функции работы с объектом ошибки — ИнформацияОбОшибке(), ПодробноеПредставлениеОшибки() и КраткоеПредставлениеОшибки().

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


Попытка
    ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Исключение
    Инфо = ИнформацияОбОшибке();
    ПодробныйТекст = ПодробноеПредставлениеОшибки(Инфо);
    Сообщить("Произошла ошибка при записи документа:" + Символы.ПС + ПодробныйТекст);
КонецПопытки;

Почему документ не записывается: основные причины и методы диагностики

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

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

Дополнительные инструменты поиска причин сбоя

Если текст ошибки малоинформативен, воспользуемся встроенными средствами платформы для локализации проблемы:

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