&НаСервере
Процедура ЗаполнитьДЗнаСервереРасход()
лкДЗ = РеквизитФормыВЗначение("дзРасход");
лкДЗ.Строки.Очистить(); // Очищаем, если что-то уже было
// Поля для группировок и строк
лкПоляГруппы = "Группа1,Группа2,Группа3,Группа4,План";
лкПоляСтрок = "Группа1,Группа2,Группа3,Группа4,План";
// Выгружаем данные для группировок
лкТЗ = тзРасход.Выгрузить(, лкПоляГруппы);
// Убираем повторяющиеся группы с помощью "Свернуть"
лкТЗ.Свернуть(, "Группа1,Группа2,Группа3,Группа4,План");
// Сортируем данные по полю "Сортировка"
лкТЗ.Сортировать("Группа1");
// Перебираем сгруппированные данные
Для каждого лкГрп Из лкТЗ Цикл
// Добавляем групповые строки
лкНовГ = лкДЗ.Строки.Добавить();
ЗаполнитьЗначенияСвойств(лкНовГ, лкГрп, лкПоляГруппы);
// Находим детализированные строки для текущей группы
лкОтбор = Новый Структура("Группа1", лкГрп.Группа1);
лкСтроки = тзРасход.НайтиСтроки(лкОтбор);
Для каждого лкРез Из лкСтроки Цикл
// Добавляем детальные строки в группу
лкНовД = лкНовГ.Строки.Добавить();
ЗаполнитьЗначенияСвойств(лкНовД, лкРез, лкПоляСтрок);
КонецЦикла;
КонецЦикла;
// Устанавливаем данные обратно в реквизит формы
ЗначениеВРеквизитФормы(лкДЗ, "дзРасход");
КонецПроцедуры
ПоказатьЕсть ТабЗнач, надо преобразовать в ДерЗнач, если иерархия одноуровневая все ок, а если уровней 4 тогда появляются трудности, прощу помочь с этим. Структура ДерЗнач и ТабЗнач в фото. Спасибо.
Прикрепленные файлы:

По теме из базы знаний
- 1С:Управление металлургическим комбинатом 2. Модуль для 1С:ERP
- 1С:Хлебобулочное и кондитерское производство. Модуль для 1С:ERP и 1С:КА
- 1С:Управление строительной организацией. 1С:ERP Управление строительной организацией 2
- Библиотека процедур и функций для технологической платформы "1С: Предприятие 7.7"
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Сделайте
по количеству нужных уровней группировки и формируйте дерево.
//ТЗРасход необходимо делать для каждого уровня группировки, в ней будет всего 2 колонки:
//Группа1, Группа2, для следующей - Группа2, Группа3 и т.д.
лкОтбор = Новый Структура("Группа1", лкГрп.Группа1);
лкСтроки = тзРасход.НайтиСтроки(лкОтбор);
Для каждого лкРез Из лкСтроки Цикл
// Добавляем детальные строки в группу
лкНовД = лкНовГ.Строки.Добавить();
ЗаполнитьЗначенияСвойств(лкНовД, лкРез, лкПоляСтрок);
КонецЦикла;
Показатьпо количеству нужных уровней группировки и формируйте дерево.
(2)
так вы имеете ввиду?
//ТЗРасход необходимо делать для каждого уровня группировки, в ней будет всего 2 колонки:
//Группа1, Группа2, для следующей - Группа2, Группа3 и т.д.
//Группа1, Группа2, для следующей - Группа2, Группа3 и т.д.
Процедура ЗаполнитьДЗнаСервереРасход()
лкДЗ = РеквизитФормыВЗначение("дзРасход");
лкДЗ.Строки.Очистить(); // Очищаем дерево значений
// Поля для уровней группировки
лкПоляГруппы = Новый Массив;
лкПоляГруппы.Добавить(Новый Массив("Группа1", "Группа2"));
лкПоляГруппы.Добавить(Новый Массив("Группа2", "Группа3"));
лкПоляГруппы.Добавить(Новый Массив("Группа3", "Группа4"));
// Начинаем обработку с верхнего уровня группировки
ОбработатьУровеньГруппировки(лкДЗ, тзХаражат, лкПоляГруппы, 0);
// Устанавливаем данные обратно в реквизит формы
ЗначениеВРеквизитФормы(лкДЗ, "дзРасход");
КонецПроцедуры
Процедура ОбработатьУровеньГруппировки(лкДЗ, тзИсходная, лкПоляГруппы, Уровень)
Если Уровень >= лкПоляГруппы.Количество() Тогда
Возврат;
КонецЕсли;
// Получаем текущие поля группировки
лкТекущиеПоля = лкПоляГруппы[Уровень];
лкТЗ = тзИсходная.Выгрузить(, СписокЗначений(лкТекущиеПоля));
лкТЗ.Свернуть(, СписокЗначений(лкТекущиеПоля));
лкТЗ.Сортировать(лкТекущиеПоля[0]);
// Перебираем сгруппированные данные
Для каждого лкГрп Из лкТЗ Цикл
лкНовГруппа = лкДЗ.Строки.Добавить();
ЗаполнитьЗначенияСвойств(лкНовГруппа, лкГрп, СписокЗначений(лкТекущиеПоля));
// Для текущей группы выбираем строки детализированной таблицы
лкОтбор = Новый Структура;
Для каждого лкПоле Из лкТекущиеПоля Цикл
лкОтбор.Вставить(лкПоле, лкГрп[лкПоле]);
КонецЦикла;
лкСтроки = тзИсходная.НайтиСтроки(лкОтбор);
// Обрабатываем вложенный уровень
ОбработатьУровеньГруппировки(лкНовГруппа, лкСтроки, лкПоляГруппы, Уровень + 1);
КонецЦикла;
КонецПроцедуры
Функция СписокЗначений(МассивПолей)
Возврат СтрСоединить(МассивПолей, ",");
КонецФункции
Показатьтак вы имеете ввиду?
Такие вещи делаются прямо бесхитростно
Для Каждого Строка Из ТЗ
СтрокДерева1 = Дерево.Строки.Найти(Строка.Группа1, "Группа1", Ложь);
Если СтркоаДерева1 = Неопределено Тогда
СтрокаДерева1 = Дерево.Строки.Добавить().Группа1 = Строка.Группа1;
КонецЕсли;
СтрокаДерева2 = СтрокаДерева1.Строки.Найти(Строка.Группа2, "Группа2", Ложь);
Если СтрокаДерева2 = Неопределено Тогда
ну и так далее сколько там уровней есть.
Можно это все автоматизировать до пары небольших процедур, но если количество уровней известно и меняется редко, проще и быстрее налепить таких блоков нужное количество
КонецЦикла;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот