Имя: Пароль:
1C
 
Как получить все данные из дерева значений?
0 djkitybr
 
05.06.08
14:06
Доброе.. уважаемые..

У меня простой и наверное банальный вопрос. Как получить все данные из дерева значений неограниченной вложенности?

В поиск прошу не посылать. Сразу туда ходил.. Но ничего не нашел кроме как использовать поиск.

Помогите построить такую рекурсивную выборку (обход) дерева значений
1 Fragster
 
гуру
05.06.08
14:09
Процедура ВывестиСтрокуИПодчиненные(Стр,Отступ = "")
  Сообщить(Отступ+Стр.«что-нибудь»);
  Для каждого Подч из Стр Цикл
      ВывестиСтрокуИПодчиненные(Подч, Отступ+"  ");
  КонецЦикла
КонецПроцедуры
ну, или что-то типа того.
Чтобы понять рекурсию, надо понять рекурсию!
2 чувак
 
05.06.08
14:10
Это справочник?
3 Stepa86
 
05.06.08
14:11
Функция ПрочитатьЗначениеСтрокиДерева(пСтрокаДерева, пТабличко)

  Для Каждого цСтрока Из пСтрокаДерева Цикл

     НовСтр = пТабличко.Добавить();
     НовСтр.Значение = цСтрока.Значение;
     ПрочитатьЗначениеСтрокиДерева(цСтрока, пТабличко);

  КонецЦикла;

КонецФункции
4 Stepa86
 
05.06.08
14:12
Обход в ширину сам пиши =)
5 djkitybr
 
05.06.08
14:12
нет. не справочник. Это маршрутная карта, составленная как дерево значений.
6 Stepa86
 
05.06.08
14:14
+ (3) вместо Для Каждого цСтрока Из пСтрокаДерева Цикл  
читать
Для Каждого цСтрока Из пСтрокаДерева.Строки Цикл
7 Stepa86
 
05.06.08
14:15
к (1) это тоже относится ;)
8 Fragster
 
гуру
05.06.08
14:15
(6) о, точно, «.строки»
9 ЗлобнийМальчик
 
05.06.08
14:17
(0) для вас принципиальна рекурсия - или итерация тоже пойдёт??
10 djkitybr
 
05.06.08
14:19
(9)ограничена вложенность. Поэтому итерация врядли здесь уместна.

но если не сложно выложите. интересно как это делает итерационно
11 Fragster
 
гуру
05.06.08
14:25
если организовать стек родителей, то теоретически можно в цикле обработать... но это будет долго, и потом хрен отладишь, а через пол года когда туда взглянешь, воскликнешь: какого хухя я это не через рекурсию сделал?!?!?
12 Stepa86
 
05.06.08
14:30
добавляешь в дерево недоступную колонку типа булево и МоеДерево.Строки.НайтиСтроки(Новый Структура("СпецКоллонка", Ложь), Истина) вернет массив всех строк
13 Рассада
 
05.06.08
14:34
А через Построитель, а потом выгрузить в таблицу?
14 Scooter
 
05.06.08
14:34
а разве построитель деревья не курит?
15 Smallrat
 
05.06.08
14:49
была у меня такая проблема - надо было посмотреть что находится в ветке дерева значений. само дерево доступно не было, а у ветки нету метода ВыбратьСтроку(). В итоге пришлось написать выгрузку ветки в дерево.


Процедура ДобавитьСтрокуВДерево(СтрокаРодитель1, СтрокаДерева)
    СтрокаРодитель2 = СтрокаРодитель1.Строки.Добавить();
    ТекИндекс = 0;
    Для Каждого Знч Из СтрокаДерева Цикл
         СтрокаРодитель2.Установить(ТекИндекс, Знч);
         ТекИндекс =  ТекИндекс + 1;
    КонецЦикла;
   
    КоллекцияСтрок = СтрокаДерева.Строки;
    Для Каждого СтрокаПодчиненная Из СтрокаДерева.Строки Цикл
         ДобавитьСтрокуВДерево(СтрокаРодитель2, СтрокаПодчиненная);
    КонецЦикла;
   
КонецПРоцедуры

//Вывод на экран структуры строки дерева
Процедура ВСД(СтрокаДерева)
    Дерево = Новый ДеревоЗначений;
    Для Каждого Знч Из СтрокаДерева Цикл
         Дерево.Колонки.Добавить();
    КонецЦикла;
   
    ДобавитьСтрокуВДерево(Дерево, СтрокаДерева);
   
    Дерево.ВыбратьСтроку();
КонецПроцедуры
16 ЗлобнийМальчик
 
05.06.08
14:57
пусть ГлавныйРодитель  - корневой элемент
тогда  напишем кривой итерационный код который мне в силу  глубокого нежелания грузить стэк нравится больше

МассивГотовых = Новый массив;
Пока истина цикл
МассивПотомков = главныйРодитель.ПолучитьПотомков();
Для каждого Элемент из массивпотомков цикл

МассивГотовых.Добавить(Элем);

ПромежуточныйМассивПотомков = Загрузить(Элем.получитьПотомков());

конецЦикла
МассивПотомков = промежуточныйМассивПотомков;
Если Массивпотомков.количество() = 0 тогда
Прервать
конецЕсли
конецЦикла

что то вроде такого. Писал навскидку багов не исключаю, но вроде бы существует теорема о том что любой рекурсивный метод можно реализовать итерационно
17 ЗлобнийМальчик
 
05.06.08
14:59
ой))) надо чуть чуть по другому
МассивГотовых = Новый массив;
МассивПотомков = главныйРодитель.ПолучитьПотомков();
Пока истина цикл

Для каждого Элемент из массивпотомков цикл
МассивГотовых.Добавить(Элем);

ПромежуточныйМассивПотомков = Загрузить(Элем.получитьПотомков());

конецЦикла
МассивПотомков = промежуточныйМассивПотомков;
Если Массивпотомков.количество() = 0 тогда
Прервать
конецЕсли
конецЦикла