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