К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как записать ошибку в журнал регистрации 1С

Как программно записать ошибку в журнал регистрации 1С через ЗаписьЖурналаРегистрации: синтаксис, уровни, примеры кода, типичные ошибки и проверка результата.

Журнал регистрации — штатный механизм платформы 1С:Предприятие, который фиксирует события работы системы: действия пользователей, ошибки, изменения данных, запуск фоновых заданий. Когда в прикладном коде возникает исключение, разработчик может сам записать его в журнал, чтобы потом найти причину сбоя, не подключая отладчик. Это особенно важно для серверных процедур, фоновых заданий и регламентных операций, где ошибка иначе останется незамеченной.

Для программной записи используется метод ЗаписьЖурналаРегистрации(), доступный на сервере и на клиенте. Он принимает имя события, уровень важности, объект метаданных, ссылку на данные, текст сообщения и режим транзакции. Ниже разобраны синтаксис, готовые примеры для типовых сценариев и ошибки, из-за которых записи теряются или засоряют журнал.

Как устроен метод ЗаписьЖурналаРегистрации

Метод вызывается с позиционными параметрами, большинство из которых необязательны. Минимально осмысленный вызов выглядит так: ЗаписьЖурналаРегистрации("Обмен данными", УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);. Первый параметр — имя события, по которому потом удобно фильтровать журнал. Рекомендуется использовать иерархические имена через точку, например "Обмен данными.Загрузка заказов", — тогда события одной подсистемы группируются вместе.

Остальные параметры: уровень важности (Ошибка, Предупреждение, Информация, Примечание), объект метаданных (например, Метаданные.Документы.РеализацияТоваровУслуг), ссылка на данные, связанные с событием, текст сообщения и режим транзакции. Заполнение метаданных и ссылки делает запись интерактивной: в просмотре журнала по ней можно перейти к объекту одним кликом, что сильно ускоряет разбор инцидента.

Запись ошибки из обработчика исключения

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

Типовой фрагмент кода для серверной процедуры обмена:

Попытка

ВыполнитьОбмен(ПараметрыОбмена);

Исключение

ИнфоОшибки = ИнформацияОбОшибке();

ЗаписьЖурналаРегистрации(

"Обмен данными.Загрузка заказов",

УровеньЖурналаРегистрации.Ошибка,

Метаданные.Обработки.ОбменССайтом,

,

ПодробноеПредставлениеОшибки(ИнфоОшибки));

ВызватьИсключение КраткоеПредставлениеОшибки(ИнфоОшибки);

КонецПопытки;

Обратите внимание на пару функций КраткоеПредставлениеОшибки() и ПодробноеПредставлениеОшибки(). Краткое представление — однострочный текст, понятный пользователю; подробное — многострочный технический текст с модулем и строкой кода, который и нужно писать в журнал. Смешивать их местами — распространённая ошибка: пользователю показывают простыню технического текста, а в журнал попадает неинформативная одна строка.

bsl
ЗаписьЖурналаРегистрации("Обмен данными", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));

Выбор уровня важности события

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

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

Какой уровень выбрать

Ошибка

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

Предупреждение

Операция завершена, но есть отклонение: не найден контрагент, пропущена строка. Позволяет отслеживать деградацию качества данных.

Информация / Примечание

Штатные события и отладочные детали. В рабочей базе пишите умеренно, чтобы не раздувать журнал.

Запись с привязкой к данным и в транзакции

Параметр «Данные» принимает ссылку на объект базы — документ, элемент справочника, запись регистра. Если ошибка произошла при проведении конкретного документа, передайте его ссылку: ЗаписьЖурналаРегистрации("Проведение", УровеньЖурналаРегистрации.Ошибка, Метаданные.Документы.РеализацияТоваровУслуг, ДокументСсылка, ТекстОшибки);. В просмотре журнала запись будет содержать гиперссылку на документ.

Отдельная тонкость — шестой параметр, режим транзакции. Если запись делается внутри обработчика исключения, а транзакция будет отменена, то и запись журнала, выполненная в той же транзакции, откатится вместе с данными. Чтобы этого избежать, укажите РежимТранзакцииЗаписиЖурналаРегистрации.Независимая — тогда событие зафиксируется независимо от исхода основной транзакции.

Как найти и проверить записанную ошибку

После выполнения кода откройте журнал регистрации: в режиме предприятия это «Администрирование — Обслуживание — Журнал регистрации» (в типовых конфигурациях путь может немного отличаться), в конфигураторе — меню «Администрирование — Журнал регистрации». Установите отбор по уровню «Ошибка» и по имени события, которое вы указали в коде.

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

Контрольные точки

Как проверить качество записи

Имя события
Норма

Иерархическое, например «Обмен данными.Загрузка заказов» — легко фильтруется

Тревожный признак

Пустое или общее «Ошибка» — запись не найти среди тысяч других

Текст сообщения
Норма

Подробное представление: модуль, строка, описание, вложенная причина

Тревожный признак

Одна общая фраза без указания места сбоя

Привязка к данным
Норма

Заполнены метаданные и ссылка, из журнала можно перейти к объекту

Тревожный признак

Объект не указан, приходится искать документ вручную

Типичные ошибки при работе с журналом

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

Вторая ошибка — логирование в цикле без агрегации. Если обмен обрабатывает десять тысяч строк и на каждой ошибке пишет отдельную запись, журнал раздувается, а его просмотр становится мучением. Лучше накапливать ошибки в массив или таблицу и писать одну сводную запись на пакет, а в предупреждения уровня «Информация» — счётчики успешных и неуспешных строк.

Типичные ошибки
01
Запись в журнал без перевыброса исключения — вызывающий код считает операцию успешной, сбой остаётся незамеченным
02
Использование ОписаниеОшибки() вместо ПодробноеПредставлениеОшибки — в журнал попадает текст без модуля и строки, диагностика затруднена
03
Запись внутри откатываемой транзакции без режима Независимая — событие исчезает вместе с откатом данных
04
Логирование каждой строки большого цикла — журнал переполняется и замедляется его просмотр
05
Уровень «Ошибка» для информационных сообщений — реальные сбои тонут в шуме

Ограничения и альтернативы журналу регистрации

Журнал регистрации не предназначен для бизнес-логики: записи нельзя редактировать, удалять выборочно по условию и строить по ним произвольные отчёты внутри прикладного решения. Очистка выполняется только по периоду («Сократить» в окне журнала), а объём хранимого текста сообщения ограничен платформой — слишком длинные строки обрезаются.

Если нужно хранить историю ошибок для показа пользователям, строить по ней отчёты или связывать с бизнес-объектами, заведите прикладной регистр сведений «Ошибки обмена» или справочник инцидентов, а в журнал регистрации пишите техническую копию для администратора. Для централизованного сбора ошибок из нескольких баз используйте внешние системы мониторинга через HTTP-вызовы или технологический журнал платформы.

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

Частые вопросы

Можно ли записать в журнал регистрации с клиента?

Да, метод ЗаписьЖурналаРегистрации доступен и в клиентском контексте — платформа сама передаст запись на сервер. Однако для массового логирования лучше собирать сообщения на клиенте и отправлять их одним серверным вызовом, чтобы не плодить обращения к серверу.

Почему моей записи нет в журнале, хотя код выполнился?

Наиболее вероятные причины: запись сделана внутри транзакции, которая затем откатилась (нужен режим Независимая), либо в просмотре журнала установлен отбор, отсекающий событие по уровню, дате или пользователю. Сбросьте отбор и проверьте нужный период.

Чем ОписаниеОшибки() отличается от ИнформацияОбОшибке()?

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

Как ограничить рост журнала регистрации?

Пишите в рабочей базе только значимые события, агрегируйте ошибки циклов в сводные записи и периодически сокращайте журнал через кнопку «Сократить» в окне просмотра, указывая дату, до которой удалить старые события. Перед сокращением можно выгрузить журнал в файл для архива.

Можно ли писать в журнал из фонового задания?

Да, и это основной способ диагностики фоновых заданий: их ошибки иначе видны только в списке заданий с коротким текстом. Записывайте подробное представление ошибки с уникальным именем события задания, чтобы быстро находить его сбои отбором.

Видит ли запись об ошибке обычный пользователь?

Доступ к просмотру журнала регистрации определяется правами роли (право «Журнал регистрации» / «Просмотр журнала регистрации»). Обычно его имеют администраторы. Поэтому пользователю текст ошибки нужно показывать отдельно — через сообщение или исключение, а не рассчитывать, что он откроет журнал.

Итог

Что важно запомнить

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