Общая информация
Дерево значений представляет собой модификацию таблицы значений. Отличие в том, что каждая строка имеет свойство "Строки", которые являются дочерними строками к текущей строке.
У дерева значений есть колонки, в которых располагаются данные. Чтобы данные располагались в виде дерева с разными типами данных, я делал тип столбцов составным: например надо отобразить список абонентов и установленного у них оборудования. Если сделать разными столбцами абонентов и оборудование, то получится не очень красиво: оборудование будет сильно смещено по отношению к абоненту и в ячейке с абонентом будет пустое значение. Чтобы оборудование отображалось сразу под абонентом, я сделал составной тип "Абонент" + "Оборудование" у столбца "Абонент", и при заполнении дерева значений все записывал в этот столбец.
Примеры кода для управляемых форм:
Создать дерево значений на форме:
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
НовыйРеквизит = Новый РеквизитФормы("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
|