8.х Обход дерева значений

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем RuslanKhanow, 24 фев 2016.

  1. TopicStarter Overlay
    RuslanKhanow
    Offline

    RuslanKhanow Опытный в 1С

    Регистрация:
    18 фев 2015
    Сообщения:
    145
    Симпатии:
    0
    Баллы:
    26
    Приветствую форумчане, Есть обработка "планирование производства" Есть вкладка "Потребность на производство" в ней несколько табличных полей
    В поле "Предел 1" помещается вся номенклатура из выбранных заказов ,которую еще необходимо обеспечить, но при этом у некоторых элементов номенклатуры есть аналоги которые есть в наличии на складах
    Код:
    Процедура ЗаполнитьПотребностиНажатие(Элемент)  
        ТаблицаПотребности.Строки.Очистить();
        Итоги.Очистить();
        Итоги1.Очистить();
       
        Для каждого СТР из Сводная Цикл
            Строка = ТаблицаПотребности.Строки.Добавить();
            Строка.Номенклатура = Стр.Номенклатура;
            Строка.ВидВоспроизводства = Стр.ВидВоспроизводства;
            Строка.Количество = Стр.Требуется;
            Строка.ОсталосьОбеспечить = Стр.ВПроизводстве;
            Строка.ВРезерве = Резерв(Стр.Номенклатура, Стр.ЗаказПокупателя);
            Строка.НаСкладе = СвободныеОстатки(Стр.Номенклатура, ТекущаяДата());
            Строка.Заказ = Стр.ЗаказПокупателя;
            Строка.Спецификация = Стр.Спецификация;
            Строка.КоличествоВПроизводстве = КоличествоВПроизводстве(Стр.Номенклатура,Стр.ЗаказПокупателя);       
           
            Если Строка.ОсталосьОбеспечить > 0 тогда           
                ЗаполнитьДеревоЗначенийТаблицаПотребностей(Строка);
            КонецЕсли;             
           
        КонецЦикла;
       
        ТабКл = Итоги1.Колонки.Добавить("СуммаОсталосьОбеспечить");
        СчИт = 0 ;
        Для Каждого СтрИт из Итоги1 Цикл 
            Если СтрИт.ОсталосьОбеспечить > 0  Тогда
                ОсталосьОбеспечить = СуммаОсталосьОбеспечить(СтрИт.Номенклатура,СтрИт.ОсталосьОбеспечить);
                Итоги1[СчИт].СуммаОсталосьОбеспечить =  ОсталосьОбеспечить;
            КонецЕсли;   
            СчИт = СчИт + 1;
        КонецЦикла; 
       
           
       
        ЭлементыФормы.ТаблицаПотребности.СоздатьКолонки();
               
        ПодобратьАналогиДляНоменклатурыСОбеспечением();
    ПроверкаНаИзмениниеЗаказовНаПроизводство();
    
    Код:
    Процедура ЗаполнитьДеревоЗначенийТаблицаПотребностей(Элемент)
        ОсталосьОбеспечить = 0;
        ПодчинненаяСтроки = Элемент.Строки;
        ТаблицаСписокПоСпецификации = ТаблицаНоменклатурПоСпецификации(Элемент.Спецификация);
    
        Для Каждого Строка из ТаблицаСписокПоСпецификации Цикл
            ПодчинненаяСтрока = ПодчинненаяСтроки.Добавить();
            ПодчинненаяСтрока.Номенклатура = Строка.НоменклатураИс;
            ПодчинненаяСтрока.ВидВоспроизводства = Строка.НоменклатураИс.ВидВоспроизводства;
            ПодчинненаяСтрока.Количество = Строка.КоличествоНаЕд * Элемент.ОсталосьОбеспечить;
            ПодчинненаяСтрока.ВРезерве = Резерв(Строка.НоменклатураИс, Элемент.Заказ);
            ПодчинненаяСтрока.НаСкладе = СвободныеОстатки(Строка.НоменклатураИс, ТекущаяДата());
            ПодчинненаяСтрока.Заказ = Элемент.Заказ;
            ПодчинненаяСтрока.Спецификация = ПодборСпецификации(Строка.НоменклатураИс);
            ПодчинненаяСтрока.КоличествоВПроизводстве = КоличествоВПроизводстве(Строка.НоменклатураИс,Элемент.Заказ);
           
            ДобавитьСтрокуВТаблицуИтоги1(ПодчинненаяСтрока.Номенклатура, ПодчинненаяСтрока.Количество, ПодчинненаяСтрока.ВРезерве);
           
            Если ОсталосьОбеспечитьИтог = 0 Тогда
                // На складе имеется достаточное количество товара, определим нужно ли создать резерв
                ПодчинненаяСтрока.ОсталосьОбеспечить = 0;
                Если Зарезервировать > 0 тогда 
                    Действие = "Зарезервировать";
                    ДобавитьСтрокуВТаблицуИтогиПоЗаказу(ПодчинненаяСтрока.Номенклатура, Зарезервировать, ПодчинненаяСтрока.Заказ,Действие);
                КонецЕсли;
            ИначеЕсли ОсталосьОбеспечитьИтог > 0  Тогда // На складе меньше чем нам требуется, определим на сколько меньше
                                                    //Если на складе есть часть потребности, зарезервируем ее
                Если ОсталосьОбеспечитьИтог < ПодчинненаяСтрока.Количество Тогда // На складе есть часть потребности
                    Если ПодчинненаяСтрока.Номенклатура.ВидВоспроизводства = Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка Тогда
                        Действие = "Запланировать закупку";
                        ДобавитьСтрокуВТаблицуИтогиПоЗаказу(ПодчинненаяСтрока.Номенклатура, ОсталосьОбеспечитьИтог, ПодчинненаяСтрока.Заказ,Действие);
                        ПодчинненаяСтрока.ОсталосьОбеспечить = ОсталосьОбеспечитьИтог;
                    Иначе
                        Действие = "Запланировать выпуск";
                        ДобавитьСтрокуВТаблицуИтогиПоЗаказу(ПодчинненаяСтрока.Номенклатура, ОсталосьОбеспечитьИтог, ПодчинненаяСтрока.Заказ,Действие);
                        ПодчинненаяСтрока.ОсталосьОбеспечить = ОсталосьОбеспечитьИтог;
                    КонецЕсли;
                Иначе
                    Если ПодчинненаяСтрока.Номенклатура.ВидВоспроизводства = Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка Тогда
                        Действие = "Запланировать закупку";
                        ДобавитьСтрокуВТаблицуИтогиПоЗаказу(ПодчинненаяСтрока.Номенклатура, ПодчинненаяСтрока.Количество, ПодчинненаяСтрока.Заказ,Действие);
                        ПодчинненаяСтрока.ОсталосьОбеспечить = ПодчинненаяСтрока.Количество;
                    Иначе
                        Действие = "Запланировать выпуск";
                        ДобавитьСтрокуВТаблицуИтогиПоЗаказу(ПодчинненаяСтрока.Номенклатура, ПодчинненаяСтрока.Количество, ПодчинненаяСтрока.Заказ,Действие);
                        ПодчинненаяСтрока.ОсталосьОбеспечить = ПодчинненаяСтрока.Количество;
                    КонецЕсли;
                КонецЕсли;   
              КонецЕсли;   
           
            Если ПодчинненаяСтрока.ОсталосьОбеспечить > 0  
                И Строка.НоменклатураИС.ВидВоспроизводства <> Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка Тогда
                ЗаполнитьДеревоЗначенийТаблицаПотребностей(ПодчинненаяСтрока);
            КонецЕсли;
           
            КоличествоНаСкладе = 0   
        КонецЦикла;   
       
    КонецПроцедуры
    
    
    Код:
    Процедура ДобавитьСтрокуВТаблицуИтоги1(Номенклатура, Количество, Резерв)
       
        Зарезервировать = 0;      
        Строка = Итоги1.Добавить();
        Строка.Номенклатура = Номенклатура;
        Строка.ВидВоспроизводства = Номенклатура.ВидВоспроизводства;
        Строка.Количество = Количество;
        Строка.ВРезерве = Резерв;
        Строка.НаСкладе = СвободныеОстатки(Номенклатура,ТекущаяДата());
           
        Для Каждого Стр из Итоги1 Цикл 
            ОсталосьОбеспечить = 0;
            ОсталосьОбеспечить = Стр.Количество - Стр.НаСкладе - Стр.ВРезерве;
            Если ОсталосьОбеспечить > 0 Тогда
                Стр.ОсталосьОбеспечить = ОсталосьОбеспечить;
            Иначе 
                Стр.ОсталосьОбеспечить = 0;
            КонецЕсли;
           
        КонецЦикла;
            Строка.ВПроизводстве = КоличествоВПроизводстве(Номенклатура, Документы.ЗаказПокупателя.ПустаяСсылка());
       
            Итоги1.Свернуть("Номенклатура, ВидВоспроизводства, НаСкладе, Аналог, ВРезерве, ВПроизводстве", "Количество, ОсталосьОбеспечить");
    
       
           
        //Проверяем обеспеченность на складе
       
        НайденнаяСтрока = Итоги1.Найти(Номенклатура,"Номенклатура");
        //Запоминаем количество остатка на складе после вычитания требуемого количества
        ОсталосьОбеспечитьИтог = НайденнаяСтрока.ОсталосьОбеспечить;
        Если ОсталосьОбеспечитьИтог = 0 И 
            НайденнаяСтрока.Количество > НайденнаяСтрока.ВРезерве ТОгда
            Зарезервировать = НайденнаяСтрока.Количество - НайденнаяСтрока.ВРезерве;
        КонецЕсли;      
       
    КонецПроцедуры
    
    
    вообщем суть задачи , если у номенклатуры есть аналоги,из надо вычесть из строки колонки ,"осталось обеспечить" в табличном поел "предел 1" ,но я не могу понять как обойти это дерево значений. "Сводная - это таблица значений" и если проходить по ней,я пройдусь только по первому уровню дерева, как быть?Поделитесь идеями как это реализовать?
    --- Объединение сообщений, 24 фев 2016 ---
    вот скрины

    Вложения:

  2. web.num
    Offline

    web.num Опытный в 1С Команда форума

    Регистрация:
    6 окт 2011
    Сообщения:
    918
    Симпатии:
    4
    Баллы:
    29

Поделиться этой страницей