Работа с деревом значений в УФ отличаеться от работы с деревом в ОП
Дерево значений представляет структуру с иерархией. У каждой строки дерева значений может быть сколько угодно подчиненных строк. Верхняя строка уровня это Родитель.
Перед тем как использовать этот объект стоит обратить внимание на один нюанс. Даный объект вместе со своей структурой не сохраняется в БД .
Создание
Добавляем на форму новый реквезит с указанием типа и нужных колонок
Заполнение
Заполнить дерево можно
- Вручную , если вы оставили командный интерфейс то через кнопку добавить
- Программно запросом. В запросе обезательно должны быть итоги и ОбходРезультатаЗапроса ПоГруппировкам или ПоГруппировкамСИерархией
- Программно кодом
ДанныеФормыВЗначение
ЗначениеВДанныеФормы
пример запроса
&НаСервере Процедура ЗаполнитьИзЗапрос() тДерево = РеквизитФормыВЗначение("Дерево"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Тест.Колонка1 КАК Колонка1, | Тест.Колонка2 КАК Колонка2 |ИЗ | Справочник.Тест КАК Тест
| Итоги по Колонка1 "; Выгрузка = Запрос.Выполнить(). Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); тДерево = Выгрузка; ЗначениеВРеквизитФормы(тДерево, "Дерево"); КонецПроцедуры
пример заполнения в цикле
_ДеревоЗн = ДанныеФормыВЗначение(ДеревоЗн, Тип("ДеревоЗначений")); Пока ВыборкаМенеджер.Следующий() Цикл НовСтрокаМенеджер = _ДеревоЗн.Строки.Добавить(); НовСтрокаМенеджер.МенеджерКонтрагент= ВыборкаМенеджер.Менеджер; ВыборкаКонтрагент=ВыборкаМенеджер.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаКонтрагент.следующий() Цикл НовСтрокаКонтрагент=НовСтрокаМенеджер.Строки.добавить(); НовСтрокаКонтрагент.МенеджерКонтрагент=ВыборкаКонтрагент.Контрагент; КонецЦикла; КонецЦикла; ЗначениеВДанныеФормы(_ДеревоЗн, ДеревоЗн);Обход
Делаеться с помощь рекрусии
&НаСервере Процедура ОбходНаСервере() тДерево = РеквизитФормыВЗначение("Дерево"); ОбходДерева(тДерево); КонецПроцедуры &НаСервере Процедура ОбходДерева(Дерево) Для Каждого тСтр Из Дерево.Строки Цикл Сообщить(тСтр.Колонка1+", "+тСтр.Колонка2); Если тСтр.Строки.Количество()>0 Тогда ОбходДерева(тСтр); КонецЕсли; КонецЦикла; КонецПроцедуры
Интеркативный расчет по родителю
&НаКлиенте Процедура ДеревоЗнПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ) СчитатьСуммыДЗ(); КонецПроцедуры &НаСервере Процедура СчитатьСуммыДЗ() ДеревоЗнач = РеквизитФормыВЗначение("ДеревоЗн"); ОбходДереваДетально(ДеревоЗнач); КонецПроцедуры &НаСервере Процедура ОбходДереваДетально(ПереданноеДер) Для Каждого СтрПолученногоДерева Из ПереданноеДер.Строки Цикл Если СтрПолученногоДерева.Строки.Количество() = 0 Тогда продолжить; КонецЕсли; СтрПолученногоДерева.СуммаПремии= СтрПолученногоДерева.Строки.Итог("СуммаПремии"); КонецЦикла; ЗначениеВРеквизитФормы(ПереданноеДер, "ДеревоЗн"); КонецПроцедуры
Сохрание
Как уже писалось выше что бы сохранить Дерево надо проделать рад манипуляци.
1.Создать ТЧ куда будем записывать данные из дерева и от куда мы их потом будем считывать.
В инете есть несклоько решений данной пролемы, но идея с использыванием ГУИДа мне кажется самой красивой. (Искать по ключевым словам Дерево значений в Таблицу значений и наоборот)
&НаСервере
ПреобразоватьВТЗРекурсия(_ДеревоЗн, объект.менеджеры, Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"));
далее
&НаСервере Процедура ПреобразоватьВТЗРекурсия(тДерево, тТаблица, ГУИД) Для Каждого тСтр Из тДерево.Строки Цикл нСтр = тТаблица.Добавить(); нСтр.Контрагент = тСтр.МенеджерКонтрагент; нСтр.процент = тСтр.процент; нСтр.СуммаПремии = тСтр.СуммаПремии; нСтр.СуммаРеализации = тСтр.СуммаДокумента; нСтр.Родитель = ГУИД; нСтр.ГУИД = Новый УникальныйИдентификатор(); Если тСтр.Строки.Количество()>0 Тогда ПреобразоватьВТЗРекурсия(тСтр, тТаблица, нСтр.ГУИД); КонецЕсли; КонецЦикла; КонецПроцедуры
далее при открытии нашей формы считываем данные из ТЧ
&НаКлиенте Процедура ПриОткрытии(Отказ) ПолучитьДаныеНаСервер() ; КонецПроцедуры &НаСервере Процедура ПолучитьДаныеНаСервер() тДерево = РеквизитФормыВЗначение("ДеревоЗн"); ПреобразоватьВДЗРекурсия(тДерево, объект.менеджеры, Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); ЗначениеВРеквизитФормы(тДерево, "ДеревоЗн"); КонецПроцедуры Процедура ПреобразоватьВДЗРекурсия(тДерево, тТаблица, ГУИД) тПоиск = Новый Структура("Родитель", ГУИД); тМассив = тТаблица.НайтиСтроки(тПоиск); Для Каждого тСтр Из тМассив Цикл нСтр = тДерево.Строки.Добавить(); нСтр.МенеджерКонтрагент =тСтр.Контрагент; нСтр.процент = тСтр.процент; нСтр.СуммаПремии = тСтр.СуммаПремии; нСтр.СуммаДокумента = тСтр.СуммаРеализации; ПреобразоватьВДЗРекурсия(нСтр, тТаблица, тСтр.ГУИД); КонецЦикла; КонецПроцедуры
Вот так не хитро все это работает, обработка для УТ 11.Добавляем и преврашаем в документ
Комментариев нет:
Отправить комментарий