При выполнении процедуры Тестирование и исправление в Конфигураторе 1С операция нередко визуально замирает на этапе Пересчет итогов. Процесс Конфигуратора перестает обновлять интерфейс, объем используемой оперативной памяти не изменяется, а окно программы переходит в статус «Не отвечает». Разберем причины такого поведения, выясним, зависла ли база на самом деле, и рассмотрим надежные альтернативные способы расчета итогов регистров.
Проанализируем ключевые факторы, из-за которых расчет итогов длится часами или полностью блокируется:
Прежде чем принудительно завершать зависший процесс, необходимо проверить, выполняется ли реальная работа сервером СУБД и кластером 1С. Разберем шаги проверки:
Соединения нужной информационной базы и найдем сессию Конфигуратора. Обратим внимание на колонки захваченных ресурсов (время вызова СУБД, количество переданных данных, активные блокировки). Если значения изменяются, сервер активно обрабатывает данные.sys.dm_exec_requests сессия находится в статусе RUNNABLE или выполняет операции чтения/записи, прерывать ее нельзя — идет обработка.SDBL и DBMSSQL (или DBPOSTGRS), можно увидеть точный текст SQL-запроса и конкретную таблицу регистра, с которой в текущий момент работает платформа.Вместо монопольного тестирования и исправления через Конфигуратор гораздо удобнее выполнять пересчет итогов непосредственно в пользовательском режиме. В типовых конфигурациях для этого предусмотрена встроенная обработка (раздел Администрирование / Обслуживание / Регламентные операции / Управление итогами и агрегатами).
В этом режиме можно:
Если штатная форма недоступна или падает, напишем внешнюю обработку и запустим пересчет регистров по отдельности. Это позволит локализовать проблемный регистр, на котором происходит задержка.
Посмотрим на пример программного пересчета для регистров накопления и бухгалтерии:
// Пересчет итогов для конкретного регистра накопления
ИмяРегистра = "ВзаиморасчетыСКонтрагентами";
Если Метаданные.РегистрыНакопления.Найти(ИмяРегистра) <> Неопределено Тогда
РегистрыНакопления[ИмяРегистра].ПересчитатьИтоги();
Сообщить("Итоги регистра " + ИмяРегистра + " успешно пересчитаны.");
КонецЕсли;
// Пересчет итогов для регистра бухгалтерии
ИмяРегистраБух = "Хозрасчетный";
Если Метаданные.РегистрыБухгалтерии.Найти(ИмяРегистраБух) <> Неопределено Тогда
РегистрыБухгалтерии[ИмяРегистраБух].ПересчитатьИтоги();
Сообщить("Итоги регистра бухгалтерии " + ИмяРегистраБух + " успешно пересчитаны.");
КонецЕсли;
Если на определенном регистре пересчет зависает намертво, самым быстрым способом сброса поврежденной структуры итогов является полное отключение и повторное включение использования итогов:
// Быстрый сброс и чистое перестроение итогов регистра
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Ложь);
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Истина);
Чтобы исключить зависания при глобальном тестировании и исправлении, выполним предварительную подготовку среды:
sp_updatestats или регламентное задание перестроения индексов и обновления статистики. Для PostgreSQL выполним операцию ANALYZE.Запуск проверки через командный файл с выводом подробного лога позволяет исключить проблемы с графической оболочкой Конфигуратора и видеть актуальный прогресс в текстовом файле:
"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.