Приветствую Вас ГостьЧетверг, 16.01.2025, 03:59

Каталог статей


Работа с деревом значений

Общая информация

Дерево значений представляет собой модификацию таблицы значений. Отличие в том, что каждая строка имеет свойство "Строки", которые являются дочерними строками к текущей строке.

У дерева значений есть колонки, в которых располагаются данные. Чтобы данные располагались в виде дерева с разными типами данных, я делал тип столбцов составным: например надо отобразить список абонентов и установленного у них оборудования. Если сделать разными столбцами абонентов и оборудование, то получится не очень красиво: оборудование будет сильно смещено по отношению к абоненту и в ячейке с абонентом будет пустое значение. Чтобы оборудование отображалось сразу под абонентом, я сделал составной тип "Абонент" + "Оборудование" у столбца "Абонент", и при заполнении дерева значений все записывал в этот столбец. 

Примеры кода для управляемых форм:

Создать дерево значений на форме:

    ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
    НовыйРеквизит = Новый РеквизитФормы("Call_ИсторияВзаимодействия",Новый ОписаниеТипов("ДеревоЗначений")); 
    НовыйРеквизит.Заголовок = "История взаимодействия";    
    ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);     
    
    МассивТипов = Новый Массив();
    МассивТипов.Добавить(Тип("ДокументСсылка.Анкета1"));
    МассивТипов.Добавить(Тип("ДокументСсылка.Анкета2"));
    МассивТипов.Добавить(Тип("ДокументСсылка.ОпросКлиента"));
    МассивТипов.Добавить(Тип("ДокументСсылка.КарточкаТелефонногоЗвонка"));
    МассивТипов.Добавить(Тип("Строка"));
    ОписаниеТипыДокументов = Новый ОписаниеТипов(МассивТипов);
    
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Call_Документ",        ОписаниеТипыДокументов,"Call_ИсторияВзаимодействия"));    
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Call_СтатусДокумента",Новый ОписаниеТипов("Строка"),"Call_ИсторияВзаимодействия"));    
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Call_Комментарий",    Новый ОписаниеТипов("Строка"),"Call_ИсторияВзаимодействия"));
    
    ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); 
    
    НовыйЭлементДерево = ЭтаФорма.Элементы.Добавить("Call_ИсторияВзаимодействия", Тип("ТаблицаФормы"),НоваяСтраница);
    НовыйЭлементДерево.ПутьКДанным =  "Call_ИсторияВзаимодействия";
    НовыйЭлементДерево.Заголовок = "История взаимодействия";
    НовыйЭлементДерево.ПоложениеКоманднойПанели=ПоложениеКоманднойПанелиЭлементаФормы.Нет;
    НовыйЭлементДерево.ПоложениеЗаголовка=ПоложениеЗаголовкаЭлементаФормы.Верх;
    
    НовыйЭлементКолонка = ЭтаФорма.Элементы.Добавить("Call_Документ", Тип("ПолеФормы"),НовыйЭлементДерево);
    НовыйЭлементКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлементКолонка.Заголовок = "Документ";
    НовыйЭлементКолонка.ПутьКДанным = "Call_ИсторияВзаимодействия.Call_Документ";
    НовыйЭлементКолонка.КнопкаВыбора=Ложь;
    
    НовыйЭлементКолонка = ЭтаФорма.Элементы.Добавить("Call_СтатусДокумента", Тип("ПолеФормы"),НовыйЭлементДерево);
    НовыйЭлементКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлементКолонка.Заголовок = "Статус документа";
    НовыйЭлементКолонка.ПутьКДанным = "Call_ИсторияВзаимодействия.Call_СтатусДокумента";
    
    НовыйЭлементКолонка = ЭтаФорма.Элементы.Добавить("Call_Комментарий", Тип("ПолеФормы"),НовыйЭлементДерево);
    НовыйЭлементКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлементКолонка.Заголовок = "Комментарий";
    НовыйЭлементКолонка.ПутьКДанным = "Call_ИсторияВзаимодействия.Call_Комментарий";
 

Заполнить дерево значений:

    Результат = Новый ДеревоЗначений();    
    Результат.Колонки.Добавить("Call_Документ");
    Результат.Колонки.Добавить("Call_СтатусДокумента");
    Результат.Колонки.Добавить("Call_Комментарий");
    
    ТЗ = ПолучитьИсториюВзаимодействияСАбонентом(Абонент, УИДАбонента, МассивТиповДокументов);
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ВЫРАЗИТЬ(втТЗ.ТипДокумента КАК СТРОКА(200)) КАК ТипДокумента,
        |    втТЗ.Документ КАК Документ,
        |    втТЗ.СтатусДокумента КАК СтатусДокумента,
        |    втТЗ.КомментарийЗаголовок КАК КомментарийЗаголовок,
        |    втТЗ.КомментарийЗначение КАК КомментарийЗначение,
        |    втТЗ.Дата КАК Дата,
        |    втТЗ.ДопИнформация КАК ДопИнформация
        |ПОМЕСТИТЬ втТЗ
        |ИЗ
        |    &втТЗ КАК втТЗ
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    втТЗ.ТипДокумента КАК ТипДокумента,
        |    втТЗ.Документ КАК Документ,
        |    втТЗ.СтатусДокумента КАК СтатусДокумента,
        |    втТЗ.КомментарийЗаголовок КАК КомментарийЗаголовок,
        |    втТЗ.КомментарийЗначение КАК КомментарийЗначение,
        |    втТЗ.Дата КАК Дата,
        |    втТЗ.ДопИнформация КАК ДопИнформация
        |ИЗ
        |    втТЗ КАК втТЗ
        |ИТОГИ ПО
        |    ТипДокумента";
    
    Запрос.УстановитьПараметр("втТЗ", ТЗ);
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаТипДокумента = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Пока ВыборкаТипДокумента.Следующий() Цикл
        ТипДок = Результат.Строки.Добавить();
        ТипДок.Call_Документ = ВыборкаТипДокумента.ТипДокумента;
    
        ВыборкаДетальныеЗаписи = ВыборкаТипДокумента.Выбрать();
    
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            НовСтрока = ТипДок.Строки.Добавить();
            НовСтрока.Call_Документ = ВыборкаДетальныеЗаписи.Документ;
            НовСтрока.Call_СтатусДокумента = ВыборкаДетальныеЗаписи.СтатусДокумента;
            НовСтрока.Call_Комментарий = ВыборкаДетальныеЗаписи.КомментарийЗаголовок + ": " + ВыборкаДетальныеЗаписи.КомментарийЗначение;
            Если ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.ДопИнформация) Тогда 
                НовСтрока.Call_Комментарий = НовСтрока.Call_Комментарий + " (" + ВыборкаДетальныеЗаписи.ДопИнформация + ")";
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;

Можно заполнить дерево значений  выгрузкой из запроса с группировкой:

    Выгрузка = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); 
    тДерево = Выгрузка;
    ЗначениеВРеквизитФормы(тДерево, "Дерево");

Если дерево создано реквизитом на форме, то перед его заполнением его надо перенести в реквизит:

   ДеревоАбонентыИОборудование = РеквизитФормыВЗначение("АбонентыИРаботы");

   ...

   ЗначениеВРеквизитФормы(ДеревоАбонентыИОборудование,"АбонентыИРаботы");
 

Развернуть все строки дерева: (выполняется на клиенте)

&НаКлиенте
Процедура РазвернутьВсе()
    тЭлементы = АбонентыИРаботы.ПолучитьЭлементы();
    Для Каждого тСтр Из тЭлементы Цикл
        Элементы.АбонентыИРаботы.Развернуть(тСтр.ПолучитьИдентификатор(), Истина);
    КонецЦикла;
КонецПроцедуры

Свернуть все строки до 1 уровня:

&НаКлиенте
Процедура СвернутьВсе()
    тЭлементы = АбонентыИРаботы.ПолучитьЭлементы();
    Для Каждого тСтр Из тЭлементы Цикл
        Элементы.АбонентыИРаботы.Свернуть(тСтр.ПолучитьИдентификатор());
    КонецЦикла;
КонецПроцедуры

Дополнительно:

Дополнительно можно почитать здесь: https://1c-programmer-blog.ru/programmirovanie/rabota-s-derevom-znachenij-v-1s.html

Категория: Формы | Добавил: leshic (04.08.2021)
Просмотров: 455 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [50]
Регистры [7]
Формы [47]
Администрирование [41]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [41]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0