Рассмотрим неприятную, но довольно распространенную ситуацию: в разгар рабочего дня в крупной рабочей базе 1С (например, УПП) после некоторых манипуляций (в данном случае, загрузки данных через стандартную обработку) произошло отключение и последующее включение итогов по регистрам накопления. Процесс включения затянулся на несколько часов, а после его завершения работа пользователей с этим регистром (построение отчетов, проведение документов) резко замедлилась. При этом на тестовой копии базы та же операция выполняется за секунды. Давайте вместе разберемся в причинах такого поведения системы и составим план действий для решения проблемы.
Первый и самый очевидный вопрос: почему на рабочей базе операция длится часы, а на тестовой — секунды? Ответ кроется в активности пользователей.
Когда итоги по регистру накопления отключены, платформа продолжает записывать все движения в основную таблицу данных регистра. В момент, когда мы даем команду включить итоги, системе необходимо рассчитать и записать в таблицы итогов все те изменения, которые произошли за период их отключения. Для этого ей нужен монопольный доступ к таблицам регистра.
В рабочей базе постоянно идут транзакции: пользователи проводят документы, формируют отчеты, выполняют регламентные задания. Каждая такая операция может устанавливать блокировки на таблицы данных в MS SQL. Процесс включения итогов, столкнувшись с этими блокировками, будет терпеливо ждать их снятия. Если система высоконагруженная, это ожидание может длиться очень долго, что и приводит к многочасовому "зависанию" операции.
На тестовой базе, где нет активных пользователей и фоновых заданий, нет и блокировок. Если за время отключения итогов никаких новых движений не было, система просто меняет внутренний флаг, сообщая, что итоги снова актуальны. Это занимает доли секунды. Если же движения были, их пересчет пройдет быстро, так как ему никто не мешает.
Вывод: Длительное включение итогов в рабочее время — это в первую очередь следствие блокировок со стороны активных сеансов пользователей.
Итак, итоги с горем пополам включились, но система начала "тормозить". Запросы к таблицам остатков и оборотов проблемного регистра стали выполняться в десятки раз дольше. Почему это произошло?
Процедура пересчета итогов — это, по сути, массовая вставка и обновление огромного количества записей в таблицах итогов в СУБД. Такие операции имеют два неприятных побочных эффекта:
Именно эти два фактора являются прямой причиной резкого падения производительности после аварийного пересчета итогов.
В ходе обсуждения на форуме выяснилась критическая деталь: граница рассчитанных итогов была установлена на 2019 год. Это коренная причина многих проблем с производительностью в данной базе.
Что такое граница итогов? Это точка во времени, до которой в таблицах итогов хранятся рассчитанные наперед обороты и остатки. Когда вы запрашиваете остатки на актуальную дату, система берет ближайший рассчитанный итог и добирает недостающие данные из таблицы движений. Если граница установлена на 31.07.2019, то для получения остатков на сегодняшний день СУБД будет вынуждена каждый раз считывать и агрегировать все движения регистра за несколько лет. Это колоссальная и совершенно избыточная нагрузка.
Такая ситуация возникает на так называемых "незакрывающихся" регистрах, где данные постоянно накапливаются, а регламентная процедура расчета и сдвига границы итогов не выполняется. Это бомба замедленного действия, которая рано или поздно приводит к деградации производительности.
Теперь, когда мы проанализировали причины, давайте составим пошаговый план по исправлению ситуации.
Это первое, что нужно сделать для "оживления" системы после инцидента. Эти операции должны выполняться непосредственно на стороне MS SQL Server, а не через стандартную реиндексацию в конфигураторе 1С.
Вам или вашему системному администратору необходимо выполнить следующие команды для таблиц проблемного регистра накопления (основной таблицы движений и таблицы итогов):
Эти действия должны значительно ускорить выполнение запросов к регистру и вернуть производительность на прежний уровень (или даже улучшить ее).
Срочные меры — это хорошо, но они не решают коренную проблему с устаревшей границей. Эту задачу нужно решать планово, в период минимальной нагрузки (ночью или на выходных).
Если в вашей системе есть "незакрывающиеся" регистры с огромными таблицами итогов, это повод задуматься об архитектуре. Возможно, стоит пересмотреть бизнес-процессы и внедрить процедуры закрытия периода, которые будут "сворачивать" старые движения, или перенести архивные данные в отдельные, не оперативные регистры. Это сложная задача, но в долгосрочной перспективе она обеспечит стабильность и высокую производительность вашей системы.