Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Собрать данные из ДеревоЗначений в ТаблицуЗначений определенным образом

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

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

 
    ТЗ = Результат.Выгрузить();
    //ТЗ.ВыбратьСтроку();

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

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

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


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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.