Как перехватить событие запуска отчета или обработки для ведения лога использования

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

В процессе сопровождения крупных конфигураций, таких как 1С:Управление торговлей 11 или ERP, часто возникает задача аудита: необходимо понять, какие отчеты и обработки действительно востребованы пользователями, а какие являются «мертвым грузом». Рассмотрим подробно различные методы перехвата событий открытия и запуска этих объектов, чтобы записывать данные в специальный регистр сведений.

Метод 1. Использование общей формы отчета (БСП)

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

Нам потребуется найти в дереве метаданных ОбщаяФорма.ФормаОтчета. В модуле этой формы в обработчике ПриСозданииНаСервере мы можем определить, какой именно отчет открывается. Разберем пример кода для расширения:


&После("ПриСозданииНаСервере")
Процедура ИНВ_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Пытаемся получить имя отчета из параметров формы
    ИмяОтчета = "";
    Если Параметры.Свойство("ОтчетИмя") Тогда
        ИмяОтчета = Параметры.ОтчетИмя;
    ИначеЕсли ЭтотОбъект.Параметры.Свойство("КлючНазначенияИспользования") Тогда
        // Иногда имя содержится в ключе назначения
        ИмяОтчета = ЭтотОбъект.Параметры.КлючНазначенияИспользования;
    КонецЕсли;
    
    Если ЗначениеЗаполнено(ИмяОтчета) Тогда
        ЗаписатьСобытиеВРегистр("Отчет", ИмяОтчета, Пользователи.ТекущийПользователь());
    КонецЕсли;
    
КонецПроцедуры

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

Метод 2. Перехват в модуле менеджера объекта

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

Рассмотрим преимущества этого метода:

  1. Срабатывает до создания формы на сервере.
  2. Позволяет подменить форму или отказаться от её открытия.
  3. Дает доступ к параметрам, с которыми запрашивается форма.

Проанализируем пример кода, который можно разместить в модуле менеджера через расширение:


&Вместо("ОбработкаПолученияФормы")
Процедура ИНВ_ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    
    // Записываем факт обращения к объекту
    ИмяОбъекта = ЭтотОбъект.Метаданные().Имя;
    ЗаписатьСобытиеВРегистр("Обработка", ИмяОбъекта, Пользователи.ТекущийПользователь());
    
КонецПроцедуры

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

Метод 3. Работа с дополнительными отчетами и обработками (БСП)

Для внешних (подключенных через справочник) объектов типовые методы могут не сработать напрямую, так как они запускаются через механизмы БСП. Выясним, как перехватить их запуск. Основная точка входа для таких объектов — общий модуль ДополнительныеОтчетыИОбработкиКлиент.

В частности, процедура ВыполнитьОткрытиеФормыОбработки отвечает за инициализацию внешних форм. Мы можем использовать механизм &Перед в расширении для логирования:


&Перед("ВыполнитьОткрытиеФормыОбработки")
Процедура ИНВ_ВыполнитьОткрытиеФормыОбработки(СсылкаНаВнешнийОбъект, ПараметрыВыполнения) Экспорт
    
    ИмяОбъекта = СсылкаНаВнешнийОбъект.Наименование;
    Идентификатор = СсылкаНаВнешнийОбъект.ИмяОбъекта;
    
    // Логируем внешнюю обработку
    ЗаписатьСобытиеВРегистр("ВнешнийОбъект", Идентификатор, Пользователи.ТекущийПользователь());
    
КонецПроцедуры

Также стоит заглянуть в модуль ДополнительныеОтчетыИОбработки (серверный), в метод ВыполнитьКоманду, чтобы отловить серверные методы выполнения, которые не создают форм (например, заполнение объекта или печатные формы).

Метод 4. Перехват события «ПриКомпоновкеРезультата»

Если ваша цель — не просто узнать, кто открыл форму, а кто реально сформировал отчет (нажал кнопку «Сформировать»), то предыдущие методы могут дать «ложноположительные» результаты. Пользователь мог открыть отчет и закрыть его, не запуская расчет.

Для фиксации реального запуска отчета проанализируем модуль объекта отчета. В нем есть предопределенная процедура ПриКомпоновкеРезультата. Рассмотрим реализацию:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Логируем факт формирования данных
    МетаданныеОбъекта = ЭтотОбъект.Метаданные();
    ЗаписатьСобытиеВРегистр("ФормированиеОтчета", МетаданныеОбъекта.Имя, Пользователи.ТекущийПользователь());
    
КонецПроцедуры

Этот метод считается самым точным для инвентаризации «полезности» отчетов. Если отчет сложный и формируется долго, запись в регистр позволит также замерять частоту реальных вычислений.

Метод 5. Глобальный аудит через Журнал регистрации

Если конфигурация сильно изменена и внедрение кода в каждый объект невозможно, разберем альтернативный вариант — использование Журнала регистрации. Платформа 1С автоматически фиксирует события открытия форм, если в настройках журнала установлен соответствующий уровень логирования.

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

  1. Создаем регламентное задание, работающее от имени администратора.
  2. Используем функцию СкопироватьЖурналРегистрации с фильтром по событию "_$Data$_.Form" (или аналогичным).
  3. Парсим описание события, извлекая имя объекта.
  4. Записываем агрегированные данные в свой регистр сведений.

Преимущество: Никакого влияния на производительность пользователей в момент открытия форм и отсутствие необходимости менять код метаданных.

Метод 6. Использование подсистемы «Оценка производительности»

В БСП уже есть встроенный механизм мониторинга — подсистема «Оценка производительности» (АПДЗ). Мы можем использовать её не по прямому назначению. Если настроить ключевые операции на открытие важных отчетов, система сама будет собирать статистику в регистр сведений ЗамерыВремени.

Для этого нужно:

  1. Добавить в справочник КлючевыеОперации элементы для интересующих нас отчетов.
  2. В процедурах открытия форм вызвать ОценкаПроизводительностиКлиент.НачатьЗамерВремени().

Это позволит не только видеть, кто открывал отчет, но и сколько времени пользователь ждал его формирования.

Рекомендации по реализации записи в регистр

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


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

Итог: Для инвентаризации лучше всего подходит комбинация Метода 1 (для массового охвата типовых отчетов) и Метода 3 (для внешних обработок). Если же требуется детальный анализ использования данных, незаменимым станет Метод 4 с перехватом компоновки результата.

← На главную