Разработка и Конфигурация · 11 мин
Как получить текст ошибки в 1С
Как получить текст ошибки в 1С: ОписаниеОшибки(), ИнформацияОбОшибке(), журнал регистрации, технологический журнал. Примеры кода и типичные ошибки.
Когда код 1С падает с исключением, самое ценное — это текст ошибки: без него невозможно понять ни причину сбоя, ни способ исправления. Пользователи часто видят только общее окно «Ошибка при выполнении операции», а настоящее описание скрывается в деталях исключения, журнале регистрации или логах сервера.
Встроенный язык 1С предоставляет несколько инструментов для извлечения текста ошибки: функции ОписаниеОшибки(), ИнформацияОбОшибке(), ПодробноеОписаниеОшибки() и КраткоеПредставлениеОшибки(). У каждого инструмента свои ограничения и сценарии применения, и выбор неправильного часто приводит к потере важной части диагностики.
Ниже разобраны все рабочие способы получения текста ошибки: внутри конструкции «Попытка — Исключение», через объект ИнформацияОбОшибке с цепочкой причин, через журнал регистрации и технологический журнал, а также типичные ошибки, из-за которых текст теряется или оказывается бесполезным.
Получение текста ошибки через ОписаниеОшибки()
Самый простой способ — функция ОписаниеОшибки(). Она доступна только внутри блока Исключение конструкции Попытка ... Исключение ... КонецПопытки и возвращает строку с описанием текущей ошибки.
Попытка
Результат = 1 / 0;
Исключение
ТекстОшибки = ОписаниеОшибки();
Сообщить(ТекстОшибки);
КонецПопытки;
У этого способа есть важное ограничение: ОписаниеОшибки() возвращает только краткое описание верхнего уровня исключения. Если ошибка была вызвана вложенной ошибкой (например, запрос упал из-за отсутствия прав, а это, в свою очередь, из-за настроек ролей), цепочка причин будет потеряна. Кроме того, вне блока «Исключение» функция вернёт пустую строку — это частая причина «пустых» сообщений в логах.
Используйте ОписаниеОшибки() для простых сценариев: показать пользователю понятное сообщение, записать короткую строку в лог обмена, прервать операцию с понятным комментарием. Для полноценной диагностики этого недостаточно — переходите к объекту ИнформацияОбОшибке.
Детальная информация через ИнформацияОбОшибке()
Функция ИнформацияОбОшибке() возвращает объект с полной структурой исключения. У него есть полезные свойства: Описание (краткий текст), ИмяМодуля (где произошла ошибка), НомерСтроки, ИсходнаяСтрока (фрагмент кода) и самое важное — Причина, которое содержит вложенный объект ИнформацияОбОшибке, если ошибка была спровоцирована другой ошибкой.
Попытка
ВыполнитьОперацию();
Исключение
Инфо = ИнформацияОбОшибке();
Пока Инфо <> Неопределено Цикл
Сообщить("Ошибка: " + Инфо.Описание);
Сообщить("Модуль: " + Инфо.ИмяМодуля + ", строка " + Инфо.НомерСтроки);
Инфо = Инфо.Причина;
КонецЦикла;
КонецПопытки;
Такой обход по цепочке Причина позволяет восстановить полную картину: верхний уровень показывает, что увидел пользователь, а вложенные уровни — первопричину. Именно в глубине цепочки обычно находятся тексты ошибок СУБД, COM-соединений и HTTP-запросов, которые на верхнем уровне заменяются общими фразами.
Проверьте, что функция вызывается строго между Исключение и КонецПопытки
Используйте ИнформацияОбОшибке() и перебор вложенных Причина
Снимите фильтры в журнале, проверьте режим регистрации событий
Подробное и краткое представление ошибки
В дополнение к перебору свойств есть две готовые функции платформы: ПодробноеОписаниеОшибки(ИнфоОшибки) и КраткоеПредставлениеОшибки(ИнфоОшибки). Они принимают объект, полученный через ИнформацияОбОшибке(), и формируют строковое представление.
КраткоеПредставлениеОшибки() возвращает короткий текст, подходящий для показа пользователю или записи в поле ограниченной длины. ПодробноеОписаниеОшибки() выдаёт развёрнутый текст, включая вложенные причины и, во многих случаях, информацию о месте возникновения. Именно подробное описание стоит писать в журнал регистрации, в письма администратору и в логи обменов.
Попытка
ЗаписьJSON = ПрочитатьДанныеИзСервиса();
Исключение
Инфо = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("Обмен с сервисом",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеОписаниеОшибки(Инфо));
ВызватьИсключение КраткоеПредставлениеОшибки(Инфо);
КонецПопытки;
Как найти текст ошибки в журнале регистрации
Если ошибка произошла вне вашего кода — в фоновом задании, при проведении документа, у другого пользователя — искать её нужно в журнале регистрации. Откройте Конфигуратор и перейдите: Администрирование → Журнал регистрации.
Чтобы быстро найти нужное событие, настройте отбор: укажите период, уровень важности «Ошибка», пользователя и, при необходимости, подстроку из текста. В колонке «Комментарий» и в деталях события будет полный текст ошибки, включая стек вызовов, если ошибка зафиксирована платформой.
Обратите внимание: события, которые ваш код записывает через ЗаписьЖурналаРегистрации(), появляются в журнале с тем уровнем и представлением, которые вы указали. Если при записи вы передали только краткое представление, подробности в журнале уже не восстановить — поэтому в лог всегда пишите подробное описание.
- 1Откройте Конфигуратор → Администрирование → Журнал регистрации
- 2Установите отбор: уровень Ошибка, нужный период и пользователь
- 3Откройте событие двойным щелчком и скопируйте полный текст ошибки
- 4Если событий нет — снимите все фильтры и повторите поиск за более широкий период
Технологический журнал для ошибок сервера и СУБД
Часть ошибок не попадает даже в журнал регистрации: падения рабочих процессов, ошибки СУБД на уровне драйвера, взаимные блокировки, таймауты. Для них существует технологический журнал — текстовые логи, которые платформа пишет при включённой настройке в файле logcfg.xml.
Чтобы включить сбор, создайте файл logcfg.xml в каталоге конфигурации платформы (подкаталог conf рядом с исполняемыми файлами сервера или клиента) и укажите нужные события: EXCP (исключения), DBMSSQL или DBPOSTGRS (запросы и ошибки СУБД), LOCK (блокировки), TDEADLOCK (взаимоблокировки). После воспроизведения ошибки в указанном каталоге появятся логи с подробным текстом.
Ошибки в фоновых заданиях и веб-сервисах
Фоновые задания — отдельный случай: исключение внутри них не показывается пользователю, а текст ошибки доступен через свойство объекта фонового задания. В консоли заданий или программно его можно получить так:
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИД);
Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
ТекстОшибки = ПодробноеОписаниеОшибки(Задание.ИнформацияОбОшибке);
КонецЕсли;
При работе через веб-сервисы и HTTP-запросы текст ошибки часто находится не в исключении, а в теле ответа сервера. Проверяйте код состояния HTTP и читайте тело ответа даже при ошибке — многие сервисы возвращают осмысленное описание в JSON или XML, а платформа при этом выбрасывает только общее «Ошибка при вызове метода контекста».
Сравнение вариантов
Быстро и просто, но только краткий текст верхнего уровня и только внутри Исключение
Полная цепочка причин и место ошибки; требует чуть больше кода
Подходит для ошибок вне вашего кода и в фоне; зависит от того, что было записано
Единственный источник для ошибок СУБД и падений сервера; требует настройки и осторожности на проде
Типичные ошибки при получении текста ошибки
Первая и самая частая проблема — перехват исключения с «проглатыванием»: блок Исключение пуст или содержит только Сообщить("Ошибка!") без текста. В результате диагностика невозможна, а пользователь видит бесполезное сообщение. Если вы перехватываете исключение, всегда сохраняйте хотя бы подробное описание в журнал регистрации.
Вторая ошибка — повторный вызов ВызватьИсключение с собственной строкой вместо исходного текста. При этом исходная причина теряется. Если нужно дополнить сообщение, используйте конструкцию ВызватьИсключение ОписаниеОшибки() или создавайте новое исключение, сохраняя исходное в причине через объект ИнформацияОбОшибке.
Третья группа ошибок связана с ожиданиями от журнала регистрации: разработчик ищет там ошибки, которые платформа не регистрирует (например, перехваченные и не записанные вами исключения), или ищет с активными фильтрами. Прежде чем делать вывод «ошибки не было», снимите все отборы и расширьте период поиска.
Что важно запомнить
Для краткого текста используйте ОписаниеОшибки() внутри Исключение, для полной диагностики — ИнформацияОбОшибке() с ПодробноеОписаниеОшибки() и обход цепочки Причина. Ошибки вне вашего кода ищите в журнале регистрации, а ошибки СУБД и сервера — в технологическом журнале. Всегда логируйте подробное описание: восстановить потерянный текст ошибки задним числом нельзя.
Частые вопросы
Чем ОписаниеОшибки() отличается от ИнформацияОбОшибке()?
ОписаниеОшибки() возвращает простую строку с кратким текстом текущего исключения. ИнформацияОбОшибке() возвращает объект со структурой: описание, модуль, номер строки и вложенная причина. Для диагностики сложных сбоев всегда предпочтительнее объект, так как он сохраняет всю цепочку причин.
Почему ОписаниеОшибки() возвращает пустую строку?
Функция работает только внутри блока Исключение конструкции Попытка–Исключение. Если вызвать её в обычном коде, после КонецПопытки или в процедуре, вызванной из обработчика исключения, результат будет пустым. Передавайте текст ошибки параметром, если он нужен за пределами блока.
Как получить текст ошибки, которая произошла у другого пользователя?
Свой код для этого не нужен: откройте журнал регистрации в Конфигураторе (Администрирование → Журнал регистрации), установите отбор по пользователю и уровню «Ошибка» и откройте найденное событие — полный текст будет в деталях события. Если ошибка перехвачена кодом без записи в журнал, её там не будет.
Как сохранить текст ошибки в журнал регистрации из кода?
Используйте ЗаписьЖурналаРегистрации() с уровнем «Ошибка» и передайте в параметр комментария ПодробноеОписаниеОшибки(ИнформацияОбОшибке()). Так в журнал попадёт полная цепочка причин, а не только верхнее сообщение.
Где искать текст ошибки, если её нет ни в исключении, ни в журнале регистрации?
Так бывает при ошибках СУБД, взаимоблокировках и падениях рабочих процессов. Включите технологический журнал через файл logcfg.xml с событиями EXCP и событиями вашей СУБД, воспроизведите ошибку и проанализируйте логи. После диагностики логирование отключите, чтобы не нагружать сервер.
Как не потерять исходную ошибку при повторном вызове исключения?
Используйте ВызватьИсключение без параметров — тогда исходное исключение пробрасывается дальше целиком. Если нужно добавить своё сообщение, сформируйте его через КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), а подробный текст предварительно запишите в журнал регистрации.