Дерево значений, интерактивное добавление колонок и заполнение строк - суммируются записи на форме

1. G_102611413924299440881 24.01.23 11:15 Сейчас в теме
Коллеги, всем доброго времени суток!

По возможности помогите пожалуйста в следующем вопросе - есть задача, в которой необходимо в зависимости от полученных данных из запроса динамически формировать дерево значений (функционал отбора по необходимым условиям у сотрудников). В зависимости от выбранных параметров, у дерева должны формироваться колонки по этим самым параметрам, тогда как три колонки остаются неизменны - НомерСтроки, ФИО и Должность (Эти реквизиты добавлены на форме в дерево вручную, как и само дерево собственно).

По данной задаче написал некий код, часть из которого отвечает за динамическое формирование тех самых параметризуемых колонок дерева:
(сам нахожусь пока что на ступени стажёра, поэтому если что сильно камнями не закидывайте, пожалуйста :) )


&НаСервере
Процедура ЗаполнитьДеревоСотрудников()

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

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


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



- единоразово работа данного алгоритма на форме отображается корректно, колонки формируются динамически (пока только для одной дополнительной колонки реализовал), но при повторном отборе с другим параметром строки добавляются к ранее выведенным строкам на форме (Прикрепленное изображение), тоесть дерево по каким-то причинам не очищается. ЧЯДНТ? Заранее большое спасибо
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
2. G_102611413924299440881 24.01.23 11:36 Сейчас в теме
Мда, только после публикации здесь обнаружил, что очищаю я не то дерево на форме 😂 Вопрос решён, всем большое спасибо!)
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. G_102611413924299440881 24.01.23 11:36 Сейчас в теме
Мда, только после публикации здесь обнаружил, что очищаю я не то дерево на форме 😂 Вопрос решён, всем большое спасибо!)
Прикрепленные файлы:
Оставьте свое сообщение

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