Когда вы сталкиваетесь с задачей массового анализа истории изменений для тысяч документов, стандартный метод ИсторияДанных.ВыбратьВерсии часто становится «узким местом» системы. Давайте разберемся, почему это происходит и какие стратегии можно применить, чтобы решить проблему производительности.
ИсторияДанных.ВыбратьВерсии работает медленно?Чтобы эффективно решать задачу, нужно сначала выяснить причины её возникновения. Механизм истории данных в платформе 1С спроектирован как универсальное хранилище для объектов любого типа. Основная проблема заключается в архитектуре хранения:
ВыбратьВерсии, система должна извлечь этот бинарный поток, прочитать его и «оживить», преобразовав обратно в объекты 1С.В отличие от таблиц регистрации изменений или обычных регистров сведений, где данные лежат в «плоском» виде и легко индексируются SQL-сервером, механизм истории данных не предназначен для построения аналитических отчетов по всей базе документов.
Рассмотрим несколько подходов, которые помогут избежать тормозов при работе с историей изменений.
Это самый надежный и производительный путь. Если вам нужно часто отслеживать, кто и когда изменил конкретные реквизиты (например, «ИмяПользователя»), не стоит полагаться на платформенную историю.
Алгоритм действий:
ЛогИзмененийДокументов.ДокументСсылка, Пользователь, ДатаИзменения.ПриЗаписи модуля объекта заполняйте данный регистр.Запрос к такому регистру будет работать максимально быстро, так как 1С сможет использовать стандартные индексы СУБД без необходимости десериализации бинарных данных.
Пример логики записи:
// В модуле объекта документа
Процедура ПриЗаписи(Отказ)
НаборЗаписей = РегистрыСведений.ЛогИзмененийДокументов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Документ.Установить(ЭтотОбъект.Ссылка);
Запись = НаборЗаписей.Добавить();
Запись.Документ = ЭтотОбъект.Ссылка;
Запись.Пользователь = Пользователи.ТекущийПользователь();
Запись.ДатаИзменения = ТекущаяДатаСеанса();
НаборЗаписей.Записать();
КонецПроцедуры
Если вы все же вынуждены использовать штатный механизм, обязательно проанализируйте план выполнения запроса. Хотя ИсторияДанных не является таблицей в привычном нам языке запросов, на уровне СУБД (например, SQL Server) работа происходит с таблицами, начинающимися с префикса DataHistory.
Проверьте, установлены ли индексы на полях, по которым вы выполняете фильтрацию (например, по автору или дате). Если вы работаете с 20 000 документов, даже малейшая неоптимальность в фильтрах может приводить к полному сканированию таблицы истории (Table Scan), что недопустимо при таких объемах.
Для систем с огромным количеством изменений хорошей практикой является вынос истории в отдельную аналитическую базу данных. Это позволяет:
Запомните: штатный метод ИсторияДанных.ВыбратьВерсии — это инструмент для просмотра истории конкретного объекта пользователем (например, через отчет «История изменений» в форме документа). Использование его для пакетной обработки десятков тысяч документов является архитектурной ошибкой.
Если задача требует массовой аналитики, переходите на модель логирования событий в регистры сведений. Это потребует дополнительных затрат ресурсов на хранение, но взамен вы получите высокую скорость работы и возможность строить любые отчеты стандартными средствами 1С.