При закрытии месяца в 1С:ERP Управлении предприятием 2 может возникнуть ситуация, когда операция «Распределение затрат и расчет себестоимости» запускается, но не завершается даже спустя несколько часов. При этом программа не показывает ошибок, а на сервере продолжают увеличиваться объемы временных данных.
В статье разберем реальный случай зависания закрытия месяца в 1С после обновления конфигурации с версии 2.5.27.81 до 2.5.27.101. Покажем, как искали причину, какие гипотезы проверяли и почему проблему удалось решить изменением одного условия в запросе.
Клиент — производственное предприятие, которое работает в 1С:ERP Управлении предприятием 2. В системе ведется учет нескольких организаций и филиалов, производство организовано с использованием этапов.
Август закрыли штатно на релизе 2.5.27.81: весь расчет себестоимости занял около полутора часов. После обновления конфигурации до версии 2.5.27.101 закрыть сентябрь не получилось.
При закрытии месяца наблюдались следующие симптомы:
В обработке «Закрытие месяца» операция «Распределение затрат и расчет себестоимости» запускалась, но не завершалась ни через час, ни через три часа, ни за ночь.
В отладчике было видно, что процесс выполняется в РасчетСебестоимостиПрикладныеАлгоритмы.РассчитатьПартиюРекурсивно, при этом значения переменных практически не менялись.
На сервере 1С и СУБД постоянно увеличивался объем временных данных. Если продолжать ожидание, свободное место на диске могло закончиться раньше, чем расчет.
При этом программа не выдавала ошибок или предупреждений. Расчет себестоимости в 1С просто не заканчивался.
Причина оказалась связана с изменением условия отбора строк детализации в релизе 2.5.27.101.
В модуле РасчетСебестоимостиНДС, в функции ТекстДетализацияПартийТоваровДляНДСиУСНДвиженияВТекущемПериоде, разработчики изменили условие запроса.
В релизе 2.5.27.81 использовалось условие:
И ДД.Количество <> 0
В релизе 2.5.27.101 условие стало следующим:
И (ДД.Количество <> 0
ИЛИ ДД.Знаменатель <> 0
ИЛИ ДД.ЗнаменательДляИсточников <> 0)
Новое условие допускает в граф партий строки детализации по исходным затратам, у которых количество равно нулю.
В производстве с этапами это приводит к следующей ситуации: внутри каждого этапа каждая строка «Списания на выпуск» связывается с каждой строкой «Выпуска». В результате возникает декартово произведение.
В рассматриваемом случае на этапе подготовки данных для НДС и УСН (дополнительные расходы) количество связей увеличилось до 35,8 млн вместо нескольких сотен тысяч. Обход такого графа практически не заканчивался.
Для решения проблемы было создано расширение с &ИзменениеИКонтроль, которое возвращает условие отбора из релиза 2.5.27.81.
После применения расширения сентябрь успешно закрылся на копии базы с полным набором документов.
Результаты проверки:
Расчет себестоимости занял 2 часа 3 минуты под отладкой.
Этапы, которые ранее зависали, прошли за полторы минуты.
Удалять документы или отменять их проведение не потребовалось.
Далее подробно рассмотрим процесс диагностики и поиска причины.
В ходе диагностики мы проверили несколько гипотез. Некоторые из них выглядели убедительно, но не подтвердились.
Разберем последовательность действий, чтобы при аналогичной проблеме можно было быстрее определить источник зависания.
Когда расчет партий в 1С выполняется слишком долго, одно из первых подозрений — наличие циклических связей в данных.
Например, товар А используется для производства товара Б, а товар Б затем возвращается в производство товара А.
Механизм партий ERP строит граф движений и обходит его. При наличии циклов такой обход может выполняться очень долго.
Мы проверили программный код.
Рекурсия в РассчитатьПартиюРекурсивно ограничена параметром ПройденныйПуть и максимальной длиной цепочки 650.
Однако внешний цикл в РассчитатьПартииПоГруппамПодграфов добавляет расходы в индекс непосредственно во время обхода.
Таким образом, кольцо в данных действительно может приводить к продолжительному повторению операций.
При этом механизм расчета себестоимости был типовым: ни доработки, ни расширения клиента его не перехватывали.
В качестве возможных источников циклических связей рассматривались:
Переработка возвратных отходов обратно в сырье для того же производства.
Сборка и разборка товаров с обратными операциями.
Встречные перемещения между складами.
Для проверки мы разработали поиск колец любой длины по алгоритму Тарьяна на основании регистра ДвиженияНоменклатураНоменклатура.
Узел графа определялся сочетанием организации, аналитики, склада и вида запасов.
За сентябрь удалось обнаружить 976 колец. Однако практически все они представляли собой технические петли этапов производства. Многоузловых колец оказалось всего семь.
На копии информационной базы мы удалили документы небольших колец, связанных со сборкой и разборкой товаров одного филиала.
После этого зависший этап завершился, но расчет остановился на следующем этапе.
Мы удалили дополнительные документы — зависание снова переместилось дальше.
Каждая попытка позволяла немного продвинуть расчет, но закрытие месяца так и не завершалось.
Вывод: если изменение данных лишь переносит зависание на следующий этап, вероятно, причина заключается не в самих данных.
У клиента обнаружилась более ранняя копия той же базы на том же релизе 1С, в которой сентябрь закрывался успешно.
На первый взгляд это позволяло сравнить две базы и определить документы, вызывающие зависание. Мы создали внешнюю обработку для получения «отпечатков» движений по документам. Обработка сравнивала количество, аналитику и MD5 по каждому документу в обеих информационных базах. В результате обнаружилось более тысячи различий.
По нашему заданию бухгалтеры отменили проведение подозрительных групп документов на копии базы. После этого сентябрь удалось закрыть.
Однако дальнейшая проверка показала важное обстоятельство. В рабочей копии за сентябрь было втрое меньше записей движений.
Причина заключалась в том, что копия была создана до выполнения шага распределения материалов. Материалы находились в цеховой кладовой и еще не были распределены по 1 210 этапам производства. Именно поэтому закрытие месяца в этой базе завершалось: в графе отсутствовало около двух третей узлов.
Вывод: рабочую копию можно использовать для сравнения только при точном понимании состояния данных на момент ее создания.
В данном случае правильным ориентиром оказался предыдущий месяц, который успешно закрывался тем же механизмом.
Следующим этапом стала проверка распределения материалов по месяцам.
Схема учета оставалась одинаковой:
Материалы передавались в кладовую один раз в месяц.
Распределение выполнялось последним днем месяца.
Количество производственных этапов увеличивалось постепенно.
Динамика распределения материалов:
| Месяц | Количество этапов производства |
|---|---|
| Июль | 939 |
| Август | 1 098 |
| Сентябрь | 1 210 |
Таким образом, сентябрь по объему данных незначительно отличался от августа. При этом августовский расчет себестоимости завершился примерно за полтора часа.
Основное различие заключалось в версии конфигурации:
Август закрывался на 1С 2.5.27.81.
Сентябрь закрывался на 1С 2.5.27.101.
После этого основной стала гипотеза о влиянии обновления конфигурации на механизм расчета себестоимости.
Мы сравнили модули расчета себестоимости типовой конфигурации 2.5.27.81 и рабочей конфигурации 2.5.27.101. Первое обнаруженное изменение выглядело возможной причиной зависания.
В РасчетСебестоимостиНДС.ОписаниеЦепочекПартийНДС из связи источников с приемником убрали условие:
Регистратор = ДокументИсточник
При этом исключение неподходящих пар перенесли на этап после построения графа. Такое изменение могло приводить к появлению декартова произведения. Мы создали расширение, которое возвращало прежний ключ связи, и запустили расчет. Однако зависание сохранилось. После этого мы изучили протокол расчета себестоимости.
На этапе 63 ПодготовкаДанныхДляУчетаНДСиУСН_ДопРасходы обнаружились следующие показатели:
Общее количество связей — 38,4 млн.
Связи «Списания на выпуск [Этап производства] → Выпуск [Этап производства]» — 35,8 млн.
Связи с приемником, для которого мы изменили условие, — всего 2,5 тысячи.
Полученные данные показали, что первоначальное исправление затрагивало не ту связь, которая вызывала резкое увеличение графа.
Протокол расчета позволил определить направление дальнейшего поиска.
Связь «Списания на выпуск → Выпуск» формировалась запросом:
ТекстДетализацияПартийТоваровДляНДСиУСНДвиженияВТекущемПериоде
При сравнении с релизом 2.5.27.81 мы обнаружили изменение условий отбора организаций.
Ранее производственные движения включались в граф только для организаций, у которых была включена детализация себестоимости до исходных затрат. В новой версии отбор распространялся на все организации с учетом партий НДС версии 2.2. Мы создали второе расширение, которое возвращало прежнее условие отбора.
Однако после повторного запуска количество связей не изменилось — 35 846 923.
Причина оказалась в том, что флаг детализации определялся выражением:
ЕСТЬNULL(..., ИСТИНА)
Следовательно, организации клиента и раньше соответствовали условию отбора.
Изменение не влияло на состав данных.
В том же разделе ГДЕ запроса мы обнаружили еще одно изменение.
Условие в 1С 2.5.27.81:
И ДД.Количество <> 0
Условие в 1С 2.5.27.101:
И (ДД.Количество <> 0
ИЛИ ДД.Знаменатель <> 0
ИЛИ ДД.ЗнаменательДляИсточников <> 0)
Именно это изменение приводило к включению в расчет строк детализации исходных затрат с нулевым количеством. Такие строки группировались по корреспондирующим полям. В результате вместо одного «Выпуска» на этап в граф попадали десятки записей. В рассматриваемой базе количество выпусков увеличилось с 1 210 до 103 тысяч.
Связь «Выпуск ← Списания на выпуск» формировалась по регистратору и корреспондирующей партии. Поэтому внутри каждого производственного этапа строки одной стороны связывались со всеми строками другой стороны. В итоге около 100 тысяч записей с каждой стороны сформировали 35,8 млн связей.
Для устранения проблемы мы создали третье расширение, которое возвращало первоначальное условие:
ДД.Количество <> 0
Чтобы проверить, действительно ли срабатывает перехват функции, в расширение добавили запись в журнал регистрации с событием:
ДК.ТестПартийНДС
Это позволило подтвердить применение изменения во время расчета.
После изменения условия отбора мы повторно запустили закрытие месяца в 1С. Проверка проводилась на копии информационной базы с полным набором документов. Никакие документы не удалялись, проведение операций не отменялось.
Результаты:
Расчет себестоимости успешно завершился за 2 часа 3 минуты под отладкой.
Этапы, на которых ранее возникало зависание, прошли за полторы минуты.
Остальные операции закрытия месяца выполнялись за секунды или минуты.
После завершения расчета осталось одно предупреждение, не связанное с зависанием. В одном из филиалов не были заполнены счета у статьи «Прибыль (убыток) прошлых лет». После успешного тестирования расширение установили в рабочую информационную базу.
Закрытие месяца завершилось. На момент подготовки материала бухгалтеры проверяют полученные результаты.
Если после обновления 1С зависает закрытие месяца, необходимо проверить несколько признаков.
1. Используется релиз 1С 2.5.27.95–2.5.27.101.
Проверьте наличие условия со Знаменатель <> 0 в функции:
РасчетСебестоимостиНДС.ТекстДетализацияПартийТоваровДляНДСиУСНДвиженияВТекущемПериоде
2. В системе используется учет партий НДС.
Например, ведется раздельный учет НДС и/или УСН, а производство организовано с использованием этапов.
3. Предыдущий месяц закрывался без ошибок.
При этом закрытие выполнялось на более раннем релизе конфигурации.
4. Зависает операция «Распределение затрат и расчет себестоимости».
В протоколе расчета видно, что длительное выполнение возникает на этапах:
ПодготовкаДанныхДляУчетаНДСиУСН_ДопРасходы
ПодготовкаДанныхДляУчетаНДСиУСН_Постатейные
5. В протоколе расчета обнаруживается большое количество связей.
Особое внимание следует обратить на связи вида:
Списания на выпуск [Этап производства] → Выпуск [Этап производства]
Если их количество исчисляется миллионами или десятками миллионов, это важный признак рассматриваемой проблемы. Если связей всего несколько сотен тысяч, причина зависания, скорее всего, другая.
Главная рекомендация: сначала изучите протокол расчета себестоимости в 1С и только после этого переходите к поиску колец в данных.
Для устранения зависания мы использовали расширение, которое изменяет поведение одной функции типовой конфигурации.
1. Перехватывает функцию:
РасчетСебестоимостиНДС.ТекстДетализацияПартийТоваровДляНДСиУСНДвиженияВТекущемПериоде
Перехват выполняется с помощью &ИзменениеИКонтроль.
2. Возвращает условие отбора из релиза 2.5.27.81:
ДД.Количество <> 0
3. Записывает событие в журнал регистрации:
ДК.ТестПартийНДС
По этому событию можно проверить, что перехват действительно срабатывает, а также определить, когда были пройдены этапы «ДопРасходы» и «Постатейные».
Механизм &ИзменениеИКонтроль позволяет контролировать изменения перехватываемой функции.
Если в следующем релизе 1С изменится исходная функция, расширение не продолжит незаметно работать с прежней реализацией, а сообщит об ошибке.
В таком случае расширение необходимо пересмотреть или удалить.
Для устранения зависания закрытия месяца в 1С 2.5.27.95–101 мы подготовили расширение, которое возвращает условие отбора строк детализации из релиза 2.5.27.81.
Расширение позволяет восстановить прежний механизм формирования графа партий и устранить выявленную причину длительного расчета себестоимости.
Перед установкой рекомендуем протестировать расширение на копии информационной базы. После закрытия месяца необходимо проверить корректность расчета себестоимости и сумм по раздельному учету НДС и УСН.
Важно понимать, что разработанное расширение не является официальным исправлением ошибки 1С.
Оно возвращает поведение предыдущего релиза в конкретном участке программного кода.
Разработчики 1С добавили в выборку строки с нулевым количеством и ненулевым знаменателем, предположительно для повышения точности распределения сумм при учете НДС.
Поэтому применение расширения требует дополнительной проверки.
Перед использованием необходимо:
Проверить работу расширения на копии информационной базы.
После закрытия месяца совместно с бухгалтерией сверить суммы по раздельному учету НДС и УСН.
После выхода официального исправления 1С удалить временное расширение.
Мы также подготовили обращение в 1С с описанием выявленного условия и количественными показателями из протокола расчета.
Рассмотренный случай позволил выделить несколько практических рекомендаций.
Начинайте диагностику с протокола расчета себестоимости.
Количество связей по типам помогает определить, какая именно связь приводит к увеличению графа.
Если бы мы изучили протокол раньше, поиск причины занял бы примерно на два дня меньше.
Проверяйте, действительно ли проблема связана с данными.
Если удаление или отмена проведения документов только переносит зависание на следующий этап, стоит проверить программный механизм расчета.
Используйте корректную контрольную базу.
Успешное закрытие месяца в другой копии не означает, что данные в ней полностью совпадают с проблемной базой.
Иногда расчет завершается только потому, что часть движений еще не сформирована.
Сравнивайте не только программные модули, но и тексты запросов разных релизов.
В нашем случае изменение одного условия в разделе ГДЕ привело к увеличению количества связей в сотни раз.
Контролируйте срабатывание расширений.
Запись события в журнал регистрации позволяет убедиться, что перехват функции действительно применяется.
Зависание закрытия месяца в 1С не всегда связано с ошибками в документах, циклическими движениями или недостаточной производительностью сервера.
В рассмотренном случае причиной стало изменение условия отбора строк детализации в релизе 2.5.27.101. Из-за включения строк с нулевым количеством число связей в графе партий увеличилось до 35,8 млн, что препятствовало завершению расчета себестоимости.
Возврат прежнего условия через расширение позволил успешно закрыть месяц без удаления документов и изменения производственных данных.
Нужна помощь по бухгалтерскому или налоговому учету? Есть вопросы по работе с 1С? Наши специалисты помогут Вам разобраться. Свяжитесь с нами по телефону +7 (495) 784-71-73 или напишите на электронную почту tlm1c@4dk.ru — мы оперативно ответим и подберём оптимальное решение.
Консультация
Консультанты «Что делать Внедрение» разберут вашу ситуацию в программе и подскажут, как настроить учёт.
Письмо раз в неделю, только новые статьи по этой теме.
Хотите обсудить вашу задачу? Оставьте заявку на бесплатную консультацию