Имя: Пароль:
1C
1С v8
дерево и структура
0 EverGreenMouse
 
29.11.17
11:12
Собственно, имеется дерево значений с N-уровнями вложенности (читай, справочник Номенклатура).
Задача - преобразовать дерево значений в структуру структур...структур.

Накидал рекурсивную функцию, но есть проблема, что не получается никак запихнуть в структуру несколько элементов одного уровня. Мож кто что подскажет по алгоритму?
1 Альбатрос
 
29.11.17
11:13
Свой сначала покажи
2 EverGreenMouse
 
29.11.17
11:14
(1) Процедура ОбойтиРекурсивноСтрокиДереваНаКлиенте(Строки, Структура)
    Для Каждого СтрокаДерева Из Строки Цикл
        Ключ = ПолучитьКлючПоНаименованию(СтрокаДерева.Код);
        ПодчиненныеСтроки   = СтрокаДерева.ПолучитьЭлементы();
        Если СтрокаДерева.Родитель = "" Тогда
            Структура.Вставить(Ключ);
            Если ПодчиненныеСтроки.Количество() > 0 Тогда
                ОбойтиРекурсивноСтрокиДереваНаКлиенте(ПодчиненныеСтроки,Структура);
            КонецЕсли;
        Иначе
            Подструктура = Новый Структура;
            Если СтрокаДерева.ЭтоГруппа Тогда
                Подструктура.Вставить(Ключ);
                Структура.Вставить(ПолучитьКлючПоНаименованию(СтрокаДерева.Родитель), Подструктура);
            Иначе
                Подструктура.Вставить("_"+СтрЗаменить(СтрокаДерева.Код, "-", "_"));
                Структура.Вставить(ПолучитьКлючПоНаименованию(СтрокаДерева.Родитель), Подструктура);
            КонецЕсли;
            Если ПодчиненныеСтроки.Количество() > 0 Тогда
                
                ОбойтиРекурсивноСтрокиДереваНаКлиенте(ПодчиненныеСтроки,Подструктура);
            Иначе
                Структура.Вставить(ПолучитьКлючПоНаименованию(СтрокаДерева.Родитель), Подструктура);
                
            КонецЕсли;
        КонецЕсли;
        
        
    КонецЦикла;
КонецПроцедуры
3 Dmitriy_76
 
29.11.17
11:15
Добавить к ключу порядковый номер в структуре.
4 EverGreenMouse
 
29.11.17
11:16
(3) таааак, а зачем? :) Я и так знаю ключ верхнего уровня, проблема, что при таком обходе он по этому ключу затирает старое значение и подставляет новое
5 Dmitriy_76
 
29.11.17
11:17
(4) имена не пересекаются ?
6 EverGreenMouse
 
29.11.17
11:18
(5) тончо нет. У меня ключом выступает преобразованный код элемента справочника
7 vdss
 
29.11.17
11:19
Тебе это надо для сериализации в XML/JSON?
Тогда преобразуй в массив структур/структуру массивов
8 EverGreenMouse
 
29.11.17
11:21
(7) да, JSON
Насчет массива структур или структуры массивов думал, но не могу догнать, в каком порядке формировать такой контейнер и чем это будет проще :)
9 Dmitriy_76
 
29.11.17
11:22
ПодчиненныеСтроки   = СтрокаДерева.ПолучитьЭлементы();
это зачем ?

Может
ПодчиненныеСтроки   = СтрокаДерева.Строки; ?
10 EverGreenMouse
 
29.11.17
11:24
(9) А разница? Массив строк получается в первом случае, во втором - коллекция строк. Для моей задачи не вижу разницы :)
11 Dmitriy_76
 
29.11.17
11:27
(10) во первом-
Описание:

Получает коллекцию элементов дерева верхнего уровня.

второй
Содержит коллекцию строк 1-го уровня дерева значений.
12 EverGreenMouse
 
29.11.17
11:33
(11) ну ок, и как это поможет?
13 EverGreenMouse
 
29.11.17
11:37
(11) как это применить в рекурсивной процедуре?
14 Dmitriy_76
 
29.11.17
11:39
(13) заменить ПолучитьЭлементы() на Строки
15 Мыш
 
29.11.17
11:39
(0) Массив структур делай. Каждая структура - один элемент справочника. Если есть элементы нижнего уровня - кидай в свойство, которое тоже массив.
16 EverGreenMouse
 
29.11.17
11:44
(15) то есть получится массив структур массивов структур и так далее?
17 EverGreenMouse
 
29.11.17
11:45
(14) Ваш К.О. :)
18 Мыш
 
29.11.17
11:52
(16) Да
19 EverGreenMouse
 
29.11.17
12:01
(18) Парсить не особо удобно будет на другой стороне. Ну ладно, попробуем :)
20 Мыш
 
29.11.17
12:05
(19) Парсится такой же рекурсией.
21 EverGreenMouse
 
01.12.17
16:10
Так я ничего и не придумал толкового. Может у кого-то есть еще свежие идеи?
22 EverGreenMouse
 
01.12.17
17:12
(21) Не, все, поплакался и сделал :) Всем спасибо))