Многоуровневая группировка в ДЗ

1. nadyusha22 24.01.25 15:08 Сейчас в теме
&НаСервере
Процедура ЗаполнитьДЗнаСервереРасход()
    
    лкДЗ = РеквизитФормыВЗначение("дзРасход");
    лкДЗ.Строки.Очистить(); // Очищаем, если что-то уже было

    // Поля для группировок и строк
	лкПоляГруппы = "Группа1,Группа2,Группа3,Группа4,План";
	лкПоляСтрок  = "Группа1,Группа2,Группа3,Группа4,План";

    // Выгружаем данные для группировок
    лкТЗ = тзРасход.Выгрузить(, лкПоляГруппы);
    
    // Убираем повторяющиеся группы с помощью "Свернуть"
	лкТЗ.Свернуть(, "Группа1,Группа2,Группа3,Группа4,План");

    // Сортируем данные по полю "Сортировка"
    лкТЗ.Сортировать("Группа1");

    // Перебираем сгруппированные данные
    Для каждого лкГрп Из лкТЗ Цикл
        // Добавляем групповые строки
        лкНовГ = лкДЗ.Строки.Добавить();
        ЗаполнитьЗначенияСвойств(лкНовГ, лкГрп, лкПоляГруппы);
        
        // Находим детализированные строки для текущей группы
        лкОтбор = Новый Структура("Группа1", лкГрп.Группа1);
        лкСтроки = тзРасход.НайтиСтроки(лкОтбор);
        
        Для каждого лкРез Из лкСтроки Цикл
            // Добавляем детальные строки в группу
            лкНовД = лкНовГ.Строки.Добавить();
            ЗаполнитьЗначенияСвойств(лкНовД, лкРез, лкПоляСтрок);
        КонецЦикла; 
    КонецЦикла; 

    // Устанавливаем данные обратно в реквизит формы
  ЗначениеВРеквизитФормы(лкДЗ, "дзРасход");
 КонецПроцедуры

Показать


Есть ТабЗнач, надо преобразовать в ДерЗнач, если иерархия одноуровневая все ок, а если уровней 4 тогда появляются трудности, прощу помочь с этим. Структура ДерЗнач и ТабЗнач в фото. Спасибо.
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 80 24.01.25 15:12 Сейчас в теме
(1) Сделайте

//ТЗРасход необходимо делать для каждого уровня группировки, в ней будет всего 2 колонки:
//Группа1, Группа2, для следующей - Группа2, Группа3 и т.д.
лкОтбор = Новый Структура("Группа1", лкГрп.Группа1);
лкСтроки = тзРасход.НайтиСтроки(лкОтбор);

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

по количеству нужных уровней группировки и формируйте дерево.
3. nadyusha22 25.01.25 08:12 Сейчас в теме
(2)
//ТЗРасход необходимо делать для каждого уровня группировки, в ней будет всего 2 колонки:
//Группа1, Группа2, для следующей - Группа2, Группа3 и т.д.


Процедура ЗаполнитьДЗнаСервереРасход()
    
    лкДЗ = РеквизитФормыВЗначение("дзРасход");
    лкДЗ.Строки.Очистить(); // Очищаем дерево значений

    // Поля для уровней группировки
    лкПоляГруппы = Новый Массив;
    лкПоляГруппы.Добавить(Новый Массив("Группа1", "Группа2"));
    лкПоляГруппы.Добавить(Новый Массив("Группа2", "Группа3"));
    лкПоляГруппы.Добавить(Новый Массив("Группа3", "Группа4"));

    // Начинаем обработку с верхнего уровня группировки
    ОбработатьУровеньГруппировки(лкДЗ, тзХаражат, лкПоляГруппы, 0);

    // Устанавливаем данные обратно в реквизит формы
    ЗначениеВРеквизитФормы(лкДЗ, "дзРасход");
КонецПроцедуры

Процедура ОбработатьУровеньГруппировки(лкДЗ, тзИсходная, лкПоляГруппы, Уровень)
    
    Если Уровень >= лкПоляГруппы.Количество() Тогда
        Возврат;
    КонецЕсли;

    // Получаем текущие поля группировки
    лкТекущиеПоля = лкПоляГруппы[Уровень];
    лкТЗ = тзИсходная.Выгрузить(, СписокЗначений(лкТекущиеПоля));
    лкТЗ.Свернуть(, СписокЗначений(лкТекущиеПоля));
    лкТЗ.Сортировать(лкТекущиеПоля[0]);

    // Перебираем сгруппированные данные
    Для каждого лкГрп Из лкТЗ Цикл
        лкНовГруппа = лкДЗ.Строки.Добавить();
        ЗаполнитьЗначенияСвойств(лкНовГруппа, лкГрп, СписокЗначений(лкТекущиеПоля));

        // Для текущей группы выбираем строки детализированной таблицы
        лкОтбор = Новый Структура;
        Для каждого лкПоле Из лкТекущиеПоля Цикл
            лкОтбор.Вставить(лкПоле, лкГрп[лкПоле]);
        КонецЦикла;

        лкСтроки = тзИсходная.НайтиСтроки(лкОтбор);

        // Обрабатываем вложенный уровень
        ОбработатьУровеньГруппировки(лкНовГруппа, лкСтроки, лкПоляГруппы, Уровень + 1);
    КонецЦикла;

КонецПроцедуры

Функция СписокЗначений(МассивПолей)
    Возврат СтрСоединить(МассивПолей, ",");
КонецФункции

Показать


так вы имеете ввиду?
4. nomad_irk 80 25.01.25 13:41 Сейчас в теме
(3) не знаю, не проверял, возможно.
nadyusha22; +1 Ответить
5. starjevschik 25.01.25 14:35 Сейчас в теме
Такие вещи делаются прямо бесхитростно
Для Каждого Строка Из ТЗ
СтрокДерева1 = Дерево.Строки.Найти(Строка.Группа1, "Группа1", Ложь);
Если СтркоаДерева1 = Неопределено Тогда
СтрокаДерева1 = Дерево.Строки.Добавить().Группа1 = Строка.Группа1;
КонецЕсли;

СтрокаДерева2 = СтрокаДерева1.Строки.Найти(Строка.Группа2, "Группа2", Ложь);
Если СтрокаДерева2 = Неопределено Тогда
ну и так далее сколько там уровней есть.
Можно это все автоматизировать до пары небольших процедур, но если количество уровней известно и меняется редко, проще и быстрее налепить таких блоков нужное количество
КонецЦикла;
Показать
nadyusha22; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот