gifts2017

Управляемая форма 1С 8.2 (8.3) – работа с деревом значений и таблицей значений. Часть I (Основы)

Опубликовал Дмитрий К (ll13) в раздел Программирование - Практика программирования

Как известно, в платформе 1С 8.1 не составляло никакого труда связать дерево значений с табличным полем на форме, единственное, что при этом нужно было не забыть, так это СоздатьКолонки(). В управляемом приложении 1С 8.2 (8.3) сделать это не так просто, как кажется на первый взгляд. В данной статье речь пойдет о программном создании дерева значений (таблицы значений) на управляемой форме в управляемом приложении 1С

В данной статье речь пойдет о программном создании дерева значений (таблицы значений) на управляемой форме в управляемом приложении 1С 8.2. Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все то же самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в платформе 1С 8.1 не составляло никакого труда связать дерево значений с табличным полем на форме, единственное что при этом нужно было не забыть, так это СоздатьКолонки(). В управляемом приложении 1С 8.2 сделать это не так просто, как кажется на первый взгляд.

Обращаю внимание, что ДеревоЗначений доступно только на сервере, в толстом клиенте и внешнем соединение. В данных самой управляемой формы для моделирования дерева используется тип ДанныеФормыДерево. Для преобразования ДеревоЗначений <-> ДанныеФормыДерево используются методы управляемой формы ЗначениеВРеквизитФормы() и РеквизитФормыВЗначение(). Для непосредственного отображения дерева используется элемент формы типа ТаблицаФормы, связанный через реквизит ПутьКДанным с реквизитом формы типа ДанныеФормыДерево. Если Вам не очень понятна вышеописанная связь объектов, не огорчайтесь, ниже рассмотрим практический пример, и все встанет на свои места.

Задача: Имеется дерево значений, необходимо отобразить его на управляемой форме.

Создаем новую внешнюю обработку, добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно. 

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Создание и заполнение "обычного" объекта прикладного типа ДеревоЗначений,
    // который будет отображен на управляемой форме
    ДеревоОбъект = Новый ДеревоЗначений;
    ДеревоОбъект.Колонки.Добавить("Узел", Новый ОписаниеТипов("Строка"));
    Для к1 = 1 По 3 Цикл
        СтрокаУ1 = ДеревоОбъект.Строки.Добавить();
        СтрокаУ1.Узел = "Узел"+к1;
        Для к2 = 1 По 3 Цикл
            СтрокаУ2 = СтрокаУ1.Строки.Добавить();
            СтрокаУ2.Узел = СтрокаУ1.Узел+к2;
            Для к3 = 1 По 3 Цикл
                СтрокаУ3 = СтрокаУ2.Строки.Добавить();
                СтрокаУ3.Узел = СтрокаУ2.Узел+к3;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;

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

    // Преобразование объекта прикладного типа ДеревоЗначений
    // в реквизит управляемой формы (данные формы)
    ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево");

    // Создание элемента формы типа ТаблицаФормы для отображения дерева
    ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
    ЭлементДерево.ПутьКДанным = "Дерево";
    ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;

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

КонецПроцедуры

http://www.obrabotki.com/1s-tree-table-managedforms-1/

Скачать файлы

Наименование Файл Версия Размер
Пример к статье 15
.rar 3,27Kb
24.06.15
15
.rar 3,27Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Иван Титов (Ibrogim) 15.05.15 07:36
Вы из ВДГБ ?

А по сабжу, можно было ещё написать про:
1) Добавление событий (например реализацию расшифровки)
2) Создание групп полей на форме, флажков и т.п.
3) Управление командной панелью дерева
4) Создание дерева не при создании формы, а по кнопке (необходимо позаботиться об предварительном удалении уже созданного дерева)
5) Кнопки открытия,выбора,гиперссылки в ячейках дерева

Хотя в общем, основы есть основы )
Светлый ум; +1 Ответить 1
2. Дмитрий К (ll13) 15.05.15 10:35
(1) Ibrogim,
Нет, я не не из ВДГБ. Они украли мои статьи.
sheffchik; Ibrogim; +2 Ответить 1
3. Иван Титов (Ibrogim) 15.05.15 10:58
(2) ll13, Ну тогда вам респект, а им позор
4. Яков Коган (Yashazz) 18.05.15 17:08
И вот это называется "статья"? и за этот, пардон, ошмёток, кто-то даже плюсит? Мда-а-а, грустна судьба Инфостарта...
5. Константин Куликов (Светлый ум) 31.08.15 12:36
1. Удаление

&НаКлиенте
Процедура УдалитьИзделие(Команда)
	
	УдалитьСтрокиДерева();
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьСтрокиДерева();
	
	Если Элементы.Арматура.ТекущиеДанные=Неопределено Тогда
		Возврат;
	КонецЕсли;
	ЭлементыТекущегоУровняИерархии=?(Элементы.Арматура.ТекущиеДанные.ПолучитьРодителя()=Неопределено, 
	ДеревоАрматурыСЗакладными.ПолучитьЭлементы(), Элементы.Арматура.ТекущиеДанные.ПолучитьРодителя().ПолучитьЭлементы());
	ТекИндекс=0;
	Пока ЭлементыТекущегоУровняИерархии[ТекИндекс]<>Элементы.Арматура.ТекущиеДанные Цикл
		ТекИндекс=ТекИндекс+1;
	КонецЦикла;
	ЭлементыТекущегоУровняИерархии.Удалить(ТекИндекс);
	
КонецПроцедуры
...Показать Скрыть


2. Свернуть / Развернуть

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

&НаКлиенте
Процедура СвернутьДеревоАрматуры()
	
	КоллекцияЭлементовДерева = ДеревоАрматурыСЗакладными.ПолучитьЭлементы();
	Для Каждого Строка Из КоллекцияЭлементовДерева Цикл    
		ИдентификаторСтроки = Строка.ПолучитьИдентификатор();
		Элементы.Арматура.Свернуть(ИдентификаторСтроки);
	КонецЦикла; 		
	
КонецПроцедуры
...Показать Скрыть
sheffchik; Ogonek_ir@; Hamsik; +3 Ответить
6. Константин Куликов (Светлый ум) 31.08.15 12:43
Свертка дерева по определенному уровню
http://infostart.ru/public/262126/