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

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

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

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

Архитектурная проблема: почему индивидуальный обход деревьев работает медленно

Распространенная ошибка при написании собственного алгоритма расчета — построение полного дерева состава изделия для каждой позиции из плана и последующий рекурсивный обход каждой ветки. Если в плане выпуска находится 15–20 позиций готовой продукции, а спецификации насчитывают тысячи компонентов, такой подход приводит к квадратичному росту сложности:

  1. Один и тот же полуфабрикат или материал, входящий в разные узлы или разные изделия, рассчитывается изолированно.
  2. Сложно корректно распределить складской остаток: если материал нужен в нескольких узлах, рекурсивный обход может списать остаток на первую попавшуюся ветку, вызвав ложный дефицит в параллельных узлах.
  3. Множественные точечные запросы в цикле к регистрам остатков и спецификациям критически замедляют время расчета.

Оптимальный алгоритм: поуровневое разузлование (метод слоев)

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

  1. Получение свободных остатков: единым запросом получаем доступные остатки по всем складам и цеховым подразделениям в рабочую таблицу (например, во временную таблицу или ТаблицаЗначений).
  2. Формирование валовой потребности верхнего уровня: берем исходный список продукции к производству (Уровень 0).
  3. Покрытие остатками готовой продукции: вычитаем из потребности Уровня 0 имеющиеся на складах готовые изделия. Оставшаяся часть формирует чистую потребность в выпуске готовой продукции. Корректируем таблицу остатков.
  4. Разузлование на следующий передел: только для нескомпенсированного остатка продукции получаем состав спецификаций первого уровня (полуфабрикаты и материалы первого передела). Суммируем одинаковые позиции по всем изделиям.
  5. Покрытие остатками полуфабрикатов и материалов: из полученной валовой потребности текущего уровня вычитаем имеющиеся остатки этих позиций.
  6. Итерация: повторяем шаги 4 и 5 для следующего уровня переделов до тех пор, пока на очередном шаге не останутся только покупные материалы или пока не будут полностью пройдены все уровни вложенности.

Посмотрим на пример структуры запроса для пакетного разузлования очередного уровня с использованием объекта МенеджерВременныхТаблиц:


// Пример пакетного запроса разузлования текущего уровня потребности
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = 
"ВЫБРАТЬ
|   ПотребностьТекущегоУровня.Номенклатура КАК Продукция,
|   ПотребностьТекущегоУровня.Характеристика КАК ХарактеристикаПродукции,
|   ПотребностьТекущегоУровня.Количество КАК ТребуемыйВыпуск,
|   Спецификация.Ссылка КАК Спецификация
|ПОМЕСТИТЬ ВТ_ПланУровня
|ИЗ
|   &ТаблицаПотребности КАК ПотребностьТекущегоУровня
|   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры КАК Спецификация
|       ПО ПотребностьТекущегоУровня.Номенклатура = Спецификация.Владелец
|       И Спецификация.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияВерсийСпецификаций.Утвержден)
|;
|
|ВЫБРАТЬ
|   Состав.Номенклатура КАК Номенклатура,
|   Состав.ХарактеристикаНоменклатуры КАК Характеристика,
|   СУММА(ВТ_ПланУровня.ТребуемыйВыпуск * Состав.Количество / Состав.КоличествоВыходаПродукции) КАК ВаловаяПотребность
|ИЗ
|   ВТ_ПланУровня КАК ВТ_ПланУровня
|   ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Состав
|       ПО ВТ_ПланУровня.Спецификация = Состав.Ссылка
|СГРУППИРОВАТЬ ПО
|   Состав.Номенклатура,
|   Состав.ХарактеристикаНоменклатуры";

Метод кодов низшего уровня (Low-Level Code)

Если один и тот же покупной материал (например, стандартный крепеж или листовой металл) входит одновременно на 2-й и на 6-й уровень разных сборочных узлов, послойный расчет может дважды вычитать остаток некорректно. В промышленных системах стандарта MRP для этого применяется классический метод Low-Level Code (LLC):

  1. Каждой номенклатурной позиции присваивается код низшего уровня вхождения в графе всех спецификаций предприятия (готовая продукция — 0, узел 1-го уровня — 1; если деталь входит на уровень 2 и уровень 5, ей присваивается код 5).
  2. Потребность рассчитывается строго в порядке возрастания кода LLC. В этом случае вычитание остатков по материалу происходит ровно один раз, когда собрана вся валовая потребность со всех уровней вышестоящих узлов.

Что обязательно учесть при расчете чистой потребности

Для получения достоверных результатов при планировании закупок и производства проанализируем следующие факторы:

  1. Учет незавершенного производства (НЗП): часть материалов и полуфабрикатов уже может быть списана со склада в цех. Для корректного расчета анализируются не только регистры ТоварыНаСкладах, но и МатериалыВПроизводстве / НезавершенноеПроизводство.
  2. Аналоги номенклатуры: если основного материала нет в свободном остатке, перед формированием заказа поставщику алгоритм должен проверять регистр сведений АналогиНоменклатуры.
  3. Формула чистой потребности: в промышленном контуре чистая потребность рассчитывается с учетом заказов и страхового запаса:
    Чистая потребность = Валовая потребность + Страховой запас - (Свободный остаток + Остаток в цехах + Заказы поставщикам - Резервы).
  4. Защита от зацикливания спецификаций: при ошибках в нормативно-справочной информации или переработке возвратных отходов возможны циклические ссылки (узел входит сам в себя). В алгоритме необходимо предусмотреть ограничение максимальной глубины разузлования (например, не более 20 уровней) и контроль повторного вхождения узлов в одной ветке.

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

← На главную