При эксплуатации систем 1С на протяжении многих лет (в нашем примере — 7 лет) базы данных неизбежно разрастаются. Когда количество записей в журнале документов, например, РеализацияТоваровУслуг, переваливает за 500 000, пользователи начинают жаловаться на «подвисания» при попытке установить фильтр или просто пролистать список. Особенно остро эта проблема проявляется в конфигурациях на обычных формах, таких как «Управление торговлей 10.3».
Разберем детально, почему это происходит, стоит ли создавать «архивные» виды документов и какие методы оптимизации действительно работают на больших объемах данных.
Проанализируем ситуацию: когда пользователь открывает журнал без фильтров, система обычно считывает последние записи. Но как только устанавливается отбор (например, по контрагенту или складу), СУБД (SQL Server) должна найти подходящие записи среди сотен тысяч строк. Если соответствующий индекс отсутствует или неэффективен, происходит операция TABLE SCAN — полное сканирование таблицы, что и вызывает длительное ожидание.
Важным фактором является так называемая селективность индекса. Если на одного контрагента (например, «Розничный покупатель») приходится 40% всех документов (200 000 из 500 000), стандартный поиск по индексу может перестать работать. SQL-сервер решит, что проще прочитать всю таблицу целиком, чем использовать индекс. Это называется «точкой перелома» (Tipping Point).
Рассмотрим идею автора темы: перенести старые документы в новый объект РеализацияТоваровУслуг_Архив. На первый взгляд, это разгрузит основную таблицу. Однако проанализируем «подводные камни»:
Вывод: Создание архивного документа — это крайняя мера, которая создает больше проблем, чем решает. Лучше использовать проверенные методы оптимизации.
Самый простой и эффективный способ ускорить работу пользователя — не давать ему открывать «всю историю» сразу. Если установить в коде формы журнала отбор по умолчанию за последние 1–2 месяца, объем обрабатываемых данных сократится в десятки раз.
Разберем пример установки программного фильтра при открытии формы:
Процедура ПриОткрытии()
// Установим период по умолчанию: начало текущего месяца
Если Не ЗначениеЗаполнено(ДатаНачала) Тогда
ДатаНачала = НачалоМесяца(ТекущаяДата());
ЭлементыФормы.ДокументСписок.НастройкаОтбора.Дата.Доступность = Истина;
ЭлементыФормы.ДокументСписок.НастройкаОтбора.Дата.ЗначениеС = ДатаНачала;
ЭлементыФормы.ДокументСписок.НастройкаОтбора.Дата.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Это заставит SQL-сервер выполнять INDEX SEEK по полю даты, что отрабатывает мгновенно даже на миллионных таблицах.
Если отбор по конкретному контрагенту (например, «Розничный покупатель») занимает более минуты, это явный признак проблем с индексами. Выясним причину через консоль SQL или замер производительности 1С.
Что нужно сделать:
Если штатный журнал документов слишком «тяжелый» (содержит много колонок, связанных с разными таблицами), можно применить технику «теневого индекса». Рассмотрим ее реализацию:
БыстрыйПоискДокументов).СсылкаНаДокумент, Дата, Контрагент, Сумма.Обрезка базы — наиболее радикальный, но правильный путь удаления данных старше 3–5 лет. Однако наличие распределенной информационной базы (РИБ) усложняет процесс. Рассмотрим, как избежать гигантских файлов обмена:
Алгоритм безопасной обрезки:
_MessageNo.Shrink (сжатие) базы данных на уровне SQL, чтобы вернуть освободившееся место операционной системе.Если вы используете SQL Server Enterprise, можно рассмотреть секционирование таблиц (Table Partitioning). Вы можете физически разнести данные таблицы документов по годам в разные файлы на диске. Для платформы 1С это будет выглядеть как одна таблица, но SQL будет обращаться только к секции за 2023–2024 год, полностью игнорируя старые данные при запросах с фильтром по дате.
Также проанализируем план запроса. Если вы видите оператор Key Lookup, это означает, что индекс помогает найти строку, но затем SQL приходится лезть в основную таблицу за недостающими полями. Уменьшение количества колонок в списке журнала может существенно ускорить выборку.
Посмотрим на итоги: для решения проблемы «тормозов» журнала на 500 000 записей не нужно плодить новые сущности вроде «Архивных документов». Достаточно внедрить обязательный фильтр по периоду, проверить индексы по контрагентам и запланировать регламентную обрезку базы с предварительным отключением регистрации в РИБ. Эти меры позволят системе работать стабильно даже при постоянном росте объема данных.