Имя: Пароль:
1C
1С v8
Проблема с обходом дерева (пропадает ровно половина строк)
,
0 icherski
 
16.08.16
11:24
Коллеги, нужна помощь коллективного разума в решении проблемы с деревом. После перебора содержимого дерева в цикле чудесным образом пропадает половина строк. Подскажите, где ошибка?

// в дереве по ряду параметров отбираются плохие группы, а их содержимое переносится на уровень выше

Процедура ПроверитьСодержимоеГруппы(Дерево, ПроблемнаяГруппа)
    
    
    Если ПлохаяГруппа(ПроблемнаяГруппа.НоменклатураСсылка) Тогда
        
        Для Каждого Стр ИЗ ПроблемнаяГруппа.Строки Цикл
            
            ПереместитьСтрокуДерева(Дерево, Стр, ПроблемнаяГруппа.Родитель, );
            
        КонецЦикла;    
        
        ПроблемнаяГруппа.Родитель.Строки.Удалить(ПроблемнаяГруппа);
        
    КонецЕсли;
    
    
КонецПроцедуры

Саму процедуры вызываю как-то так:

ДеревоГрупп = мРезультатЗапросаИерархияНоменклатуры.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    
    Для каждого СтрДерева из ДеревоГрупп.Строки Цикл
        Для каждого СтрДва из СтрДерева.Строки Цикл

            ПроверитьСодержимоеГруппы(ДеревоГрупп.Строки, СтрДва);
            
            Попытка
                Для каждого СтрТри из СтрДва.Строки Цикл
                                    
                    ПроверитьСодержимоеГруппы(ДеревоГрупп.Строки, СтрТри);
                    
                КонецЦикла;
            Исключение
            КонецПопытки;

        КонецЦикла;
    КонецЦикла;


Имеем следующую структуру:

- Корень 1
-- Корень 2
--- Элемент 1
--- Элемент 2
--- Элемент 3
--- Элемент 4

После обработки остается такая картина:

- Корень 1
-- Элемент 1
-- Элемент 2

Куда пропадают Элементы 3 и 4?))
1 vicof
 
16.08.16
11:27
Да где ж вас берут?
2 vicof
 
16.08.16
11:27
Сегодня тема уже обсуждалась лигой флудерастов
3 vicof
 
16.08.16
11:28
4 icherski
 
16.08.16
11:36
Вопрос - как обойти дерево в обратном порядке?
5 vicof
 
16.08.16
11:39
(4) Надо себя как-то заставить.
Так же, как в прямом, только наоборот.
6 icherski
 
16.08.16
11:40
Очень профессиональный совет. Спасибо. Специально для подобного рода рекомендаций и заводил тему)
7 icherski
 
16.08.16
11:41
Решение задачи:

    Если ИспользоватьОтбор Тогда
        
        // Используем обратный порядок обхода дерева значений.
        КоличествоЭлементовКоллекции = ДеревоМетаданных.Строки.Количество();
        
        Для ОбратныйИндекс = 1 По КоличествоЭлементовКоллекции Цикл
            
            ТекущийИндекс = КоличествоЭлементовКоллекции - ОбратныйИндекс;
            СтрокаДерева = ДеревоМетаданных.Строки[ТекущийИндекс];
            Если СтрокаДерева.Строки.Количество() = 0 Тогда
                ДеревоМетаданных.Строки.Удалить(ТекущийИндекс);
            КонецЕсли;
            
        КонецЦикла;
    
    КонецЕсли;

Надеюсь, кому-нибудь пригодится. Не все ж флуд читать.
8 lubitelxml
 
16.08.16
11:45
(7) да ты гений )
9 Горогуля
 
16.08.16
11:49
(7) ты ещё не дорос до того, чтобы _писать_ флуд. читай
10 vicof
 
16.08.16
11:49
(6) Я тебе собственно и посоветовал (7), и ты успешно внял моему совету.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший