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

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

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

Разберем подробнее несколько эффективных способов решения этой задачи, начиная от анализа на уровне СУБД и заканчивая настройками самой платформы.

Анализ статистики SQL Server (DMV)

Если ваша база данных работает на MS SQL Server, мы можем получить информацию о последнем обращении к таблице без включения сложных логов. Это самый быстрый и «дешевый» с точки зрения производительности способ. Для этого воспользуемся динамическими административными представлениями (DMV).

Проанализируем состояние индексов таблицы регистра. SQL Server хранит дату последнего поиска (seek) или сканирования (scan) по индексам. Сначала нам нужно узнать имя таблицы в базе данных. Для этого в консоли запросов 1С или через обработку выполним команду ПолучитьСтруктуруХраненияБазыДанных(), указав имя нашего регистра. Допустим, имя таблицы — _AccumReg123.

Затем в SQL Server Management Studio выполним следующий запрос:


SELECT 
    OBJECT_NAME(object_id) AS TableName,
    last_user_seek,
    last_user_scan,
    last_user_lookup
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID('Имя_Вашей_Базы')
AND object_id = OBJECT_ID('_AccumReg123');

Важный момент: эта статистика сбрасывается при каждом перезапуске службы SQL Server. Если даты в полях last_user_seek или last_user_scan свежие, значит, данные читаются. Если поля пустые или даты очень старые — регистр, скорее всего, не востребован.

Использование Технологического журнала (ТЖ)

Этот метод является наиболее точным встроенным инструментом платформы 1С. Мы можем настроить сбор событий SDBL (внутренний язык запросов 1С) или DBMSSQL (запросы к СУБД) с фильтром по имени таблицы нашего регистра. Рассмотрим, как это настроить в файле logcfg.xml.

В конфигурационном файле необходимо прописать условие, которое будет отлавливать вхождение имени таблицы в текст запроса:


<log location="C:\LOGS\RegisterRead" history="168">
    <event>
        <eq property="Name" value="SDBL"/>
        <like property="Text" value="%_AccumReg123%"/>
    </event>
    <property name="all"/>
</log>

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

Регистрация через механизм RLS (Access Control)

Рассмотрим «хитрый» способ регистрации чтения данных непосредственно средствами 1С, который не требует изменения структуры метаданных. Он заключается в использовании ограничения доступа на уровне записей (RLS).

  1. Выберем роль, которая назначена всем пользователям (или создадим новую).
  2. Для нашего регистра накопления установим ограничение на право Чтение.
  3. В шаблоне ограничения пропишем вызов функции из общего модуля: #Параметр1("Где ЛогФункция()").
  4. Общий модуль должен быть помечен как «Вызов сервера». В самой функции можно реализовать запись факта обращения в отдельный лог-журнал или текстовый файл.

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

Анализ кода и организационные меры

Прежде чем приступать к сложным техническим методам, проанализируем конфигурацию стандартными средствами:

  1. Глобальный поиск: выполним поиск по имени регистра во всей конфигурации. Обращаем внимание не только на запросы, но и на свойства объектов (например, использование регистра как источника данных для отчета или динамического списка).
  2. Поиск во внешних файлах: если есть подозрение, что регистр используют внешние отчеты, можно воспользоваться утилитами поиска текста в двоичных файлах (grep) для поиска имени регистра или его идентификатора (GUID) в папках с внешними обработками.
  3. Метод префиксов: переименуем регистр, добавив префикс Удалить_. В среде 1С это потребует исправления мест записи (проведения документов), но это сразу «подсветит» все места, где данные пытаются прочитать программно. Как отмечали эксперты, это радикальный, но самый действенный способ выявления реальных зависимостей.

Выясним причину использования регистра: если за длительный период (например, квартал или год) ни SQL-статистика, ни Технологический журнал не зафиксировали обращений, объект можно пометить на удаление, предварительно сделав резервную копию базы данных.

← На главную