Имя: Пароль:
1C
1С v8
Обход дерева. Как это правильно решать?
0 mnimo
 
05.12.14
19:45
Есть некоторое ДеревоЗначений, одно из полей (колонок) которого - "Количество". «Листья» дерева заполнены значениями, «узлы» содержат 0 (количество звездочек обозначает глубину вложенности):
* 0
* * 0
* * * 10
* * * 5
* * * 10
* * 0
* * * 0
* * * * 7
Необходимо "обойти" дерево, записав в поле "Количество" узлов сумму полей "Количество" подчиненных записей, т.е. в итоге должно получиться:
* 32
* * 25
* * * 10
* * * 5
* * * 10
* * 7
* * * 7
* * * * 7

Как будет решаться задача:
1. Если известно, что в дереве значений всего три уровня вложенности
2. Если количество уровней вложенности не ограничено.
1 iamnub
 
05.12.14
19:50
Вообще в 1С принято такую инфу сразу из базы доставать. Запросом.
2 iamnub
 
05.12.14
19:51
Но и так можно. Ведь на самом низком уровне вложенности у тебя есть доступ к родительским строкам. Нашел значение - просуммировал его у всех родительских строк.

И всё.
3 МихаилМ
 
05.12.14
19:55
2)рекурсия Вам в помощь.
4 mnimo
 
05.12.14
20:03
Надо начинать складывать с последнего уровня?
5 exwill
 
05.12.14
20:11
(0) Сначала реши для себя - как ты собираешься обходить дерево. С суммированием потом легко разберешься.
6 Garykom
 
гуру
05.12.14
20:18
Один раз изучить рекурсию и все

Тем более и повод есть
7 mnimo
 
05.12.14
20:42
&НаКлиенте
Процедура Посчитать(Команда)
    ПосчитатьДерево(Дерево);
КонецПроцедуры

&НаКлиенте
Процедура ПосчитатьДерево(Строки)
        
    ДеревоОбъект = Строки.ПолучитьЭлементы();
    Сумма = 0;
    Для Каждого СтрокаДерева ИЗ ДеревоОбъект Цикл
        Если СтрокаДерева.Значение = 0 тогда
            ПосчитатьДерево(СтрокаДерева);
        Иначе
            Сумма = Сумма+СтрокаДерева.Значение;
        КонецЕсли;
    КонецЦикла;
    
    ДобавитьВРодителя(СтрокаДерева,Сумма);
        
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьВРодителя(СтрокаДерева,Сумма)

    СтрокаРодитель = СтрокаДерева.ПолучитьРодителя();
    Если СтрокаРодитель<> Неопределено Тогда
        СтрокаРодитель.Количество = СтрокаРодитель.Количество + Сумма;
        ДобавитьВРодителя(СтрокаРодитель,Сумма);
    КонецЕсли;
    
КонецПроцедуры
8 Drac0
 
05.12.14
22:10
(7) Ну, и? Считает? Имхо, не должно.
9 ramir
 
06.12.14
01:33
Процедура Посчитать()
    ВычислитьСуммуСтрок(Дерево);
КонецПроцедуры

Функция ВычислитьСуммуСтрок(Родитель)
    Сумма = 0;
    
    Для Каждого Стр Из Родитель.Строки Цикл
        Если Стр.Значение = 0 Тогда //А лучше проверять Стр.Строки.Количество() > 0 (не будем полагаться на Значение = 0)
            Стр.Значение = ВычислитьСуммуСтрок(Стр);
        КонецЕсли;
        
        Сумма = Сумма + Стр.Значение;
    КонецЦикла;    
    
    Возврат Сумма;
КонецФункции
10 Wobland
 
06.12.14
03:12
эта контора называется "аванкор". решение давать?
11 Escander
 
06.12.14
05:23
(10) ты что-ли автор тестового задания?
12 mdocs
 
06.12.14
08:44
(0) было раньше. Красивого решения нет. Придется все равно городить тонну кода. Рекурсия разве что нижний уровень поможет найти.
13 Wobland
 
06.12.14
10:17
(11) контору в глаза не видел, но все семь заданий решал
14 Wobland
 
06.12.14
10:18
(13) даже в портфолио включил
15 ifso
 
06.12.14
10:53
(0) а в типовых обходы дерева не встречаются?