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

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 Сейчас в теме
Мда, только после публикации здесь обнаружил, что очищаю я не то дерево на форме 😂 Вопрос решён, всем большое спасибо!)
Прикрепленные файлы:
Оставьте свое сообщение
Вакансии
Разработчик 1С:ERP WE
Москва
зарплата от 250 000 руб.
Полный день

Аналитик 1С:ЗУП
Москва
зарплата от 150 000 руб.
Полный день

Ведущий разработчик 1С
Москва
зарплата от 200 000 руб.
Полный день

Программист 1С
Москва
зарплата от 130 000 руб. до 170 000 руб.
Полный день

Аналитик 1С: ERP (оперконтур)
Москва
зарплата от 180 000 руб. до 250 000 руб.
Полный день