Данная статья относится к конфигурациям 1С:Бухгалтерия (стандартная и КОРП). Возможно, схожие проблемы есть у пользователей Комплексной автоматизации.
В марте 2022 года мы установили обновление конфигурации Бухгалтерия КОРП. Мы обратили внимание на длительную реструктуризацию базы данных, и связали её большей частью с повышением версии совместимости конфигурации с платформой до версии 8.3.16. Но, оказалось, это было не самое главное изменение.
Вскоре после установки обновления наши пользователи стали сигнализировать нам, что время формирования отчетов Оборотно-сальдовая ведомость (по счету) стало катастрофически большим. Например, ОСВ за прошлый год формировалась полчаса, при том, что раньше это происходило за несколько секунд.
Для информации, наша информационная база имеет размер около 1 Тбайт, и изображения в самой базе мы не храним.
Мы подумали сначала, что это произошло из сильной фрагментации индексов после обновления. Сразу скажу, что это оказалось не так. Поглядев на планы исполнения запросов СУБД MS SQL SERVER 2019 я искренне удивился, если не сказать больше.
Вместо ожидаемого получения оборотов из таблиц хранимых итогов, я увидел суммирование всех проводок регистра бухгалтерии для получения оборотов за период.
Что-то мешало системе получать данные итогов!
У нас версия платформы в тот момент была рекомендуемой - 8.3.18.1741, поэтому платформу обновлять я не хотел.
Я продолжил изучение проблемы на этой версии платформы.
Для начала я проверил, включены ли итоги, где находятся минимальные и максимальные границы, но все было в норме.
Еще раз изучив план исполнения запроса в СУБД я обратил внимание, что добавилось условие по новому полю PeriodAdjustment, причем очень плохое условие, через OR. Получалось, что сравнивается Period и PeriodAdjustment.
В языке запросов 1С PeriodAdjustment представлен полем УточнениеПериода. Поиск по этому полю в конфигурации не дал результата, в запросе отчета 1С не было условий по этому полю, а было условие только по полю Период в параметрах виртуальной таблицы ОстаткиИОбороты.
И тут до меня дошло! Платформа неправильно работает с итогами (оборотами) в случае наличия в регистре бухгалтерии дополнительного поля УточнениеПериода.
Вот оно главное изменение, влияющее на производительность! В свойствах регистра бухгалтерии Хозрасчетный увеличили значение Длина уточнения периода на единицу. В таблицы регистра в СУБД были добавлены поля PeriodAdjustment, но не во все таблицы, а только в основную и значений субконто. В таблицы итогов поле PeriodAdjustment не добавилось.
Так как у нас проведение и закрытие месяца после обновления замедлилось в 15 раз, а объем проводимых документов в месяц превышает 300 тысяч, нам надо было срочно что-то делать!
Единственное, что спасало нашу производительность, это использование расширения Оперативное проведение документов, которое сокращает использование получения оборотов при проведении.
Для проверки я установил значение свойства Длина уточнения периода равным 0.
После длительной оптимизированной реструктуризации (V2) я проверил формирование отчетов ОСВ. Они снова стали формироваться за секунды.
Теперь я начал думать как справиться с проблемой уже в рабочей системе. Для начала я проверил работу в более новой версии платформы - 8.3.20.1710. Результат так же был плачевный.
Все упоминания в конфигурации УточнениеПериода сводились к условиям: УточнениеПериода = 0.
Значит, по крайней мере в версии Бухгалтерии 3.0.108.31, реальное использование возможности уточнения периода еще не началось. За пять минут удалось удалить все упоминания УточнениеПериода из конфигурации.
В итоге нами было принято решение обнулить УточнениеПериода в продуктовой системе и удалить все использования поля УточнениеПериода в запросах. Что мы и сделали, и нам пока не пришлось сожалеть об этом.