Как отключить журнал регистрации в копиях баз 1С программно

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Почему журнал регистрации нельзя отключить или очистить через SQL

Среди разработчиков и системных администраторов нередко возникает идея выполнить отключение или очистку журнала регистрации с помощью прямого SQL-запроса к рабочей базе данных СУБД (Microsoft SQL Server, PostgreSQL и др.) в процессе выполнения скрипта восстановления резервной копии. Проанализируем архитектуру хранения данных платформы, чтобы понять, почему этот подход не работает.

Журнал регистрации 1С технологически отделен от таблиц СУБД информационной базы. Сервер «1С:Предприятия» сохраняет все записи журнала в локальную файловую систему сервера приложений. По умолчанию файлы располагаются в каталоге данных кластера серверов по пути вида .../srvinfo/reg_XXXX/GUID_информационной_базы/1Cv8Log/. В зависимости от используемого формата журнала это может быть либо база данных SQLite (файл 1Cv8.lgd), либо набор текстовых файлов с расширениями *.lgf и *.lgp. Поскольку внутри СУБД нет никаких служебных таблиц, отвечающих за события ЖР, воздействовать на журнал скриптом к серверу баз данных невозможно.

Штатный метод платформы: УстановитьИспользованиеЖурналаРегистрации

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

Если в данный метод передать пустой массив, сервер 1С полностью отключает регистрацию любых событий. Рассмотрим базовый пример вызова:


ПустойСписокУровней = Новый Массив;
УстановитьИспользованиеЖурналаРегистрации(ПустойСписокУровней);

Выясним важные особенности работы этого метода, которые необходимо учитывать при проектировании архитектуры автоматизации:

  1. Персистентность настройки: При вызове метода сервер платформы записывает конфигурацию логирования непосредственно в служебные файлы каталога 1Cv8Log. Это означает, что настройка сохраняется после перезапуска службы кластера «1С:Предприятия» и перезагрузки сервера. Применять вызов при старте каждого клиентского сеанса не требуется — достаточно выполнить его однократно при инициализации копии.
  2. Требования к правам доступа: Метод может выполняться исключительно в сеансе пользователя, обладающего административными правами (проверяется право «Администрирование»). Попытка вызова метода под обычной учетной записью приведет к аварийному завершению с исключением нарушения прав доступа.
  3. Поведение при создании новой базы в кластере: Если скрипт развертывания регистрирует базу в кластере серверов 1С заново, ей присваивается новый уникальный идентификатор (GUID). В каталоге кластера создается новая папка ЖР, в которой логирование по умолчанию снова оказывается полностью включенным. Поэтому отключение необходимо выполнять каждый раз после регистрации копии.

Вариант 1. Автоматическое отключение при старте базы в контуре копии

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

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


&НаСервере
Процедура ОтключитьЖурналРегистрацииДляКопии()
    
    // Проверяем наличие административных прав у текущего пользователя
    Если Не ПравоДоступа("Администрирование", Метаданные) Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем признак того, что информационная база является тестовой копией
    // В типовых конфигурациях на базе БСП можно использовать параметры блокировки работы с внешними ресурсами
    // Для произвольных систем можно сравнить строку соединения с эталонным именем рабочей базы
    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
    ЭтоКопия = СтрНайти(ВРег(СтрокаСоединения), "TEST") > 0 ИЛИ СтрНайти(ВРег(СтрокаСоединения), "DEV") > 0;
    
    Если ЭтоКопия Тогда
        // Получаем текущие зарегистрированные уровни
        ТекущиеУровни = ПолучитьИспользованиеЖурналаРегистрации();
        
        // Если массив не пустой — журнал все еще активен, выполняем отключение
        Если ТекущиеУровни.Количество() > 0 Тогда
            ПустойМассив = Новый Массив;
            УстановитьИспользованиеЖурналаРегистрации(ПустойМассив);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Вариант 2. Отключение ЖР через скрипты развертывания CI/CD

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

Разберем по шагам создание такой автоматизации:

  1. Создадим внешнюю обработку (например, DisableLog.epf). В модуле формы или в модуле объекта при открытии пропишем установку пустого массива и немедленное закрытие программы:

Процедура ПриОткрытии()
    Попытка
        УстановитьИспользованиеЖурналаРегистрации(Новый Массив);
    Исключение
        // Запись в лог или вывод сообщения при ошибке прав
    КонецПопытки;
    
    ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
  1. В скрипте автоматического восстановления базы (PowerShell, Bash или Bat) после загрузки бэкапа вызовем исполняемый файл 1С в пакетном режиме:

1cv8.exe ENTERPRISE /S "ServerName\CopyBaseName" /N "Administrator" /P "AdminPassword" /Execute "C:\Scripts\DisableLog.epf" /DisableStartupMessages

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

Выборочное подавление событий и очистка истории

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

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


НастройкаСобытия = Новый ИспользованиеСобытияЖурналаРегистрации;
НастройкаСобытия.Использование = Ложь;

// Отключаем фиксацию транзакций
УстановитьИспользованиеСобытияЖурналаРегистрации("_$Transaction$_.Commit", НастройкаСобытия);

Если же копия была развернута вместе с объемным каталогом старого журнала регистрации и требуется быстро освободить место на диске сервера приложений, применим метод программной очистки:


// Удаляем все записи журнала до текущей даты включительно
ОчиститьЖурналРегистрации(ТекущаяДата());

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

Иногда администраторы пытаются заблокировать запись журнала на уровне прав доступа операционной системы (отзыв прав на запись у учетной записи службы usr1cv8 к папке 1Cv8Log) либо создают символические ссылки на фиктивные устройства (вроде NUL или /dev/null). Делать этого категорически нельзя. В современном формате SQLite при невозможности выполнить операцию записи серверные процессы 1С сталкиваются с непредвиденными блокировками ввода-вывода, что приводит к зависанию пользовательских сеансов и аварийному падению рабочих процессов кластера rphost. Отключение журнала должно выполняться исключительно штатным программным интерфейсом платформы.

← На главную