Администрирование · 14 мин
Как программно прочитать журнал регистрации 1С
Как программно прочитать журнал регистрации 1С: методы ВыбратьСобытияЖурналаРегистрации и ВыгрузитьЖурналРегистрации, отборы, примеры кода и типичные ошибки.
Журнал регистрации в 1С:Предприятие хранит сведения о действиях пользователей, ошибках, изменениях данных и системных событиях. Просматривать его через конфигуратор удобно для разовой проверки, но для регулярного аудита, рассылки отчётов об ошибках или интеграции с внешними системами мониторинга журнал нужно читать программно.
Встроенный язык 1С предоставляет для этого несколько инструментов: метод ВыбратьСобытияЖурналаРегистрации для постраничной выборки, метод ВыгрузитьЖурналРегистрации для выгрузки в таблицу значений или XML, а также технологию внешних компонент и прямой разбор файлов формата lgd. Выбор зависит от объёма данных, требований к производительности и версии платформы.
Ниже разобраны рабочие способы чтения журнала с примерами кода, настройкой отборов, ограничениями каждого подхода и типичными ошибками, которые приводят к пустым выборкам или чрезмерной нагрузке на сервер.
Где хранится журнал регистрации и какие есть форматы
Перед написанием кода важно понимать, как платформа физически хранит журнал, потому что от этого зависят доступные способы чтения. Журнал регистрации не хранится в таблицах базы данных — это отдельные файлы в каталоге информационной базы.
Для файловой базы журнал лежит в подкаталоге 1Cv8Log каталога базы. Для клиент-серверной базы — в каталоге служебных файлов кластера серверов 1С, в подкаталоге с именем базы, папка 1Cv8Log. Прямой доступ к этим файлам на сервере есть не всегда, что само по себе аргумент в пользу программного чтения через API платформы.
Существует два формата хранения: старый (файлы *.lgp и текстовый индекс) и новый — SQLite-база 1Cv8.lgd. Платформа 8.3 по умолчанию использует формат lgd. Формат можно конвертировать через конфигуратор («Администрирование» → «Настройка журнала регистрации» → «Изменить формат»), но при этом старые данные потребуют отдельной конвертации.
Чтение журнала методом ВыбратьСобытияЖурналаРегистрации
Основной метод постраничного чтения — ВыбратьСобытияЖурналаРегистрации(Отбор, ПорядокСортировки, КоличествоПорции). Он возвращает выборку событий, которую можно обходить в цикле. Метод выполняется на сервере, поэтому вызывать его нужно из серверной процедуры или фонового задания.
Отбор задаётся структурой, где ключи — имена полей события: НачалоДиапазона, КонецДиапазона, Пользователь, Уровень, Событие, Метаданные, Данные и другие. Без отбора метод вернёт весь журнал, что на большой базе неприемлемо по времени.
// Серверная процедура: выборка ошибок за вчерашний день
Процедура ПрочитатьОшибкиЖурнала() Экспорт
Отбор = Новый Структура;
Отбор.Вставить("НачалоДиапазона", НачалоДня(ТекущаяДатаСеанса()) - 86400);
Отбор.Вставить("КонецДиапазона", НачалоДня(ТекущаяДатаСеанса()) - 1);
Отбор.Вставить("Уровень", УровеньЖурналаРегистрации.Ошибка);
Выборка = ВыбратьСобытияЖурналаРегистрации(Отбор);
Пока Выборка.Следующий() Цикл
ТекстСообщения = Строка(Выборка.Дата) + " | "
+ Выборка.ИмяПользователя + " | "
+ Выборка.ПредставлениеСобытия + " | "
+ Выборка.Комментарий;
// Здесь — запись в регистр, отправка письма и т.п.
КонецЦикла;
КонецПроцедуры
У выборки доступны поля: Дата, Уровень, Пользователь, ИмяПользователя, Компьютер, Событие и ПредставлениеСобытия, Комментарий, Метаданные, Данные, ПредставлениеДанных, Транзакция, Соединение, Сеанс, РазделениеДанныхСеанса. Поле Данные содержит ссылку на объект, если событие связано с изменением данных, — по ней можно перейти к документу или элементу справочника.
Выгрузка журнала методом ВыгрузитьЖурналРегистрации
Когда нужна не потоковая обработка, а сразу вся таблица событий или файл для внешнего анализа, используется ВыгрузитьЖурналРегистрации(Куда, Отбор, ПорядокСортировки, КоличествоПорции). Первым параметром передаётся либо таблица значений, либо имя XML-файла.
// Выгрузка в таблицу значений с последующей свёрткой
Процедура ВыгрузитьЖурналВТаблицу() Экспорт
ТаблицаСобытий = Новый ТаблицаЗначений;
Отбор = Новый Структура;
Отбор.Вставить("НачалоДиапазона", ДобавитьМесяц(ТекущаяДатаСеанса(), -1));
Отбор.Вставить("Уровень", УровеньЖурналаРегистрации.Ошибка);
ВыгрузитьЖурналРегистрации(ТаблицаСобытий, Отбор);
ТаблицаСобытий.Свернуть("ИмяПользователя,ПредставлениеСобытия");
КонецПроцедуры
Выгрузка в XML-файл удобна для передачи данных во внешнюю систему: достаточно указать путь к файлу первым параметром. Учтите, что файл формируется на сервере — путь должен быть доступен серверному процессу, а не клиентской машине. Это частая причина ошибок «файл не найден» у начинающих разработчиков.
По производительности оба метода сопоставимы при одинаковом отборе. Разница в удобстве: выборка подходит для обработки «на лету» с возможностью прервать цикл, выгрузка — для агрегации, сортировки и многократного обхода результата.
Сравнение способов чтения
Потоковая выборка в цикле, можно прервать обход. Подходит для фильтрации и реакции на события. Ограничение: только встроенный язык, только серверный контекст.
Вся выборка сразу в таблицу значений или XML. Подходит для отчётов и экспорта. Ограничение: весь результат в памяти, на больших диапазонах возможен рост потребления ОЗУ.
Чтение вне платформы любым SQLite-клиентом. Подходит для аварийного анализа, когда сервер 1С недоступен. Ограничение: формат внутренний, структура может меняться, часть данных закодирована.
Настройка отборов: даты, пользователи, уровни и события
Качество программного чтения журнала почти полностью определяется правильным отбором. Разберём ключевые поля и подводные камни их использования.
Диапазон дат задаётся полями НачалоДиапазона и КонецДиапазона. Даты в журнале хранятся с точностью до секунды, поэтому для выборки «за день» конец диапазона должен быть концом дня, а не началом. Часовой пояс — тот, в котором работает сеанс; при сборе данных с серверов в разных часовых поясах это нужно учитывать явно.
Отбор по пользователю принимает либо имя пользователя строкой, либо ссылку на объект ПользовательИнформационнойБазы. Для отбора по нескольким пользователям передаётся массив. Отбор по уровню (УровеньЖурналаРегистрации.Ошибка, Предупреждение, Информация, Примечание) также поддерживает массив значений.
Отбор по событию требует точного системного имени события, например "_$Data$_.Update" для изменения данных или "_$Session$_.Authentication" для аутентификации. Точные имена удобно подсмотреть в конфигураторе, настроив отбор интерактивно и посмотрев его представление. Ошибка в одном символе даёт пустую выборку без какого-либо сообщения об ошибке.
Чтение журнала регламентным заданием и мониторинг ошибок
Типовой прикладной сценарий — регулярный сбор ошибок с отправкой администратору. Реализуется через регламентное задание, которое раз в час читает журнал за прошедший интервал и формирует письмо или запись в служебный регистр.
Ключевой приём — хранить дату последней обработанной записи, чтобы не вычитывать весь день заново. Сохраняйте её в константе или параметре сеанса и используйте как НачалоДиапазона при следующем запуске. Добавьте небольшой запас (например, минус минута) и проверку на дубликаты, потому что события с одинаковой датой с точностью до секунды встречаются часто.
- 1Создайте общий серверный модуль с процедурой чтения журнала по отбору: уровень Ошибка, диапазон от сохранённой даты до текущего момента.
- 2Добавьте константу или запись регистра сведений для хранения даты последней обработки.
- 3Сформируйте из выборки текст письма или записи в регистр мониторинга; сгруппируйте одинаковые ошибки.
- 4Создайте регламентное задание с расписанием (например, каждые 15–60 минут) и укажите созданный метод.
- 5Проверьте работу: вызовите метод вручную из консоли кода и убедитесь, что дата последней обработки обновляется, а дубликаты не приходят повторно.
Для клиент-серверных баз убедитесь, что регламентное задание выполняется под пользователем с правами на чтение журнала регистрации — нужно право «Журнал регистрации» (просмотр) у роли. Без него выборка вернётся пустой, и диагностика причины займёт время.
На базах с интенсивной работой журнал растёт быстро, и выборка даже за один день может содержать сотни тысяч записей уровня «Информация». Для мониторинга ограничивайтесь уровнями Ошибка и Предупреждение — этого достаточно для реагирования, а нагрузка снижается в десятки раз.
Прямое чтение файла lgd как SQLite-базы
Формат lgd — это файл SQLite, который можно открыть любым инструментом работы с SQLite, например через Python с библиотекой sqlite3 или через DB Browser for SQLite. Такой способ применяется, когда платформа недоступна: база повреждена, сервер не запускается, нужно проанализировать журнал на архивной копии.
Основная таблица называется EventLog, в ней есть поля даты-времени, уровня, пользователя, события и комментария. Часть значений хранится как числовые коды или ссылки на служебные таблицы, поэтому для читаемого результата потребуются соединения с таблицами-справочниками внутри того же файла.
SELECT datetime(Date/10000000 - 62135596800, 'unixepoch') AS EventTime, UserID, Event, Comment FROM EventLog ORDER BY Date DESC LIMIT 100;Прямой разбор — инструмент последней инстанции. Структура файла является внутренним форматом платформы и может меняться между версиями, а кодировки полей документированы не полностью. Для штатных задач автоматизации всегда предпочтительнее методы встроенного языка.
Как проверить результат
Количество и даты записей совпадают с тем, что видно в конфигураторе при том же отборе
Выборка пустая — проверьте системные имена событий, часовой пояс дат и права пользователя
Дата последней обработки обновляется, повторных уведомлений о тех же ошибках нет
Дата не меняется или приходят дубликаты — ошибка в логике сохранения границы диапазона
Чтение за ограниченный диапазон занимает секунды, пользователи не жалуются
Выборка идёт минутами — диапазон слишком широкий или отбор не задан
Ограничения, права и влияние на производительность
Программное чтение журнала — безопасная операция в смысле целостности данных: методы только читают, ничего не изменяя. Риски связаны с производительностью и правами доступа.
Для чтения журнала пользователю нужно право «Журнал регистрации» / «Просмотр журнала регистрации». Полные права его включают. Если выборка выполняется в привилегированном модуле, проверка прав не выполняется — это удобно для служебных заданий, но не выводите такие данные пользователям без контроля: в журнале могут быть персональные данные и сведения о действиях сотрудников.
По производительности главные правила просты: всегда задавайте диапазон дат, читайте на сервере, выносите регулярное чтение в фоновые задания в нерабочие часы для больших объёмов. Дополнительно помогает регулярное сокращение журнала через конфигуратор («Сократить» в настройке журнала регистрации) с сохранением архивной копии — маленький журнал читается заметно быстрее.
Что важно запомнить
Основной инструмент — ВыбратьСобытияЖурналаРегистрации с отбором по датам, уровням и пользователям; для массового экспорта — ВыгрузитьЖурналРегистрации. Чтение выполняйте на сервере, всегда ограничивайте диапазон, для мониторинга используйте регламентное задание с сохранением даты последней обработки. Прямой разбор lgd-файла — только для аварийных сценариев.
Частые вопросы
Можно ли прочитать журнал регистрации через COM-подключение из другой базы 1С?
Да. Установите COM-соединение через V83.COMConnector, откройте соединение с базой и вызовите методы глобального контекста удалённой базы через её объектную модель. Учтите, что учётная запись подключения должна иметь право просмотра журнала регистрации в целевой базе, а сам способ медленнее прямого чтения из-за накладных расходов COM.
Почему отбор по событию возвращает пустую выборку?
Чаще всего указано локализованное представление события вместо системного имени. Отбор требует точное внутреннее имя вида _$Data$_.Update, включая символы подчёркивания и регистр. Подсмотрите имя в конфигураторе, настроив отбор интерактивно, либо сначала прочитайте журнал без отбора по событию и посмотрите значения поля Событие у интересующих записей.
Как получить события только по конкретному документу?
Используйте в отборе поле Данные, передав в него ссылку на объект. Метод вернёт события, связанные с этим объектом: записи, изменения, пометки удаления. Дополнительно ограничьте диапазон дат, чтобы выборка не сканировала весь журнал.
Можно ли программно очистить или сократить журнал регистрации?
Штатного метода встроенного языка для сокращения журнала нет. Сокращение выполняется интерактивно через конфигуратор или автоматически при конвертации формата. Для автоматизации некоторые администраторы удаляют старые файлы lgp при остановленной базе, но это требует остановки работы и резервной копии — штатной практикой такой способ не является.
Чем отличаются поля Пользователь и ИмяПользователя в выборке?
Пользователь — ссылка на объект ПользовательИнформационнойБазы, подходит для отборов и сравнений. ИмяПользователя — строковое имя, удобное для вывода в отчёты и письма. Если пользователь был удалён из списка пользователей базы, ссылка может оказаться битой, а имя останется читаемым.
Работает ли чтение журнала в фоновом задании на файловой базе?
Да, если файловая база опубликована на веб-сервере и фоновые задания выполняются на стороне сервера. В локальной файловой базе без публикации регламентные задания выполняются только в запущенном клиентском сеансе, поэтому для автономного мониторинга нужен постоянно работающий сеанс-исполнитель или перенос базы в клиент-серверный вариант.