Сталкиваясь с ошибками в работе пользователей, мы первым делом обращаемся к журналу регистрации. Это мощный инструмент для анализа сбоев и нештатных ситуаций. Однако часто можно заметить, что для событий с уровнем "Ошибка" поля "Метаданные" и "Данные" остаются пустыми. Это сильно затрудняет отладку, ведь непонятно, в каком именно документе, справочнике или отчете пользователь столкнулся с проблемой. Давайте разберемся, почему так происходит и как все-таки выяснить источник ошибки.
Основная причина, по которой при возникновении ошибки контекст (метаданные и данные) не записывается, заключается в том, где именно в коде происходит сбой. Рассмотрим два сценария:
Таким образом, пустые поля "Метаданные" и "Данные" при ошибке — это часто не сбой в работе журнала, а штатное поведение платформы в ситуациях, когда контекст выполнения не определен.
Прежде чем переходить к сложным методам, давайте рассмотрим два базовых шага, которые помогут локализовать проблему.
Шаг 1. Проверка целостности файла журнала
Иногда причиной некорректной записи может быть поврежденный файл журнала (с расширением .lgd в формате SQLite). Чтобы исключить эту вероятность, можно создать новый, "чистый" журнал. Делается это так:
1Cv8.lgd).1Cv8Log и внутри него — файл журнала .lgd.После этой операции проверьте, изменилось ли поведение при записи ошибок. Если нет — проблема не в файле, и мы переходим к следующему шагу.
Шаг 2. Анализ событий, предшествующих ошибке
Это самый эффективный и простой способ определить контекст. Часто на рабочих базах в настройках журнала регистрации включают запись только событий "Ошибка" и "Предупреждение", чтобы журнал не разрастался. Но для анализа такой отбор скрывает самое важное — действия пользователя.
Разберем по шагам, как действовать:
Эта последовательность с высокой долей вероятности укажет на тот самый объект, при работе с которым произошел сбой. Вы сможете понять, какой документ пользователь пытался открыть, записать или провести, и уже предметно анализировать код, связанный с этими действиями.
Если анализ журнала не дал результатов или ошибка слишком сложная, можно прибегнуть к более мощным инструментам.
1. Использование Технологического журнала (ТЖ)
Технологический журнал — это инструмент для низкоуровневой диагностики работы платформы 1С. Он позволяет получить гораздо больше деталей, чем стандартный журнал регистрации. Для отлова ошибок нас интересует событие EXCP (исключения).
Настроив сбор дампов по событию EXCP, вы получите полный стек вызовов процедур и функций, который привел к ошибке. Это позволит точно определить не только проблемный объект, но и конкретную строку кода в конфигурации, которая вызвала сбой, даже если она находится в общем модуле.
2. Программная запись в журнал регистрации
Хотя этот способ требует внесения изменений в конфигурацию, он обеспечивает стопроцентную запись нужного контекста в журнал. Идея заключается в том, чтобы "обернуть" потенциально проблемные участки кода в конструкцию Попытка-Исключение и в блоке обработки исключения принудительно записать в журнал всю необходимую информацию.
Для этого используется метод ЗаписьЖурналаРегистрации(). Посмотрим на пример:
Предположим, у нас есть код, который иногда вызывает ошибку при записи документа.
Попытка
// Какой-то код, который может вызвать ошибку
ПроблемныйОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
// Перехватываем ошибку и формируем подробную запись в журнал
ТекстДляЖурнала = "Произошла ошибка при проведении документа. " + ОписаниеОшибки();
// Выполняем запись в журнал, явно указывая все параметры
ЗаписьЖурналаРегистрации(
"ПроведениеДокумента.Ошибка", // Уникальное имя события для удобства отбора
УровеньЖурналаРегистрации.Ошибка,
ПроблемныйОбъект.Метаданные(), // Метаданные объекта
ПроблемныйОбъект.Ссылка, // Данные (ссылка на объект)
String(ПроблемныйОбъект), // Представление данных для наглядности
ТекстДляЖурнала // Комментарий с детальным описанием ошибки
);
// Можно также сообщить пользователю о проблеме
Сообщить("Не удалось провести документ. Информация об ошибке записана в журнал.");
КонецПопытки;
Такой подход позволяет гарантированно зафиксировать и Метаданные, и Данные, и их представление, что сделает запись об ошибке в журнале максимально информативной.