Каждый специалист по внедрению и сопровождению 1С:ERP рано или поздно сталкивается с проблемой критического снижения производительности при закрытии месяца. Ситуация, когда расчет себестоимости внезапно «вырастает» с привычных 10–12 часов до 50–60 часов, а то и вовсе зависает или аварийно завершается, является классическим кошмаром для крупного предприятия. Особое внимание заслуживает этап ПодготовкаДанныхДляУчетаНДСиУСН2_4 и связанный с ним регистр ДетализацияПартийТоваровДляНДСиУСН2_4.
В этой статье мы подробно разберем, почему возникает лавинообразный рост движений по партиям, как бороться с падением фоновых заданий расчета себестоимости и какие конкретные шаги необходимо предпринять на уровне СУБД, настроек 1С:ERP и анализа данных, чтобы вернуть время расчета в разумные рамки.
Проанализируем технический лог, представленный в описании проблемы. Первое, что бросается в глаза — это колоссальная разница в объемах формируемых движений за два последовательных месяца:
ДетализацияПартийТоваровДляНДСиУСН2_4 — около 17 миллионов (из них уникальных — 735 тысяч). Время расчета составляло 12 часов.Появление 136 миллионов записей при нуле уникальных свидетельствует о наличии глобальной закольцовки (петли) в графе распределения партий. Алгоритм партионного учета в 1С:ERP представляет движение ценностей в виде системы линейных уравнений (графов), где узлами выступают партии и номенклатура, а дугами — документы движения. Если в учете возникает ситуация, когда полуфабрикат или услуга списывается сама на себя (например, через встречный выпуск или некорректные цепочки перемещений между организациями в схеме Интеркампани), математический решатель системы уходит в бесконечный цикл. Он пытается распределить копейки стоимости по кругу, генерируя миллионы временных записей, которые в итоге «забивают» оперативную память и дисковую подсистему сервера.
Второй критический симптом — это ошибка №5: «Фоновое задание завершено аварийно». Это прямое следствие нехватки оперативной памяти (Out of Memory). Когда рабочий процесс сервера 1С rphost.exe пытается обработать гигантский неделимый подграф (в нашем логе зафиксирован максимальный подграф из 357 124 узлов и почти 8 миллионов дуг), он лавинообразно потребляет RAM. При превышении установленных в кластере 1С лимитов безопасности процесс принудительно аварийно завершается операционной системой или менеджером кластера, прерывая расчет.
Ниже мы подробно рассмотрим пошаговые методы решения этой проблемы.
Фирмой «1С» предусмотрены механизмы управления производительностью расчета партий, которые часто скрыты от обычного пользователя. При обработке сверхбольших графов по умолчанию система пытается за один раз выбрать слишком большой объем данных, что приводит к перерасходу ресурсов.
Выполним настройку ограничения порции выборки данных по шагам:
Эта настройка заставляет систему жестко дробить обрабатываемый массив информации на порции, что существенно снижает пиковое потребление оперативной памяти рабочим процессом сервера rphost.exe и предотвращает падение фонового задания по ошибке «Out of Memory».
Когда расчет себестоимости прерывается аварийно, в регистрах накопления и детальных временных таблицах остаются «мусорные» движения от предыдущих незавершенных расчетов. При последующем запуске система пытается анализировать эти некорректные остатки, что только усугубляет ситуацию.
Рассмотрим, как запустить расчет в режиме очистки данных:
Это позволит полностью обнулить результаты предыдущих неудачных попыток расчета партий по регистру ДетализацияПартийТоваровДляНДСиУСН2_4 перед стартом нового прохода и исключит влияние «грязных» данных на построение графа распределения.
Редкое или некачественное обслуживание базы данных на SQL-сервере — одна из главных причин внезапного (в течение одного дня) падения производительности. Расчет себестоимости активно использует сложные запросы со множеством левых соединений и временных таблиц. Если статистика СУБД устарела, оптимизатор запросов SQL строит неверный план выполнения. Вместо быстрого поиска по индексам (Index Seek) СУБД начинает выполнять полное сканирование таблиц (Table/Index Scan), увеличивая время выполнения простого запроса с миллисекунд до десятков минут.
Проанализируем шаги по оптимизации СУБД:
FULLSCAN. Для этого можно выполнить T-SQL скрипт в SQL Server Management Studio:
USE [Имя_Вашей_Базы_Данных];
GO
-- Обновление статистики для всей базы данных с полным сканированием
EXEC sp_MSforeachtable 'UPDATE STATISTICS ? WITH FULLSCAN';
GO
DBCC FREEPROCCACHE;
GO
tempdb, испытывает колоссальную нагрузку. Убедимся, что файлы tempdb расположены на самых быстрых SSD/NVMe накопителях, а количество файлов данных tempdb равно количеству логических ядер процессора (но не более 8 файлов одинакового размера).Даже самые мощные сервера не смогут быстро рассчитать себестоимость, если в учете присутствуют грубые логические ошибки. Выясним, какие именно операции порождают бесконечные циклы в графах списания партий.
Проанализируем основные факторы риска в данных:
Ведомость по товарам на складах и устраним все отрицательные остатки.необходимо указать цену плановой стоимости материалов и работ по номенклатуре.... Когда в системе включен выпуск встречных полуфабрикатов, но для них не задана плановая стоимость, алгоритм распределения затрат не имеет «точки опоры» для первой итерации расчета и начинает бесконечно пересчитывать фактические затраты. Для решения этой проблемы обязательно установим плановые цены для всех позиций номенклатуры, которые участвуют в производственных цепочках выпуска и полуфабрикатов.Если аварийное завершение фоновых заданий (Ошибка №5) продолжается, необходимо скорректировать параметры работы процессов rphost.exe в консоли администрирования кластера 1С:
rphost. На время расчета себестоимости рекомендуется временно увеличить эти показатели или установить их в значение "0" (без ограничений), обеспечив достаточный объем физической RAM и файла подкачки на сервере.Для успешного и быстрого завершения расчета себестоимости на платформе 1С:ERP 2.4 примените комплексный подход:
Шаг 1. Обслужите СУБД: выполните принудительное обновление статистик с полным сканированием таблиц (WITH FULLSCAN) и очистите кэш планов.
Шаг 2. В параметрах закрытия месяца ограничьте максимальную порцию выборки данных при расчете партий до 20000.
Шаг 3. Исправьте методологические ошибки: заполните плановые цены для производства, устраните отрицательные остатки и проверьте документы сборки/разборки.
Шаг 4. Запустите закрытие месяца через конфигуратор в режиме отладки с включенной опцией очистки старых расчетных движений.