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

v8: Как выбрать все строки дерева значений?

Получилось так:
======================================================
ДерЗнач.Колонки.Добавить(«НовоеПоле»);
ВсеСтроки = ДерЗнач.Строки.НайтиСтроки(Новый Структура(«НовоеПоле», Неопределено), Истина);
======================================================
Но это как-то странно. Есть ли более правильный способ?

Не нужно выбирать все строки, свойство «Строки» — это коллекция, иди по коллекции и будет тебе счастье.

Не понял о чем говорит (1). Коллекция-коллекцией, но при выборке из неё будут выбираться только строки первого уровня? На то оно и дерево.
Для выборки всех строк дерева используй простейшую рекурсию.
.
Процедура ВыбратьВсеСтрокиДерева(Дерево)
Для Каждого СтрокаДерева Из Дерево.Строки Цикл
Сообщить(«Строка: «+СтрокаДерева);
ВыбратьВсеСтрокиДерева(СтрокаДерева.Строки);
КонецЦикла
КонецПроцедуры

(1) При переборе этой коллекции будут выбираться только строки первого уровня, так что счастья не будет 🙂
(2) Спасибо, но по-моему, решение в (0) проще, чем рекурсия 🙂

(3) 🙂 Смотря для какой цели. Мне, например, надо было перебирать дерево и по выполнению определённого условия выпадать из перебора с возвратом Истина. Рекурсия замечательно отрабатывает, надеюсь (хотя не проверял) быстрее чем добавление новой колонки и поиск строк по ней.
К тому же в рекурсии можно на ходу определять уровень строки.
.
А для каких-то случаев, возможно, первый вариант более приемлем благодаря своей простоте.

Источник

ДеревоЗначений
Метод ВыбратьСтроку()

Метод ВыбратьСтроку() открывает модальное окно для выбора строки из дерева значений.

Читайте также:  Быстрорастущее дерево вдоль забора

Доступность

Пример использования

Пример кода с использованием метода ВыбратьСтроку() :

//создание нового дерева значений ДеревоЗначений = Новый ДеревоЗначений; //добавим колонки ДеревоЗначений.Колонки.Добавить("Наименование"); ДеревоЗначений.Колонки.Добавить("КодТовара"); //добавим корневую строку КорневаяСтрока = ДеревоЗначений.Строки.Добавить(); КорневаяСтрока.Наименование = "МЕБЕЛЬ"; //добавим подчиненные строки для корневой НоваяСтрока = КорневаяСтрока.Строки.Добавить(); НоваяСтрока.Наименование = "Стол деревянный"; НоваяСтрока.КодТовара = "СТО_Д_1"; НоваяСтрока = КорневаяСтрока.Строки.Добавить(); НоваяСтрока.Наименование = "Стул деревянный"; НоваяСтрока.КодТовара = "СТУ_Д_1"; ВыбСтрока = ДеревоЗначений.ВыбратьСтроку(); Если НЕ ВыбСтрока = Неопределено Тогда Сообщить(ВыбСтрока.Наименование); КонецЕсли; 

Читайте также:

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Шкатулки из дерева дома

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Разновидностью какого плодового дерева является алыча

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

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

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

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

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

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

(оценок: 36, средняя оценка: 4,64 из 5)

Источник

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