Имя: Пароль:
1C
1С v8
дерево значений
0 cyx7
 
21.08.14
14:52
установил новый модуль обмена с сайтом(в новом модуле отличается структура настроек). написал обработку которая перекидывает все значения, но в новых настройках не нужен первый уровень. тупо удалить - нельзя, получается нужна как то создать новое дерево и там это дело сделать, но я с ним до этого не работал и не представляю как это сделать. структура следующая:
уровень 1
уровень 2
  уровень 3
  ...
уровень 2
уровень 2
вот уровень 1 не нужен, надо чтобы уровни 2 стали первыми.
сам код:
Процедура КнопкаВыполнитьНажатие(Кнопка)
    КудаОб = Куда.ПолучитьОбъект();
    ТЗ = Откуда.СохраненнаяТаблицаКаталогов.Получить();
    ТЗ.Колонки.Добавить("ДеревоГрупп");
    
    
    Дерево = Откуда.СхемаРазделовКаталогаНаСайте.ХранилищеДереваСтруктуры.Получить();
    Дерево.Колонки.Добавить("Группа");
    Дерево.Колонки.Добавить("Номенклатура");
    Дерево.Колонки.Добавить("ИдГруппы");
    
    Для Каждого Стр Из Дерево.Строки Цикл
        //Для Каждого СтрСтр Из Стр.Строки Цикл
            ПреобразоватьДерево(Стр);
        //КонецЦикла;
    КонецЦикла;
    
    Дерево.Колонки.Удалить("НоменклатураСсылка");
    ТЗ[0].ДеревоГрупп = Дерево;
    Нхр = Новый ХранилищеЗначения(ТЗ);
    КудаОб.СохраненнаяТаблицаКаталогов = Нхр;
    КудаОб.Записать();
КонецПроцедуры

Процедура ПреобразоватьДерево(Дерево)
    Если Дерево.Строки.Количество()>0 Тогда
        Дерево.Группа = Дерево.НоменклатураСсылка.Наименование;
        Дерево.ИдГруппы = Дерево.НоменклатураСсылка.Код;
        СЗ = Новый СписокЗначений;
        СЗ.Добавить(Дерево.НоменклатураСсылка);
        Дерево.Номенклатура = СЗ;
        Для Каждого Стр Из Дерево.Строки Цикл
            ПреобразоватьДерево(Стр);
        КонецЦикла;    
    Иначе
        Дерево.Группа = Дерево.НоменклатураСсылка.Наименование;
        Дерево.ИдГруппы = Дерево.НоменклатураСсылка.Код;
        СЗ = Новый СписокЗначений;
        СЗ.Добавить(Дерево.НоменклатураСсылка);
        Дерево.Номенклатура = СЗ;
    КонецЕсли;    
КонецПроцедуры
1 13_Mult
 
21.08.14
14:59
2 cyx7
 
21.08.14
15:13
(1) не то(
3 cyx7
 
21.08.14
15:14
что то мне подсказывает, что вот так надо делать http://help1c.com/faq/view/794.html  но не пойму как реализовать
4 Kalambur
 
21.08.14
15:23
ндерево = новый деревозначений;

    Для Каждого Стр Из Дерево.Строки Цикл
        Для Каждого Стр2 Из Стр.Строки Цикл
            новстр = ндерево.строки.Добавить();
            заполнитьзначениясвйств(новстр,стр2);
            новстр.родитель = неопределено;
          ...
        КонецЦикла;

    КонецЦикла;
5 cyx7
 
21.08.14
15:29
(4) спасибо, ошибка что родителю нельзя присваивать значение, он только для чтения. голова уже пухнет, который день мучаю это дело
6 Kalambur
 
21.08.14
15:34
(5) да точно, тогда убери "новстр.родитель = неопределено;", если не выйдет
вместо этого
   заполнитьзначениясвйств(новстр,стр2);
   новстр.родитель = неопределено;
пиши
   новстр.чтото = стр2.чтото
7 cyx7
 
21.08.14
16:02
(6) увы, не помогло
8 Kalambur
 
21.08.14
16:04
не помогло что? тебя ндерево не устраивает или что?
9 cyx7
 
21.08.14
16:13
(8) оно всё сделало как надо. изначально был гл уровень(его убрать надо было), а у него 4 подуровня(и естественно в каждом  много уровней). стало 4 главных уровня(но они не заполненные) либо я туплю где то, либо.. хотя, наверное, всё таки я)
10 cyx7
 
21.08.14
16:15
(8)

     нДерево = Новый ДеревоЗначений;

    Для Каждого Стр Из Дерево.Строки Цикл
        Для Каждого Стр2 Из Стр.Строки Цикл
            НовСтр = нДерево.Строки.Добавить();
            ЗаполнитьЗначенияСвойств(НовСтр,Стр2);
            //новстр.родитель = неопределено;
          
        КонецЦикла;

    КонецЦикла;
    
    ТЗ[0].ДеревоГрупп = нДерево;
    Нхр = Новый ХранилищеЗначения(ТЗ);
    КудаОб.СохраненнаяТаблицаКаталогов = Нхр;
    КудаОб.Записать();
КонецПроцедуры
11 Kalambur
 
21.08.14
16:52
1) Что ЭТО? )))
ТЗ[0].ДеревоГрупп = нДерево;

2) а кто будет еще циклы писать для всех уровней?
    Для Каждого Стр Из Дерево.Строки Цикл
        Для Каждого Стр2 Из Стр.Строки Цикл
            Для Каждого Стр3 Из Стр2.Строки Цикл
                 Для Каждого Стр4 Из Стр3.Строки Цикл
12 lodger
 
21.08.14
16:56
(11) даешь рекурсию! 8)
13 Kalambur
 
21.08.14
16:58
(12) да какая разница, если количество уровней фиксировано
14 EvgeniuXP
 
21.08.14
17:22
(13) рекурсия не стабильно работает.
15 lodger
 
22.08.14
02:34
(13) разница в непредсказуемом кол-ве уровней.
(14) все зависит от реализации. связные списки (а древо в 1с их расширенный частный случай) всегда решались, вычислялись и считались с помощью рекурсии.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой