Как исправить бесконечное зависание на этапе «Заполнение партий в регистре себестоимость товаров» при закрытии месяца в 1С:Комплексная автоматизация 2.4?

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

При проведении регламентной процедуры закрытия месяца в программе 1С:Комплексная автоматизация 2 (или 1С:ERP) пользователи часто сталкиваются с критическим падением производительности на этапе партионного учета. Процесс, который ранее занимал минуты, внезапно начинает длиться по 14–16 часов или полностью зависает. Проанализируем лог расчета себестоимости и разберем по шагам, почему возникает эта проблема и как ее оперативно локализовать и устранить.

В чем суть проблемы: анализируем лог расчета

Обратим внимание на ключевые показатели из протокола расчета за проблемный месяц:

Такое колоссальное соотношение (более 15 миллионов сформированных движений на 5 тысяч узлов) однозначно указывает на возникновение так называемого комбинаторного взрыва при обходе графа распределения партий. Программа уходит в рекурсивные циклы, пытаясь распределить стоимость по сложным цепочкам перемещений и возвратов, многократно дублируя записи во временных таблицах СУБД.

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

Выясним причину, почему проблема «выстрелила» после обновления системы (например, в ноябре), хотя сам закрываемый исторический месяц (январь) ранее закрывался без сбоев. В версиях линейки 2.4.5 и 2.4.6 фирма «1С» кардинально переписала внутренние алгоритмы движка «Партионный учет 2.2». Новые релизы стали значительно строже относиться к расхождениям в аналитике учета номенклатуры. Если старый алгоритм просто списывал стоимость по упрощенной схеме или игнорировал мелкие ошибки, то новый пытается во что бы то ни стало построить математически точный направленный граф. При наличии ошибок в данных алгоритм начинает зацикливаться.

Выделим основные технические причины, приводящие к зависанию партионного движка:

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

Шаг 1. Локализация проблемы с помощью сравнения баз данных

Рассмотрим метод локализации проблемы, основанный на анализе резервных копий. Выполним следующие действия:

  1. Развернем резервную копию базы данных, созданную до обновления (в которой январь закрывался быстро), на тестовом сервере.
  2. Обновим эту копию до текущего проблемного релиза конфигурации.
  3. Запустим процедуру закрытия месяца.

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

Шаг 2. Поиск и устранение отрицательных остатков

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

Если в течение месяца возникают ситуации, когда расход проводится раньше прихода (даже в пределах одного дня), это ломает последовательность партионного учета. Нам нужно исправить время проведения документов, чтобы приходные накладные всегда были записаны раньше расходных документов.

Шаг 3. Проверка документов ввода начальных остатков

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

  1. Дата документов: Все документы ввода остатков должны быть проведены строго последней секундой предыдущего периода (например, 31.12.2017 23:59:59). Проведение документов ввода остатков датами внутри января недопустимо.
  2. Наличие стоимости: Если в остатках зафиксировано количество товара, но не указана его себестоимость (нулевая сумма), система при списании начнет плодить пустые стоимостные узлы графа, пытаясь распределить «нуль».
  3. Сумма без количества: Наличие стоимостных остатков без количественных в регистре СебестоимостьТоваров гарантированно приведет к зависанию распределения партий. Для выявления таких позиций можно использовать консоль запросов.

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


ВЫБРАТЬ
    СебестоимостьОстатки.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    СебестоимостьОстатки.РазделУчета КАК РазделУчета,
    СебестоимостьОстатки.КоличествоОстаток КАК Количество,
    СебестоимостьОстатки.СтоимостьОстаток КАК Стоимость
ИЗ
    РегистрНакопления.СебестоимостьТоваров.Остатки(&НачалоПериода, ) КАК СебестоимостьОстатки
ГДЕ
    СебестоимостьОстатки.КоличествоОстаток <= 0
    И СебестоимостьОстатки.СтоимостьОстаток <> 0

Если запрос вернул строки — необходимо скорректировать соответствующие документы ввода начальных остатков, добавив количество или убрав некорректную стоимость.

Шаг 4. Анализ цепочек Интеркампани

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

Шаг 5. Временное переключение метода оценки себестоимости

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

  1. Перейдем в учетную политику организации (раздел «НСИ и администрирование» -> «Организации» -> закладка «Учетная политика»).
  2. Временно изменим метод оценки стоимости товаров с «ФИФО (взвешенная оценка)» или «ФИФО (скользящая оценка)» на «Средняя за месяц».
  3. Запустим процедуру закрытия месяца повторно.

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

Шаг 6. Обновление конфигурации и платформы

Если мы используем релиз 2.4.6.162, то работаем на версии с неоптимальными и устаревшими алгоритмами распределения партий. В последующих релизах веток 2.4.13, 2.4.14 и при переходе на редакцию 2.5 фирма «1С» внесла множество критических исправлений:

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

Шаг 7. Техническая оптимизация СУБД под обработку тяжелых запросов

Процедура расчета себестоимости активно использует создание, индексацию и чтение огромного количества временных таблиц в базе данных tempdb на сервере MS SQL Server. Если дисковая подсистема сервера перегружена, запись миллионов строк будет длиться часами. Проведем техническую оптимизацию:

  1. Перенесем файлы базы данных tempdb на самые быстрые твердотельные накопители (SSD NVMe).
  2. Перед запуском закрытия месяца принудительно запустим процедуру обновления статистик СУБД. Неактуальная статистика заставляет оптимизатор MS SQL Server строить неэффективные планы запросов, из-за чего СУБД выполняет сканирование таблиц вместо поиска по индексам. Для этого выполним на сервере SQL команду: EXEC sp_updatestats;
  3. Очистим кэш планов запросов, чтобы исключить использование старых неоптимальных планов, выполнив команду: DBCC FREEPROCCACHE;

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

← На главную