Имя: Пароль:
1C
1С v8
Разузлование заказов на производство снизу вверх
0 discant
 
12.07.12
12:13
Здравствуйте, есть обработка, которая занимается разузлованием заказов на производство от "головы", то есть сборки 0 уровня и по иерархии вниз до самых мелких составных частей.
Можно ли как-нибудь изменить алгоритм таким образом, чтобы разузлование шло снизу, то есть, сначала создавались заказы на мелкие составляющие, а затем на подсборки и т. д.?
Код ниже:

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

Процедура СоздатьВнутреннийУровень(ВерхЗаказ)                                                                                                                                  

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



           // Вызываем процедуру для записанного документа, чтобы на основании него нарисовать след. уровень
           СоздатьВнутреннийУровень(ЗП.Ссылка);
               КонецЦикла;    
       
   
КонецПроцедуры
1 discant
 
16.07.12
11:48
Люди! Ну неужели никто не юзщзал График заказов? Вы где?
2 hhhh
 
16.07.12
11:54
(1) ну это, создать всё, а потом обойти в обратном порядке - не оно?
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn