- Управляемая форма 1С 8.2 (8.3) – работа с деревом значений и таблицей значений. Часть I (Основы)
- Дерево значений на форме
- Управляемые формы
- Обычные формы
- 2 комментария на «“Дерево значений на форме”»
- Работа с деревом значений в 1С
- Дерево значений
- Дерево значений на форме
- Заполнение дерева значений
- Обход дерева значений
- Как свернуть и развернуть дерево значений
- Как удалить строку и очистить дерево значений
- Запрос и дерево значений
- Дерево значений в таблицу значений и обратно
- Отбор в дереве значений
Управляемая форма 1С 8.2 (8.3) – работа с деревом значений и таблицей значений. Часть I (Основы)
Как известно, в платформе 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; КонецЦикла; КонецЦикла; КонецЦикла; // Создание Реквизита формы типа ДанныеФормыДерево МассивДобавляемыхРеквизитов = Новый Массив; МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Дерево", Новый ОписаниеТипов("ДеревоЗначений"))); Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево")); КонецЦикла; ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); // Преобразование объекта прикладного типа ДеревоЗначений // в реквизит управляемой формы (данные формы) ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево"); // Создание элемента формы типа ТаблицаФормы для отображения дерева ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы")); ЭлементДерево.ПутьКДанным = "Дерево"; ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево; Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ЭлементДерево); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя; КонецЦикла; КонецПроцедуры
Источник
Дерево значений на форме
рубрики: Работа с формами | Дата: 12 ноября, 2016
Скачать обработку с примерами из статьи: professia1c_TreeValue.epf
Платформа: 8.3; Тип формы: управляемая.
В этой статье рассмотрим как можно выгружать результат запроса в
дерево значений на форме. Разберем этот вопрос как для обычных,
так и для управляемых форм.
В некоторм роде эта статья пересекается со статьей про
иерархический обход результата запроса
Поэтому и пример возьмем такой же. То есть когда нам надо сделать запрос к таблице:
Период | Склад | Товар | Цена |
---|---|---|---|
01.01.2016 | Центральный | Ручка | 30 |
01.01.2016 | Офис | Карандаш | 15 |
05.01.2016 | Центральный | Ручка | 45 |
10.01.2016 | Офис | Карандаш | 25 |
15.01.2016 | Центральный | Степлер | 150 |
17.01.2016 | Офис | Дырокол | 200 |
и разместить результат на форме в виде дерева значений вот в таком виде:
Центральный | |||
---|---|---|---|
Ручка | |||
01.01.2016 | 30 | ||
05.01.2016 | 45 | ||
Степлер | |||
15.01.2016 | 150 | ||
Офис | |||
Карандаш | |||
01.01.2016 | 15 | ||
10.01.2016 | 25 | ||
Дырокол | |||
17.01.2016 | 200 |
А теперь рассмотрим как это можно сделать на управляемых и на обычных формах.
Управляемые формы
Для демонстрации создадим внешнюю обработку. Добавим форму. В реквизитах формы
создаем реквизит с типом ДеревоЗначений. Уже в этот реквизит добавляем
колонки реквизита (имена должны совпадать с именами полей в запросе).
Перетаскиваем наше дерево значений на форму. Ну и конечно добавим команду, которая
будет запускать заполнение дерева.
В модуле формы пишем вот такой код (текст запроса по формированию временной таблицы
с исходными данными полностью приводить не буду. Его можно взять в вышеуказанной статье):
Здесь стоит обратить внимание на два момента. Первое — это то, что имена полей
запроса и полей дерева значений должны совпадать.
И второе — это метод
ЗначениеВРеквизитФормы(), который помещает сформированное дерево
значений в реквизит формы.
После выполнения кода в форме получаем вот такое дерево значений:
Обычные формы
Создадим тестовую обработку и добавим реквизит с типом ДеревоЗначений.
Создадим обычную форму, добавим на нее табличное поле и в свойствах в качестве
источника данных укажем ранее добавленный реквизит
Как видим в отиличие от управляемых в обычных формах нет необходимости заранее
создавать колонки для дерева значений.
Переходим в модуль формы. Текст запроса опустим, т.к. он будет точно такой же
как и для управляемой формы. Немного различаться будет обработка результата
запроса.
Для тех кто первый раз сталкивается с такой задачей основная трудность — это
догадаться о необходимости применения метода СоздатьКолонки()
к табличному полю формы, т.к. без него поле остается пустым.
Запускаем выполнение обработки и получаем следующую картину

2 комментария на «“Дерево значений на форме”»
не работает них на обычных формах.
если создать реквизит обработки Дерево, то в табличном поле в Данных этого реквизита НЕТ!
а вот если создать реквизит формы тогда он появляется в выборе данных для табличного поля.
год спустя пришел ответ 🙂
работает, нужно просто развернуть строку ОбработкаОбъект, и выбрать её реквизит
Источник
Работа с деревом значений в 1С
В последнее время аномально часто мне в работе попадалось дерево значений, поэтому решил написать на эту тему статью.
Попробую рассмотреть способы решения основных задач связанных с деревом значений, при этом постараюсь писать «без воды».
Дерево значений
Из названия объекта понятно, что дерево значений служит для хранения/отображения какой-либо иерархической информации. Каждая строка дерева значений может иметь какое-то количество подчиненных строк, при этом такие операции как поиск, сортировка, подсчет итогов можно проводит с учетом уровня иерархии и подчиненных строк.
Кроме этого, каждая строка дерева значений имеет свойства «Родитель» и «Строки».
Дерево значений на форме
Визуальное представление дерева значений обеспечивает элемент «Табличное поле».
Заполнение дерева значений
При заполнении дерева значений нужно помнить, что сам объект «ДеревоЗначений» и все его строки имеют свойство «Строки»и добавление новых строк на любом уровне дерева осуществляется через это свойство.
Сам же объект «ДеревоЗначений» имеет еще и свойство «Колонки», которое ничем не отличается от аналогичного свойства у таблицы значений.
Небольшой пример программного заполнения таблицы значений для управляемых форм:
Обход дерева значений
Обход всех строк дерева значений делается при помощи рекурсии, вот так будет выглядеть код для обхода дерева созданного в примере выше:
Как свернуть и развернуть дерево значений
Сворачивается и разворачивается дерево значений очень просто.
Привел три примера: для сворачивания текущей строки, для сворачивания строк верхнего уровня, для сворачивания вообще всех строк (рекурсия).
Два примера: для разворачивания текущей строки и для разворачивания всех строк. У метода «Развернуть» есть дополнительный параметр, который позволяет указать нужно ли разворачивать подчиненные строки.
Как удалить строку и очистить дерево значений
Тут опять же все просто, нужно помнить, что при удалении/очистке строки, все подчиненные строки удаляются.
Точно также можно очистить от подчиненных элементов другую другую строку.
Удалить строку дерева значений не сложнее — нужно только знать ее индекс:
Запрос и дерево значений
Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом «Выгрузить» и указать параметр «ТипОбхода» отличным от того, что стоит по умолчанию, т.е. «ПоГруппировкам» или «ПоГруппировкамСИерархией».
Если на форме имеется реквизит «ДеревоЗначений» и связанный с ним визуальный элемент, то можно сделать примерно так:
Причем полного совпадения колонок и типов не требуется — лишние колонки будут просто отброшены, а колонки с различными типами будут заполнены пустыми значениями.
Дерево значений в таблицу значений и обратно
Преобразовать дерево значений в таблицу значений и наоборот достаточно просто, ведь дерево значений это та же таблица значений, но с дополнительной колонкой — «Родитель». У меня есть отдельная статья о том как преобразовать дерево значений в таблицу значений и обратно.
Отбор в дереве значений
Стандартного отбора в дереве значений не предусмотрено. Так получилось потому, что непонятно как разрешать ситуацию, когда родительский элемент не удовлетворяет условию отбора, а подчиненные ему элементы удовлетворяют.
Таким образом, если Вам нужно реализовать отбор в дереве значений, то начать нужно с решения именно этой проблемы. А уже после этого можно придумать несколько способов реализовать задуманное.
Первый способ — накладывать отбор до вывода дерева значений (в запросе например). Это не классический отбор, но в тех случаях когда этот способ применим, то следует применять именно его, так как это почти всегда быстрее и правильнее чем что-либо другое.
Второй способ — перебор всех строк дерева значений. Описывать здесь особенно нечего, нужно просто взять обход дерева значений, проверять каждую строку на соответствие условию отбора и удалять лишние строки.
Еще один способ заключается в том, чтобы преобразовать дерево значений в таблицу значений, сделать отбор в таблице значений, проконтролировать результат (почистить «хвосты» — строки, родитель которых не удовлетворил условию отбора) и выполнить обратное преобразование в дерево значений.
На этом все, рассказал все, что знал, надеюсь мне удалось сэкономить Вам немного времени.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
(оценок: 36, средняя оценка: 4,64 из 5)
Источник