Зависание процедуры закрытия месяца — одна из самых сложных проблем в администрировании 1С:ERP 2.0. Ситуация, когда на сервере с внушительным объемом оперативной памяти (например, 256 Гб) процесс поглощает все ресурсы и останавливается на 99% загрузки, часто вводит в ступор. Особенно странным выглядит тот факт, что на тестовом сервере та же самая база может закрываться без проблем. Это прямо указывает на то, что корень проблемы кроется не в данных, а в настройках серверного окружения или отсутствии регламентного обслуживания СУБД.
В данной статье мы подробно разберем, почему возникает лавинообразный рост потребления памяти, как диагностировать «узкие места» и какие настройки необходимо изменить на рабочем сервере, чтобы процедура выполнялась стабильно.
Первым делом нам необходимо понять, на каком именно этапе и на каком участке кода происходит «зацикливание» или чрезмерное потребление ресурсов. Если система позволяет, мы должны включить режим отладки на сервере приложений 1С. Для этого в параметрах запуска службы 1С:Предприятия необходимо добавить ключ -debug. После этого мы сможем подключиться к рабочему процессу rphost и запустить замер производительности.
Рассмотрим порядок действий при диагностике:
Анализ замера покажет нам, в каких методах конфигурации система проводит больше всего времени. В старых релизах ERP 2.0 проблемными местами часто оказываются расчеты себестоимости и распределение партий. Если мы видим, что один и тот же запрос или цикл выполняется бесконечно, это может свидетельствовать о «кольцевых зависимостях» в данных, которые на рабочем сервере из-за высокой нагрузки обрабатываются медленнее, чем на тесте.
Одной из самых частых причин зависания является деградация производительности базы данных. Когда 1С выполняет закрытие месяца, она создает и обрабатывает миллионы временных таблиц. Если статистика базы данных не актуальна, оптимизатор SQL Server может выбрать неверный план запроса, что приведет к колоссальному росту потребления памяти процессом sqlservr.exe или rphost (из-за ожидания данных).
Выясним, когда в последний раз проводилось обслуживание. Нам необходимо выполнить следующие действия в SQL Server Management Studio (SSMS):
Обновление статистики. Это критически важно для корректной работы планировщика запросов. Выполним скрипт для всей базы данных:
USE [Имя_Вашей_Базы];
EXEC sp_updatestats;
Реорганизация и перестроение индексов. Сильная фрагментация индексов замедляет чтение данных. Проанализируем состояние индексов и выполним их обслуживание. Для быстрого решения можно запустить дефрагментацию всех таблиц, задействованных в учете затрат.
Также полезно очистить процедурный кэш SQL, чтобы заставить сервер перестроить планы выполнения для тяжелых запросов закрытия месяца:
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
Если сервер 1С и SQL Server установлены на одной физической машине, возникает борьба за ресурсы. По умолчанию SQL Server забирает под свои нужды (Buffer Pool) всю доступную память. Когда 1С запускает тяжелый процесс rphost, памяти в системе не остается, и Windows начинает использовать файл подкачки (swapping). Скорость работы при этом падает в десятки раз.
Разберем, как правильно ограничить аппетиты SQL Server. На сервере с 256 Гб RAM рекомендуется оставить для операционной системы и процессов 1С не менее 64-80 Гб. Следовательно, для SQL Server нужно установить лимит около 170-180 Гб.
Настроим это через скрипт:
EXEC sys.sp_configure N'show advanced options', N'1';
RECONFIGURE;
EXEC sys.sp_configure N'max server memory (MB)', N'184320'; -- Лимит 180 Гб
RECONFIGURE;
Проанализируем параметры консоли администрирования кластера 1С. Часто администраторы оставляют настройки по умолчанию, что ведет к «раздуванию» одного процесса rphost. Рассмотрим параметры, которые могут влиять на стабильность:
Во время закрытия месяца 1С активно использует папку Temp пользователя, под которым запущен сервер 1С, а SQL Server — базу TempDB. Проверим следующие моменты:
Антивирусное сканирование. На рабочем сервере часто включен антивирус, который проверяет каждый создаваемый временный файл. Это создает огромную очередь дисковых операций. Необходимо добавить в исключения антивируса расширения *.mdf, *.ldf, а также каталоги srvinfo и все временные папки (%TEMP%).
Конфигурация TempDB. Убедимся, что база TempDB разделена на несколько файлов (равно количеству ядер процессора, но не более 8) и эти файлы имеют одинаковый размер и фиксированный шаг прироста. Это предотвратит конкуренцию за запись во временные таблицы.
Иногда проблема кроется в «мусоре», накопившемся в серверном кэше после аварийных завершений или некорректных обновлений конфигурации. На тестовом сервере база разворачивается «с нуля», поэтому там этой проблемы нет. Разберем шаги по очистке кэша на рабочем сервере:
1C:Enterprise 8.3 Server Agent.C:\Program Files\1cv8\srvinfo (путь может отличаться).reg_1541.snccntx и config внутри папки базы. Внимание: не удаляйте файлы конфигурации самой базы, только временные данные кэша!После этой процедуры первый запуск 1С и процедура закрытия месяца могут занять чуть больше времени из-за компиляции модулей, но это исключит влияние поврежденного кэша на потребление памяти.
Посмотрим на проблему с точки зрения прикладного решения. В версии ERP 2.0 расчет себестоимости реализован через решение системы линейных уравнений. Если в данных за месяц образовалась «петля» (изделие А входит в стоимость Б, а Б — в стоимость А через несколько переделов), алгоритм может уходить в длительные итерации.
Для выявления таких проблем в программе 1С:ERP предусмотрен отчет «Дерево себестоимости» или проверки в самом помощнике закрытия месяца. Обратите внимание на ошибки в протоколе закрытия, которые система выдает перед тем, как окончательно зависнуть. Даже если система кажется зависшей, проверьте журнал регистрации: если там идут записи о расчете партий, значит, процесс идет, просто крайне медленно из-за огромного объема данных или неоптимальных индексов.
Подводя итог, можно сказать, что решение проблемы всегда комплексное: регламенты SQL + ограничение памяти + исключения антивируса + чистота кэша. Проделав эти шаги, вы добьетесь того, что рабочий сервер будет выполнять закрытие месяца так же стабильно, как и тестовый.