Что означает ошибка "Recalc totals" в 1С, почему блокируется вход в базу и как ускорить процесс?

Системный администратор IT и автоматизация бизнеса
← На главную

Ситуация, когда после аварийного завершения работы или сбоя при пересчете итогов база данных 1С становится недоступной, является классической проблемой для администраторов. Пользователи видят сообщение с кодом блокировки Recalc totals, а попытка войти в Конфигуратор или режим Предприятия заканчивается неудачей. Сама по себе ошибка Recalc totals: причины блокировки и способы устранения требует понимания того, что происходит "под капотом" платформы и SQL-сервера, почему этот процесс может занимать часы и как правильно выполнить замер производительности контура 1С и поиск узких мест, чтобы грамотно решить эту проблему.

Природа блокировки Recalc totals

Когда мы запускаем штатную процедуру пересчета в режиме Конфигуратора или Предприятия, платформа 1С выполняет ряд действий для обеспечения целостности данных. О том, как в целом устроено управление итогами в 1С 8.3: механизмы, проблемы и системные решения, а также как должна быть выполнена настройка регламентных операций MS SQL SERVER под 1С, важно знать для понимания причин возникновения монопольных блокировок. Первым делом платформа устанавливает блокировку на таблицы, с которыми будет работать, чтобы во время пересчета никто не изменил данные регистров.

Сообщение Recalc totals — это маркер этой специфической блокировки. Если процесс пересчета прерывается некорректно (например, вы "убили" процесс 1cv8.exe через диспетчер задач, или пропало электричество), блокировка может остаться активной по двум причинам:

  1. Сеанс 1С в кластере серверов еще считается "живым".
  2. СУБД (SQL Server) продолжает выполнять операцию, начатую этим сеансом, или выполняет её откат (Rollback).

Рассмотрим, почему процесс может "висеть" очень долго, даже если визуально ничего не происходит.

Механизм очистки таблиц: DELETE против TRUNCATE

Самая интересная часть проблемы кроется в том, как именно 1С очищает таблицы итогов перед их новым расчетом. Таблицы итогов регистров накопления и бухгалтерии в базе данных обычно имеют имена, начинающиеся с _AccumRgT... или _AccRgT.... Проанализируем разницу в подходах, на которой базируется оптимизация пересчета итогов 1С с использованием TRUNCATE в MS SQL Server:

  1. Команда DELETE (используется 1С штатно):

    Платформа выполняет удаление записей. Для SQL Server это означает построчное удаление данных. Каждая удаляемая строка записывается в журнал транзакций (Transaction Log, файл .ldf). Если таблица итогов огромная (миллионы записей), этот процесс:

    • Занимает много времени.
    • Сильно раздувает лог транзакций.
    • Блокирует таблицу на всё время операции, что может привести к ошибкам, если отключена блокировка на уровне страницы при реорганизации индексов.

    Самое важное: если в процессе выполнения DELETE произошел сбой, SQL Server обязан откатить транзакцию назад. Операция ROLLBACK для DELETE занимает примерно столько же времени (или даже больше), сколько шло само удаление. Именно поэтому 1С не пускает вас в базу — SQL всё еще занят "возвращением" удаленных строк.

  2. Команда TRUNCATE (оптимальный вариант):

    Это команда мгновенной очистки таблицы. Она не пишет удаление каждой строки в лог, а просто деаллоцирует страницы данных. Это происходит за доли секунды, независимо от объема данных. Однако 1С штатно редко использует этот метод при пересчете итогов из пользовательского режима.

Диагностика зависшего процесса

Прежде чем предпринимать активные действия, давайте убедимся, что происходит именно откат транзакции или зависание процесса в SQL. В этом поможет диагностика блокировок 1С в SQL Server Management Studio (SSMS), особенно если анализировать SQL сервер глазами 1С-ника с помощью специализированных инструментов мониторинга:

  1. Откроем SQL Server Management Studio.
  2. Запустим Activity Monitor (Монитор активности) или используем процедуру sp_who2.
  3. Поищем процессы, связанные с нашей базой данных.
  4. Обратим внимание на колонки Command и Wait Type. Если мы видим статус KILLED/ROLLBACK, значит, сервер занят отменой изменений. Если видим активный DELETE, значит, очистка все еще идет.

Если процесс находится в состоянии ROLLBACK, попытка "убить" его снова через KILL SPID не поможет — процесс не исчезнет, пока не откатит транзакцию до конца. В этом случае остается только ждать.

Решение проблемы и ускорение пересчета

Если база заблокирована, а пересчет итогов жизненно необходим, и вы не хотите ждать часами, пока штатный механизм 1С удалит записи через DELETE, мы можем применить "военную хитрость" администратора 1С.

Важное предупреждение: Все действия с прямыми SQL-запросами вы делаете на свой страх и риск. Обязательно сделайте резервную копию базы данных (средствами SQL) перед началом работ.

Алгоритм ускоренного пересчета итогов (метод ручного Truncate)

Идея метода заключается в том, чтобы самостоятельно и мгновенно очистить таблицы итогов средствами SQL, а затем запустить пересчет в 1С. Платформа увидит, что таблицы пусты, и сразу начнет их заполнение (INSERT), пропустив фазу длительного удаления.

  1. Остановка доступа:

    Остановите службу сервера 1С или установите блокировку работы пользователей (поможет завершение сеансов и блокировка пользователей), чтобы никто не пытался писать в регистры в процессе обслуживания.

  2. Определение таблиц итогов:

    Нам нужно узнать имена таблиц итогов для регистров накопления. В этом помогут скрипты SQL для администратора 1С: автоматизация и ручная очистка таблиц, которые позволяют быстро идентифицировать нужные объекты через метаданные — для этого есть обработка просмотра структуры таблиц 1С в SQL. Чтобы сделать работу с метаданными быстрее, можно использовать обработку Структура хранения базы данных.

    Пример кода на 1С для получения имен таблиц:

    
    СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных(, ИменаМетаданных);
    Для Каждого Таблица Из СтруктураБД Цикл
        // Ищем таблицы итогов регистров
        Если ТипЗнч(Таблица.Метаданные) = Тип("Метаданные.РегистрыНакопления") Тогда
            // Здесь будет имя таблицы итогов в SQL
            Сообщить(Таблица.ИмяТаблицыИтогов); 
        КонецЕсли;
    КонецЦикла;
    
  3. Выполнение очистки в SQL:

    В Management Studio создайте запрос к нужной базе. Используйте команду TRUNCATE TABLE для таблиц итогов. Это мгновенно очистит их.

    
    -- Примерный вид команд (имена таблиц у вас будут другие!)
    TRUNCATE TABLE _AccumRgT12345
    TRUNCATE TABLE _AccumRgT67890
    

    Будьте предельно внимательны: не очистите основные таблицы движений (обычно _AccumRg... без суффикса T)! Нам нужны только таблицы итогов.

  4. Запуск пересчета в 1С:

    После того как таблицы очищены вручную:

    • Запустите Конфигуратор.
    • Перейдите в "Администрирование" -> "Тестирование и исправление".
    • Выберите только пункт "Пересчет итогов".
    • Запустите выполнение.

    Платформа обнаружит, что итогов нет, и начнет рассчитывать их на основании таблиц движений. Этот процесс пройдет значительно быстрее и стабильнее, чем DELETE + INSERT.

Что делать, если нужно просто снять блокировку?

Если ваша цель — просто вернуть доступ пользователям, а пересчет итогов вы планируете отложить на ночь:

  1. Проверьте консоль кластера 1С: Посмотрите, есть ли зависшие сеансы. Удалите их.
  2. Очистите сеансовые данные: Если сеансов нет, но 1С не пускает, возможно, "залип" файл блокировок. Попробуйте перезапустить службу 1C:Enterprise 8.3 Server Agent.
  3. Убейте процесс в SQL (крайняя мера): Если в Activity Monitor висит процесс DELETE от вашего старого сеанса, вы можете сделать ему KILL. Но помните: SQL начнет ROLLBACK.

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

Резюме

Блокировка Recalc totals возникает из-за монопольного захвата таблиц при пересчете. Длительность процесса часто обусловлена использованием медленной операции DELETE вместо TRUNCATE. При сбоях SQL Server тратит время на откат транзакции. Для решения проблемы и ускорения процесса рекомендуется использовать ручную очистку таблиц итогов через TRUNCATE TABLE в SQL, после чего запускать штатный пересчет в 1С, предварительно убедившись, что выполнена грамотная настройка регламентных операций MS SQL SERVER.

← На главную