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

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

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

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

Решение 1. Программное чтение журнала через привилегированный режим

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

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

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

Посмотрим на пример функции, выполняющей отбор событий создания объектов текущим пользователем за определенный период:


Функция ПолучитьСписокСозданныхОбъектов(Пользователь, ДатаНачала, ДатаОкончания) Экспорт
    
    УстановитьПривилегированныйРежим(Истина);
    
    ФильтрЖурнала = Новый Структура;
    ФильтрЖурнала.Вставить("ДатаНачала", ДатаНачала);
    ФильтрЖурнала.Вставить("ДатаОкончания", ДатаОкончания);
    ФильтрЖурнала.Вставить("Пользователь", Пользователь);
    ФильтрЖурнала.Вставить("Событие", "_$Data$_.New");
    ФильтрЖурнала.Вставить("Метаданные", Метаданные.Справочники.Контрагенты.ПолноеИмя());
    
    ТаблицаСобытий = Новый ТаблицаЗначений;
    ВыгрузитьЖурналРегистрации(ТаблицаСобытий, ФильтрЖурнала);
    
    УстановитьПривилегированныйРежим(Ложь);
    
    Возврат ТаблицаСобытий;
    
КонецФункции

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

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

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

  1. Блокировки и падение производительности: журнал регистрации (особенно нового формата на базе SQLite) оптимизирован для последовательной быстрой записи. При интенсивной многопользовательской работе одновременное чтение через ВыгрузитьЖурналРегистрации() и фоновая фиксация событий другими сеансами вызывают взаимные файловые блокировки процессов rphost.
  2. Зависимость от уровня логирования: системный администратор может изменить параметры регистрации событий в кластере 1С (например, отключить логирование данных ради экономии места или установить уровень «Только ошибки»). В этом случае прикладной функционал молча перестанет работать.
  3. Обрезание и перенос базы: при переносе базы данных на другой сервер, создании копий или плановом сокращении (сжатии) журнала регистрации прикладные данные об авторах объектов будут безвозвратно утеряны.

Решение 2. Добавление реквизита «Автор» или подсистемы версионирования

Для надежного и быстрого получения информации об авторах и датах создания объектов следует использовать стандартные средства базы данных.

  1. Реквизит «Автор» и подписка на событие: в расширении или основной конфигурации к объекту добавляется реквизит Автор (тип СправочникСсылка.Пользователи). В подписке на событие ПередЗаписью проверяется условие Источник.ЭтоНовый() (или Источник.Ссылка.Пустая()), и реквизиту присваивается значение ПользователиИнформационнойБазы.ТекущийПользователь(). Запрос по такому реквизиту с установленным индексом выполняется мгновенно.
  2. Механизм «История данных» (Data History): платформа 1С предоставляет встроенную подсистему версионирования на уровне метаданных. Включив историю данных для нужного справочника, можно стандартным языком запросов через виртуальные таблицы истории получать информацию о первой версии объекта и ее авторе.
  3. Использование версионирования БСП: в типовых конфигурациях достаточно включить версионирование объектов в настройках программы. Сведения о создателях и изменениях будут храниться в регистре сведений ВерсииОбъектов.
  4. Сервис «История работы пользователя»: если требуется просто показать интерактивный список последних открытых и отредактированных пользователем элементов интерфейса, применяют встроенный системный объект ИсторияРаботыПользователя, не нагружающий базу данных дополнительными запросами.
← На главную