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

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

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

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

Метод 1: Настройка уровня детализации журнала и программная запись

Рассмотрим первый и самый "чистый" с точки зрения платформы способ. Мы можем полностью отключить автоматическую регистрацию событий и перевести управление журналом в ручной режим. Разберем этот алгоритм по шагам:

  1. Перейдем в Конфигуратор.
  2. Откроем меню Администрирование — Настройка журнала регистрации.
  3. Установим уровень детализации в значение Не записывать.

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


Процедура ПередЗаписьюОбъекта(Источник, Отказ)
    ТекущийПользовательИмя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
    
    // Проверяем, нужно ли игнорировать данного пользователя
    Если ТекущийПользовательИмя <> "Админ" Тогда
        ЗаписатьВЖурналРегистрации(
            "Данные.Изменение",
            УровеньЖурналаРегистрации.Информация,
            Источник.Метаданные(),
            Источник.Ссылка,
            "Объект изменен пользователем " + ТекущийПользовательИмя
        );
    КонецЕсли;
КонецПроцедуры

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

Метод 2: Манипуляции с файлом базы данных SQLite (.lgd)

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

Разберем ситуацию: действия уже совершены и записаны. Как их "подчистить"?

  1. Найдем каталог с журналом регистрации. Обычно он располагается в папке srvinfo на сервере 1С в подпапке конкретной информационной базы (путь вида reg_1541/ID_базы/1Cv8Log/).
  2. Для работы нам понадобится любая внешняя утилита для SQLite (например, SQLite Browser).
  3. Выполним SQL-запрос для удаления записей конкретного пользователя. Сначала выясним внутренний идентификатор пользователя в таблице Users, а затем удалим строки из EventLogData.

Пример запроса для очистки:


DELETE FROM EventLogData 
WHERE UserCode IN (SELECT UserCode FROM Users WHERE UserName = 'Админ');

Важный момент: перед выполнением таких операций необходимо остановить службу сервера 1С или временно заблокировать доступ к файлу, иначе база данных может быть заблокирована процессом rphost.

Метод 3: Временная подмена файлов журнала

Проанализируем еще один способ, который предложили участники форума: "фокус" с подменой файлов. Это полезно, когда нужно выполнить большой объем работы под определенным пользователем и сделать так, чтобы за этот период в журнале вообще не было следов.

Алгоритм действий следующий:

  1. Останавливаем службу сервера 1С (или сеансы в файловом варианте).
  2. Переименовываем или перемещаем файл 1Cv8.lgd в другую директорию.
  3. Запускаем сервер. 1С, не найдя журнала, создаст новый пустой файл.
  4. Выполняем все необходимые действия под "скрытым" пользователем.
  5. Снова останавливаем сервер.
  6. Удаляем созданный "временный" журнал и возвращаем старый файл на место, переименовав его обратно.

Таким образом, в истории ЖР возникнет временной разрыв (дыра), но конкретных действий пользователя зафиксировано не будет. Это значительно быстрее, чем парсить и чистить огромные файлы логов.

Метод 4: Использование настроек метаданных объектов

Если задача стоит не в том, чтобы скрыть пользователя "вообще", а в том, чтобы не фиксировать работу с конкретными секретными данными, можно воспользоваться свойствами метаданных. В Конфигураторе для каждого объекта (например, справочника Контрагенты или документа НачислениеЗарплаты) существует свойство Журнал регистрации.

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

Метод 5: Программный обход через фоновые задания

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

Для реализации этого метода можно использовать следующий код:


ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(НужныеПараметры);
ФоновыеЗадания.Выполнить("МойОбщийМодуль.ВыполнитьДействиеБезЛога", ПараметрыЗадания);

Администратор, просматривающий журнал, увидит стандартную системную запись, которая не привлечет внимания так, как прямая правка документа пользователем Admin.

Метод 6: Манипуляция системным временем

Рассмотрим экзотический, но рабочий метод, связанный с разделением журнала по периодам. Если в настройках базы выбрано хранение журнала "по дням", 1С создает файлы типа 20231024000000.lgp (для старого формата) или хранит периоды внутри SQLite. Если перевести системное время сервера на год назад, выполнить действия и вернуть время обратно, записи попадут в файл за прошлый год. Вероятность того, что кто-то будет проверять архивные логи за прошлые периоды в поисках свежих изменений, крайне мала.

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

← На главную