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

Публикация № 356288

Программирование - Практика программирования

1с 8.2 1с 8.3 Дерево значений Таблица значений Управляемые формы

59
Как известно, в платформе 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/

59

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

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

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Ibrogim 1087 15.05.15 07:36 Сейчас в теме
Вы из ВДГБ ?

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

Хотя в общем, основы есть основы )
гыук320; jmi; rozhkovdmitriy; Светлый ум; +4 Ответить
2. ll13 1015 15.05.15 10:35 Сейчас в теме
(1) Ibrogim,
Нет, я не не из ВДГБ. Они украли мои статьи.
purgin; Ibrogim; +2 Ответить
3. Ibrogim 1087 15.05.15 10:58 Сейчас в теме
(2) Ну тогда вам респект, а им позор
Y_U_S; tdml; +2 Ответить
4. Yashazz 2384 18.05.15 17:08 Сейчас в теме
И вот это называется "статья"? и за этот, пардон, ошмёток, кто-то даже плюсит? Мда-а-а, грустна судьба Инфостарта...
Night_ost; alest; +2 1 Ответить
10. Y_U_S 18 13.07.18 00:34 Сейчас в теме
(4) Ошмёток-НеОшмёток, а мне помогло, когда впервые столкнулся с необходимостью использовать ДеревоЗначений на форме.
Всё изложено кратко и по сути — без воды.
По моему вопросу, так и листинг кода излишен — всё есть в Синтаксис-помощнике.
5. Светлый ум 226 31.08.15 12:36 Сейчас в теме
1. Удаление

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

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


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

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

&НаКлиенте
Процедура СвернутьДеревоАрматуры()
	
	КоллекцияЭлементовДерева = ДеревоАрматурыСЗакладными.ПолучитьЭлементы();
	Для Каждого Строка Из КоллекцияЭлементовДерева Цикл    
		ИдентификаторСтроки = Строка.ПолучитьИдентификатор();
		Элементы.Арматура.Свернуть(ИдентификаторСтроки);
	КонецЦикла; 		
	
КонецПроцедуры
Показать
r.zdorkin; purgin; Ogonek_ir@; Hamsik; +4 Ответить
6. Светлый ум 226 31.08.15 12:43 Сейчас в теме
Свертка дерева по определенному уровню
http://infostart.ru/public/262126/
7. user809597 07.08.17 14:27 Сейчас в теме
А почему у меня ругается, что неуникальное имя реквизита "Дерево" ?..
8. user809597 07.08.17 15:11 Сейчас в теме
Причём сначала всё работало, а сейчас даже когда предыдущие версии подгружаю, то выдаёт предупреждение (внешний отчёт)
9. Xander0206 09.10.17 21:09 Сейчас в теме
При программном Разворачивании/Сворачивании дерева вызываются обработчики событий дерева ПередРазворачиванием/ПередСворачиванием. Как от этого избавится?
11. olezhe 20 08.04.19 02:24 Сейчас в теме
Оставьте свое сообщение