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