В практике разработчика 1С часто возникает задача оптимизации конфигурации, в рамках которой нужно выявить неиспользуемые объекты. Если с регистрами сведений или справочниками ситуация проще, то с регистрами накопления возникает проблема: платформа 1С:Предприятие не предоставляет стандартных обработчиков событий, таких как ПриЧтении или ПередЧтением. Мы можем отследить запись, но не можем встроенными методами узнать, кто и когда формировал запрос к таблицам регистра.
Разберем подробнее несколько эффективных способов решения этой задачи, начиная от анализа на уровне СУБД и заканчивая настройками самой платформы.
Если ваша база данных работает на 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>
Система будет записывать все обращения к регистру, включая те, что происходят из внешних отчетов, консоли запросов или программного кода. Это позволит нам увидеть не только факт чтения, но и имя пользователя, а также контекст вызова.
Рассмотрим «хитрый» способ регистрации чтения данных непосредственно средствами 1С, который не требует изменения структуры метаданных. Он заключается в использовании ограничения доступа на уровне записей (RLS).
#Параметр1("Где ЛогФункция()").Предупреждение: этот метод может существенно замедлить работу системы при массовых запросах к регистру, поэтому используйте его осторожно и только на короткий период мониторинга.
Прежде чем приступать к сложным техническим методам, проанализируем конфигурацию стандартными средствами:
Удалить_. В среде 1С это потребует исправления мест записи (проведения документов), но это сразу «подсветит» все места, где данные пытаются прочитать программно. Как отмечали эксперты, это радикальный, но самый действенный способ выявления реальных зависимостей.Выясним причину использования регистра: если за длительный период (например, квартал или год) ни SQL-статистика, ни Технологический журнал не зафиксировали обращений, объект можно пометить на удаление, предварительно сделав резервную копию базы данных.