Управляемая форма 1С 8.2 — работа с деревом значений и таблицей значений. Часть I (Основы)
В данной статье речь пойдет о программном создании дерева значений (таблицы значений) на управляемой форме в управляемом приложении 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;
КонецЦикла;
КонецЦикла;
КонецЦикла;
// Создание Реквизита формы типа ДанныеФормыДерево
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Дерево",
Новый ОписаниеТипов("ДеревоЗначений")));
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
МассивДобавляемыхРеквизитов.Добавить(
Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево"));
КонецЦикла;
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// Преобразование объекта прикладного типа ДеревоЗначений
// в реквизит управляемой формы (данные формы)
ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево");
// Создание элемента формы типа ТаблицаФормы для отображения дерева
ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
ЭлементДерево.ПутьКДанным = "Дерево";
ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"),
ЭлементДерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя;
КонецЦикла;
КонецПроцедуры
Если публикация помогла Вам справится с проблемой, решить задачу или расширить свои знания - поддержите автора.
Комментарии:
Чтобы оставить комментарий, Вы должны войти в систему.
Бился полдня над динамическим созданием колонок — сдался. Вероятно, при создании формы можно поступить указанным в статье способом, а вот «на горячую», когда форма уже открыта, у меня не получилось.
Никакой разницы нет, колонки прекрасно создаются и при уже открытой форме. Обратите внимание, что данный пример предназначен для управляемых форм 8.2
Спасибо большое, в очень запутанной задаче помогли разобраться.
Спасибо за подсказку
Пользуйтесь на здоровье.
Очень полезно! Спасибо.
Красавчег! спасибо помог )
Огромное спасибо! Реально очень полезная штука :). Помогло.
Спасибо за примеры!
А как потом в коде обращаться к «рукотворному» дереву (реквизиту формы)?
У меня получается только примерно так:
» ДеревоКопия = РеквизитФормыВЗначение(«Дерево»);
ДеревоДобавитьСтроки(ДеревоКопия, Д);
ЗначениеВРеквизитФормы(ДеревоКопия, «Дерево»);
«
В зависимости от того что Вы хотите с этим деревом сделать.
Если нужен объект-дерево, то так как вы написали.
Многие манипуляции можно осуществить непосредственно на клиенте, не преобразовывая реквизит ДанныеФормыДерево в дерево-объект.
Почитайте следующую статью там полно примеров работы с этой коллекцией (ДанныеФормыДерево), там добавление и удаление элементов и т.д.
В примерах фигурирует «элемент формы ТЗОбъект «.
Предполагается, что он доступен в процессе кодирования.
А если он создается программно, как к нему обращаться?
[«ТЗОбъект»] не получится…
Тоже выскажу огромную благодарность за примеры! Возникла трудность. На форме есть две существующие таблицы формы. Данные в них берутся из существующих реквизитов объекта (ТаблицыЗначений, причём колонки ТЗ’s создаются программно «ЗначениеВРеквизитФормы»). ПриАктивизации строки верхней таблицы активизирую строку нижней таблицы и наоборот (они логически связаны по полю номенклатура). Строка в нижней таблице активизирется без проблем, а вот в верхней устанавливается значение неопределено (причём в самой процедуре установки тоже ТекущаяСтрока не устанавливаеся, устанавливается почему-то только в серверном методе). Может быть спасёте новичка дельным советом? )
Большое спасибо за статьи.
Мне как новичку интересно, как же все таки не программно добавить на форму таблицу и потом по нажатию кнопки добавлять записи в дерево?
Дело в том, что моя форма неактивна и я не знаю как разместить на ней элементы управления…
Спасибо за хорошую публикацию!!! Очень помогли!!!
Спасибо Анечка, пользуйтесь на здоровье.
Спасибо! Не получалось выгрузить результат запроса в дерво на форме.
Большое спасибо. Очень хорошая и полезная статья.
охеренная статья, такая же на сайте франчи есть. Но тут ее можно скачать за деньги. да и еще это офигенный типовой пример.
Что про все это слышал, но сам руками не делал, когда пытался — все было как то коряво.. Здесь все на отлично. Пять баллов
Спасибо! Статья ответила на несколько вопросов.
Просто спасли! Спасибо автору!
Интересная и нужная статья. Спасибо
Спасибо, очень помогло
Добрый день! А подскажите пожалуйста, как применить условное оформление к строкам таким образом созданного дерева?