Как правильно выполнить разузлование номенклатуры в 1С:УПП программно

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

Разузлование номенклатуры — это одна из ключевых задач в конфигурации "Управление производственным предприятием" (УПП). Этот процесс позволяет получить полный список комплектующих, из которых состоит готовое изделие, основываясь на данных спецификаций. В УПП для этих целей предусмотрен мощный механизм, сосредоточенный в общем модуле РазузлованиеНоменклатуры. Однако при работе с ним разработчики часто сталкиваются с ситуацией, когда функция возвращает пустой результат, даже если спецификации в системе заведены корректно. Разберем пошагово, как правильно подготовить параметры и избежать типичных ошибок.

Анализ структуры источника данных

Для вызова метода РазузлованиеНоменклатуры.РазузловатьНоменклатуру нам необходимо подготовить специальную структуру, которую мы назовем СтруктураИсточник. Эта структура описывает объект, который мы хотим «разложить» на составляющие. Проанализируем состав полей этой структуры:

  1. Номенклатура — ссылка на элемент справочника. Поле является обязательным, если не указана конкретная спецификация.
  2. ХарактеристикаНоменклатуры — если для номенклатуры ведется учет по характеристикам, важно передать конкретное значение, иначе система может не найти нужную спецификацию.
  3. ЕдиницаИзмерения — ссылка на единицу измерения. Если оставить пустым, система попытается использовать единицу хранения остатков.
  4. Коэффициент — числовой множитель для пересчета единиц. Обычно равен 1.
  5. Количество — КРИТИЧЕСКИ ВАЖНОЕ ПОЛЕ. Если в этом поле будет значение Неопределено, алгоритм разузлования не сможет рассчитать потребность в материалах и вернет пустой результат.
  6. Спецификация — конкретная спецификация, по которой нужно выполнить разузлование. Если не указана, система будет искать основную спецификацию на текущую дату.

Рассмотрим пример инициализации структуры в коде:


СтруктураИсточник = Новый Структура("Номенклатура, ХарактеристикаНоменклатуры, ЕдиницаИзмерения, Коэффициент, Количество, Спецификация");
СтруктураИсточник.Номенклатура = ВыбраннаяНоменклатура;
СтруктураИсточник.ХарактеристикаНоменклатуры = ВыбраннаяХарактеристика;
СтруктураИсточник.ЕдиницаИзмерения = ВыбраннаяНоменклатура.ЕдиницаХраненияОстатков;
СтруктураИсточник.Коэффициент = 1;
СтруктураИсточник.Количество = 1; // Обязательно должно быть заполнено числом!
СтруктураИсточник.Спецификация = ВыбраннаяСпецификация;

Настройка параметров разузлования

Помимо данных об изделии, нам нужно передать параметры самого процесса разузлования. Самый важный параметр здесь — КоличествоУровнейРазузлования. Рассмотрим, как он влияет на результат:

Также важно подготовить структуру для приема результата. Нам потребуются поля ИсходныеКомплектующие (для получения плоского списка) или ПолноеРазузлование (для иерархии).


Параметры = Новый Структура("КоличествоУровнейРазузлования", 0);

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

Вызов функции и обработка результата

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


РазузлованиеНоменклатуры.РазузловатьНоменклатуру(СтруктураИсточник, РезультатРазузлования, Параметры);

// Данные будут находиться здесь:
ТаблицаРезультата = РезультатРазузлования.ПолноеРазузлование;

Если ТаблицаРезультата <> Неопределено Тогда
    Для Каждого СтрокаРезультата Из ТаблицаРезультата Цикл
        // Обработка полученных комплектующих
        Сообщить("Материал: " + СтрокаРезультата.Номенклатура + " Кол-во: " + СтрокаРезультата.Количество);
    КонецЦикла;
КонецЕсли;

Почему разузлование может не работать: неочевидные причины

Выясним причины, по которым даже при правильном коде массив может оставаться пустым. Если вы убедились, что Количество заполнено, проверьте следующие моменты:

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

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

← На главную