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

Администрирование · 12 мин

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

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

Журнал регистрации в 1С хранит сведения о действиях пользователей, ошибках, изменениях данных и системных событиях. Когда нужно разобраться, кто изменил документ, почему упал обмен или когда запускалась регламентная операция, стандартного просмотра в конфигураторе часто недостаточно: требуется программная выборка с фильтрами. Для этого в платформе предусмотрен метод ВыгрузитьЖурналРегистрации(), который позволяет получить события в виде таблицы значений и обработать их произвольным образом.

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

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

Как устроен журнал регистрации and что можно получить запросом

Журнал регистрации физически хранится в каталоге информационной базы (в файловом варианте — в подкаталоге 1Cv8Log, в клиент-серверном — на сервере СУБД) и состоит из сегментов по периодам. Платформа записывает туда события аутентификации, изменения данных, ошибки, вызовы фоновых заданий, действия с транзакциями и многое другое. Уровень детализации настраивается в конфигураторе: «Администрирование» → «Настройка журнала регистрации».

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

Важно понимать: запрос к журналу регистрации — это не запрос на языке запросов 1С. Конструкция ВЫБРАТЬ ... ИЗ к журналу не применяется. Вместо этого используется специальный метод глобального контекста, который сам читает файлы журнала и накладывает отбор.

Метод ВыгрузитьЖурналРегистрации: синтаксис и параметры

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

Минимальный работающий пример выглядит так:

ТаблицаСобытий = Новый ТаблицаЗначений;

Отбор = Новый Структура;

Отбор.Вставить("ДатаНачала", НачалоДня(ТекущаяДатаСеанса()));

Отбор.Вставить("ДатаОкончания", КонецДня(ТекущаяДатаСеанса()));

ВыгрузитьЖурналРегистрации(ТаблицаСобытий, Отбор);

Для Каждого СтрокаСобытия Из ТаблицаСобытий Цикл

Сообщить(Строка(СтрокаСобытия.Дата) + " | "

+ СтрокаСобытия.Пользователь + " | "

+ СтрокаСобытия.ПредставлениеСобытия);

КонецЦикла;

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

Ключи отбора: по чему можно фильтровать события

Структура отбора поддерживает фиксированный набор ключей. Неизвестный ключ вызовет ошибку, поэтому важно использовать только документированные имена. Основные ключи приведены ниже.

Ключ отбораТип значенияЧто фильтрует
ДатаНачала / ДатаОкончанияДатаПериод событий
ПользовательСтрока или массивИмя пользователя ИБ
СобытиеСтрока или массивИмя события (например, "_$Data$_.Update")
УровеньУровеньЖурналаРегистрации или массивВажность: ошибка, предупреждение, информация
МетаданныеОбъект метаданных или массивСобытия по конкретным объектам конфигурации
ДанныеСсылкаСобытия по конкретному объекту данных
Компьютер / ИмяПриложенияСтрока или массивРабочее место или тип клиента
КомментарийСтрокаТочное совпадение комментария

Большинство ключей принимают массив значений — это позволяет отобрать, например, события нескольких пользователей или несколько уровней важности одним запросом. Условия по разным ключам объединяются логическим «И»: событие попадёт в выборку, только если удовлетворяет всем заданным ограничениям.

Практические сценарии запросов

Выборка ошибок за период

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

Отбор = Новый Структура;

Отбор.Вставить("ДатаНачала", НачалоДня(ТекущаяДатаСеанса()) - 86400);

Отбор.Вставить("ДатаОкончания", КонецДня(ТекущаяДатаСеанса()) - 86400);

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

ТаблицаСобытий = Новый ТаблицаЗначений;

ВыгрузитьЖурналРегистрации(ТаблицаСобытий, Отбор);

Если нужны и ошибки, и предупреждения, передайте массив: Уровни = Новый Массив; Уровни.Добавить(УровеньЖурналаРегистрации.Ошибка); Уровни.Добавить(УровеньЖурналаРегистрации.Предупреждение); — и подставьте его в отбор.

Действия конкретного пользователя с объектом

Чтобы выяснить, кто менял конкретный документ, используется связка ключей «Данные» и «Событие». В «Данные» передаётся ссылка на объект, в «Событие» — массив имён событий записи и изменения:

СобытияИзменения = Новый Массив;

СобытияИзменения.Добавить("_$Data$_.New");

СобытияИзменения.Добавить("_$Data$_.Update");

СобытияИзменения.Добавить("_$Data$_.Delete");

Отбор = Новый Структура;

Отбор.Вставить("ДатаНачала", ДобавитьМесяц(ТекущаяДатаСеанса(), -1));

Отбор.Вставить("Данные", СсылкаНаДокумент);

Отбор.Вставить("Событие", СобытияИзменения);

Такой запрос покажет все факты создания, изменения и удаления объекта с указанием пользователя и времени. Учтите, что отбор по «Данные» работает медленнее отбора по дате и пользователю, поэтому период стоит сужать максимально.

Мониторинг фоновых заданий

Для контроля регламентных операций отбирайте события по имени приложения или по событию _$Job$_.Fail. Это позволяет автоматически обнаруживать падения обменов и рассылок, не открывая консоль заданий.

Порядок действий для типового запроса
  1. 1
    Определите цель: ошибки, действия пользователя, события объекта
  2. 2
    Сформируйте структуру отбора с обязательным периодом
  3. 3
    Создайте пустую таблицу значений и вызовите ВыгрузитьЖурналРегистрации
  4. 4
    Обойдите таблицу и обработайте строки: выведите, отфильтруйте дополнительно, сохраните
  5. 5
    Проверьте результат на малом периоде, затем расширьте выборку

Выгрузка результата в файл и дополнительная обработка

Полученную таблицу значений удобно сохранить для последующего анализа. Для передачи в отдел поддержки подойдёт табличный документ или CSV; для программной обработки — XML или JSON. Пример сохранения в CSV:

Текст = Новый ТекстовыйДокумент;

Для Каждого СтрокаСобытия Из ТаблицаСобытий Цикл

Текст.ДобавитьСтроку(

Строка(СтрокаСобытия.Дата) + ";"

+ СтрокаСобытия.Пользователь + ";"

+ СтрокаСобытия.ПредставлениеСобытия + ";"

+ СтрокаСобытия.Комментарий);

КонецЦикла;

Текст.Записать("C:\Temp\log_export.csv", КодировкаТекста.UTF8);

Если встроенного отбора недостаточно — например, нужно найти подстроку в комментарии (ключ «Комментарий» ищет только точное совпадение) — выгружайте данные с более широким фильтром и доводите выборку в цикле через СтрНайти(). Это стандартная практика для поиска по тексту ошибки.

Для регулярного мониторинга оформите выгрузку ошибок как регламентное задание, которое раз в час собирает события с уровнем «Ошибка» и отправляет сводку ответственному. Это дешевле ручной проверки и не пропускает ночные сбои.
ПЗ
Практическое замечание

Ограничения, производительность и типичные ошибки

Метод ВыгрузитьЖурналРегистрации выполняется на том язычке, где вызван: на сервере — в контексте сервера, на клиенте толстого приложения — на клиенте. В тонком и веб-клиенте метод недоступен, поэтому вызов следует размещать в серверной процедуре общего модуля. Также требуются права: у пользователя должно быть право «Журнал регистрации» (просмотр журнала), иначе выгрузка вернёт пустой результат или вызовет ошибку доступа.

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

Типичные ошибки
01
Вызов метода на тонком клиенте — метод недоступен, код падает; переносите вызов на сервер
02
Выгрузка без периода — чтение всего журнала, долгое выполнение и переполнение памяти
03
Отбор по событию в представлении ("Изменение данных" вместо "_$Data$_.Update") — пустой результат
04
Ожидание поиска подстроки в комментарии через отбор — ключ «Комментарий» ищет только точное совпадение
05
Забытое право доступа к журналу — у пользователя без права просмотра выборка пустая

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

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

Как проверить результат

Количество строк в таблице
Норма

Больше нуля при заведомо существующих событиях за период

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

Ноль строк при точно имеющихся событиях — проверьте права и ключи отбора

Период в выборке
Норма

Все даты в границах ДатаНачала–ДатаОкончания

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

События вне периода — перепутаны границы или часовой пояс сеанса

Состав событий
Норма

Только нужные уровни и события

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

Лишние записи — отбор не применился из-за опечатки в имени ключа

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

Можно ли обратиться к журналу регистрации через обычный запрос 1С (ВЫБРАТЬ ... ИЗ)?

Нет. Журнал регистрации не является таблицей, доступной языку запросов. Единственный штатный программный способ — метод ВыгрузитьЖурналРегистрации(), возвращающий таблицу значений. Для анализа файлов журнала вне платформы существуют сторонние инструменты, но они не относятся к штатным средствам.

Почему запрос возвращает пустую таблицу, хотя события точно есть?

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

Как найти, кто удалил конкретный документ?

Сформируйте отбор с ключом «Данные», равным ссылке на документ, и событием "_$Data$_.Delete" (при необходимости добавьте "_$Data$_.Update"). В колонках «Пользователь» и «Дата» результата будут виновник и время. Если журнал за нужный период уже сокращён, восстановить информацию из него невозможно.

Влияет ли выгрузка журнала на работу пользователей?

Чтение журнала не блокирует запись новых событий, но при большом объёме создаёт нагрузку на диск и память сервера. На продуктивной базе ограничивайте период, запускайте тяжёлые выгрузки в нерабочее время или выполняйте их на копии базы.

Как искать события по части текста ошибки?

Ключ «Комментарий» отбора работает только на точное совпадение. Для поиска по подстроке выгрузите события за период с нужным уровнем важности, затем в цикле отберите строки через СтрНайти(СтрокаСобытия.Комментарий, "фрагмент") > 0.

Где посмотреть журнал без программирования?

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

Итог

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

Запрос к журналу регистрации делается методом ВыгрузитьЖурналРегистрации() с обязательным отбором по периоду. Ключи отбора — ДатаНачала, Пользователь, Событие (во внутренних именах), Уровень, Данные. Вызов выполняйте на сервере с нужными правами, тяжёлые выгрузки — вне рабочего времени.