|   |   | 
| 
 | Заполнить Дерево значений из ТЗ | ☑ | ||
|---|---|---|---|---|
| 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) Цикл СтрокаДерева = СтрокаДерева.Родитель; КонецЦикла; СтрокаДерева = СтрокаДерева.Строки.Добавить(); КонецЕсли; // заполняем строку дерева СтрокаДерева.ПродукцияСоставляющие = СтрокаТЗ.Номенклатура; СтрокаДерева.ВидНоменклатуры = СтрокаТЗ.Номенклатура.ВидНоменклатуры; СтрокаДерева.ЕдиницаИзмерения = СтрокаТЗ.Номенклатура.БазоваяЕдиницаИзмерения; СтрокаДерева.Количество = СтрокаТЗ.Количество; СтрокаДерева.Итого = СтрокаТЗ.Итого; КонецЦикла; Спасибо большое )) | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |