Имя: Пароль:
1C
1С v8
Собрать данные из ДеревоЗначений в ТаблицуЗначений определенным образом
0 AneJIbcuH
 
10.09.16
09:14
Всем привет! Ломаю голову над такой штукой, есть дерево значений

Группа 1
     Группа 1.1
            Группа 1.1.1
            Группа 1.1.2
            Группа 1.1.3
     Группа 1.2
            Группа 1.2.1
            Группа 1.2.2
Группа 2
     Группа 2.1
            Группа 2.1.1
            Группа 2.1.2

И тд, уровней может быть больше!, напротив каждой строки есть определенное значение.
Необходимо собрать из этого ТЗ следующим образом:
Для значения каждого конечного элемента ДЗ (самые последние уровни  - Группа 1.1.1 ... Группа 2.1.1  и тд) получить строку вида: "Группа 1 --> Группа 1.1 --> Группа 1.1.1"
...
"группа 1 --> Группа 1.2 --> Группа 1.2.1"
...
"Группа 2 --> Группа 2.1 --> Группа 2.1.1"
и тд, повторюсь, уровней может быть больше.

Организовал рекурсию по ДЗ, имею уровни, знаю последние строки.
Но при проходе Группа 1.2 и тд. получается лажа и на этом стопарюсь.
Кто какие идеи может подкинуть?
1 bodri
 
10.09.16
09:54
Попробуй в СКД закинуть, а от туда выгрузить в ТЗ, я подобное делал, но только из ТЗ в ДЗ
2 Diman000
 
10.09.16
09:58
Бежишь рекурсией по дереву, строку, у которой нет подчиненных пишешь в ТЗ, перечисляя всех ее родителей.
В чем сложность?
3 Diman000
 
10.09.16
10:01
Сначала сделай по-простому. Не надо начинать запоминать родителей и формировать строку в процессе обхода дерева.
Нашел нижний уровень -> вызвал еще одну процедуру, которая рекурсивно всех родителей тебе выдаст -> записал в ТЗ.
Да, не самый идеал, зато дешево, надежно и практично.
Про оптимизацию потом будешь думать, если она вообще потребуется.
4 AneJIbcuH
 
10.09.16
10:03
(1) не представляю, как ДЗ закинуть в СКД. ТЗ конечно
гораздо проще.
5 AneJIbcuH
 
10.09.16
10:04
(3) Согласен, такой вариант сразу был в голове. Но некую оптимальность охото :)
6 Diman000
 
10.09.16
10:08
Оптимальность решения задачи в этом и состоит, чтобы не тратить время там где это не требуется :)
В любом случае тут сначала надо по-простому сделать, чтобы хоть какой-то результат получить.
7 МихаилМ
 
10.09.16
10:10
Функция  ТД_ТЗ(ТД,ТЗ)
    Перем ПостроительЗапроса;
    Перем Результат;
    ПостроительЗапроса = Новый ПостроительЗапроса;
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ);

    Результат = ПостроительЗапроса.Результат; // отобранные строки типа РезультатЗапроса    

    ТЗ = Результат.Выгрузить();
    //ТЗ.ВыбратьСтроку();
                
    
КонецФункции
8 AneJIbcuH
 
10.09.16
10:18
(7) Совсем совсем не к месту. Новый ОписаниеИсточникаДанных() - Не поддерживает ДеревоЗначений
9 zak555
 
10.09.16
10:19
(7) что такое тд?
10 МихаилМ
 
10.09.16
11:05
сорри
ПостроительЗапроса замените на Построительотчета
11 Serginio1
 
10.09.16
12:26
12 AneJIbcuH
 
10.09.16
18:22
Сделал пока так:

Функция РекурсивноеЧтениеДерева(ТаблицаНаправлений, СтрокаДерева, Уровень = 0)
    
    НашеДерево     = СтрокаДерева.Строки;
    
    Для каждого ТекСтрокаДерева из НашеДерево Цикл    
        
        КонечнаяГруппа = (ТекСтрокаДерева.Строки.Количество() = 0);                                           
        
        Если КонечнаяГруппа Тогда              
                                    
            СтрокаНаправления = ТаблицаНаправлений.Добавить();
            СтрокаНаправления.ИдГруппы = ТекСтрокаДерева.ИдГруппы;
            ТекНаправление = "";
            ВернутьРекурсивноНаправление(ТекСтрокаДерева,ТекНаправление);
            СтрокаНаправления.НаправлениеСтрока = ТекНаправление;             
            
        КонецЕсли;        
        
        РекурсивноеЧтениеДерева(ТаблицаНаправлений, ТекСтрокаДерева, Уровень + 1);        
        
    КонецЦикла;     
    
КонецФункции

Процедура ВернутьРекурсивноНаправление(СтрокаДЗ,ТекНаправление,Первый = Истина)
    
    Если Первый Тогда         
        ТекНаправление =  Строка(СтрокаДЗ.Группа);        
    Иначе          
        ТекНаправление =  Строка(СтрокаДЗ.Группа) + "-->" + ТекНаправление;         
    КонецЕсли;     
    
    Если СтрокаДЗ.Родитель <> Неопределено Тогда         
        ВернутьРекурсивноНаправление(СтрокаДЗ.Родитель,ТекНаправление,Ложь);            
    КонецЕсли;      
        
КонецПроцедуры


Может у кого более элегантное решение есть :)
13 Рэйв
 
10.09.16
20:22
(0)Да сделай тз с вложенными тз. Задача для школьников:-)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший