|
Проблема с обходом дерева (пропадает ровно половина строк) |
☑ |
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), и ты успешно внял моему совету.
|
|
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший