Как ускорить расчет себестоимости и исправить зависание на этапе ДетализацияПартийТоваровДляНДСиУСН2_4 в 1С:ERP 2.4

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

Каждый специалист по внедрению и сопровождению 1С:ERP рано или поздно сталкивается с проблемой критического снижения производительности при закрытии месяца. Ситуация, когда расчет себестоимости внезапно «вырастает» с привычных 10–12 часов до 50–60 часов, а то и вовсе зависает или аварийно завершается, является классическим кошмаром для крупного предприятия. Особое внимание заслуживает этап ПодготовкаДанныхДляУчетаНДСиУСН2_4 и связанный с ним регистр ДетализацияПартийТоваровДляНДСиУСН2_4.

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

Выясняем причины проблемы: почему лог расчета фиксирует аномалии

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

Появление 136 миллионов записей при нуле уникальных свидетельствует о наличии глобальной закольцовки (петли) в графе распределения партий. Алгоритм партионного учета в 1С:ERP представляет движение ценностей в виде системы линейных уравнений (графов), где узлами выступают партии и номенклатура, а дугами — документы движения. Если в учете возникает ситуация, когда полуфабрикат или услуга списывается сама на себя (например, через встречный выпуск или некорректные цепочки перемещений между организациями в схеме Интеркампани), математический решатель системы уходит в бесконечный цикл. Он пытается распределить копейки стоимости по кругу, генерируя миллионы временных записей, которые в итоге «забивают» оперативную память и дисковую подсистему сервера.

Второй критический симптом — это ошибка №5: «Фоновое задание завершено аварийно». Это прямое следствие нехватки оперативной памяти (Out of Memory). Когда рабочий процесс сервера 1С rphost.exe пытается обработать гигантский неделимый подграф (в нашем логе зафиксирован максимальный подграф из 357 124 узлов и почти 8 миллионов дуг), он лавинообразно потребляет RAM. При превышении установленных в кластере 1С лимитов безопасности процесс принудительно аварийно завершается операционной системой или менеджером кластера, прерывая расчет.

Ниже мы подробно рассмотрим пошаговые методы решения этой проблемы.

Решение 1. Тонкая настройка параметров расчета себестоимости в 1С:ERP

Фирмой «1С» предусмотрены механизмы управления производительностью расчета партий, которые часто скрыты от обычного пользователя. При обработке сверхбольших графов по умолчанию система пытается за один раз выбрать слишком большой объем данных, что приводит к перерасходу ресурсов.

Выполним настройку ограничения порции выборки данных по шагам:

  1. Откроем форму закрытия месяца в системе.
  2. Перейдем в меню Настройки и выберем пункт Настройка параметров операций закрытия месяца. Если этого пункта нет в обычном режиме, запустим сеанс «1С:Предприятие» из конфигуратора в режиме отладки.
  3. Найдем параметр Максимальная порция выборки данных при расчете партии. По умолчанию это значение может быть неограниченным или чрезмерно большим.
  4. Установим жесткое ограничение в размере 20000 (в некоторых случаях помогает уменьшение до 10000).

Эта настройка заставляет систему жестко дробить обрабатываемый массив информации на порции, что существенно снижает пиковое потребление оперативной памяти рабочим процессом сервера rphost.exe и предотвращает падение фонового задания по ошибке «Out of Memory».

Решение 2. Использование режима отладки закрытия месяца и очистка старых движений

Когда расчет себестоимости прерывается аварийно, в регистрах накопления и детальных временных таблицах остаются «мусорные» движения от предыдущих незавершенных расчетов. При последующем запуске система пытается анализировать эти некорректные остатки, что только усугубляет ситуацию.

Рассмотрим, как запустить расчет в режиме очистки данных:

  1. Запустим конфигуратор базы данных и выполним запуск клиентского приложения в режиме отладки (клавиша F5).
  2. В режиме «1С:Предприятие» перейдем в рабочее место Закрытие месяца.
  3. Благодаря запущенному режиму отладки, нам станет доступно расширенное меню настроек закрытия месяца.
  4. Установим флаг Перед расчетом очищать старые расчетные движения.

Это позволит полностью обнулить результаты предыдущих неудачных попыток расчета партий по регистру ДетализацияПартийТоваровДляНДСиУСН2_4 перед стартом нового прохода и исключит влияние «грязных» данных на построение графа распределения.

Решение 3. Обслуживание СУБД (MS SQL Server) и обновление статистики

Редкое или некачественное обслуживание базы данных на SQL-сервере — одна из главных причин внезапного (в течение одного дня) падения производительности. Расчет себестоимости активно использует сложные запросы со множеством левых соединений и временных таблиц. Если статистика СУБД устарела, оптимизатор запросов SQL строит неверный план выполнения. Вместо быстрого поиска по индексам (Index Seek) СУБД начинает выполнять полное сканирование таблиц (Table/Index Scan), увеличивая время выполнения простого запроса с миллисекунд до десятков минут.

Проанализируем шаги по оптимизации СУБД:

  1. Обязательно настроим регламентное задание СУБД на обновление статистик (Update Statistics). Перед запуском расчета себестоимости крайне рекомендуется принудительно запустить полное обновление статистик с параметром FULLSCAN. Для этого можно выполнить T-SQL скрипт в SQL Server Management Studio:

USE [Имя_Вашей_Базы_Данных];
GO
-- Обновление статистики для всей базы данных с полным сканированием
EXEC sp_MSforeachtable 'UPDATE STATISTICS ? WITH FULLSCAN';
GO
  1. Очистим процедурный кэш (Plan Cache). После обновления статистики старые неоптимальные планы запросов могут оставаться в кэше SQL-сервера. Очистим их командой:

DBCC FREEPROCCACHE;
GO
  1. Настроим базу TempDB. Так как расчет партионного учета активно создает и уничтожает миллионы временных таблиц, дисковая подсистема, где расположена база tempdb, испытывает колоссальную нагрузку. Убедимся, что файлы tempdb расположены на самых быстрых SSD/NVMe накопителях, а количество файлов данных tempdb равно количеству логических ядер процессора (но не более 8 файлов одинакового размера).

Решение 4. Поиск и устранение методологических ошибок в учетных данных

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

Проанализируем основные факторы риска в данных:

Решение 5. Оптимизация серверной инфраструктуры и лимитов памяти 1С

Если аварийное завершение фоновых заданий (Ошибка №5) продолжается, необходимо скорректировать параметры работы процессов rphost.exe в консоли администрирования кластера 1С:

  1. Откроем утилиту Администрирование серверов 1С Предприятия.
  2. Перейдем в свойства нашего рабочего сервера.
  3. Проверим значение параметра Допустимый объем памяти и Интервал превышения допустимого объема памяти. Если эти лимиты установлены слишком жестко (например, память ограничена 2-4 Гб на процесс), то при обработке тяжелого графа расчет себестоимости будет гарантированно «убивать» процесс rphost. На время расчета себестоимости рекомендуется временно увеличить эти показатели или установить их в значение "0" (без ограничений), обеспечив достаточный объем физической RAM и файла подкачки на сервере.
  4. Установим параметр Количество документов в транзакции в настройках закрытия месяца в меньшее значение. Это снизит нагрузку на транзакционную модель СУБД и предотвратит переполнение журнала транзакций SQL-сервера.

Резюме и план действий

Для успешного и быстрого завершения расчета себестоимости на платформе 1С:ERP 2.4 примените комплексный подход:

Шаг 1. Обслужите СУБД: выполните принудительное обновление статистик с полным сканированием таблиц (WITH FULLSCAN) и очистите кэш планов.

Шаг 2. В параметрах закрытия месяца ограничьте максимальную порцию выборки данных при расчете партий до 20000.

Шаг 3. Исправьте методологические ошибки: заполните плановые цены для производства, устраните отрицательные остатки и проверьте документы сборки/разборки.

Шаг 4. Запустите закрытие месяца через конфигуратор в режиме отладки с включенной опцией очистки старых расчетных движений.

← На главную