Что делать, если 1С зависает при тестировании и исправлении на этапе пересчета итогов?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При выполнении процедуры Тестирование и исправление в Конфигураторе 1С операция нередко визуально замирает на этапе Пересчет итогов. Процесс Конфигуратора перестает обновлять интерфейс, объем используемой оперативной памяти не изменяется, а окно программы переходит в статус «Не отвечает». Разберем причины такого поведения, выясним, зависла ли база на самом деле, и рассмотрим надежные альтернативные способы расчета итогов регистров.

Выясняем причины кажущегося или реального зависания

Проанализируем ключевые факторы, из-за которых расчет итогов длится часами или полностью блокируется:

  1. Большой объем движений и специфика работы Конфигуратора. Во время выполнения пересчета итогов графический поток Конфигуратора блокируется и не реагирует на действия пользователя. В этот момент вся основная работа выполняется на стороне сервера СУБД. Конфигуратор лишь ожидает ответа, поэтому в диспетчере задач объем его памяти может оставаться минимальным и статичным.
  2. Аномальные даты в движениях регистров. Механизм итогов в 1С рассчитывает данные помесячно. Если из-за программного сбоя или некорректного ручного ввода в регистр попали даты из далекого будущего (например, 3999 или 9999 год) либо даты начала нашей эры (01.01.0001), платформа пытается сформировать и рассчитать миллионы пустых месячных срезов. Это приводит к колоссальным временным затратам даже на базах небольшого объема.
  3. Неактуальная статистика и планы запросов СУБД. Если статистика по таблицам движений и итогов устарела, оптимизатор СУБД может выбрать неэффективный план выполнения с полным сканированием таблиц (Table Scan) вместо индексного поиска.
  4. Переполнение журнала транзакций или TempDB. При полной модели восстановления базы в Microsoft SQL Server журнал транзакций стремительно разрастается. Если диск переполнен или шаг авторасширения настроен некорректно, сервер уходит в длительное ожидание дисковых операций ввода-вывода.
  5. Конфликты с фоновыми и регламентными заданиями. Неотключенные фоновые процессы могут параллельно обращаться к тем же регистрам, создавая взаимные блокировки данных.

Диагностируем реальное состояние процесса

Прежде чем принудительно завершать зависший процесс, необходимо проверить, выполняется ли реальная работа сервером СУБД и кластером 1С. Разберем шаги проверки:

  1. Консоль администрирования кластера серверов 1С. Откроем консоль администрирования, перейдем в ветку Соединения нужной информационной базы и найдем сессию Конфигуратора. Обратим внимание на колонки захваченных ресурсов (время вызова СУБД, количество переданных данных, активные блокировки). Если значения изменяются, сервер активно обрабатывает данные.
  2. Мониторинг запросов на стороне Microsoft SQL Server. Запустим SQL Server Profiler или выполним системный запрос для проверки активности сессий. Если в системных представлениях sys.dm_exec_requests сессия находится в статусе RUNNABLE или выполняет операции чтения/записи, прерывать ее нельзя — идет обработка.
  3. Анализ технологического журнала. Включив сбор событий SDBL и DBMSSQL (или DBPOSTGRS), можно увидеть точный текст SQL-запроса и конкретную таблицу регистра, с которой в текущий момент работает платформа.

Решение 1. Пересчет итогов в режиме 1С:Предприятие

Вместо монопольного тестирования и исправления через Конфигуратор гораздо удобнее выполнять пересчет итогов непосредственно в пользовательском режиме. В типовых конфигурациях для этого предусмотрена встроенная обработка (раздел Администрирование / Обслуживание / Регламентные операции / Управление итогами и агрегатами).

В этом режиме можно:

  1. Запустить пересчет без монопольного захвата всей информационной базы.
  2. Выполнять пересчет выборочно для конкретных регистров накопления и бухгалтерии.
  3. Контролировать визуальный прогресс обработки по каждому объекту.

Решение 2. Программный пересчет итогов через встроенный язык

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

Посмотрим на пример программного пересчета для регистров накопления и бухгалтерии:


// Пересчет итогов для конкретного регистра накопления
ИмяРегистра = "ВзаиморасчетыСКонтрагентами";
Если Метаданные.РегистрыНакопления.Найти(ИмяРегистра) <> Неопределено Тогда
    РегистрыНакопления[ИмяРегистра].ПересчитатьИтоги();
    Сообщить("Итоги регистра " + ИмяРегистра + " успешно пересчитаны.");
КонецЕсли;

// Пересчет итогов для регистра бухгалтерии
ИмяРегистраБух = "Хозрасчетный";
Если Метаданные.РегистрыБухгалтерии.Найти(ИмяРегистраБух) <> Неопределено Тогда
    РегистрыБухгалтерии[ИмяРегистраБух].ПересчитатьИтоги();
    Сообщить("Итоги регистра бухгалтерии " + ИмяРегистраБух + " успешно пересчитаны.");
КонецЕсли;

Если на определенном регистре пересчет зависает намертво, самым быстрым способом сброса поврежденной структуры итогов является полное отключение и повторное включение использования итогов:


// Быстрый сброс и чистое перестроение итогов регистра
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Ложь);
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Истина);

Решение 3. Подготовка информационной базы и СУБД перед тестированием

Чтобы исключить зависания при глобальном тестировании и исправлении, выполним предварительную подготовку среды:

  1. Блокировка регламентных заданий. В консоли кластера 1С установим флаг Блокировка регламентных заданий включена для базы, чтобы исключить конфликты блокировок.
  2. Обновление статистики в СУБД. В Microsoft SQL Server выполним команду sp_updatestats или регламентное задание перестроения индексов и обновления статистики. Для PostgreSQL выполним операцию ANALYZE.
  3. Модель восстановления. Временно переключим модель восстановления базы данных в СУБД в режим Simple (Простая), чтобы журнал транзакций не переполнял дисковое пространство во время массивных вставок.
  4. Проверка дат движений. Напишем запрос к таблицам движений регистров на поиск дат, превышающих текущий год более чем на несколько лет, либо некорректных пустых дат.

Решение 4. Запуск тестирования и исправления через командную строку

Запуск проверки через командный файл с выводом подробного лога позволяет исключить проблемы с графической оболочкой Конфигуратора и видеть актуальный прогресс в текстовом файле:


"C:\Program Files\1cv8\8.3.9.2170\bin\1cv8.exe" DESIGNER /S "srv-1c\base_name" /N "Admin" /P "Password" /IBCheckAndRepair -RecalcTotals -LogFormative /Out "C:\Logs\tiilog.txt"

Параметр -LogFormative обеспечивает запись подробной информации о каждом шаге в результирующий лог tiilog.txt.

← На главную