Почему при вводе заказа на производство на основании не учитываются резервы полуфабрикатов в 1С:УПП

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

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

Анализ проблемы и архитектура типового механизма

В типовой конфигурации учет плановых потребностей и фактических резервов разнесен по разным регистрам накопления. Плановые потребности фиксируются в регистре ПотребностиЗаказовНаПроизводство, а фактическое резервирование запасов на складе отражается в регистре ТоварыВРезервеНаСкладах.

Когда мы формируем Заказ на производство на основании документа Заказ покупателя, система проверяет наличие свободных остатков и резервов. Однако при формировании цепочки «Заказ на производство → Заказ на производство» типовой ввод на основании работает иначе: он не выполняет полного расчета дефицита по всем складам и переделам, а рассчитывает остаток невыполненных потребностей по основному заказу.

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

Как формируются потребности в типовом коде

Проанализируем программный код конфигурации. Заполнение табличной части подчиненного заказа выполняется в общем модуле ЗаказыНаПроизводствоИПереработку внутри процедуры ЗаполнитьТабличнуюЧастьПоПотребностямЗаказаНаПроизводство().

Рассмотрим фрагмент формирования запроса:


|ИЗ
|    РегистрНакопления.ПотребностиЗаказовНаПроизводство.Остатки(, ЗаказНаПроизводство В (&ПроизвЗаказ) " + ТекстОтбор + ") КАК РегПотребности
|   //ДОПОЛНЕНИЕ_Резервы ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(,ДокументРезерва В (&ПроизвЗаказ) И Склад = &Склад) КАК РегРезервы
|   //ДОПОЛНЕНИЕ_Резервы ПО РегРезервы.Номенклатура = РегПотребности.Номенклатура
|    //ДОПОЛНЕНИЕ_Резервы И РегРезервы.ХарактеристикаНоменклатуры = РегПотребности.ХарактеристикаНоменклатуры
|    //ДОПОЛНЕНИЕ_Резервы И РегРезервы.КоличествоОстаток > 0
|ГДЕ РегПотребности.КоличествоОстаток > 0";
        
Если ИмяЗаказРезерв <> Неопределено ИЛИ ИмяСпособСписанияОстатка <> Неопределено Тогда
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ДОПОЛНЕНИЕ_Резервы", "");
    Запрос.УстановитьПараметр("Склад", Склад);
    Если ИмяЗаказРезерв <> Неопределено Тогда
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ДОПОЛНЕНИЕ_ЗаказРезерв", "");
    КонецЕсли;
    Если ИмяСпособСписанияОстатка <> Неопределено Тогда
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ДОПОЛНЕНИЕ_СпособСписания", "");
        Запрос.УстановитьПараметр("СоСклада", Перечисления.СпособыСписанияОстаткаТоваров.СоСклада);
        Запрос.УстановитьПараметр("ИзРезерва", Перечисления.СпособыСписанияОстаткаТоваров.ИзРезерва);
    КонецЕсли;
КонецЕсли;

Как видно из кода, соединение с регистром ТоварыВРезервеНаСкладах активируется динамически только при соблюдении определенных условий и обязательно накладывает жесткий отбор по реквизитам ДокументРезерва и Склад. Если полуфабрикат зарезервирован под другой склад или не заполнен способ списания остатка, резерв не вычитается из исходной потребности.

Разделение полуфабрикатов по производственным подразделениям

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

Рассмотрим процедуру ЗаполнитьМатериалыПоСпецификации() модуля документа Заказ на производство:


ИсходныеКомплектующие = РезультатРазузлования.ИсходныеКомплектующие;
ИсходныеКомплектующие.ЗаполнитьЗначения(Подразделение, "Подразделение");

// Заполним подразделение по основной спецификации полуфабрикатов
Для Каждого Строка Из ИсходныеКомплектующие Цикл
    ПодразделениеНоменклатуры = ЗаказыНаПроизводствоИПереработку.ПолучитьПодразделениеИзСпецификации(
        Строка.Спецификация,
        Строка.Номенклатура,
        Строка.ХарактеристикаНоменклатуры
    );
    Если ЗначениеЗаполнено(ПодразделениеНоменклатуры) Тогда
        Строка.Подразделение = ПодразделениеНоменклатуры;
    КонецЕсли;
КонецЦикла;

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

Варианты решения проблемы

Разберем основные практические пути решения проблемы с избыточными полуфабрикатами в подчиненных заказах.

Способ 1. Корректное использование типового сервиса авторезервирования

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

  1. В основном заказе на производство перейдем на вкладку Материалы.
  2. Убедимся, что для полуфабрикатов в наличии указан склад и выбран способ списания Из резерва или Со склада.
  3. Воспользуемся кнопкой Заполнить и провести (сервис автоматического резервирования и размещения). Это действие сформирует движения по регистрам ТоварыВРезервеНаСкладах и РазмещениеЗаказовНаПроизводство.
  4. Создадим подчиненный заказ на производство через меню Действия → На основании. При совпадении склада и заполненных реквизитах резервирования система уменьшит количество к производству на зарезервированный объем.

Способ 2. Использование подсистемы объемно-календарного планирования

Для крупных производств ввод на основании не заменяет полноценного планирования. Рекомендуется использовать встроенные инструменты:

  1. Обработка Помощник планирования: позволяет рассчитать чистую потребность в полуфабрикатах. В качестве источника данных задается потребность по основному заказу с вычитанием источника остатков на складах за вычетом резервов.
  2. План производства по сменам или Календарный план производства: механизмы автоматически выполняют разузлование изделий до элементарных полуфабрикатов и рассчитывают дефицит только на недостающий объем.

Способ 3. Доработка запроса ввода на основании

Если специфика учета требует обязательного создания заказов по цепочке «на основании» без ручной очистки строк, доработаем алгоритм заполнения в общем модуле ЗаказыНаПроизводствоИПереработку.

Для этого модифицируем запрос получения остатков потребностей, добавив левое соединение с регистрами ТоварыНаСкладах (свободные остатки) и РазмещениеЗаказовНаПроизводство. Итоговое количество для заполнения табличной части подчиненного заказа рассчитываем по формуле: КоличествоКПроизводству = Потребность - Зарезервировано - УжеРазмещеноВЗаказах. Строки с нулевым или отрицательным остатком исключаем из результата выборки.

← На главную