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