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