Имя: Пароль:
1C
1С v8
Заполнить Дерево значений из ТЗ
0 Vladislava-smile
 
27.04.16
07:55
Всем доброго дня, подскажите никто не сталкивался как заполнить дерево значений из ТЗ, не зная заранее количество уровней.

Пример ТЗ такой:

Номенклатура      Уровень
Ном1                 1
Ном2                 1
Ном3                 2
Ном4                 3
Ном5                 4

Последовательность соблюдена,


Ном2 состоит из Ном3, Ном3 состоит из Ном4, Ном4 состоит из Ном5
1 1Сергей
 
27.04.16
07:59
нужно сделать кэш родителей
2 1Сергей
 
27.04.16
08:00
по методу LIFO
3 Рэйв
 
27.04.16
08:01
1.Получаешь максимум КолУровней по колонке "Уровень"
2.Добавляешь ветку Строки в дерево в первый уровень присваиваешь ТекУр    
3.
Для каждого Ур Из КолУровней цикл
        
    //Ищешь строки с уровнем=Ур добавляешь в ветку ТекУр
    //Добавляешь ветку ТекУр.Строки в дерево присваиваешь ТекУр
Конеццикла;
//---
как то так
4 Vladislava-smile
 
27.04.16
08:08
(3) А если бедт такой пример

Номенклатура      Уровень
Ном1                 1
Ном2                 2
Ном3                 2
Ном4                 3
Ном5                 2

По твоей логике будет такое дерево:

Ном1
   Ном2
   Ном3
   Ном5
      Ном4

что не верно
5 Vladislava-smile
 
27.04.16
08:13
(1, 2) А можно поподробнее немного

Просто в моем представлении это надо можно сделать так


Пример

Ст1 = Дерево.Строки.Добавить();
Ст2 = Ст1.Строки.Добавить();

И хранить вида

Уровень       Переменная
1               Ст1
2               Ст2

Но куда сохранять понять не могу ...
6 ДемонМаксвелла
 
27.04.16
08:20
(0) в ТЗ не хватает ссылки на родителя.
а так в простом цикле обойти ТЗ и добавить строки в дерево
7 Рэйв
 
27.04.16
08:22
(5)С чего это?
.НайтиСтроки()  с Ур= 2 Найдет все =2 и добавить
8 Рэйв
 
27.04.16
08:22
(7) к 4
9 Рэйв
 
27.04.16
08:22
(8)Чем не верно то? Все уровни на месте
10 Vladislava-smile
 
27.04.16
08:26
(9) А хотя правы, сейчас попробую.
11 Vladislava-smile
 
27.04.16
08:42
(9) Может я поняла вас не верно. Опять же рамматриваем пример

Номенклатура      Уровень
Ном1                 1
Ном2                 2
Ном3                 2
Ном4                 3
Ном5                 2


Кол - во уровней = 3
Для каждого из увроней ищем все строки из ТЗ и записываем:
Заполняем первый
Ном1
Заполняем воторой
Ном1
   Ном2
   Ном3
   Ном5
Заполняем третий
Ном1
   Ном2
   Ном3
   Ном5
      Ном4

Должно быть:
Ном1
   Ном2
   Ном3
      Ном4
   Ном5
12 Fish
 
гуру
27.04.16
08:57
(11) Простой цикл тебе поможет.
13 Vladislava-smile
 
27.04.16
09:09
(12) Окей, простой цикл???
Номенклатура      Уровень
Ном1                 1
Ном2                 2
Ном3                 2
Ном4                 3
Ном5                 2

Мы заполним до 3 уровня, а как потом вставить в требуемый 2-ой уровень последнюю строку???????

Повторюсь, нам надо запоминать ветки, которые создаются ранее.
14 ДенисЧ
 
27.04.16
09:11
(13) Хочешь, продам описание метода Сортировать() ?
15 1Сергей
 
27.04.16
09:11
(13) см  (1) и (2)
16 Оранжевое настроение
 
27.04.16
09:15
// Функция возращает дерево значний из таблицы значений, с нужной группировкой
//
//ТЗ - таблица значений, из которой будет формироваться дерево
//МассивКолонокГруппировки - массив строк (названий колонок ТЗ), по которым будет вестись группировка
//
//Порядок группировки зависит от порядка колонок в ТЗ (имеет смысл, если колонок для группировки несколько) и не зависит от порядка в массиве МассивКолонокГруппировки
//Например: если в ТЗ три колонки "_1", "_2", "_3", а в массиве названий указаны две строки "_2" и "_1", то группировка в дереве будет сначала по колонке "_1", а потом по колонке "_2"
Функция ТаблицаЗначенийВДеревоЗначений(ТЗ, МассивКолонокГруппировки) Экспорт
    
    ПЗ                            = Новый ПостроительЗапроса;
    ПЗ.ИсточникДанных          = Новый ОписаниеИсточникаДанных(ТЗ);
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    Для Каждого ГруппировкаКолонка ИЗ МассивКолонокГруппировки Цикл
        ПЗ.ИсточникДанных.Колонки[ГруппировкаКолонка].Измерение = Истина;
    КонецЦикла;
    ПЗ.ЗаполнитьНастройки();
    ПЗ.Выполнить();
    Дерево = ПЗ.Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);  
    Возврат Дерево;  
    
КонецФункции // ТаблицаЗначенийВДеревоЗначений()
17 Vladislava-smile
 
27.04.16
09:53
(16) У меня уровни написаны в строке, это не колонки, точное количество их не знаю, так что это тоже не вариант ... ((
18 Vladislava-smile
 
27.04.16
10:10
(15) - как я понимаю это единственный вариант, а можно немноооооожечко поподробнее или где почитать
19 1Сергей
 
27.04.16
10:19
(18) балин. чего там читать?




    Дерево = Новый ДеревоЗначений;
    СтрокаДерева;
    
    Для Каждого СтрокаТЗ ИЗ ТЗ Цикл
        
        Уровень = /// определяем уровень
        Номенклатура = // находим номенклатуру
        
        Если Уровень = 1 Тогда
            
            // корень
            СтрокаДерева = Дерево.Строки.Добавить();
            
        Иначе
            
            // ищем ветку нужного уровня
            Пока Уровень > (СтрокаДерева.Уровень() + 1) Цикл
                СтрокаДерева = СтрокаДерева.Родитель;
            КонецЦикла;
            
            СтрокаДерева = СтрокаДерева.Строки.Добавить();
            
        КонецЕсли;
        
        // заполняем строку дерева
        
        СтрокаДерева.Номенклатура = Номенклатура;
        
    КонецЦикла;
20 1Сергей
 
27.04.16
10:22
//Пока Уровень > (СтрокаДерева.Уровень() + 1) Цикл
Пока Уровень < (СтрокаДерева.Уровень() + 1) Цикл

чуть, тупанул. Ну, разберёшься
21 Vladislava-smile
 
28.04.16
07:12
(20), ага получилось, только вот так:

Для Каждого СтрокаТЗ ИЗ ТЗ Цикл
        
        
        Если СтрокаТЗ.Уровень = 1 Тогда
            
            // корень

            СтрокаДерева = ДеревоСоставаПродукции.Строки.Добавить();
            
        Иначе
            
            // ищем ветку нужного уровня

            Пока СтрокаТЗ.Уровень - 1 < (СтрокаДерева.Уровень() + 1) Цикл
                СтрокаДерева = СтрокаДерева.Родитель;
            КонецЦикла;
            
            СтрокаДерева = СтрокаДерева.Строки.Добавить();
            
        КонецЕсли;
        
        // заполняем строку дерева
        
        СтрокаДерева.ПродукцияСоставляющие = СтрокаТЗ.Номенклатура;
        СтрокаДерева.ВидНоменклатуры = СтрокаТЗ.Номенклатура.ВидНоменклатуры;
        СтрокаДерева.ЕдиницаИзмерения = СтрокаТЗ.Номенклатура.БазоваяЕдиницаИзмерения;
        СтрокаДерева.Количество = СтрокаТЗ.Количество;
        СтрокаДерева.Итого = СтрокаТЗ.Итого;
      
    КонецЦикла;

Спасибо большое ))