Дерево значений — 1C-WIKI.RU (1С википедия)

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

Материал из 1C-WIKI.RU (1С википедия)

Перейти к: навигация, поиск

Содержание

Общие сведения

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

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

Для работы с деревом значений в 1С используется объект "ДеревоЗначений". Среди основных свойств данного объекта стоит отметить следующие:

  1. Колонки - содержит коллекцию колонок дерева значений (Тип: КоллекцияКолонокДереваЗначений).
  2. Строки - содержит коллекцию строк 1-го уровня дерева значений (Тип: КоллекцияСтрокДереваЗначений).
Коллекции строк следующих уровней можно получить, используя свойство Строки, имеющееся у каждой строки дерева значений.

Полный набор методов и свойств можно посмотреть в Синтакс-помощнике 1С.

Предоставить пользователю возможность интерактивной работы с деревом значений можно используя элемент управления "Табличное поле". Для этого в его палитре свойств нужно указать тип значения - "Дерево значений". Добавив в табличном поле необходимые колонки, получим готовый элемент управления с возможность добавления/удаления строк пользователем связанный с элементом данных.

СвойствоТипЗначенияТабличногоПоля.PNG

Можно и программно заполнять дерево значений, делается это так:

Процедура ОсновныеДействияФормыЗаполнить(Кнопка)
	
	Дерево.Колонки.Добавить("Должность", Новый ОписаниеТипов("Строка"));
	Дерево.Колонки.Добавить("ФИО");
	
	ГенДир = Дерево.Строки.Добавить();
	ГенДир.Должность = "Генеральный директор";
	ГенДир.ФИО = "ЛилиПутин Владимир Владимирович";
	
	ФинДир = ГенДир.Строки.Добавить();
	ФинДир.Должность = "Финансовый директор";
	ФинДир.ФИО = "Ленин Владимир Ильич";
	
	КоммДир = ГенДир.Строки.Добавить();
	КоммДир.Должность = "Коммерческий директор";
	КоммДир.ФИО = "Троцкий Федор";
	
	ГлБух = ФинДир.Строки.Добавить();
	ГлБух.Должность = "Главный бухгалтер";
	ГлБух.ФИО = "Сорокин Сергей Алексеевич";
	
	ЭлементыФормы.Дерево.СоздатьКолонки();
	
КонецПроцедуры
 

Строка ЭлементыФормы.Дерево.СоздатьКолонки(); необходима для обновления элемента управления на основании элемента данных связанного с деревом.

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

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

Т.к. количество уровней вложенности дерева может быть различным для перебора дерева необходимо использовать рекурсию. Пример рекурсивного вывода дерева значений:

Процедура КнопкаВыполнитьНажатие(Кнопка)
	//Вызов рекурсивной функции
	ВывестиДерево(Дерево);
	
КонецПроцедуры

Процедура ВывестиДерево(ВыводимаяСтрока, Уровень = 0)
	//Обходим строки текущего уровня дерева
	Для Каждого СтрДерева Из ВыводимаяСтрока.Строки Цикл
		//Формируем отступ чтобы показать иерархию:
		СтрокаОтступ = "";
		Для Инд = 1 По Уровень Цикл
			СтрокаОтступ = СтрокаОтступ + Символы.Таб;	
		КонецЦикла;
		
		//Выводим элемент строки с отступом:
		Сообщить(СтрокаОтступ + СтрДерева.Должность + "(" + СтрДерева.ФИО + ")" );
		//Рекурсивно вызываем процедуру саму из себя для вывода подчиненных элементов дерева:
		ВывестиДерево(СтрДерева, Уровень + 1);
	КонецЦикла;
КонецПроцедуры

В результате получаем такой результат:

ПереборДереваЗначений.PNG

Флажки и картинки дерева значений

Добиться отображения в строках табличного поля, связанного с деревом значений, картинок и флажков можно следующим образом:

  1. Размещаем на форме элемент Табличное поле, в качестве источника данных указываем Дерево Значений
  2. Добавляем необходимое количество колонок. Для колонки, которая будет отображать флажок и картинку дополнительно в палитре свойств
    • Заполняем поле ДанныеФлажка
    • Заполняем поле ДанныеКартинки
    • Поле Режим редактирования устанавливаем в Непосредственно
    • Устанавливаем флажок Отображать иерархию
    • Устанавливаем флажок Три состояния флажка, если необходимо третье состояние для флажка: серый (частично выбрано)

НастройкаСвойствКолонкиТабличногоПоля.PNG

Теперь при заполнении дерева можно использовать наши свойства "Флажок" и "Картинка":

Процедура ПриОткрытии()
	//Заполняем дерево значений при открытии формы
	ГенДир = Дерево.Строки.Добавить();
	ГенДир.Должность = "Генеральный директор";
	ГенДир.ФИО = "ЛилиПутин Владимир Владимирович";
	ГенДир.Флажок = 2;
	ГенДир.Картинка = БиблиотекаКартинок.Важно;
	
	ФинДир = ГенДир.Строки.Добавить();
	ФинДир.Должность = "Финансовый директор";
	ФинДир.ФИО = "Ленин Владимир Ильич";
	ФинДир.Флажок = 1;
	
	КоммДир = ГенДир.Строки.Добавить();
	КоммДир.Должность = "Коммерческий директор";
	КоммДир.ФИО = "Троцкий Федор";
	КоммДир.Флажок = 0;
	
	ГлБух = ФинДир.Строки.Добавить();
	ГлБух.Должность = "Главный бухгалтер";
	ГлБух.ФИО = "Сорокин Сергей Алексеевич";
	ГлБух.Флажок = 1;
	ГлБух.Картинка = БиблиотекаКартинок.ДебетКредит;
КонецПроцедуры

Результат будет выглядеть так:

ДеревоСФлажками.PNG


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

Среди наиболее часто используемых методов с объектом "ДеревоЗначений" стоит отметить метод "Найти" коллекции строк дерева значений:

Синтаксис:

Найти(<Значение>, <Колонки>, <Включать подчиненные>)

Параметры: <Значение> (обязательный)

Тип: Произвольный. Искомое значение.

<Колонки> (необязательный)

Тип: Строка. Список имен колонок, в которых будет осуществляться поиск, разделенных запятыми.

Если параметр не указан, поиск осуществляется по всем колонкам дерева.

Значение по умолчанию: Пустая строка

<Включать подчиненные> (необязательный)

Тип: Булево. Определяет, будут ли участвовать в поиске строки подчиненных коллекций (если таковые имеются). Истина - строки подчиненных коллекций участвуют в поиске.

Значение по умолчанию: Ложь

Возвращаемое значение:

Тип: СтрокаДереваЗначений; Неопределено.

Строка, которая содержит искомое значение. Если значение не найдено, то возвращается значение Неопределено.

Описание: Осуществляет поиск значения в дереве в указанных колонках коллекции строк дерева значений.

Примечание: Метод эффективно использовать для поиска уникальных значений.

Для нашего примера сменим картинку для строки дерева с должностью "Главный бухгалтер":

Процедура КнопкаВыполнитьНажатие(Кнопка)
	СтрГлавБух = Дерево.Строки.Найти("Главный бухгалтер", "Должность", Истина);
	Если СтрГлавБух <> Неопределено Тогда
		СтрГлавБух.Картинка = БиблиотекаКартинок.Внимание16;	
	КонецЕсли;
КонецПроцедуры

Источники

Синтакс-помощник 1С:Предприятие 8.1

Личные инструменты