Каталог решений - Просто о дереве значений

Просто о дереве значений

Просто о дереве значений

В наличии

Кратко о работе с объектом типа ДеревоЗначений.

Категория:

Описание

   Цель данной статьи — изложить свой взгляд на такой объект 1С, как дерево значений. На данную тему написано уже достаточно статей, в особенности на предмет программной работы с этим объектом. Поэтому Америку не открою, лишь попытаюсь предложить начинающим программистам способ лёгкого освоения методики работы с деревом значений с помощью всего 3х важных моментов.

    Для того, чтобы работать с этим объектом, нужно понимать, для чего он нужен. Он удобен, в первую очередь, для представления иерархических объектов – таких, как справочник Номенклатура. Мне встречалась также задача по представлению в виде дерева разнотипных подчинённых объектов, например ЗаказовПокупателя и Номенклатуры в Маршрутном Листе.

Дерево Значений = Таблица Значений + колонка Родитель

 

 

Иерархия или подчинённость отражается в 1С с помощью дополнительного реквизита – Родитель. Именно наличие такого реквизита отличает объект ДеревоЗначений от объекта ТаблицаЗначений.  Это первое, что нужно запомнить для работы с Деревом – ДеревоЗначений это ТаблицаЗначений с дополнительной колонкой Родитель.

Дерево Значений = работа с одним уровнем иерархии

 

 

Второй важный момент – при работе с деревом на Сервере, в отличие от ТаблицыЗначений, у которой можно получить произвольное количество строк методом НайтиСтроки(), получаемые строки ограничены текущим уровнем иерархии, то есть значением колонки Родитель.  Во время первого обращения к объекту метод Строки() возвращает коллекцию (не массив, как в ТЗ) строк корневого уровня – строк с пустым значением колонки Родитель. В зависимости от типа иерархии таких строк может быть как одна, так и несколько. Далее вся работа с Деревом сводится к перебору циклом «Для Каждого Из» колллекции, полученной методом Строки(). Для каждого элемента коллекции метод Строки() возвращает коллекцию подчинённых строк – тех, у которых значение колонки Родитель равно данному элементу. Таким образом организуется рекурсивный обход дерева – примеры функций также есть в других статьях. Остальные методы работы с деревом аналогичны методам работы с таблицей значений (см. синтакс-помощник). Иначе говоря, коллекция строк дерева с одинаковым значением колонки Родитель представляет собой таблицу значений.

ДеревоЗначений на Сервере = ДанныеФормыДерево на Клиенте

   Третий момент – передача данных Дерева между Клиентом и Сервером. На Клиенте объекту типа ДеревоЗначений соответствует объект ДанныеФормыДерево.

 

 

Для работы с Деревом Значений в клиент-серверном режиме необходимо использовать функции платформы – РеквизитФормыВЗначение (ДанныеФормыВЗначение) для передачи изменений с клиента на сервер и ЗначениеВРеквизитФормы (ЗначениеВДанныеФормы) для передачи с сервера на клиент. Эти функции облегчают жизнь разработчику, поскольку обрабатывают весь объект целиком, а не только один уровень иерархии, как это вынужден делать разработчик.

Напоследок, хотелось бы изложить свой взгляд на задачу позиционирования в Дереве, которая встречается достаточно часто. Раз у Дерева есть колонки, то для его отображения на клиенте используется объект ТаблицаФормы. Для решения задачи позиционирования в дереве используется свойство таблицы – ТекущаяСтрока. На просторах Интернета встречаются решения, когда для позиционирования происходит обращение к серверу. На мой взгляд, этого не требуется, поскольку объект ДанныеФормыДерево содержит все значения, при условии, что они переданы с помощью функций передачи (см. выше) и позиционирование заключается в поиске значения, получении идентификатора строки и установке свойства ТекущаяСтрока у элемента управляемой формы.

Пример клиентской функции поиска значения:

Функция Дерево_НайтиНаКлиенте(Что_то)
    
    НайденоЗначение = Ложь;
    КоллекцияДерева = Дерево.ПолучитьЭлементы();
    Для Каждого СтрокаДерева Из КоллекцияДерева Цикл
        Если СтрокаДерева.Поле = Что_то Тогда
            РезультатПоиска = СтрокаДерева;
        Иначе
            РезультатПоиска = НайтиВДереве(СтрокаДерева, Что_то);
        КонецЕсли;
        Если РезультатПоиска <> Неопределено Тогда
            ИндексДерева = РезультатПоиска.ПолучитьИдентификатор();
            ЭтаФорма.ТекущийЭлемент = Элементы.Дерево;
            ЭтаФорма.ТекущийЭлемент.ТекущаяСтрока = ИндексДерева;
            НайденоЗначение = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    Возврат НайденоЗначение;
    
КонецФункции

Комментарий: сначала получается коллекция элементов корневого уровня. Системная функция ПолучитьЭлементы() на клиенте соответствует функции Строки() на сервере. В цикле запускается перебор элементов коллекции, в котором присутствует рекурсивная функция НайтиВДереве(СтрокаДерева, Что_то), возвращающая найденную строку в случае успешного поиска, либо Неопределено, в противном случае. Если РезультатПоиска отличается от пустого значения Неопределено, то в ТаблицеФормы, отображающей Дерево, устанавливаются значения ТекущийЭлемент и ТекущаяСтрока по идентификатору строки дерева, получаемому системной функцией ПолучитьИдентификатор().

Это простой пример поиска по одному полю — Поле. Если имя поля передать в качестве второго параметра функции, то к нему можно будет обратиться следующим образом:

Если СтрокаДерева[Поле] = Что_то Тогда

и функция будет искать значения в любой колонке (по любому реквизиту) дерева.

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

has been added to your cart:
Оформление заказа