Имя: Пароль:
1C
 
Как построить дерево...
0 kosts
 
31.07.08
12:26
ПолеВвода1 = "ВЫБРАТЬ
   Операции1.Ссылка КАК Ссылка1,
   Операции.Ссылка КАК Ссылка
ИЗ
   (ВЫБРАТЬ
       Операции.Ссылка КАК Ссылка
   ИЗ
       Справочник.Операции КАК Операции
   ГДЕ
       Операции.Проект = &ВыбранныйПроект) КАК Операции1
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Операции КАК Операции
           
       ПО Операции.Этап = Операции1.Ссылка
ГДЕ
   Операции.Проект = &ВыбранныйПроект
ИТОГИ ПО
   Ссылка1 ИЕРАРХИЯ, Ссылка ИЕРАРХИЯ";

Текст = ПолеВвода1;
   Запрос.Текст = Текст;
   Запрос.УстановитьПараметр("ВыбранныйПроект", ВыбранныйПроект);
   Дерево3 = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
   ЭлементыФормы.Дерево3.СоздатьКолонки();


Так дерево строится, но только до второго уровня.
Справочник Операции сам по себе одноуровневый, но в поле Этап записывается предок.
Как проще всего построить дерево с произвольным количеством "подуровней"?
1 Mitriy
 
31.07.08
12:29
в коде, обходом по выборке
2 kosts
 
31.07.08
12:33
(1) Думал над этим, сейчас застрял на том, как отсортировать выборку, что бы дерево строилось за один проход, но не идет что-то...
Проблема в том что не вижу способа отсортировать выборку в порядке их вывода в дерево...
3 hhhh
 
31.07.08
12:35
ОбходРезультатаЗапроса.ПоГруппировкамСИерархией
4 kosts
 
31.07.08
12:37
(3) Результат тот же.
5 Mitriy
 
31.07.08
12:43
если справочник не иерархический, тогда чо-нить вроде этого, имхо:

"ВЫБРАТЬ
   Операции.Этап КАК Этап,
   Операции.Ссылка КАК Операция    
ИЗ
  Справочник.Операции КАК Операции КАК Операции

ГДЕ
   Операции.Проект = &ВыбранныйПроект
УПОРЯДОЧИТЬ ПО
   Этап,
   Операция

ИТОГИ ПО
   Этап
АВТОУПОРЯДОЧИВАНИЕ";
6 kosts
 
31.07.08
12:58
(5) Если так, то сперва выводятся элементы первого уровня, потом второго и тд.
Подумаю, поможет ли это...
7 kosts
 
31.07.08
13:48
Может кто предсказать, если использовать отдельный справочник для хранения уровней
Т.е.
справочник Операции (Наименование)
справочник Связи (Операция, Вышестоящая операция)

Можно ли по простому построить дерево в таком случае?
8 kosts
 
31.07.08
15:41
(6)

Думал выводятся по уровням, однако, выводятся не по уровням.

А то уже нашел нормальное решение, а дерево кривое получилось :-)
9 Косой
 
31.07.08
15:48
Древесные справочники спокон веку делались так:

ID,
Parent,
Name,
...
всё это хозяйство епстественно в одной таблице(справочнике:))
10 kosts
 
31.07.08
15:51
(9) Ну я так и сделал. Хочу добиться, что бы затем по простому построить дерево за один проход, а сейчас этого не получается...
из-за того, что в запросе строки идут в беспорядке...
11 kosts
 
31.07.08
16:04
Сейчас вот так

ПолеВвода1 = "ВЫБРАТЬ
   |Операции.Ссылка КАК Операция,
   |Операции.Этап КАК ВышестоящаяОперация,
   |1 как НПП
|ИЗ
  |Справочник.Операции КАК Операции
|ГДЕ
   |Операции.Проект = &ВыбранныйПроект
|ИТОГИ ПО
|    ВышестоящаяОперация
|АВТОУПОРЯДОЧИВАНИЕ";

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

   Пока Выборка.Следующий() цикл // Хотели воспользоваться тем, что подчиненные элементы будет в выборке позже вышестоящего
       
       Операция = Выборка.Операция;
       ВышестоящаяОперация = Выборка.ВышестоящаяОперация;
       
       узел = ст.Получить(ВышестоящаяОперация);
       Если узел = Неопределено тогда
           узел = Строки;
       КонецЕсли;
       
       Строка = узел.Строки.Добавить();
       Строка.Операция = Операция;
       Строка.ВышестоящаяОперация = ВышестоящаяОперация;
       
       Если Операция <> null тогда
           ст.Вставить(Операция, Строка);
       КонецЕсли;        

   КонецЦикла;


В определенных местах дерево рвет.
12 Mitriy
 
31.07.08
16:11
ВыборкаВышестоящаяОрганизация = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

.....
Пока ВыборкаВышестоящаяОрганизация.Следующий() Цикл
.....
   ВыборкаОперация = ВыборкаВышестоящаяОрганизация.Выбрать();
   Пока ВыборкаВышестоящаяОрганизация.Следующий() Цикл
       .......
   КонецЦикла;
КонецЦикла;
13 Mitriy
 
31.07.08
16:12
(12)* млин...

Пока ВыборкаВышестоящаяОрганизация.Следующий() Цикл
.....
   ВыборкаОперация = ВыборкаВышестоящаяОрганизация.Выбрать();
   Пока ВЫБОРКАОПЕРАЦИЯ.Следующий() Цикл
       .......
   КонецЦикла;
КонецЦикла;
14 kosts
 
31.07.08
16:15
(12) Это не работает, т.к. в запросе не формируются корректные группировки.
Работает, только если заранее известно количество группировок, например, для запроса из (0)
15 kosts
 
31.07.08
16:16
(13) Да я понял
16 Mitriy
 
31.07.08
16:16
(14) ты пробовал?
17 kosts
 
31.07.08
16:18
(16) Первоначально с этого и начинал. Для этого варианта проблема в том, что не могу составить запрос чтобы запрос сам корректно сгруппировал данные ...
18 Mitriy
 
31.07.08
16:22
(17) чего-то я не понимаю... ты хочешь, у тебя вложенность больше, чем 2?
19 Mitriy
 
31.07.08
16:23
(18)* без "ты хочешь"...
20 kosts
 
31.07.08
16:24
(19) Количество уровней неопределено.
21 Mitriy
 
31.07.08
16:36
тады ой... тут уже думать надо...
22 Новиков
 
31.07.08
17:20
>>Как проще всего построить дерево с произвольным количеством "подуровней"?

Я не особо понял, что городиться ниже этого вопроса, но на процитированный вопрос отвечу. Я пришел к мысли (хз правильной ли), что кароче всего код при выводе произвольного кол-ва уровней - рекурсивная процедура.

рыба примерно такая:

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

Для каждого ТекСтр Из ДЗ.Строки Цикл
 ПостроитьДерево(ТекСтр,0);
КонецЦикла;

В построить дерево пишешь цикл, который смотрит какие-то твои условия. Если енто группа, иерархия или хз что тебе надо - продолжаешь вызов этой процедуры с уровнем +1, када дошел до конца - выводишь свои листики. Я делаю всегда так - код получается очень коротким. А то что ты там сортировать вздумал - я не особо втыкнул :)
23 Mitriy
 
31.07.08
17:26
(22) ну дык почитал бы сначала...
24 Новиков
 
31.07.08
17:28
ну дык почитал :) Как сам делаю - написал. Про сортировку я не понял.
25 Mitriy
 
31.07.08
17:29
(24) ну дык не только про сортировку не понял, почитай еще :)
26 himch
 
01.08.08
10:05
// Решение для Табличной части и Дерева значений.

// Загрузка из ТЧ в ДеревоЗначений

Перем НомерСтрокиТЧ;

Функция ДобавитьСтрокуИзТЧ(РодительскаяСтрокаТабличногоПоля,СтрокаТЧ)
   НоваяСтрока=РодительскаяСтрокаТабличногоПоля.Строки.Добавить();
   КопироватьТЧ(НоваяСтрока,СтрокаТЧ);
   НоваяСтрока.СтрокаРодитель=СтрокаТЧ.СтрокаРодитель;
   НоваяСтрока.НомерСтроки=НомерСтрокиТЧ;
   НомерСтрокиТЧ=НомерСтрокиТЧ+1;
   Возврат НоваяСтрока;
КонецФункции

Процедура СчитыватьСтрокиИзТЧ(РодительскаяСтрокаТабличногоПоля, ТекущийРодительТЧ)
   Пока НомерСтрокиТЧ<=Операции.Количество() Цикл
       СтрокаТЧ=Операции[НомерСтрокиТЧ-1];
       Если СтрокаТЧ.СтрокаРодитель=ТекущийРодительТЧ Тогда
           НоваяСтрока=ДобавитьСтрокуИзТЧ(РодительскаяСтрокаТабличногоПоля,СтрокаТЧ);
       Иначе
           Если СтрокаТЧ.СтрокаРодитель<ТекущийРодительТЧ Тогда
               Возврат;
           Иначе    
               СчитыватьСтрокиИзТЧ(НоваяСтрока, СтрокаТЧ.СтрокаРодитель);
           КонецЕсли;    
       КонецЕсли;
   КонецЦикла;    
КонецПроцедуры

Функция СоздатьДЗ()
// тут создаем само дерево значений
   КЧ = Новый КвалификаторыЧисла(10,0);
   Массив = Новый Массив;
   Массив.Добавить(Тип("Число"));
   ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, КЧ);
   ТП = Новый ДеревоЗначений;
   ТП.Колонки.Добавить("СтрокаРодитель",ОписаниеТиповЧ,"СтрокаРодитель");
   ТП.Колонки.Добавить("НомерСтроки",ОписаниеТиповЧ,"НомерСтроки");
// и так далее..
   Возврат ТП;
КонецФункции    

Процедура ТабличноеПолеЗагрузитьИзТЧ(ТП) Экспорт
   ТП=СоздатьДЗ();
   НомерСтрокиТЧ=1;
   СчитыватьСтрокиИзТЧ(ТП, 0);
КонецПроцедуры


// Сохрание из ДереваЗначений в ТЧ

Функция ДобавитьСтрокуВТЧ(ТЧ, СтрокаТЧ,НомерСтрокиРодителя)
   НоваяСтрока=ТЧ.Добавить();
   КопироватьТЧ(НоваяСтрока,СтрокаТЧ);
   НоваяСтрока.СтрокаРодитель=НомерСтрокиРодителя;
   Возврат НоваяСтрока;
КонецФункции

Процедура ЗаписатьСтрокиВТЧ(ТЧ, КорневаяСтрока, НомерСтрокиРодителя)
   Для каждого СтрокаТЧ из КорневаяСтрока.Строки Цикл
       НоваяСтрока=ДобавитьСтрокуВТЧ(СтрокаТЧ,НомерСтрокиРодителя);
       Если СтрокаТЧ.Строки.Количество()<>0 Тогда
           ЗаписатьСтрокиВТЧ(ТЧ,СтрокаТЧ,НоваяСтрока.НомерСтроки);
       КонецЕсли;    
   КонецЦикла;
КонецПроцедуры

Процедура ТабличноеПолеИнформацииСохранитьВТЧ(ТЧ)
   ТЧ.Очистить();
   ЗаписатьСтрокиВТЧ(ТЧ,ТабличноеПолеИнформации,0)
КонецПроцедуры