Свои события в журнале регистрации 1С: уровень, код и проверка
Содержание
Записать событие в журнал регистрации 1С можно двумя путями. Платформа сама пишет туда вход пользователей, изменение данных и ошибки, если уровень журнала это разрешает. Свои события пишут из кода методом ЗаписьЖурналаРегистрации(), на сервере.
Порядок такой: сначала проверяете уровень регистрации в конфигураторе, затем вызываете метод с понятным именем события, затем находите запись в журнале через отбор. Если уровень стоит «только ошибки», информационная запись из кода просто не сохранится, и это главная причина вопроса «почему ничего не пишется».
1. Уровень журналирования: что база вообще сохраняет
Журнал регистрации ведётся платформой для каждой информационной базы отдельно. Что попадёт в него, решает один параметр — уровень регистрации.
Где его настроить:
- Откройте базу в режиме
Конфигуратор. - Меню
Администрирование → Настройка журнала регистрации. - Выберите уровень и, при необходимости, период разделения журнала.
- Нажмите «ОК». Настройка применяется сразу, перезапуск базы не нужен.
Уровни вложены друг в друга: каждый следующий включает предыдущие.
| Уровень | Что сохраняется | Когда выбирать |
|---|---|---|
| Не регистрировать | Ничего | Почти никогда: теряется история входов и ошибок |
| Ошибки | Только события с важностью «Ошибка» | Слабый диск, огромный поток событий |
| Ошибки и предупреждения | Плюс «Предупреждение» | Компромисс для нагруженных баз |
| Ошибки, предупреждения, информация | Плюс «Информация» | Рабочий вариант для большинства баз |
| Все события | Плюс «Примечание» | Поиск сложной проблемы, на короткий срок |
Если вы пишете свои события с уровнем «Информация», в базе должен стоять уровень не ниже «Ошибки, предупреждения, информация». Иначе вызов отработает без ошибки, но записи не будет.
Тот же уровень можно поставить из кода — например, в обработке администратора без входа в конфигуратор:
// Выполняется на сервере, нужны административные права
Уровни = Новый Массив;
Уровни.Добавить(УровеньЖурналаРегистрации.Ошибка);
Уровни.Добавить(УровеньЖурналаРегистрации.Предупреждение);
Уровни.Добавить(УровеньЖурналаРегистрации.Информация);
УстановитьИспользованиеЖурналаРегистрации(Уровни);
Текущую настройку возвращает функция ПолучитьИспользованиеЖурналаРегистрации() — удобно для проверки перед отладкой.
Уровень «Все события» держите включённым только на время разбора. Поставили утром, воспроизвели проблему, собрали записи, вернули прежний уровень. Если забыть, журнал активной базы за месяц может вырасти в разы, а окно просмотра начнёт заметно тормозить у всех пользователей.
2. Как записать событие в журнал регистрации из кода 1С
Основной инструмент — глобальный метод ЗаписьЖурналаРегистрации. У него шесть параметров, обязателен только первый.
ЗаписьЖурналаРегистрации(
ИмяСобытия, // Строка: "Обмен.ЗагрузкаКонтрагентов"
Уровень, // УровеньЖурналаРегистрации
ОбъектМетаданных, // ОбъектМетаданных или Неопределено
Данные, // ссылка или примитивное значение
Комментарий, // Строка с подробностями
РежимТранзакции); // РежимТранзакцииЗаписиЖурналаРегистрации
Простой пример: успех и ошибка загрузки
&НаСервере
Процедура ЗагрузитьКонтрагентовНаСервере(ИмяФайла)
ИмяСобытия = "Обмен.ЗагрузкаКонтрагентов";
Попытка
Загружено = ЗагрузитьИзФайла(ИмяФайла); // ваша процедура загрузки
ЗаписьЖурналаРегистрации(ИмяСобытия,
УровеньЖурналаРегистрации.Информация,
Метаданные.Справочники.Контрагенты,
,
СтрШаблон("Файл %1, загружено записей: %2", ИмяФайла, Формат(Загружено, "ЧГ=0")));
Исключение
ЗаписьЖурналаРегистрации(ИмяСобытия,
УровеньЖурналаРегистрации.Ошибка,
Метаданные.Справочники.Контрагенты,
,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Что здесь сделано правильно:
- 🏷️ Имя события составное, через точку. В окне журнала события группируются по первой части, и ваши записи не теряются среди системных.
- 🧾 В комментарий идёт
ПодробноеПредставлениеОшибки(), а не только текст ошибки: там видны модуль и строка. - 🔁 После записи исключение пробрасывается дальше, ошибка не «проглатывается».
Привязка записи к документу
Если передать ссылку в параметр Данные, запись можно будет найти отбором по конкретному документу:
ЗаписьЖурналаРегистрации("Документы.ПроверкаПередПроведением",
УровеньЖурналаРегистрации.Предупреждение,
ДокументСсылка.Метаданные(),
ДокументСсылка,
"Сумма документа не совпадает с суммой по строкам");
Независимая и транзакционная запись
Последний параметр решает, переживёт ли запись откат транзакции.
| Режим | Поведение | Когда нужен |
|---|---|---|
Независимая (по умолчанию) | Запись появляется сразу, даже если транзакция потом откатится | Ошибки, аудит попыток действия |
Транзакционная | Запись сохранится, только если транзакция зафиксирована | Фиксация факта успешного изменения данных |
ЗаписьЖурналаРегистрации("Цены.Изменение",
УровеньЖурналаРегистрации.Информация, , ,
"Пересчитаны цены по прайсу",
РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная);
Одна процедура для всех записей
Когда вызовов становится больше десятка, имена событий начинают расходиться: «Обмен.Загрузка», «Обмен загрузка», «ЗагрузкаОбмен». Отбор по группе после этого не работает . Решение — общий серверный модуль с одной процедурой-обёрткой:
// Общий модуль ЖурналОбмена, флаг «Сервер»
Процедура Записать(Действие, Уровень, Текст, Данные = Неопределено) Экспорт
ЗаписьЖурналаРегистрации("Обмен." + Действие, Уровень, , Данные, Текст);
КонецПроцедуры
Теперь префикс группы задан в одном месте, а в коде остаётся короткий вызов ЖурналОбмена.Записать("Выгрузка", УровеньЖурналаРегистрации.Информация, "Готово"). Если конфигурация многоязычная, имя события в типовых решениях оборачивают в НСтр(), чтобы в журнале оно читалось на языке пользователя.
Запись с клиента
В тонком клиенте метод недоступен. Есть два рабочих варианта:
- 🖥️ вызвать серверную процедуру формы (
&НаСервере) или общего модуля с флагом «Вызов сервера» и писать там; - 📦 в конфигурациях на БСП использовать клиентский модуль
ЖурналРегистрацииКлиент: он копит сообщения на клиенте и передаёт их на сервер пачкой, без лишних серверных вызовов.
3. Отбор событий: как писать в журнал только нужное
Уровень — грубый фильтр. Тонкая настройка возможна на уровне отдельных событий.
Регистрация доступа к данным. По умолчанию платформа не пишет, кто открывал или читал данные. Чтобы видеть, кто смотрел, например, лицевые счета сотрудников, включают события доступа методом УстановитьИспользованиеСобытияЖурналаРегистрации(). Для них указывают таблицы и поля, обращения к которым нужно фиксировать, и поля, значения которых сохранять в запись. Текущее состояние читается функцией ПолучитьИспользованиеСобытияЖурналаРегистрации().
Регистрация доступа на большой таблице резко увеличивает объём журнала. Включайте её на конкретные таблицы и поля, а не «на всё».
Свои правила внутри кода. Хороший приём — не писать в журнал каждую мелочь. Например:
- ✅ «Информация» — итог операции одной записью: сколько загружено, сколько пропущено;
- ⚠️ «Предупреждение» — данные пропущены по бизнес-правилу;
- ❌ «Ошибка» — операция не выполнена;
- 🔍 «Примечание» — отладочные детали по каждой строке. Их видно, только когда уровень временно поднят до «Все события».
Так база в обычном режиме не раздувается, а при разборе инцидента вы включаете полный уровень и получаете подробности без правки кода.
4. Где хранится журнал регистрации и в каком формате
Журнал лежит в подкаталоге 1Cv8Log:
| Вариант базы | Где искать |
|---|---|
| Файловая | <каталог базы>\1Cv8Log |
| Клиент-серверная | <каталог srvinfo>\reg_1541\<идентификатор базы>\1Cv8Log на сервере 1С |
Идентификатор базы — это GUID. Его видно в консоли кластера, в свойствах информационной базы.
У платформы 8.3 два формата журнала:
| Признак | Последовательный (старый) | SQLite (новый) |
|---|---|---|
| Файлы | 1Cv8.lgf — словарь, *.lgp — данные за период | Один или несколько *.lgd |
| Чтение сторонними утилитами | Текстовый формат, читается парсерами логов | Нужен драйвер SQLite |
| Поведение на больших объёмах | Стабильнее при частой записи | Быстрее отбор, но чувствителен к блокировкам файла |
Формат определяется тем, какие файлы лежат в каталоге. Сменить его можно, перенеся старый журнал в архив и положив в пустой 1Cv8Log нужный файл-признак. Делать это стоит только при остановленной базе.
Разделение по периодам. В той же настройке в конфигураторе выбирают, как делить журнал: по годам, месяцам, дням или часам. Для активной базы удобно деление по дням: файлы небольшие, старые периоды легко архивировать.
Сокращение журнала. В окне настройки есть кнопка «Сократить». Она удаляет записи до указанной даты и может сохранить их в отдельный файл. Сохраняйте удаляемую часть в файл, если журнал нужен для проверок или споров о том, кто изменил документ.
Журнал и резервные копии. Выгрузка базы в .dt журнал регистрации не содержит. Если история действий важна, копируйте каталог 1Cv8Log отдельно, вместе с остальными резервными копиями. Для серверной базы это обычное файловое копирование с сервера 1С; закрытые периоды при делении по дням копируются без конфликтов, потому что в них уже никто не пишет.
Сколько места закладывать. Объём зависит от числа пользователей и уровня. Ориентир простой: включите нужный уровень на неделю и посмотрите прирост каталога 1Cv8Log. Умножив его на 52, получите годовую потребность и сразу решите, сколько периодов держать на сервере, а сколько отправлять в архив.
5. Как найти и проанализировать записанные данные
Просмотр в режиме «Предприятие»
Открыть журнал можно двумя способами:
- в Бухгалтерии 3.0 и других типовых:
Администрирование → Обслуживание → Журнал регистрации(в конфигурациях на БСП раздел может называться «Поддержка и обслуживание»); - в любой конфигурации:
Все функции → Стандартные → Журнал регистрации(пункт «Все функции» включается в параметрах программы).
Для просмотра у пользователя должна быть роль с правом «Журнал регистрации».
Отбор, который реально помогает
Не листайте весь журнал. Задайте отбор:
- Интервал — по возможности не больше суток.
- Событие — для своих записей выберите группу по первой части имени, например «Обмен».
- Важность — только «Ошибка», если ищете сбои.
- Пользователь или Данные — если разбираете конкретный документ.
Двойной щелчок по строке открывает карточку записи: там полный комментарий, компьютер, приложение, номер сеанса.
Системные события, которые стоит знать
Платформа пишет свои события сама, и их удобно использовать вместе с вашими:
| Событие в окне журнала | Что фиксирует |
|---|---|
| Сеанс. Начало / Завершение | Вход и выход пользователя, компьютер, приложение |
| Сеанс. Аутентификация (ошибка) | Неверный пароль или вход несуществующего пользователя |
| Данные. Добавление / Изменение / Удаление | Запись объектов, с ссылкой на объект в колонке «Данные» |
| Данные. Проведение / Отмена проведения | Работа с документами |
Пример связки: ваша запись «Обмен.Загрузка» с ошибкой и рядом системные «Данные. Изменение» от того же сеанса. По номеру сеанса видно, какие объекты загрузка успела записать до сбоя.
Выгрузка для анализа
Для отчёта или анализа в Excel журнал удобно выгрузить программно:
Отбор = Новый Структура;
Отбор.Вставить("ДатаНачала", НачалоДня(ТекущаяДата()));
Отбор.Вставить("ДатаОкончания", КонецДня(ТекущаяДата()));
Отбор.Вставить("Уровень", УровеньЖурналаРегистрации.Ошибка);
Таблица = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(Таблица, Отбор);
Для Каждого Строка Из Таблица Цикл
Сообщить(СтрШаблон("%1 | %2 | %3",
Строка.Дата, Строка.ИмяПользователя, Строка.Комментарий));
КонецЦикла;
Метод выполняется на сервере. Первым параметром можно передать и имя файла — тогда журнал выгрузится в XML. Ограничивайте период: выгрузка месяца в большой базе может идти минутами.
6. Почему событие не попало в журнал и другие сбои
Администрирование → Настройка журнала регистрации. Запись с важностью «Информация» не сохраняется при уровне «Ошибки» или «Ошибки и предупреждения». Ещё одна причина — транзакционный режим записи при откате транзакции.1Cv8Log из проверки антивирусом. При повреждении остановите работу с базой, переименуйте каталог 1Cv8Log в архивный и дайте платформе создать новый.Переименование каталога 1Cv8Log на сервере делают, когда в базе нет пользователей: остановите сеансы через консоль кластера и предупредите сотрудников заранее, их незаписанная работа будет прервана. Старый каталог не удаляйте — из него ещё можно достать историю.
Ещё пара практических моментов:
- 📏 Длинные комментарии. Не пишите в журнал целые XML-пакеты обмена на каждую строку. Для этого есть файлы протокола; в журнал — итог и ссылка на файл.
- 🔐 Персональные данные. Не кладите в комментарий паспортные данные и пароли: журнал видят все, у кого есть право на просмотр.
- 🗂️ Регламентные задания. В фоновых заданиях журнал — единственный способ увидеть, что произошло. Пишите туда хотя бы старт, итог и ошибки.
7. Частые вопросы
Нужны ли права, чтобы записать событие в журнал регистрации из кода?
Можно ли удалить отдельную запись из журнала?
Сколько хранится журнал регистрации?
Попадает ли запись в журнал, если транзакция откатилась?
Можно ли читать журнал без запуска 1С?
.lgf/.lgp разбирают текстовыми парсерами логов, а .lgd открывается как база SQLite. Но структура полей не документирована для внешних утилит, поэтому для отчётов надёжнее выгрузка через ВыгрузитьЖурналРегистрации().