Имя: Пароль:
1C
1С v8
СКД 8.2: программный вывод в дерево значений на форме
0 kabanoff
 
27.04.10
11:00
Есть задача вывести результат компоновки в дерево значений и отобразить его в управляемой форме на клиенте. С выводом в дерево проблем нет, а вот отобразить дерево в управляемой форме никак не получается:
1) Если создаю реквизит обработки, то в форме таб.часть не появляется.
2) Если создаю реквизит формы, то для того, чтобы появилась таб.часть, нужно интерактивно навешать колонки.

Интерактивно создавать колонки нет желания, т.к. в схему компоновки планирую передавать различные наборы данных и на выходе получать различные комбинации полей.

В 8.1 создать дерево можно было двумя способами:
1) Создать элемент управления на форме и связать его с данными типа "ДеревоЗначений". Вывод осуществить с помощью метода СоздатьКолонки().
2) Создать элемент управления типа ДеревоЗначений, добавить интерактивно колонки и далее заполнить через ЭлементыФормы.

Здесь бьюсь ап стену, пытаясь пойти по №1. Метод СоздатьКолонки() в контексте Элементов не нашел.

Коллеги, подскажите, как правильно создать и заполнить дерево значений, чтобы работать с ним как на сервере, так и на клиенте в управляемой форме?
1 kabanoff
 
27.04.10
11:52
вверх
2 kabanoff
 
27.04.10
12:25
кто-нибудь может знает?
3 WayLander
 
27.04.10
13:51
По поводу дерева могу только посоветовать посмотреть в конфигурации УНФ. Там есть ничегошные примеры построения дерева.
Ну, и как я уяснил, многое приходится делать программно. То есть можно и колонки, если что, навесить программно.
4 Mort
 
27.04.10
14:02
(2) ИзменитьРеквизиты ищи в СП.

Кратко - нужно создать (программно !) реквизит формы вида коллекция-дерево, и создать элементы привязанные к этому реквизиту.
5 kabanoff
 
27.04.10
14:03
(3)(4) Попробую, спасибо.
6 kabanoff
 
27.04.10
14:29
тов. Defender aka LINN помог разобраться. Вот рабочий кусок кода вывода ДереваДанных в управляемой форме с динамически создаваемыми колонками:

 МассивРеквизитов = Новый Массив;

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


Эта 8.2 просто взрыв мозга! %/ В вышеприведенном куске еще нужно сделать удаление уже существующих колонок.
7 kabanoff
 
27.04.10
15:24
Выкладываю рабочий код с удалением реквизитов формы, если кто-то вдруг решит наткнуться на те же грабли.

&НаСервере
Процедура ОбновитьДеревоНаФорме(Знач ДеревоДанных)
   МассивДобавляемыхРеквизитов = Новый Массив;
   МассивУдаляемыхРеквизитов = Новый Массив;

   Для Каждого Колонка Из ДеревоДанных.Колонки Цикл
   МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ДеревоРезультата"));
       
   Если ЭтаФорма.Элементы.Найти("Дерево_" + Колонка.Имя) <> Неопределено Тогда
           МассивУдаляемыхРеквизитов.Добавить("ДеревоРезультата." + Колонка.Имя);
   КонецЕсли;
   КонецЦикла;
   
   ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивУдаляемыхРеквизитов);
   
   ЗначениеВРеквизитФормы(ДеревоДанных,"ДеревоРезультата");
   
   ЭлементФормы = Элементы.Найти("Дерево");
   Если ЭлементФормы <> Неопределено Тогда
       Элементы.Удалить(ЭлементФормы);
   КонецЕсли;
   
   ЭлементДерево = Элементы.Добавить("Дерево",Тип("ТаблицаФормы"));
   ЭлементДерево.ПутьКДанным = "ДеревоРезультата";
   ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;
   
   Для Каждого Колонка Из ДеревоДанных.Колонки Цикл
       НовыйЭлемент = Элементы.Добавить("Дерево_" + Колонка.Имя, Тип("ПолеФормы"), ЭлементДерево);
   НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
   НовыйЭлемент.ПутьКДанным = "ДеревоРезультата." + Колонка.Имя;
   КонецЦикла;
КонецПроцедуры
8 bashta_aleksey
 
27.04.10
15:54
закладка ))
автору спасибо
9 Aswed
 
29.04.10
18:18
Автор спасибо, столкнулся именно с такой же гадостью.
10 Студиозус
 
30.04.10
11:58
А у меня что то не работает.
Пишет не уникальное имя колонки:(

Или на форме надо создать два дерева значений?
11 Студиозус
 
30.04.10
12:03
Я создал на форме дерево значений с названием как в куске кода. Добавил в него одну колонку "Телефон". еперь при попытке вывести выводит сообщение Не уникальное имя колонки, и ругается на строчку

ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивУдаляемыхРеквизитов);
12 kabanoff
 
30.04.10
12:15
(10) На форме не надо ничего создавать. Достаточно добавить один реквизит формы "ДеревоРезультата" (тип "ДеревоЗначений").
Вот ссылка на мою форму: http://i047.radikal.ru/1004/a4/b2816404e54a.png

В режиме Предприятия (толстого/тонкого/web-клиента) дерево само появится на форме.
13 Студиозус
 
30.04.10
12:20
(12) Понял, спасибо. Пытался просто выводить пустое дерево, вот из-за этого и ругался видимо.
14 Студиозус
 
30.04.10
15:00
А как ты в выводим дереве значений убирал заголовок колонки?
И меню управления списком значений?