Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 мар 2025, 17:25

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

Автор maxxi, 24 янв 2025, 15:12

0 Пользователей и 1 гость просматривают эту тему.

maxxi

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

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

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

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

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

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



Есть ТабЗнач, надо преобразовать в ДерЗнач, если иерархия одноуровневая все ок, а если уровней 4 тогда появляются трудности, прощу помочь с этим. Структура ДерЗнач и ТабЗнач в фото. Спасибо.

antoneus


maxxi

antoneus, сорри, моя ошибка.

antoneus

Понятнее не стало) То есть, группа1 - это наверху, а группа4 - в самом внутри?

maxxi


maxxi

antoneus, пробовал так:


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

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

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

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

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

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

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

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

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

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

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

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

maxxi

antoneus, не подскажите в какую сторону двигаться, спасибо

antoneus

В сторону рекурсии.

maxxi


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск