Разработка и Конфигурация · 10 мин
Как записать ошибку в журнал регистрации 1С
Как программно записать ошибку в журнал регистрации 1С через ЗаписьЖурналаРегистрации: синтаксис, уровни, примеры кода, типичные ошибки и проверка результата.
Журнал регистрации — штатный механизм платформы 1С:Предприятие, который фиксирует события работы системы: действия пользователей, ошибки, изменения данных, запуск фоновых заданий. Когда в прикладном коде возникает исключение, разработчик может сам записать его в журнал, чтобы потом найти причину сбоя, не подключая отладчик. Это особенно важно для серверных процедур, фоновых заданий и регламентных операций, где ошибка иначе останется незамеченной.
Для программной записи используется метод ЗаписьЖурналаРегистрации(), доступный на сервере и на клиенте. Он принимает имя события, уровень важности, объект метаданных, ссылку на данные, текст сообщения и режим транзакции. Ниже разобраны синтаксис, готовые примеры для типовых сценариев и ошибки, из-за которых записи теряются или засоряют журнал.
Как устроен метод ЗаписьЖурналаРегистрации
Метод вызывается с позиционными параметрами, большинство из которых необязательны. Минимально осмысленный вызов выглядит так: ЗаписьЖурналаРегистрации("Обмен данными", УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);. Первый параметр — имя события, по которому потом удобно фильтровать журнал. Рекомендуется использовать иерархические имена через точку, например "Обмен данными.Загрузка заказов", — тогда события одной подсистемы группируются вместе.
Остальные параметры: уровень важности (Ошибка, Предупреждение, Информация, Примечание), объект метаданных (например, Метаданные.Документы.РеализацияТоваровУслуг), ссылка на данные, связанные с событием, текст сообщения и режим транзакции. Заполнение метаданных и ссылки делает запись интерактивной: в просмотре журнала по ней можно перейти к объекту одним кликом, что сильно ускоряет разбор инцидента.
Запись ошибки из обработчика исключения
Самый частый сценарий — фиксация ошибки в конструкции Попытка ... Исключение ... КонецПопытки. Внутри блока Исключение доступна функция ОписаниеОшибки(), возвращающая текст текущего исключения. Для более подробной диагностики используют ИнформацияОбОшибке() — объект с полями Описание, ИмяМодуля, НомерСтроки, ИсходнаяСтрока и вложенной Причина для цепочек исключений.
Типовой фрагмент кода для серверной процедуры обмена:
Попытка
ВыполнитьОбмен(ПараметрыОбмена);
Исключение
ИнфоОшибки = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации(
"Обмен данными.Загрузка заказов",
УровеньЖурналаРегистрации.Ошибка,
Метаданные.Обработки.ОбменССайтом,
,
ПодробноеПредставлениеОшибки(ИнфоОшибки));
ВызватьИсключение КраткоеПредставлениеОшибки(ИнфоОшибки);
КонецПопытки;
Обратите внимание на пару функций КраткоеПредставлениеОшибки() и ПодробноеПредставлениеОшибки(). Краткое представление — однострочный текст, понятный пользователю; подробное — многострочный технический текст с модулем и строкой кода, который и нужно писать в журнал. Смешивать их местами — распространённая ошибка: пользователю показывают простыню технического текста, а в журнал попадает неинформативная одна строка.
ЗаписьЖурналаРегистрации("Обмен данными", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));Выбор уровня важности события
Платформа поддерживает четыре уровня: Ошибка, Предупреждение, Информация и Примечание. Правильный выбор уровня важен, потому что администраторы обычно настраивают отбор журнала именно по уровню «Ошибка» — если писать всё подряд с этим уровнем, реальные сбои потеряются среди шума.
Практическое правило: Ошибка — операция не выполнена и требует вмешательства; Предупреждение — операция выполнена, но с отклонением (пропущена часть данных, сработал запасной сценарий); Информация — штатное значимое событие (старт и завершение обмена); Примечание — отладочные детали, которые в рабочей базе обычно не нужны.
Какой уровень выбрать
Операция прервана исключением, данные не записаны. Используйте только для реальных сбоев, иначе журнал заполнится ложными тревогами.
Операция завершена, но есть отклонение: не найден контрагент, пропущена строка. Позволяет отслеживать деградацию качества данных.
Штатные события и отладочные детали. В рабочей базе пишите умеренно, чтобы не раздувать журнал.
Запись с привязкой к данным и в транзакции
Параметр «Данные» принимает ссылку на объект базы — документ, элемент справочника, запись регистра. Если ошибка произошла при проведении конкретного документа, передайте его ссылку: ЗаписьЖурналаРегистрации("Проведение", УровеньЖурналаРегистрации.Ошибка, Метаданные.Документы.РеализацияТоваровУслуг, ДокументСсылка, ТекстОшибки);. В просмотре журнала запись будет содержать гиперссылку на документ.
Отдельная тонкость — шестой параметр, режим транзакции. Если запись делается внутри обработчика исключения, а транзакция будет отменена, то и запись журнала, выполненная в той же транзакции, откатится вместе с данными. Чтобы этого избежать, укажите РежимТранзакцииЗаписиЖурналаРегистрации.Независимая — тогда событие зафиксируется независимо от исхода основной транзакции.
Как найти и проверить записанную ошибку
После выполнения кода откройте журнал регистрации: в режиме предприятия это «Администрирование — Обслуживание — Журнал регистрации» (в типовых конфигурациях путь может немного отличаться), в конфигураторе — меню «Администрирование — Журнал регистрации». Установите отбор по уровню «Ошибка» и по имени события, которое вы указали в коде.
Проверьте, что запись содержит всё необходимое для диагностики: понятное имя события, полный текст ошибки с модулем и строкой, ссылку на объект данных. Если вместо подробного текста видно одну общую фразу — значит, в коде использовано краткое представление ошибки или потерян вызов ИнформацияОбОшибке().
Как проверить качество записи
Иерархическое, например «Обмен данными.Загрузка заказов» — легко фильтруется
Пустое или общее «Ошибка» — запись не найти среди тысяч других
Подробное представление: модуль, строка, описание, вложенная причина
Одна общая фраза без указания места сбоя
Заполнены метаданные и ссылка, из журнала можно перейти к объекту
Объект не указан, приходится искать документ вручную
Типичные ошибки при работе с журналом
Первая ошибка — писать в журнал вместо того, чтобы пробросить исключение выше. Если процедура «проглотила» исключение, записала его и завершилась успешно, вызывающий код считает операцию выполненной, а пользователь не узнает о сбое. Правильный шаблон: записать подробности в журнал и перевыбросить исключение командой ВызватьИсключение.
Вторая ошибка — логирование в цикле без агрегации. Если обмен обрабатывает десять тысяч строк и на каждой ошибке пишет отдельную запись, журнал раздувается, а его просмотр становится мучением. Лучше накапливать ошибки в массив или таблицу и писать одну сводную запись на пакет, а в предупреждения уровня «Информация» — счётчики успешных и неуспешных строк.
Ограничения и альтернативы журналу регистрации
Журнал регистрации не предназначен для бизнес-логики: записи нельзя редактировать, удалять выборочно по условию и строить по ним произвольные отчёты внутри прикладного решения. Очистка выполняется только по периоду («Сократить» в окне журнала), а объём хранимого текста сообщения ограничен платформой — слишком длинные строки обрезаются.
Если нужно хранить историю ошибок для показа пользователям, строить по ней отчёты или связывать с бизнес-объектами, заведите прикладной регистр сведений «Ошибки обмена» или справочник инцидентов, а в журнал регистрации пишите техническую копию для администратора. Для централизованного сбора ошибок из нескольких баз используйте внешние системы мониторинга через HTTP-вызовы или технологический журнал платформы.
Удобно оформить запись в журнал как единую процедуру общего модуля, например ЗаписатьОшибку(ИмяСобытия, ИнфоОшибки, Данные). Тогда во всех местах кода будет одинаковый формат событий, а изменить правила логирования можно в одной точке.
Частые вопросы
Можно ли записать в журнал регистрации с клиента?
Да, метод ЗаписьЖурналаРегистрации доступен и в клиентском контексте — платформа сама передаст запись на сервер. Однако для массового логирования лучше собирать сообщения на клиенте и отправлять их одним серверным вызовом, чтобы не плодить обращения к серверу.
Почему моей записи нет в журнале, хотя код выполнился?
Наиболее вероятные причины: запись сделана внутри транзакции, которая затем откатилась (нужен режим Независимая), либо в просмотре журнала установлен отбор, отсекающий событие по уровню, дате или пользователю. Сбросьте отбор и проверьте нужный период.
Чем ОписаниеОшибки() отличается от ИнформацияОбОшибке()?
ОписаниеОшибки() возвращает только текст текущего исключения. ИнформацияОбОшибке() возвращает структуру с описанием, именем модуля, номером строки и вложенной причиной — для журнала информативнее именно она через ПодробноеПредставлениеОшибки().
Как ограничить рост журнала регистрации?
Пишите в рабочей базе только значимые события, агрегируйте ошибки циклов в сводные записи и периодически сокращайте журнал через кнопку «Сократить» в окне просмотра, указывая дату, до которой удалить старые события. Перед сокращением можно выгрузить журнал в файл для архива.
Можно ли писать в журнал из фонового задания?
Да, и это основной способ диагностики фоновых заданий: их ошибки иначе видны только в списке заданий с коротким текстом. Записывайте подробное представление ошибки с уникальным именем события задания, чтобы быстро находить его сбои отбором.
Видит ли запись об ошибке обычный пользователь?
Доступ к просмотру журнала регистрации определяется правами роли (право «Журнал регистрации» / «Просмотр журнала регистрации»). Обычно его имеют администраторы. Поэтому пользователю текст ошибки нужно показывать отдельно — через сообщение или исключение, а не рассчитывать, что он откроет журнал.
Что важно запомнить
Пишите ошибки методом ЗаписьЖурналаРегистрации с уровнем «Ошибка», подробным представлением из ИнформацияОбОшибке(), привязкой к метаданным и данным. В обработчиках исключений используйте независимый режим транзакции и перевыбрасывайте исключение, а результаты проверяйте отбором по имени события в журнале.