Почему оборотно-сальдовая ведомость за разные периоды формируется с разной скоростью и как это исправить?

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

В процессе эксплуатации систем на базе 1С:Предприятие 8.3 администраторы и разработчики часто сталкиваются с парадоксальной ситуацией: один и тот же отчет (например, оборотно-сальдовая ведомость) за один месяц формируется мгновенно, а за другой — вызывает длительное «зависание» системы. Особенно остро эта проблема проявляется после обновления платформы, перехода на новые релизы БСП (Библиотеки стандартных подсистем) или повышения режима совместимости конфигурации. В данной статье мы подробно разберем, почему это происходит, как диагностировать проблему с помощью инструментов SQL Server и как программно восстановить производительность системы.

Анализ симптомов и поиск первопричины

Рассмотрим типовую ситуацию. После обновления базы с режима совместимости 8.3.14 до 8.3.17 и подключения новых механизмов БСП, отчеты за прошлые периоды (например, за сентябрь) начинают работать крайне медленно, в то время как за текущие (октябрь) — «летают». Стандартные действия, такие как пересчет итогов в конфигураторе, обновление статистики SQL или реструктуризация таблиц, в данном случае могут не приносить результата.

Проанализируем ситуацию с точки зрения СУБД. При изучении планов запроса через SQL Profiler или Extended Events можно заметить колоссальную разницу в объеме обрабатываемых данных. В «быстром» запросе система может обрабатывать около 200 тысяч строк, в то время как в «медленном» — более 6 миллионов строк для аналогичного периода. Это происходит потому, что в первом случае 1С обращается к таблицам итогов, а во втором — игнорирует их и выполняет полное сканирование основной таблицы движений регистра (например, AccRg для бухгалтерии).

Механизм минимального периода рассчитанных итогов (МПРИ)

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

При обновлении конфигурации или смене режима совместимости этот параметр может установиться некорректно или сброситься. В результате «граница доверия» к итогам сдвигается, и отчеты за вполне актуальные месяцы начинают требовать сканирования миллионов записей.

Программная диагностика и исправление периода итогов

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

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


// Получаем дату, ранее которой итоги не используются
ДатаМинимума = РегистрыБухгалтерии.Типовой.ПолучитьМинимальныйПериодРассчитанныхИтогов();
Сообщить("Минимальный период итогов сейчас: " + ДатаМинимума);

Если возвращаемая дата позже, чем период, за который отчет тормозит, значит, причина найдена. Для исправления ситуации необходимо принудительно установить минимальный период на более раннюю дату, например, на начало прошлого года или на дату начала ведения учета в базе:


// Устанавливаем корректную границу для использования итогов
НужнаяДата = Дата(2021, 01, 01);
РегистрыБухгалтерии.Типовой.УстановитьМинимальныйПериодРассчитанныхИтогов(НужнаяДата);
Сообщить("Минимальный период успешно изменен на " + НужнаяДата);

После выполнения этого кода система снова начнет использовать таблицы итогов для построения отчетов за указанный период, что моментально сократит количество сканируемых строк в SQL Server.

Влияние SQL Server 2019 и режима совместимости

Проанализируем дополнительные факторы, которые могут усугублять проблему. При использовании SQL Server 2019 включаются механизмы Intelligent Query Processing. Один из них — Adaptive Join. В некоторых случаях 1С генерирует запросы, которые конфликтуют с этой функцией, вызывая неоптимальный выбор плана выполнения.

Если изменение периода итогов помогло частично, попробуем изменить настройки базы данных на стороне SQL. В частности, можно попробовать отключить адаптивные соединения или понизить уровень совместимости базы (Compatibility Level) до 140 (соответствует SQL Server 2017). Для отключения конкретной фичи без смены уровня совместимости используйте команду:

ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_ADAPTIVE_JOINS = OFF;

Также стоит обратить внимание на Parameter Sniffing. Поскольку 1С активно использует временные таблицы, SQL Server может кэшировать план запроса, построенный для «легкого» периода, и пытаться применить его к «тяжелому». Регулярное обновление статистики (особенно по таблицам AccRg) и очистка процедурного кэша могут помочь в стабилизации производительности.

Почему база выросла после обновления?

Разберем вопрос увеличения объема базы данных на 25-30% после перехода на режим 8.3.17. Это часто связано с особенностями хранения данных в новых версиях БСП и платформы:

  1. Версионирование объектов: Новые подсистемы могут автоматически включать хранение версий для большого количества справочников и документов.
  2. Изменение индексов: При реструктуризации платформа 1С может пересоздавать индексы с учетом новых требований режима совместимости, что увеличивает размер файлов данных.
  3. Ghost Cleanup: В SQL Server после массового удаления или перемещения данных (что происходит при реструктуризации) записи помечаются как «призраки». Они физически не удаляются сразу, и даже процедура SHRINK не поможет, пока фоновый процесс очистки не завершит работу.

Для минимизации размера рекомендуется выполнить полную реиндексацию и убедиться, что в базе не хранятся избыточные данные версионирования за длительный период.

Резюме действий для исправления работы отчетов

Подведем итог нашему исследованию. Если ваши отчеты в 1С работают выборочно медленно, следуйте этой инструкции:

  1. Проверьте количество обрабатываемых строк в SQL Profiler для быстрого и медленного периодов.
  2. Используйте программный метод ПолучитьМинимальныйПериодРассчитанныхИтогов() для проверки границ расчета.
  3. Установите корректную дату через УстановитьМинимальныйПериодРассчитанныхИтогов().
  4. Обновите статистику SQL Server для основных таблиц регистра бухгалтерии.
  5. При сохранении проблем на SQL 2019 попробуйте отключить BATCH_MODE_ADAPTIVE_JOINS.

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

← На главную