0
discant
12.07.12
✎
12:13
|
Здравствуйте, есть обработка, которая занимается разузлованием заказов на производство от "головы", то есть сборки 0 уровня и по иерархии вниз до самых мелких составных частей.
Можно ли как-нибудь изменить алгоритм таким образом, чтобы разузлование шло снизу, то есть, сначала создавались заказы на мелкие составляющие, а затем на подсборки и т. д.?
Код ниже:
Для каждого строкаТабличнойЧасти из ПроизвЗаказ.Материалы Цикл
Если СтрокаТабличнойЧасти.ВидВоспроизводства <> Перечисления.ВидыВоспроизводстваНоменклатуры.Производство Тогда
Продолжить;
КонецЕсли;
Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
ЗП = Документы.ЗаказНаПроизводство.СоздатьДокумент();
ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(ЗП, ПроизвЗаказ);
ЗП.ОсновнойЗаказНаПроизводство = ПроизвЗаказ;
Подразделение = РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Новый Структура("Объект,Свойство",Номенклатура,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Подразделения"))).Значение;
Если Подразделение = Неопределено Тогда
// Предупреждение("Свойство <Подразделения> элемента" + Номенклатура + "не заполнено. Заказ для этой подсборки не может быть создан");
Продолжить;
КонецЕсли;
ЗП.Подразделение = Подразделение;
ЗП.Дата = ТекущаяДата();
ЗП.ДатаИсполнения = ПроизвЗаказ.ДатаИсполнения -86400;
СрокИзготовления = РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Новый Структура("Объект,Свойство",Номенклатура,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Срок изготовления"))).Значение;
Если СрокИзготовления = Неопределено Тогда
СрокИзготовления = 0;
КонецЕсли;
ЗП.ДатаЗапуска = ЗП.ДатаИсполнения - СрокИзготовления*86400;
ЗП.УстановитьНовыйНомер(ПроизвЗаказ.Организация.Префикс);
ЗП.Ответственный = глЗначениеПеременной("глТекущийПользователь");
НоваяСтрока = ЗП.Продукция.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТабличнойЧасти);
НоваяСтрока.Спецификация = УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(НоваяСтрока.Номенклатура, НоваяСтрока.ХарактеристикаНоменклатуры, ЗП.Дата, ЗП.Подразделение);
Если НЕ ЗначениеЗаполнено(НоваяСтрока.Спецификация) Тогда
Продолжить;
КонецЕсли;
ЗП.ЗаполнитьМатериалыПоСпецификации(ЗП.Материалы, "Материалы");
ЗП.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ "+СокрЛП(ЗП));
// Вызываем процедуру для записанного документа, чтобы на основании него нарисовать след. уровень
СоздатьВнутреннийУровень(ЗП.Ссылка);
КонецЦикла;
Предупреждение("Документы созданы. Пожалуйста проверьте их!");
КонецПроцедуры
//*************************************************************************
Процедура СоздатьВнутреннийУровень(ВерхЗаказ)
Для каждого строкаТабличнойЧасти из ВерхЗаказ.Материалы Цикл
Если СтрокаТабличнойЧасти.ВидВоспроизводства <> Перечисления.ВидыВоспроизводстваНоменклатуры.Производство Тогда
Продолжить;
КонецЕсли;
Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
ЗП = Документы.ЗаказНаПроизводство.СоздатьДокумент();
ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(ЗП, ВерхЗаказ);
ЗП.ОсновнойЗаказНаПроизводство = ВерхЗаказ;
Подразделение = РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Новый Структура("Объект,Свойство",Номенклатура,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Подразделения"))).Значение;
Если Подразделение = Неопределено Тогда
// Предупреждение("Свойство <Подразделения> элемента" + Номенклатура + "не заполнено. Заказ для этой подсборки не может быть создан");
Продолжить;
КонецЕсли;
ЗП.Подразделение = Подразделение;
ЗП.Дата = ТекущаяДата();
ЗП.ДатаИсполнения = ВерхЗаказ.ДатаЗапуска -86400;
СрокИзготовления = РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Новый Структура("Объект,Свойство",Номенклатура,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Срок изготовления"))).Значение;
Если СрокИзготовления = Неопределено Тогда
СрокИзготовления = 0;
КонецЕсли;
ЗП.ДатаЗапуска = ЗП.ДатаИсполнения - СрокИзготовления*86400;
ЗП.УстановитьНовыйНомер(ВерхЗаказ.Организация.Префикс);
ЗП.Ответственный = глЗначениеПеременной("глТекущийПользователь");
НоваяСтрока = ЗП.Продукция.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТабличнойЧасти);
НоваяСтрока.Спецификация = УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(НоваяСтрока.Номенклатура, НоваяСтрока.ХарактеристикаНоменклатуры, ЗП.Дата, ЗП.Подразделение);
Если НЕ ЗначениеЗаполнено(НоваяСтрока.Спецификация) Тогда
Продолжить;
КонецЕсли;
ЗП.ЗаполнитьМатериалыПоСпецификации(ЗП.Материалы, "Материалы");
ЗП.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ "+СокрЛП(ЗП));
// Вызываем процедуру для записанного документа, чтобы на основании него нарисовать след. уровень
СоздатьВнутреннийУровень(ЗП.Ссылка);
КонецЦикла;
КонецПроцедуры
|
|