Вход | Регистрация

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)Да сделай тз с вложенными тз. Задача для школьников:-)

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