Имя: Пароль:
1C
1С v8
Синхронизация веток дерева значений
0 ixijixi
 
06.12.24
10:16
Коллеги, привет.

Есть дерево значений с заранее известной структурой (Категория/ВидПриемаПищи/Блюдо), но неизвестным количеством подчиненных веток.

Требуется сделать так, чтобы на каждом уровне вложенности (кроме верхнего) количество подчиненных веток было одинаковым.

Например, в категориях А и Б нужно, чтобы к-во приемов пищи было одинаковым. К примеру в категории А по факту был только завтрак+обед, в Б -завтрак+обед+ужин. Надо сделать так, чтобы в категории А было 3 подчиненных ветки.

То же касается и следующего уровня вложенности.

В результате параллельные ветки категорий должны стать одинаковыми по количеству веток.
1 maxab72
 
06.12.24
10:32
и в чем конкретно проблема?
2 ixijixi
 
06.12.24
10:33
Проблема в том, что обходя рекурсивно дерево, я натыкаюсь на то, что повторно обхожу ветки и начинаю сравнивать то, что уже сравнивал, уходя в бесконечный цикл
3 maxab72
 
06.12.24
10:36
Обходи дважды. За первый обход определи максимальное число подчиненных элементов на каждом уровне вложенности, а за второй сверяй с полученной таблицей максимального числа элементов на уровне.
4 ixijixi
 
06.12.24
10:45
Обходя 1-й раз не будет доступа к результатам 2-го обхода, и наоборот
5 maxab72
 
06.12.24
11:23
(4) Почему?!!
6 Мультук
 
06.12.24
11:24
(0)

Представим, что это отчёт на СКД.

Отчёт один, данные одни (общие для всех категорй, например А, Б, В),
но при выводе отчета по Категории А мы скрываем текст для всех прочих категорий.
Например по некому признаку (ресурсу)

Концепт понятен ?

Создаём одно общее дерево, затем рекурсивным алгоритмом меняем текст/цвет шрифта/флаги в "чужих категориях"
7 ixijixi
 
06.12.24
12:00
Всё хорошо, но это не СКД)
8 ixijixi
 
06.12.24
12:18
Сделал в два прохода дерева.

1. В первый проход получил соответствие количеств
Ключ Значение
Обед 5
Завтрак 4
"ПриемовПищиВКатегории" 2

2. Во второй проход добил ветки до нужного количества

    Количество = Новый Соответствие;
    
    Для Каждого Категория Из СтрокаОрганизации.Строки Цикл
        
        Ключ = "ПриемовПищиВКатегории";
        ТекущееКоличество = Количество.Получить(Ключ);
        Если ТекущееКоличество = Неопределено Тогда
            ТекущееКоличество = 0;
        КонецЕсли;
        
        Количество.Вставить(Ключ, Макс(ТекущееКоличество, Категория.Строки.Количество()));
        
        Для Каждого ПриемПищи Из Категория.Строки Цикл
            
            Ключ = ПриемПищи.ПриемПищи;
            ТекущееКоличество = Количество.Получить(Ключ);
            Если ТекущееКоличество = Неопределено Тогда
                ТекущееКоличество = 0;
            КонецЕсли;
            
            Количество.Вставить(Ключ, Макс(ТекущееКоличество, ПриемПищи.Строки.Количество()));
            
        КонецЦикла;
        
    КонецЦикла;
    
    Для Каждого Категория Из СтрокаОрганизации.Строки Цикл
        
        Ключ = "ПриемовПищиВКатегории";
        ТекущееКоличество = Количество.Получить(Ключ);
        ДополнитьСтроки(Категория, ТекущееКоличество);
        
        Для Каждого ПриемПищи Из Категория.Строки Цикл
            
            Ключ = ПриемПищи.ПриемПищи;
            ТекущееКоличество = Количество.Получить(Ключ);
            ДополнитьСтроки(ПриемПищи, ТекущееКоличество);
            
        КонецЦикла;
        
    КонецЦикла;
9 Мультук
 
06.12.24
13:10
(8)

Что будет, если "Макаронник с мясом" в "А" есть,
но в Б "нет".
То что строчки "Съедут вверх" это нормально ?
10 СвинТуз
 
06.12.24
17:06
Таблица
1. Уровень
2. Количество вложений

1. Проходим по уровням ищем максимум. Заполняем таблицу.
2. Проходим по уровням считаем вложения и добавляем если не досчитались.
11 СвинТуз
 
06.12.24
17:09
Можно не заполнять дерево.
Нашли максимумы, при выводе допечатываем.