При организации позаказного многопередельного производства в конфигурации «1С:Управление производственным предприятием» пользователи часто сталкиваются с ситуацией, когда подчиненный документ Заказ на производство заполняется полным составом полуфабрикатов, игнорируя уже имеющиеся складские резервы и размещенные остатки. Разберем логику работы типовых механизмов, выясним причины такого поведения и рассмотрим способы корректной настройки и доработки системы.
В типовой конфигурации учет плановых потребностей и фактических резервов разнесен по разным регистрам накопления. Плановые потребности фиксируются в регистре ПотребностиЗаказовНаПроизводство, а фактическое резервирование запасов на складе отражается в регистре ТоварыВРезервеНаСкладах.
Когда мы формируем Заказ на производство на основании документа Заказ покупателя, система проверяет наличие свободных остатков и резервов. Однако при формировании цепочки «Заказ на производство → Заказ на производство» типовой ввод на основании работает иначе: он не выполняет полного расчета дефицита по всем складам и переделам, а рассчитывает остаток невыполненных потребностей по основному заказу.
Если материалы и полуфабрикаты не были корректно зарезервированы или размещены именно в рамках аналитики основного заказа и соответствующего склада, система считает потребность открытой и повторно включает всю номенклатуру в новый заказ.
Проанализируем программный код конфигурации. Заполнение табличной части подчиненного заказа выполняется в общем модуле ЗаказыНаПроизводствоИПереработку внутри процедуры ЗаполнитьТабличнуюЧастьПоПотребностямЗаказаНаПроизводство().
Рассмотрим фрагмент формирования запроса:
|ИЗ
| РегистрНакопления.ПотребностиЗаказовНаПроизводство.Остатки(, ЗаказНаПроизводство В (&ПроизвЗаказ) " + ТекстОтбор + ") КАК РегПотребности
| //ДОПОЛНЕНИЕ_Резервы ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(,ДокументРезерва В (&ПроизвЗаказ) И Склад = &Склад) КАК РегРезервы
| //ДОПОЛНЕНИЕ_Резервы ПО РегРезервы.Номенклатура = РегПотребности.Номенклатура
| //ДОПОЛНЕНИЕ_Резервы И РегРезервы.ХарактеристикаНоменклатуры = РегПотребности.ХарактеристикаНоменклатуры
| //ДОПОЛНЕНИЕ_Резервы И РегРезервы.КоличествоОстаток > 0
|ГДЕ РегПотребности.КоличествоОстаток > 0";
Если ИмяЗаказРезерв <> Неопределено ИЛИ ИмяСпособСписанияОстатка <> Неопределено Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ДОПОЛНЕНИЕ_Резервы", "");
Запрос.УстановитьПараметр("Склад", Склад);
Если ИмяЗаказРезерв <> Неопределено Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ДОПОЛНЕНИЕ_ЗаказРезерв", "");
КонецЕсли;
Если ИмяСпособСписанияОстатка <> Неопределено Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ДОПОЛНЕНИЕ_СпособСписания", "");
Запрос.УстановитьПараметр("СоСклада", Перечисления.СпособыСписанияОстаткаТоваров.СоСклада);
Запрос.УстановитьПараметр("ИзРезерва", Перечисления.СпособыСписанияОстаткаТоваров.ИзРезерва);
КонецЕсли;
КонецЕсли;
Как видно из кода, соединение с регистром ТоварыВРезервеНаСкладах активируется динамически только при соблюдении определенных условий и обязательно накладывает жесткий отбор по реквизитам ДокументРезерва и Склад. Если полуфабрикат зарезервирован под другой склад или не заполнен способ списания остатка, резерв не вычитается из исходной потребности.
Еще одна частая задача при создании подчиненных заказов — разделение одного объемного заказа на несколько документов по подразделениям-исполнителям. В типовой конфигурации подразделение для полуфабриката определяется по технологической карте или спецификации.
Рассмотрим процедуру ЗаполнитьМатериалыПоСпецификации() модуля документа Заказ на производство:
ИсходныеКомплектующие = РезультатРазузлования.ИсходныеКомплектующие;
ИсходныеКомплектующие.ЗаполнитьЗначения(Подразделение, "Подразделение");
// Заполним подразделение по основной спецификации полуфабрикатов
Для Каждого Строка Из ИсходныеКомплектующие Цикл
ПодразделениеНоменклатуры = ЗаказыНаПроизводствоИПереработку.ПолучитьПодразделениеИзСпецификации(
Строка.Спецификация,
Строка.Номенклатура,
Строка.ХарактеристикаНоменклатуры
);
Если ЗначениеЗаполнено(ПодразделениеНоменклатуры) Тогда
Строка.Подразделение = ПодразделениеНоменклатуры;
КонецЕсли;
КонецЦикла;
Если в спецификациях полуфабрикатов указаны точки маршрута и производящие подразделения, типовой интерфейс при вводе на основании предлагает пользователю интерактивное окно с выбором конкретного подразделения. В этом случае в формируемый документ попадают только позиции выбранного цеха.
Разберем основные практические пути решения проблемы с избыточными полуфабрикатами в подчиненных заказах.
Чтобы типовой механизм исключал зарезервированные полуфабрикаты, выполним следующие действия:
ТоварыВРезервеНаСкладах и РазмещениеЗаказовНаПроизводство.Для крупных производств ввод на основании не заменяет полноценного планирования. Рекомендуется использовать встроенные инструменты:
Если специфика учета требует обязательного создания заказов по цепочке «на основании» без ручной очистки строк, доработаем алгоритм заполнения в общем модуле ЗаказыНаПроизводствоИПереработку.
Для этого модифицируем запрос получения остатков потребностей, добавив левое соединение с регистрами ТоварыНаСкладах (свободные остатки) и РазмещениеЗаказовНаПроизводство. Итоговое количество для заполнения табличной части подчиненного заказа рассчитываем по формуле: КоличествоКПроизводству = Потребность - Зарезервировано - УжеРазмещеноВЗаказах. Строки с нулевым или отрицательным остатком исключаем из результата выборки.