Как обойти дерево спецификаций и определить нехватку материалов с учетом промежуточных остатков в 1С?

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При автоматизации производственного планирования в конфигурациях 1С (в частности, 1С:Управление производственным предприятием 1.3) часто возникает задача расчета чистой (нетто) потребности в материалах и полуфабрикатах. Обычное разузлование разворачивает изделие на всю глубину до покупных компонентов. Однако если на промежуточных уровнях на складе уже есть готовые полуфабрикаты, разворачивать спецификацию этих веток вглубь не имеет смысла. Рассмотрим, почему не всегда подходят стандартные механизмы и как реализовать алгоритм обхода дерева спецификации с проверкой остатков.

Ограничения типовых механизмов

В типовых решениях 1С существуют механизмы работы со структурами изделий, однако при решении задачи расчета нетто-потребности возникают следующие особенности:

  1. Общий модуль РазузлованиеНоменклатуры: Служит для технического разворачивания спецификации продукции до заданной глубины или до исходных материалов. Он работает со структурой изделия, но не сопоставляет потребности с фактическими складскими остатками или резервами.
  2. Обработка «Помощник планирования»: Расчет выполняется по брутто-потребности. Чтобы учесть остатки полуфабрикатов на промежуточных переделах, типовой механизм требует пошагового проведения планов производства снизу вверх или сверху вниз с формированием промежуточных документов выпуска.

Алгоритм поуровневого разузлования с учетом остатков

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

  1. Расчет доступного свободного остатка:

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

    СвободныйОстаток = ОстатокНаСкладах - РезервыПоЗаказам;

    В зависимости от задач предприятия к свободному остатку также можно прибавлять остатки в незавершенном производстве (НЗП) или ожидаемые приходы по заказам поставщикам.

  2. Пошаговая проверка потребности на каждом уровне:

    При рекурсивном обходе каждого узла спецификации рассчитываем нетто-потребность:

    ЧистаяПотребность = ТребуемоеКоличество - СвободныйОстаток;

    Проанализируем полученный результат:

    1. Если ЧистаяПотребность <= 0, то имеющийся свободный остаток полуфабриката полностью перекрывает текущую потребность. В этом случае разворачивать спецификацию этой позиции дальше вглубь не требуется — обход данной ветки прекращается.
    2. Если ЧистаяПотребность > 0, то спецификация полуфабриката разворачивается строго на величину возникшего дефицита (на значение ЧистаяПотребность), а не на исходное количество.
  3. Учет распределения остатка между ветками:

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

Технические нюансы и оптимизация кода

При реализации собственного алгоритма разузлования обратим внимание на следующие моменты:

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