Как отключить разузлование номенклатуры до комплектующих при заполнении потребностей в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация Управленческий учет IT и автоматизация бизнеса
← На главную

При работе с документами планирования и обеспечения потребностей в конфигурациях «1С:Управление производственным предприятием 1.3» (УПП) или «1С:Комплексная автоматизация 1.1» (КА) пользователи часто сталкиваются со специфическим поведением системы. При заполнении табличной части «Потребности» на основании документа Внутренний заказ программа автоматически заменяет исходную номенклатуру (например, готовую продукцию или полуфабрикат) на её комплектующие из спецификации. Это логично для отдела снабжения, закупающего сырье под производство, но абсолютно неприемлемо, если необходимо зафиксировать потребность в самом готовом изделии.

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

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

Давайте проанализируем штатный механизм работы документа Формирование потребностей. Система определяет необходимость разложения номенклатуры на составляющие (так называемое разузлование) на основании параметра мИспользоватьРазузлование. По умолчанию в типовом коде эта переменная инициализируется следующим образом:


мИспользоватьРазузлование = Метаданные.Справочники.Найти("СпецификацииНоменклатуры") <> Неопределено;

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

  1. Если для номенклатуры установлен вид воспроизводства Производство, система делает вывод: «Эту позицию мы делаем сами. Покупать её у поставщика не нужно, но для её создания требуются материалы». В этом случае срабатывает алгоритм разузлования, и в табличную часть попадают комплектующие из спецификации.
  2. Если установлен вид воспроизводства Покупка (или он не заполнен), система считает, что товар приобретается в готовом виде. Разузлование не происходит, и в потребности попадает сама исходная номенклатура.

Таким образом, корень проблемы лежит в сочетании активного механизма разузлования и настроек карточек товаров.

---

Решение 1. Настройка данных без изменения конфигурации

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

  1. Перейдем в карточку интересующей нас номенклатуры.
  2. Откроем вкладку Дополнительные (или найдем реквизит на основной форме в зависимости от настроек интерфейса).
  3. Изменим значение реквизита Вид воспроизводства с «Производство» на «Покупка».
  4. Сохраним изменения.

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

---

Решение 2. Использование альтернативного инструмента «Помощник планирования»

Если бизнес-процессы компании требуют гибкого управления планированием (например, сегодня нам нужно разузловать заказ, а завтра — заказать готовую продукцию напрямую), жесткое изменение карточек товаров не подойдет. В этом случае рассмотрим использование типовой обработки «Помощник планирования».

Этот инструмент предоставляет гораздо больше возможностей для маневра:

  1. Откроем обработку Помощник планирования.
  2. На вкладке Стратегия расчета количества выберем в качестве источника данных «Внутренние заказы».
  3. Обратим внимание на колонку «Р» (Разузлование) в таблице стратегий. Если снять этот флаг для конкретной строки источника, то система сформирует план потребностей (или закупок) строго по исходным позициям, игнорируя их спецификации.
  4. Сформируем результирующий документ планирования, на основании которого создадим заказы поставщикам.

---

Решение 3. Программная доработка (для разработчиков)

Если типовые аналитические инструменты по какой-то причине не подходят и требуется, чтобы кнопка «Заполнить потребности» в самом документе работала без разузлования именно для документов Внутренний заказ, нам придется внести точечные изменения в код конфигурации. Простое отключение переменной мИспользоватьРазузлование = Ложь крайне нежелательно, так как это нарушит логику работы документа для планов продаж, планов производства и заказов покупателей.

Рассмотрим два корректных варианта программного обхода.

Вариант А. Добавление управляющего флага на форму документа

Добавим на форму документа реквизит типа Булево с наименованием НеРазузловыватьВнутренниеЗаказы. Это позволит пользователям самостоятельно решать, нужно ли раскладывать спецификацию в данный момент. В модуле объекта найдем место инициализации переменной мИспользоватьРазузлование и модифицируем код:


мИспользоватьРазузлование = (Метаданные.Справочники.Find("СпецификацииНоменклатуры") <> Неопределено) 
                            И НЕ ЭтотОбъект.НеРазузловыватьВнутренниеЗаказы;

Этот способ элегантен тем, что оставляет за пользователем право выбора логики заполнения.

Вариант Б. Локальный обход разузлования для внутренних заказов в коде

Если требуется полностью исключить разузлование только для внутренних заказов на уровне алгоритма заполнения, проанализируем цикл обработки потребностей. Найдем процедуру, где выполняется обход коллекции НовыеПотребности и вызывается функция РазузловатьНоменклатуру. Мы можем добавить проверку типа документа-основания:


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

Благодаря этому условию ТипЗнч(Строка.Заказ) <> Тип("ДокументСсылка.ВнутреннийЗаказ") мы гарантируем, что потребности, сформированные по внутренним заказам, будут переноситься в табличную часть «как есть», в то время как для заказов покупателей и планов продаж сохранится стандартное поведение разузлования до комплектующих.

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

← На главную