При разработке прикладных решений нередко возникает задача отобразить пользователю историю его недавних действий — например, список созданных им за текущий рабочий день элементов справочника. Попытка предоставить пользователю возможность получать эти данные непосредственно из журнала регистрации (ЖР) наталкивается на проблему безопасности: если дать роль с правом Просмотр журнала регистрации, пользователь получит полный интерактивный доступ ко всем системным событиям конфигурации.
Разберем, как технически реализовать программное чтение записей без выдачи интерактивных прав, почему завязывать бизнес-логику на журнал регистрации не рекомендуется и какие архитектурные альтернативы предоставляет платформа 1С:Предприятие 8.3.
Если пользователю не назначена роль с правом Просмотр журнала регистрации, стандартный интерактивный интерфейс журнала для него недоступен. При этом прямой вызов метода ВыгрузитьЖурналРегистрации() в обычном контексте сеанса завершится ошибкой «Нарушение прав доступа».
Чтобы обойти это ограничение в коде, чтение данных необходимо выполнять на стороне сервера с включением привилегированного режима. Рассмотрим два способа реализации:
УстановитьПривилегированныйРежим() непосредственно перед выгрузкой журнала.Посмотрим на пример функции, выполняющей отбор событий создания объектов текущим пользователем за определенный период:
Функция ПолучитьСписокСозданныхОбъектов(Пользователь, ДатаНачала, ДатаОкончания) Экспорт
УстановитьПривилегированныйРежим(Истина);
ФильтрЖурнала = Новый Структура;
ФильтрЖурнала.Вставить("ДатаНачала", ДатаНачала);
ФильтрЖурнала.Вставить("ДатаОкончания", ДатаОкончания);
ФильтрЖурнала.Вставить("Пользователь", Пользователь);
ФильтрЖурнала.Вставить("Событие", "_$Data$_.New");
ФильтрЖурнала.Вставить("Метаданные", Метаданные.Справочники.Контрагенты.ПолноеИмя());
ТаблицаСобытий = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(ТаблицаСобытий, ФильтрЖурнала);
УстановитьПривилегированныйРежим(Ложь);
Возврат ТаблицаСобытий;
КонецФункции
Важное требование к фильтрации: выгрузка из журнала регистрации выполняется во временную таблицу значений в оперативной памяти сервера. Обязательно задавайте жесткие границы по периоду (ДатаНачала и ДатаОкончания), иначе при большом размере базы выгрузка приведет к чрезмерному потреблению RAM и длительным задержкам.
Проанализируем технические риски, с которыми сталкивается разработчик при завязывании прикладного функционала на журнал регистрации:
ВыгрузитьЖурналРегистрации() и фоновая фиксация событий другими сеансами вызывают взаимные файловые блокировки процессов rphost.Для надежного и быстрого получения информации об авторах и датах создания объектов следует использовать стандартные средства базы данных.
Автор (тип СправочникСсылка.Пользователи). В подписке на событие ПередЗаписью проверяется условие Источник.ЭтоНовый() (или Источник.Ссылка.Пустая()), и реквизиту присваивается значение ПользователиИнформационнойБазы.ТекущийПользователь(). Запрос по такому реквизиту с установленным индексом выполняется мгновенно.ВерсииОбъектов.ИсторияРаботыПользователя, не нагружающий базу данных дополнительными запросами.