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