Ситуация, когда после аварийного завершения работы или сбоя при пересчете итогов база данных 1С становится недоступной, является классической проблемой для администраторов. Пользователи видят сообщение с кодом блокировки Recalc totals, а попытка войти в Конфигуратор или режим Предприятия заканчивается неудачей. Сама по себе ошибка Recalc totals: причины блокировки и способы устранения требует понимания того, что происходит "под капотом" платформы и SQL-сервера, почему этот процесс может занимать часы и как правильно выполнить замер производительности контура 1С и поиск узких мест, чтобы грамотно решить эту проблему.
Когда мы запускаем штатную процедуру пересчета в режиме Конфигуратора или Предприятия, платформа 1С выполняет ряд действий для обеспечения целостности данных. О том, как в целом устроено управление итогами в 1С 8.3: механизмы, проблемы и системные решения, а также как должна быть выполнена настройка регламентных операций MS SQL SERVER под 1С, важно знать для понимания причин возникновения монопольных блокировок. Первым делом платформа устанавливает блокировку на таблицы, с которыми будет работать, чтобы во время пересчета никто не изменил данные регистров.
Сообщение Recalc totals — это маркер этой специфической блокировки. Если процесс пересчета прерывается некорректно (например, вы "убили" процесс 1cv8.exe через диспетчер задач, или пропало электричество), блокировка может остаться активной по двум причинам:
Рассмотрим, почему процесс может "висеть" очень долго, даже если визуально ничего не происходит.
Самая интересная часть проблемы кроется в том, как именно 1С очищает таблицы итогов перед их новым расчетом. Таблицы итогов регистров накопления и бухгалтерии в базе данных обычно имеют имена, начинающиеся с _AccumRgT... или _AccRgT.... Проанализируем разницу в подходах, на которой базируется оптимизация пересчета итогов 1С с использованием TRUNCATE в MS SQL Server:
Платформа выполняет удаление записей. Для SQL Server это означает построчное удаление данных. Каждая удаляемая строка записывается в журнал транзакций (Transaction Log, файл .ldf). Если таблица итогов огромная (миллионы записей), этот процесс:
Самое важное: если в процессе выполнения DELETE произошел сбой, SQL Server обязан откатить транзакцию назад. Операция ROLLBACK для DELETE занимает примерно столько же времени (или даже больше), сколько шло само удаление. Именно поэтому 1С не пускает вас в базу — SQL всё еще занят "возвращением" удаленных строк.
Это команда мгновенной очистки таблицы. Она не пишет удаление каждой строки в лог, а просто деаллоцирует страницы данных. Это происходит за доли секунды, независимо от объема данных. Однако 1С штатно редко использует этот метод при пересчете итогов из пользовательского режима.
Прежде чем предпринимать активные действия, давайте убедимся, что происходит именно откат транзакции или зависание процесса в SQL. В этом поможет диагностика блокировок 1С в SQL Server Management Studio (SSMS), особенно если анализировать SQL сервер глазами 1С-ника с помощью специализированных инструментов мониторинга:
sp_who2.KILLED/ROLLBACK, значит, сервер занят отменой изменений. Если видим активный DELETE, значит, очистка все еще идет.Если процесс находится в состоянии ROLLBACK, попытка "убить" его снова через KILL SPID не поможет — процесс не исчезнет, пока не откатит транзакцию до конца. В этом случае остается только ждать.
Если база заблокирована, а пересчет итогов жизненно необходим, и вы не хотите ждать часами, пока штатный механизм 1С удалит записи через DELETE, мы можем применить "военную хитрость" администратора 1С.
Важное предупреждение: Все действия с прямыми SQL-запросами вы делаете на свой страх и риск. Обязательно сделайте резервную копию базы данных (средствами SQL) перед началом работ.
Идея метода заключается в том, чтобы самостоятельно и мгновенно очистить таблицы итогов средствами SQL, а затем запустить пересчет в 1С. Платформа увидит, что таблицы пусты, и сразу начнет их заполнение (INSERT), пропустив фазу длительного удаления.
Остановите службу сервера 1С или установите блокировку работы пользователей (поможет завершение сеансов и блокировка пользователей), чтобы никто не пытался писать в регистры в процессе обслуживания.
Нам нужно узнать имена таблиц итогов для регистров накопления. В этом помогут скрипты SQL для администратора 1С: автоматизация и ручная очистка таблиц, которые позволяют быстро идентифицировать нужные объекты через метаданные — для этого есть обработка просмотра структуры таблиц 1С в SQL. Чтобы сделать работу с метаданными быстрее, можно использовать обработку Структура хранения базы данных.
Пример кода на 1С для получения имен таблиц:
СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных(, ИменаМетаданных);
Для Каждого Таблица Из СтруктураБД Цикл
// Ищем таблицы итогов регистров
Если ТипЗнч(Таблица.Метаданные) = Тип("Метаданные.РегистрыНакопления") Тогда
// Здесь будет имя таблицы итогов в SQL
Сообщить(Таблица.ИмяТаблицыИтогов);
КонецЕсли;
КонецЦикла;
В Management Studio создайте запрос к нужной базе. Используйте команду TRUNCATE TABLE для таблиц итогов. Это мгновенно очистит их.
-- Примерный вид команд (имена таблиц у вас будут другие!)
TRUNCATE TABLE _AccumRgT12345
TRUNCATE TABLE _AccumRgT67890
Будьте предельно внимательны: не очистите основные таблицы движений (обычно _AccumRg... без суффикса T)! Нам нужны только таблицы итогов.
После того как таблицы очищены вручную:
Платформа обнаружит, что итогов нет, и начнет рассчитывать их на основании таблиц движений. Этот процесс пройдет значительно быстрее и стабильнее, чем DELETE + INSERT.
Если ваша цель — просто вернуть доступ пользователям, а пересчет итогов вы планируете отложить на ночь:
1C:Enterprise 8.3 Server Agent.DELETE от вашего старого сеанса, вы можете сделать ему KILL. Но помните: SQL начнет ROLLBACK.Важно: После принудительного убийства процесса пересчета, итоги в регистрах будут некорректны. Поэтому полный пересчет итогов после таких манипуляций обязателен.
Блокировка Recalc totals возникает из-за монопольного захвата таблиц при пересчете. Длительность процесса часто обусловлена использованием медленной операции DELETE вместо TRUNCATE. При сбоях SQL Server тратит время на откат транзакции. Для решения проблемы и ускорения процесса рекомендуется использовать ручную очистку таблиц итогов через TRUNCATE TABLE в SQL, после чего запускать штатный пересчет в 1С, предварительно убедившись, что выполнена грамотная настройка регламентных операций MS SQL SERVER.