В процессе администрирования и оптимизации работы крупных баз данных 1С часто возникает задача: понять, какие отчеты наиболее востребованы пользователями, а какие — создают избыточную нагрузку на систему. Стандартный Журнал регистрации не всегда предоставляет детальную информацию о факте формирования отчета, особенно если речь идет о сложных схемах компоновки данных (СКД). В этой статье мы подробно разберем, как реализовать «отчет по отчетам» и автоматизировать сбор статистики использования метаданных.
Первым делом нам необходимо подготовить место, где будут храниться данные. Простая запись в текстовый лог неудобна для последующего анализа, поэтому мы создадим Регистр сведений (например, ЛогФормированияОтчетов).
Разберем структуру регистра:
Чтобы не модифицировать каждый отчет в системе (что трудозатратно и неудобно при обновлениях), мы воспользуемся механизмом Расширений конфигурации. Это наиболее современный и «чистый» подход.
Проанализируем ситуацию: большинство современных отчетов строятся на базе Системы компоновки данных (СКД). Нам нужно найти «точку входа», через которую проходят все отчеты. В конфигурациях на базе БСП (Библиотека стандартных подсистем) такой точкой является общая форма отчета или программные интерфейсы в общих модулях.
Рассмотрим пример кода для расширения общего модуля ОтчетыСервер (или аналогичного в вашей конфигурации), где происходит вызов компоновки:
&После("СкомпоноватьРезультат")
Процедура Лог_СкомпоноватьРезультат(КонтекстОтчета, Результат)
ИмяОтчета = КонтекстОтчета.ИмяОтчета;
ТекущийПользователь = Пользователи.АвторизованныйПользователь();
// Записываем данные в наш регистр сведений
МенеджерЗаписи = РегистрыСведений.ЛогФормированияОтчетов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Пользователь = ТекущийПользователь;
МенеджерЗаписи.Отчет = ИмяОтчета;
МенеджерЗаписи.Записать();
КонецПроцедуры
Если в вашей конфигурации отчеты не используют общую форму, мы можем внедрить код в модуль объекта каждого отчета. Хотя это требует правок в объектах, использование Шаблона отчета упростит разработку новых инструментов в будущем.
Выясним причину, почему это эффективно: событие ПриКомпоновкеРезультата срабатывает непосредственно перед тем, как сервер 1С начнет выполнять запросы к базе данных. Это идеальное место для фиксации факта запуска.
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// Логика записи в регистр
ЗаписьЛога = РегистрыСведений.ЛогФормированияОтчетов.СоздатьМенеджерЗаписи();
ЗаписьЛога.Период = ТекущаяДата();
ЗаписьЛога.Отчет = ЭтотОбъект.Метаданные().Имя;
ЗаписьЛога.Пользователь = ПараметрыСеанса.ТекущийПользователь;
ЗаписьЛога.Записать();
КонецПроцедуры
Если вы работаете в современной конфигурации (например, ERP 2.5, КА 2.5 или БП 3.0), то функционал логирования уже частично встроен в БСП. Подсистема «Варианты отчетов» автоматически собирает статистику посещений.
Рассмотрим, как найти эти данные:
ИспользованиеСрезов или внутренних таблиц метрик производительности.Важный нюанс: Статистика БСП часто фиксирует только факт открытия формы отчета, но не всегда — факт нажатия кнопки «Сформировать». Если вам нужна точность до исполнения запроса, лучше использовать комбинацию расширения и ручного логирования.
Для конфигураций на обычных формах (например, УПП 1.3 или старые редакции УТ 10.3) событие ОбработкаПолученияФормы или расширения могут работать иначе. В этом случае мы рекомендуем использовать подписку на события. Однако, как было замечено в обсуждении, для ОтчетМенеджер доступно мало событий.
Разберем альтернативу: создание Общей формы отчета. В настройках метаданных отчета можно указать общую форму как основную. В модуле этой формы, в событии ПриОткрытии или при нажатии на стандартную кнопку Сформировать, прописывается код логирования. Это позволит избежать изменения модуля объекта каждого отчета, сосредоточив логику в одном месте.
Если стоит задача собрать данные за прошедший период или без внесения изменений в конфигурацию, проанализируем возможности Технологического журнала (ТЖ). Настроив сбор событий SCOM и CALL, можно отследить обращения к объектам метаданных типа Report.
Пример настройки logcfg.xml для мониторинга отчетов:
<log location="C:\LOGS\Reports" history="72">
<event>
<eq property="Name" value="SCOM"/>
<like property="Context" value="Report.*"/>
</event>
<property name="All"/>
</log>
Этот метод требует навыков парсинга логов, но он абсолютно не нагружает базу данных транзакциями записи при каждом формировании отчета пользователем.
Мы рассмотрели несколько способов решения задачи. Выбор зависит от вашей инфраструктуры:
ВариантыОтчетов.Помните, что избыточное логирование (особенно запись параметров формирования) может привести к росту объема базы данных. Рекомендуем настроить регламентное задание по очистке старых записей в регистре мониторинга.