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


1С:Предприятие ::

Метки: 

дерево и структура

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

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

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

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

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



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