|
Синхронизация веток дерева значений
СвинТуз, Zamestas, SleepyHead, maxab72, АгентБезопаснойНацио, fyn, Климов Сергей, Волшебник, Мультук, Хряк, Stepashkin, dedmoroz777, 2S, sapravka, petr_ivanov, Prog_man, orakool, kpe4et178, ixijixi, Fedor-1971, Ненавижу 1С, программистище, Mellon, Admin_Net_1C, MWWRuza, d4rkmesa, DemonShinji2, Indian, Crusher, formista2000
| ☑ |
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
|
Можно не заполнять дерево.
Нашли максимумы, при выводе допечатываем.
|
|
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой