При планировании производства и закупок на производственных предприятиях с глубокой структурой изделий (от 4 до 7 и более уровней вложенности спецификаций) возникает классическая задача концепции MRP: как корректно и быстро рассчитать чистый дефицит сырья и полуфабрикатов. Если на складе уже есть готовый полуфабрикат или сборочная единица, система не должна требовать закупку материалов на весь объем изделия с нуля.
Типовой механизм подсистемы объемно-календарного планирования в конфигурациях на платформе 1С (в частности, в 1С:Управление производственным предприятием) предполагает использование документов планов и инструмента Помощник планирования. Однако на практике при спецификациях в несколько тысяч позиций цепочка ручного создания документов с пошаговым вычитанием остатков становится слишком громоздкой. Разберем, как реализовать эффективный расчет чистой потребности программно или с помощью доработки типовых механизмов.
Распространенная ошибка при написании собственного алгоритма расчета — построение полного дерева состава изделия для каждой позиции из плана и последующий рекурсивный обход каждой ветки. Если в плане выпуска находится 15–20 позиций готовой продукции, а спецификации насчитывают тысячи компонентов, такой подход приводит к квадратичному росту сложности:
Для быстрого и корректного распределения складских запасов применим послойный расчет. Суть алгоритма заключается в том, что разузлование выполняется синхронно для всего списка изделий уровень за уровнем:
ТаблицаЗначений).Посмотрим на пример структуры запроса для пакетного разузлования очередного уровня с использованием объекта МенеджерВременныхТаблиц:
// Пример пакетного запроса разузлования текущего уровня потребности
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| ПотребностьТекущегоУровня.Номенклатура КАК Продукция,
| ПотребностьТекущегоУровня.Характеристика КАК ХарактеристикаПродукции,
| ПотребностьТекущегоУровня.Количество КАК ТребуемыйВыпуск,
| Спецификация.Ссылка КАК Спецификация
|ПОМЕСТИТЬ ВТ_ПланУровня
|ИЗ
| &ТаблицаПотребности КАК ПотребностьТекущегоУровня
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры КАК Спецификация
| ПО ПотребностьТекущегоУровня.Номенклатура = Спецификация.Владелец
| И Спецификация.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияВерсийСпецификаций.Утвержден)
|;
|
|ВЫБРАТЬ
| Состав.Номенклатура КАК Номенклатура,
| Состав.ХарактеристикаНоменклатуры КАК Характеристика,
| СУММА(ВТ_ПланУровня.ТребуемыйВыпуск * Состав.Количество / Состав.КоличествоВыходаПродукции) КАК ВаловаяПотребность
|ИЗ
| ВТ_ПланУровня КАК ВТ_ПланУровня
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Состав
| ПО ВТ_ПланУровня.Спецификация = Состав.Ссылка
|СГРУППИРОВАТЬ ПО
| Состав.Номенклатура,
| Состав.ХарактеристикаНоменклатуры";
Если один и тот же покупной материал (например, стандартный крепеж или листовой металл) входит одновременно на 2-й и на 6-й уровень разных сборочных узлов, послойный расчет может дважды вычитать остаток некорректно. В промышленных системах стандарта MRP для этого применяется классический метод Low-Level Code (LLC):
Для получения достоверных результатов при планировании закупок и производства проанализируем следующие факторы:
ТоварыНаСкладах, но и МатериалыВПроизводстве / НезавершенноеПроизводство.АналогиНоменклатуры.Вынесение расчета в отдельную внешнюю обработку или специализированный документ с пакетным поуровневым выполнением запросов позволяет сократить время расчета многотысячных спецификаций с нескольких десятков минут до нескольких секунд, обеспечивая оперативное и точное планирование закупок.