Свернуть дерево значений управляемая форма

Как развернуть (свернуть) строки дерева значений?

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

По умолчанию, при помещении на форму табличного поля или таблицы формы, связанных с деревом значений, оно показывается в свернутом виде. Если нужно, чтобы при открытии формы дерево значений показывалось в раскрытом виде, проще всего воспользоваться свойством НачальноеОтображениеДерева таблицы (табличного поля). Оно может принимать одно из следующих значений:

НеРаскрывать
(NoExpand)
отображать строки дерева в свернутом виде (по умолчанию)
РаскрыватьВерхнийУровень
(ExpandTopLevel)
отображать развернутыми строки дерева значений первого уровня
РаскрыватьВсеУровни
(ExpandAllLevels)
отображать развернутыми все строки дерева значений

Внимание! Программная установка свойства НачальноеОтображениеДерева на клиенте в режиме управляемого приложения неизбежно ведет к вызову сервера

Теперь рассмотрим варианты программного сворачивания\разворачивания строк дерева значений. Реализация этих методов может отличаться для обычных и управляемых форм.

Дерево значений на управляемых формах

Пример для сворачивания всех строк дерева значений:

//получаем подчиненные элементы ДанныеФормыДерево СтрокиДерева = ДеревоДокументов.ПолучитьЭлементы(); Для каждого СтрокаДерева Из СтрокиДерева Цикл //получаем идентификатор строки в таблице формы СтрокаДереваИД = СтрокаДерева.ПолучитьИдентификатор(); //проверяем состояние строки Если Элементы.ДеревоДокументов.Развернут(СтрокаДереваИД) = Истина Тогда //сворачиваем строку дерева Элементы.ДеревоДокументов.Свернуть(СтрокаДереваИД); КонецЕсли; КонецЦикла; 

Пример для разворачивания всех строк дерева значений верхнего уровня:

//получаем подчиненные элементы ДанныеФормыДерево СтрокиДерева = ДеревоДокументов.ПолучитьЭлементы(); Для каждого СтрокаДерева Из СтрокиДерева Цикл //получаем идентификатор строки в таблице формы СтрокаДереваИД = СтрокаДерева.ПолучитьИдентификатор(); //проверяем состояние строки Если Элементы.ДеревоДокументов.Развернут(СтрокаДереваИД) = Ложь Тогда //разворачиваем строку дерева Элементы.ДеревоДокументов.Развернуть(СтрокаДереваИД); КонецЕсли; КонецЦикла; 

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

Читайте также:  Гриб ухо на дереве

Дерево значений на обычных формах

С обычными формами дела обстоят проще: обращение к серверу для обычных форм не так критично, как для управляемых, поэтому раскрыть все строки дерева можно так:

ЭлементыФормы.ДеревоДокументов.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни; 

Но в большинстве случаев лучше использовать следующий код, который гарантированно работает

//свернуть строки верхнего уровня Для каждого ПодчиненнаяСтрока Из ДеревоДокументов.Строки Цикл Если ЭлементыФормы.ДеревоДокументов.Развернут(ПодчиненнаяСтрока) Тогда ЭлементыФормы.ДеревоДокументов.Свернуть(ПодчиненнаяСтрока); КонецЕсли; КонецЦикла; //развернуть строки верхнего уровня Для каждого ПодчиненнаяСтрока Из ДеревоДокументов.Строки Цикл Если ЭлементыФормы.ДеревоДокументов.Развернут(ПодчиненнаяСтрока) = Ложь Тогда ЭлементыФормы.ДеревоДокументов.Развернуть(ПодчиненнаяСтрока); КонецЕсли; КонецЦикла; 

Источник

Работа с деревом значений в 1С

В последнее время аномально часто мне в работе попадалось дерево значений, поэтому решил написать на эту тему статью.

Попробую рассмотреть способы решения основных задач связанных с деревом значений, при этом постараюсь писать «без воды».

Дерево значений

Из названия объекта понятно, что дерево значений служит для хранения/отображения какой-либо иерархической информации. Каждая строка дерева значений может иметь какое-то количество подчиненных строк, при этом такие операции как поиск, сортировка, подсчет итогов можно проводит с учетом уровня иерархии и подчиненных строк.

Кроме этого, каждая строка дерева значений имеет свойства «Родитель» и «Строки».

Дерево значений на форме

Визуальное представление дерева значений обеспечивает элемент «Табличное поле».

Дерево значений на обычной форме Дерево значений на управляемой форме

Заполнение дерева значений

При заполнении дерева значений нужно помнить, что сам объект «ДеревоЗначений» и все его строки имеют свойство «Строки»и добавление новых строк на любом уровне дерева осуществляется через это свойство.

Сам же объект «ДеревоЗначений» имеет еще и свойство «Колонки», которое ничем не отличается от аналогичного свойства у таблицы значений.

Небольшой пример программного заполнения таблицы значений для управляемых форм:

Читайте также:  Темно серый стул дерево

Обход дерева значений

Обход всех строк дерева значений делается при помощи рекурсии, вот так будет выглядеть код для обхода дерева созданного в примере выше:

Как свернуть и развернуть дерево значений

Сворачивается и разворачивается дерево значений очень просто.

Привел три примера: для сворачивания текущей строки, для сворачивания строк верхнего уровня, для сворачивания вообще всех строк (рекурсия).

Два примера: для разворачивания текущей строки и для разворачивания всех строк. У метода «Развернуть» есть дополнительный параметр, который позволяет указать нужно ли разворачивать подчиненные строки.

Как удалить строку и очистить дерево значений

Тут опять же все просто, нужно помнить, что при удалении/очистке строки, все подчиненные строки удаляются.

Точно также можно очистить от подчиненных элементов другую другую строку.

Удалить строку дерева значений не сложнее — нужно только знать ее индекс:

Запрос и дерево значений

Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом «Выгрузить» и указать параметр «ТипОбхода» отличным от того, что стоит по умолчанию, т.е. «ПоГруппировкам» или «ПоГруппировкамСИерархией».

Если на форме имеется реквизит «ДеревоЗначений» и связанный с ним визуальный элемент, то можно сделать примерно так:

Причем полного совпадения колонок и типов не требуется — лишние колонки будут просто отброшены, а колонки с различными типами будут заполнены пустыми значениями.

Дерево значений в таблицу значений и обратно

Преобразовать дерево значений в таблицу значений и наоборот достаточно просто, ведь дерево значений это та же таблица значений, но с дополнительной колонкой — «Родитель». У меня есть отдельная статья о том как преобразовать дерево значений в таблицу значений и обратно.

Отбор в дереве значений

Стандартного отбора в дереве значений не предусмотрено. Так получилось потому, что непонятно как разрешать ситуацию, когда родительский элемент не удовлетворяет условию отбора, а подчиненные ему элементы удовлетворяют.

Таким образом, если Вам нужно реализовать отбор в дереве значений, то начать нужно с решения именно этой проблемы. А уже после этого можно придумать несколько способов реализовать задуманное.

Читайте также:  Народные средства живое дерево

Первый способ — накладывать отбор до вывода дерева значений (в запросе например). Это не классический отбор, но в тех случаях когда этот способ применим, то следует применять именно его, так как это почти всегда быстрее и правильнее чем что-либо другое.

Второй способ — перебор всех строк дерева значений. Описывать здесь особенно нечего, нужно просто взять обход дерева значений, проверять каждую строку на соответствие условию отбора и удалять лишние строки.

Еще один способ заключается в том, чтобы преобразовать дерево значений в таблицу значений, сделать отбор в таблице значений, проконтролировать результат (почистить «хвосты» — строки, родитель которых не удовлетворил условию отбора) и выполнить обратное преобразование в дерево значений.

На этом все, рассказал все, что знал, надеюсь мне удалось сэкономить Вам немного времени.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

УжасноПлохоНеплохоХорошо Отлично(оценок: 36, средняя оценка: 4,64 из 5)

Источник

Как программно Свернуть / Развернуть дерево значений УФ 1С 8

Если нужно свернуть / развернуть дерево значений на управляемой форме программно тогда можно использовать одноименные методы на клиенте.

Методы имеют следующие параметры:

Идентификатор обрабатываемой строки

(необязательный, только для разворачивания) — Значение по умолчанию: Ложь.

Тип: Булево.
Определяет необходимость раскрытия подчиненных узлов. Истина — раскрывать подчиненные узлы, Ложь — не раскрывать подчиненные узлы.

Элементы.Дерево.Развернуть(ИдентификаторСтроки, Истина); Элементы.Дерево.Свернуть(ИдентификаторСтроки);
Элементы.Дерево.Развернуть(0, Истина);
&НаКлиенте Процедура ПриОткрытии(Отказ) СвернутьРазвернутьДерево(Дерево.ПолучитьЭлементы(), Истина); КонецПроцедуры &НаКлиенте Процедура РазвернутьВсе(Команда) СвернутьРазвернутьДерево(Дерево.ПолучитьЭлементы(), Истина); КонецПроцедуры &НаКлиенте Процедура Развернуть3(Команда) СвернутьРазвернутьДерево(Дерево.ПолучитьЭлементы(), Ложь); СвернутьРазвернутьДерево(Дерево.ПолучитьЭлементы(), Истина, 3); КонецПроцедуры &НаКлиенте Процедура Развернуть2(Команда) СвернутьРазвернутьДерево(Дерево.ПолучитьЭлементы(), ЛОжь); СвернутьРазвернутьДерево(Дерево.ПолучитьЭлементы(), Истина, 2); КонецПроцедуры &НаКлиенте Процедура СвернутьДерево(Команда) СвернутьРазвернутьДерево(Дерево.ПолучитьЭлементы(), Ложь); КонецПроцедуры &НаКлиенте Процедура СвернутьРазвернутьДерево(Дерево, Развернуть, Уровень = Неопределено) Экспорт Если НЕ Уровень = Неопределено Тогда Уровень = Уровень - 1; Если Уровень= 0 Тогда Возврат; КонецЕсли; КонецЕсли; Для Каждого ТекСтр Из Дерево Цикл Строки = ТекСтр.ПолучитьЭлементы(); Если Строки.Количество() > 0 Тогда СвернутьРазвернутьДерево(Строки, Развернуть, Уровень); Если Развернуть = Истина Тогда Элементы.Дерево.Развернуть(ТекСтр.ПолучитьИдентификатор()); Иначе Элементы.Дерево.Свернуть(ТекСтр.ПолучитьИдентификатор()); КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры

Функция СвернутьРазвернутьДерево(), позволяет свернуть или развернуть все дерево до определенного уровня или полностью

Источник

Оцените статью