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