1с как найти значение в дереве значений

Объект «ДеревоЗначений» в 1С 8.3 представляет собой динамический набор значений любого типа. Для такого набора доступны свойства «колонки» и «строки» где каждая строка может иметь набор подчинённых строк, а каждая подчинённая строка набор своих подчинённых строк и т.д.  Программная инициализация дерева значений в 1С осуществляется с помощью оператора НОВЫЙ.

Пример:

ДеревоЗначений = Новый ДеревоЗначений;

Визуально, объект «ДеревоЗначений» похож на дерево групп справочника. К примеру, можно открыть справочник «Номенклатура» любой типовой конфигурации выставив форму списка в «Режим просмотра» — «Дерево».

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

Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.

Связаться с нами можно по телефону +7 499 350 29 00.

Услуги и цены можно увидеть по ссылке.

Будем рады помочь Вам!

Содержание

  • Дерево значений на управляемой форме
  • Заполнение дерева значений
    • Ручное заполнение реквизита формы с типом «ДеревоЗначений»
    • Заполнение дерева значений из результата запроса
  • Поиск строк в дереве значений
    • Метод «Найти()»
    • Метод «НайтиСтроки()»
  • Очистка дерева значений или строк
  • Обход дерева значений в 1С
  • Как преобразовать дерево значений в таблицу значений

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

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

Для отображения на форме добавим реквизит в раздел элементов формы простым перетаскиванием.

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

Заполнить данными дерево значений в 1С можно программно (вручную) или получить из результата запроса. Рассмотрим на примерах оба способа.

Ручное заполнение реквизита формы с типом «ДеревоЗначений»

Простой пример:

&НаКлиенте
Процедура ДЗ_НаФорме(Команда)
ДЗ_НаФормеНаСервере();
КонецПроцедуры

&НаСервере
Процедура ДЗ_НаФормеНаСервере()

// Преобразуем реквизит формы ДЗ в объект прикладного типа
ДеревоЗначений = РеквизитФормыВЗначение("ДЗ");

Корень = ДеревоЗначений.Строки.Добавить();
Корень.Наименование = "Корневая группа";

Группа1 = Корень.Строки.Добавить();
Группа1.Наименование = "Первая группа";

Элемент1 = Группа1.Строки.Добавить();
Элемент1.Наименование = "Элемент №1";                               

Группа2 = Корень.Строки.Добавить();
Группа2.Наименование = "Втровая группа";

Элемент1 = Группа2.Строки.Добавить();
Элемент1.Наименование = "Элемент №1";

Элемент2 = Группа2.Строки.Добавить();
Элемент2.Наименование = "Элемент №2";
        
// Преобразуем объект ДеревоЗначений в реквизит формы         
ЗначениеВРеквизитФормы(ДеревоЗначений,"ДЗ");                                                                     

КонецПроцедуры

Результат запроса на форме:

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

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

&НаКлиенте
Процедура ДЗ_НаФорме(Команда)
ДЗ_НаФормеНаСервере();
КонецПроцедуры

&НаСервере
Процедура ДЗ_НаФормеНаСервере()

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|          Номенклатура.Ссылка КАК Наименование
|ИЗ
|          Справочник.Номенклатура КАК Номенклатура
|
|УПОРЯДОЧИТЬ ПО
|          Наименование ИЕРАРХИЯ";
ДеревоЗначений = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

ЗначениеВРеквизитФормы(ДеревоЗначений, "ДЗ");

КонецПроцедуры

Результат запроса на форме может выглядеть так:

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

Для поиска строк в дереве значений существует два способа, точнее говоря, метода.

Метод «Найти()»

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

Возвращает строку дерева значений, если строка не найдена, вернёт «Неопределено». Поиск можно ограничивать, указав в параметре <Колонки> нужные колонки для поиска. Также расширять, указав для параметра <ВключатьПодчиненные> значение «Истина», тогда в поиске будут участвовать строки подчинённых коллекций.

Для примера найдём строку со значением «Элемент №1» в дереве значений вида:

Пример кода:

&НаКлиенте
Процедура НайтиСтрокуДЗ(Команда)
            НайтиСтрокуДЗ_НаСервере();
КонецПроцедуры

&НаСервере
Процедура НайтиСтрокуДЗ_НаСервере()

// Преобразуем реквизит формы ДЗ в объект прикладного типа
ДеревоЗначений = РеквизитФормыВЗначение("ДЗ");

// Ищем строку
НайденнаяСтрока = ДеревоЗначений.Строки.Найти("Элемент №1","Наименование", Истина);

// Анализ результата поиска
Если НайденнаяСтрока = Неопределено Тогда
Сообщить("Строка не найдена");
Иначе
Сообщить(НайденнаяСтрока.Наименование + " - " + НайденнаяСтрока.Родитель.Наименование);
КонецЕсли;
          
КонецПроцедуры

Результат:

Из результата видно, что метод вернул первую попавшуюся строку, и поиск был прекращён.

Метод «НайтиСтроки()»

Если необходимо найти все строки со значением «Элемент №1» тогда следует использовать метод НайтиСтроки()

  • НайтиСтроки(<ПараметрыОтбора>, <ВключатьПодчиненные>)

Где <ПараметрыОтбора> — это условия для поиска в виде структуры, а параметр <ВключатьПодчиненные> с помощью значений Ложь/Истина контролирует возможность поиска в подчинённых коллекциях.

Пример кода:

&НаКлиенте
Процедура НайтиСтрокиДЗ(Команда)
НайтиСтрокиДЗНаСервере();
КонецПроцедуры

&НаСервере
Процедура НайтиСтрокиДЗНаСервере()

// Преобразуем реквизит формы ДЗ в объект прикладного типа
ДеревоЗначений = РеквизитФормыВЗначение("ДЗ");

// Условие для поиска
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Наименование", "Элемент №1");

// Поиск строк
МассивСтрок = ДеревоЗначений.Строки.НайтиСтроки(ПараметрыОтбора, Истина);

// Проверяем найдены ли строки
Если МассивСтрок.Количество() = 0 Тогда
Сообщить("Не найдено ни одной строки, удовлетворяющей условия поиска.");
КонецЕсли;

// Перебор массива строк
Для Каждого Строка Из МассивСтрок Цикл

Если Строка.Родитель = Неопределено Тогда
Сообщить(Строка.Наименование + " - Корень дерева значений.");
Иначе
Сообщить(Строка.Наименование + " - " + Строка.Родитель.Наименование);
КонецЕсли

КонецЦикла;

КонецПроцедуры

Результат:

Очистка дерева значений или строк

Для очистки дерева значений пригодятся методы  Очистить(), Удалить(). Пример кода:

&НаСервере
Процедура УдалитьСтрокуНаСервере()

// Преобразуем реквизит формы ДЗ в объект прикладного типа
ДеревоЗначений = РеквизитФормыВЗначение("ДЗ");

ДеревоЗначений.Строки.Очистить();

// Или по индексу
ДеревоЗначений.Строки.Удалить(0);

// Преобразуем объект ДеревоЗначений в реквизит формы
ЗначениеВРеквизитФормы(ДеревоЗначений, "ДЗ");

КонецПроцедуры

С помощью данных методов возможно удаление конкретных строк дерева значений.

!!!При удалении либо очистки строки все её подчинённые строки удалятся!!!

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

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

Пример:

&НаСервере
Процедура ОбойтиДЗ_НаСервере()
ДеревоЗначений = РеквизитФормыВЗначение("ДЗ");
ОбходДереваЗначений(ДеревоЗначений);
КонецПроцедуры

&НаСервере
Процедура ОбходДереваЗначений(Данные)

Для Каждого Строка Из Данные.Строки Цикл

Сообщить(Строка.Наименование);

Если Строка.Строки.Количество()>0 Тогда
ОбходДереваЗначений(Строка);
КонецЕсли;

КонецЦикла;

КонецПроцедуры

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

Состав элементов и реквизитов формы:

&НаКлиенте
Процедура ВТЗ(Команда)
ВТЗНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВТЗНаСервере()


ДеревоЗначений = РеквизитФормыВЗначение("ДЗ");
ТаблицаЗначений = РеквизитФормыВЗначение("ТЗ");

ПреобразоватьВ_ТЗ(ДеревоЗначений, ТаблицаЗначений, Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"));
ДеревоЗначений.Строки.Очистить();

ЗначениеВРеквизитФормы(ТаблицаЗначений, "ТЗ");
ЗначениеВРеквизитФормы(ДеревоЗначений, "ДЗ");
КонецПроцедуры

&НаСервере
Процедура ПреобразоватьВ_ТЗ(Данные, ТаблицаЗначений, ГУИД)

Для Каждого Строка Из Данные.Строки Цикл

НовСтрока = ТаблицаЗначений.Добавить();
НовСтрока.Наименование = Строка.Наименование;
НовСтрока.Родитель = ГУИД;
НовСтрока.ГУИД = Новый УникальныйИдентификатор();

Если Строка.Строки.Количество()>0 Тогда
ПреобразоватьВ_ТЗ(Строка, ТаблицаЗначений, НовСтрока.ГУИД);
КонецЕсли;

КонецЦикла;

КонецПроцедуры

Используя данный способ можно легко преобразовать таблицу значений обратно в дерево значений.  Из примера «ГУИД» это уникальный идентификатор строки, а «Родитель» уникальный идентификатор родителя. Если обратного преобразования не требуется можно исключить использование колонок «Родитель» и  «ГУИД».

  • АКТУАЛЬНЫЕ РЕЛИЗЫ 1С
  • ПРИМЕРЫ КОДА НА ПЛАТФОРМЕ 1С
Работа с деревом значений в 1С 8.x
  • Как самостоятельно заполнить дерево значений?
  • Как в дереве значений найти строку по определенному условию?

Как самостоятельно заполнить дерево значений?

Процедура ЗаполнениеДерева(Кнопка) 
	Дерево.Колонки.Очистить(); 
	Дерево.Колонки.Добавить("ИмяКолонки"); 

	// Создать первую строку. Правильнее сказать создать элемент 
	// коллекции. Он помещается в переменную "СтрокаВерхнегоУровня". 
	СтрокаВерхнегоУровня = Дерево.Строки.Добавить(); 

	// В колонку "ИмяКолонки" записать значение "Старшая". 
	СтрокаВерхнегоУровня.ИмяКолонки = "Старшая"; 

	// Создать строку подчиненную "Старшей". 
	ПодчиненнаяСтрока =СтрокаВерхнегоУровня.Строки.Добавить(); 
	ПодчиненнаяСтрока.ИмяКолонки = "Первая подчиненная"; 

	ПодчиненнаяВторогоУровня = ПодчиненнаяСтрока.Строки.Добавить(); 
	ПодчиненнаяВторогоУровня.ИмяКолонки = "Первая нижняя"; 

	ПодчиненнаяВторогоУровня = ПодчиненнаяСтрока.Строки.Добавить(); 
	ПодчиненнаяВторогоУровня.ИмяКолонки = "Вторая нижняя"; 

	ПодчиненнаяСтрока = СтрокаВерхнегоУровня.Строки.Добавить(); 
	ПодчиненнаяСтрока.ИмяКолонки = "Вторая подчиненная"; 

	// Использование метода позволит увидеть результат работы 
	// с деревом значений в табличном поле. 
	ЭлементыФормы.Дерево.СоздатьКолонки(); 

КонецПроцедуры 

Процедура ОткрытиеВетки(Кнопка) 

	// Сделать текущим именно элемент коллекции "Строки". 
	РезультатПоиска = Дерево.Строки.Найти("Первая нижняя", "ИмяКолонки", Истина); 

	Если РезультатПоиска <> Неопределено Тогда 
		ЭлементыФормы.Дерево.ТекущаяСтрока = РезультатПоиска; 
	КонецЕсли; 

КонецПроцедуры            
Как в дереве значений найти строку по определенному условию?

// С деревом значений проблема в том, что по сути это массив строк с данными,
// каждая строка в котором может иметь свой массив строк, а может и не иметь.
// Ниже приведен пример функции, которая возвращает строку, найденную по 
// определенному условию

// Получаем искомую строку вызвав функцию, в функцию передаем строки дерева 
// значений на первом уровне:
ОписаниеМетаданныхЗагрузки = НайтиОтмеченноеЗначениеВДеревеЗначений(ДеревоМетаданных.Строки);

// Эта функция осуществляет поиск строки
// Если строка найдена, возвращает найденною строку дерева
// Если строка не найдена, возвращает неопределено
Функция НайтиОтмеченноеЗначениеВДеревеЗначений(СтрокиДерева)

	// пробежимся по всем строкам (по всем строкам одного уровня, которые были переданы!)
	Для каждого Строка из СтрокиДерева Цикл
		// Вот наше условие, значение Выгружать у строки равно 1:
		Если Строка.Выгружать = 1 Тогда
			// Если условие сработало, возвращаем строку
			Возврат Строка;
		КонецЕсли;
	КонецЦикла;

	// Если не нашли строку, смотрим под-строки каждой строки
	Для каждого Строка из СтрокиДерева Цикл

		// Здесь осуществляется рекурсивный вызов
		НайденнаяСтрока = НайтиОтмеченноеЗначениеВДеревеЗначений(Строка.Строки);
		Если НайденнаяСтрока <> неопределено Тогда
			// Если нашли, возвращается строка
			Возврат НайденнаяСтрока;
		КонецЕсли;

	КонецЦикла;

	// Не нашли строку по условию, возвращаем неопределено
	Возврат неопределено;

КонецФункции          

Задайте вопрос программисту 1С

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

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

Как уже упоминалось выше, каждая строка имеет свойство Строки, которое содержит коллекцию дочерних строк. И сам объект ДеревоЗначений имеет свойство Строки, которое содержит коллекцию строк верхнего уровня.

&НаКлиенте
Процедура СоздатьДеревоЗначений(Команда)
    СоздатьДеревоЗначенийНаСервере();
КонецПроцедуры

&НаСервере
Процедура СоздатьДеревоЗначенийНаСервере()

    // создаем объект ДеревоЗначений и добавляем колонки
    ДеревоЗначений = Новый ДеревоЗначений();
    ДеревоЗначений.Колонки.Добавить("Код");
    ДеревоЗначений.Колонки.Добавить("Наименование");
    ДеревоЗначений.Колонки.Добавить("Количество");

    // добавляем две строки верхнего уровня
    ГруппаТовары = ДеревоЗначений.Строки.Добавить();
    ГруппаТовары.Код = "001";
    ГруппаТовары.Наименование = "Товары";
    ГруппаТовары.Количество = "";
    ГруппаУслуги = ДеревоЗначений.Строки.Добавить();
    ГруппаУслуги.Код = "002";
    ГруппаУслуги.Наименование = "Услуги";
    ГруппаУслуги.Количество = "";

    // для первой строки верхнего уровня добавляем дочерние строки
    ПервыйТовар = ГруппаТовары.Строки.Добавить();
    ПервыйТовар.Код = "003";
    ПервыйТовар.Наименование = "Первый товар";
    ПервыйТовар.Количество = 5;
    ПервыйТовар = ГруппаТовары.Строки.Добавить();
    ПервыйТовар.Код = "004";
    ПервыйТовар.Наименование = "Второй товар";
    ПервыйТовар.Количество = 7;

    // для второй строки верхнего уровня добавляем дочерние строки
    ПерваяУслуга = ГруппаУслуги.Строки.Добавить();
    ПерваяУслуга.Код = "005";
    ПерваяУслуга.Наименование = "Первая услуга";
    ПерваяУслуга.Количество = "";
    ВтораяУслуга = ГруппаУслуги.Строки.Добавить();
    ВтораяУслуга.Код = "006";
    ВтораяУслуга.Наименование = "Вторая услуга";
    ВтораяУслуга.Количество = "";

    // цикл по строкам верхнего уровня
    Для Каждого ТекущаяГруппа Из ДеревоЗначений.Строки Цикл
        Сообщить("Код: " + ТекущаяГруппа.Код + ", Группа: " + ТекущаяГруппа.Наименование);
        // цикл по дочерним строкам текущей строки верхнего уровня
        Для Каждого ТекущийТоварИлиУслуга Из ТекущаяГруппа.Строки Цикл
            Сообщить(
                "Код: " + ТекущийТоварИлиУслуга.Код +
                ", Товар или услуга: " + ТекущийТоварИлиУслуга.Наименование
            );
        КонецЦикла;
    КонецЦикла;

КонецПроцедуры
Код: 001, Группа: Товары
Код: 003, Товар или услуга: Первый товар
Код: 004, Товар или услуга: Второй товар
Код: 002, Группа: Услуги
Код: 005, Товар или услуга: Первая услуга
Код: 006, Товар или услуга: Вторая услуга
КоллекцияКолонокДереваЗначений.Добавить(Имя, Тип, Заголовок, Ширина) 
  • Добавляет колонку в конец коллекции колонок дерева значений.
  • Возвращаемое значение: КолонкаДереваЗначений.
КоллекцияСтрокДереваЗначений.Добавить()
  • Добавляет строку в конец коллекции строк данного уровня дерева значений.
  • Возвращаемое значение: СтрокаДереваЗначений.

Заполнить табличное поле на форме

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

Пример программного заполнения дерева значений для управляемых форм:

&НаКлиенте
Процедура ЗаполнитьТабличноеПоле(Команда)
    ЗаполнитьТабличноеПолеНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТабличноеПолеНаСервере()
    ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений");

    // Добавляем строку в корень дерева
    ПерваяСтрока = ДеревоЗначений.Строки.Добавить();
    ПерваяСтрока.ПерваяКолонка = "Первая строка, первая колонка";
    ПерваяСтрока.ВтораяКолонка = "Первая строка, вторая колонка";
    // Дочерняя строка первой строки
    ВтораяСтрока = ПерваяСтрока.Строки.Добавить();
    ВтораяСтрока.ПерваяКолонка = "Вторая строка, первая колонка";
    ВтораяСтрока.ВтораяКолонка = "Вторая строка, вторая колонка";
    // Дочерняя строка второй строки
    ТретьяСтрока = ВтораяСтрока.Строки.Добавить();
    ТретьяСтрока.ПерваяКолонка = "Третья строка, первая колонка";
    ТретьяСтрока.ВтораяКолонка = "Третья строка, вторая колонка";

    ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений");
КонецПроцедуры

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

&НаКлиенте
Процедура ЗаполнитьТабличноеПоле(Команда)
    ЗаполнитьТабличноеПолеНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТабличноеПолеНаСервере()
    Запрос = Новый Запрос();
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Номенклатура.Наименование КАК ПерваяКолонка,
        |    Номенклатура.Код КАК ВтораяКолонка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |УПОРЯДОЧИТЬ ПО
        |    ПерваяКолонка ИЕРАРХИЯ";
    ДеревоЗначений = Запрос.Выполнить().Выгрузить(
        ОбходРезультатаЗапроса.ПоГруппировкамСИерархией
    );
    ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений"); 
КонецПроцедуры

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

Свернуть и развернуть дочерние строки элемента дерева значений можно с помощью методов Свернуть() и Развернуть().

ВсеЭлементыФормы.ЭлементТаблицаФормы.Свернуть(ИдектификаторСтроки)
  • Сворачивает узел в указанной строке дерева.
  • ИдектификаторСтроки — идентификатор строки таблицы.
ВсеЭлементыФормы.ЭлементТаблицаФормы.Развернуть(ИдектификаторСтроки, СПодчиненными)
  • Разворачивает узел в указанной строке дерева.
  • ИдектификаторСтроки — идентификатор строки таблицы.
  • СПодчиненными — определяет необходимость раскрытия подчиненных узлов.
&НаКлиенте
Процедура СвернутьТекущуюСтрокуДерева(Команда)
    Элементы.ЭлементДеревоЗначений.Свернуть(
        Элементы.ЭлементДеревоЗначений.ТекущаяСтрока
    );
КонецПроцедуры

&НаКлиенте
Процедура СвернутьВерхниеСтрокиДерева(Команда)
    СтрокиДерева = РеквизитДеревоЗначений.ПолучитьЭлементы();
    Для Каждого ТекущаяСтрока Из СтрокиДерева Цикл
        Элементы.ЭлементДеревоЗначений.Свернуть(
            ТекущаяСтрока.ПолучитьИдентификатор()
        );
    КонецЦикла;
КонецПроцедуры

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

&НаКлиенте
Процедура РазвернутьВсеСтрокиДерева(Команда)
    СтрокиДерева = РеквизитДеревоЗначений.ПолучитьЭлементы();
    Для Каждого ТекущаяСтрока Из СтрокиДерева Цикл
        Элементы.ЭлементДеревоЗначений.Развернуть(
            ТекущаяСтрока.ПолучитьИдентификатор(), Истина
        );
    КонецЦикла;
КонецПроцедуры
ДанныеФормыДерево.ПолучитьЭлементы()
  • Получает коллекцию элементов дерева верхнего уровня.
  • Возвращаемое значение: ДанныеФормыКоллекцияЭлементовДерева.
ДанныеФормыЭлементДерева.ПолучитьЭлементы()
  • Получает коллекцию дочерних элементов.
  • Возвращаемое значение: ДанныеФормыКоллекцияЭлементовДерева.

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

  • ДанныеФормыСтруктура — содержит набор свойств произвольного типа. Свойствами могут быть другие структуры, коллекции или структуры с коллекциями. Таким типом представляется, например, в форме СправочникОбъект.
  • ДанныеФормыКоллекция — это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.
  • ДанныеФормыСтруктураСКоллекцией — это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.
  • ДанныеФормыДерево — объект предназначен для хранения иерархических данных.

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

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

&НаКлиенте
Процедура УдалитьСтрокуДереваЗначений(Команда)
    УдалитьСтрокуДереваЗначенийНаСервере();
КонецПроцедуры

&НаСервере
Процедура УдалитьСтрокуДереваЗначенийНаСервере()
    ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений");
    // удаляем первую строку дерева значений
    ДеревоЗначений.Строки.Удалить(0);
    ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений");
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьДеревоЗначений(Команда)
    ОчиститьДеревоЗначенийНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОчиститьДеревоЗначенийНаСервере()
    ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений");
    ДеревоЗначений.Строки.Очистить();
    ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений");
КонецПроцедуры

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

Среди наиболее часто используемых методов стоит отметить метод Найти() коллекции строк дерева значений.

КоллекцияСтрокДереваЗначений.Найти(Значение, Колонки, ВключатьПодчиненные)
  • Значение (обязательный, тип Произвольный). Искомое значение.
  • Колонки (необязательный, тип Строка). Список имен колонок, в которых будет осуществляться поиск, разделенных запятыми. Если параметр не указан, поиск осуществляется по всем колонкам дерева. Значение по умолчанию — Пустая строка.
  • ВключатьПодчиненные (необязательный, тип Булево). Определяет, будут ли участвовать в поиске строки подчиненных коллекций (если таковые имеются). Если Истина — строки подчиненных коллекций участвуют в поиске. Значение по умолчанию — Ложь.

Метод осуществляет поиск значения в дереве в указанных колонках коллекции строк дерева значений. Возвращает строку (тип СтрокаДереваЗначений), которая содержит искомое значение. Если значение не найдено, то возвращается значение Неопределено. Предназначен для поиска уникальных значений.

&НаКлиенте
Процедура НайтиСтрокуДереваЗначений(Команда)
    ЗаполнитьТабличноеПолеНаСервере();
    НайтиСтрокуДереваЗначенийНаСервере();
КонецПроцедуры

&НаСервере
Процедура НайтиСтрокуДереваЗначенийНаСервере()
    ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений");
    РезультатПоиска = ДеревоЗначений.Строки.Найти(
        ИскомоеЗначение,
        "ПерваяКолонка,ВтораяКолонка",
        Истина
    );
    Если РезультатПоиска <> Неопределено Тогда
        Сообщить(
            "Первая колонка: " + РезультатПоиска.ПерваяКолонка +
            ", Вторая колонка: " + РезультатПоиска.ВтораяКолонка
        );
    Иначе
        Сообщить("Ничего не найдено");
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТабличноеПолеНаСервере()
    Запрос = Новый Запрос();
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Номенклатура.Наименование КАК ПерваяКолонка,
        |    Номенклатура.Код КАК ВтораяКолонка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |УПОРЯДОЧИТЬ ПО
        |    ПерваяКолонка ИЕРАРХИЯ";
    ДеревоЗначений = Запрос.Выполнить().Выгрузить(
        ОбходРезультатаЗапроса.ПоГруппировкамСИерархией
    );
    ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений");
КонецПроцедуры

Поиск:
1С:Предприятие • Дерево значений • Иерархия • Коллекция • Таблица формы • Типы данных • Управляемая форма

Дерево Значений в 1С 8.3 — это иерархический динамически набор любого типа. По своим функциям и структуре (колонки и строки) очень схожа с Таблицей Значений, но есть виртуальная колонка «Родитель». Дерево значений рекомендуется использовать для работы именно с иерархической информацией. Каждая строка дерева значений имеет свойства «Родитель» и «Строки», а также может иметь любое количество подчиненных строк. Операции с помощью встроенного функционала (сортировка, раскраска строк, поиск, итоги, различные отборы) могут производится с учетом подчиненных строк / уровней иерархии.

Оглавление:

Заполнение реквизита формы Дерева Значений в 1С 8.3:

&НаСервере
Процедура ЗаполнениеРеквизитаФормыДеревоЗначений()// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
   
ДеревоЗначений = РеквизитФормыВЗначение(«ДеревоЗначНаФорме»);
   
// ДеревоЗначений = Новый ДеревоЗначений; — если без реквизитаДЗ_Корень = ДеревоЗначений.Строки.Добавить();
   
ДЗ_Корень.Наименование = «Самый верхний уровень»;ДЗ_1уровень = ДЗ_Корень.Строки.Добавить();
   
ДЗ_1уровень.Наименование = «1-ая папка (группа)»;ЭлементДЗ_1 = ДЗ_1уровень.Строки.Добавить();
   
ЭлементДЗ_1.Наименование = «Первый (вложенный) элемент»;ДЗ_2уровень = ДЗ_Корень.Строки.Добавить();
   
ДЗ_2уровень.Наименование = «2-ая папка (группа)»;ЭлементДЗ_1 = ДЗ_2уровень.Строки.Добавить();
   
ЭлементДЗ_1.Наименование = «Первый (вложенный) элемент»;ЭлементДЗ_2 = ДЗ_2уровень.Строки.Добавить();
   
ЭлементДЗ_2.Наименование = «Второй (вложенный) элемент»;// Преобразование ДеревоЗначений в реквизит формы (табличное поле)
   
ЗначениеВРеквизитФормы(ДеревоЗначений,«ДеревоЗначНаФорме»);

КонецПроцедуры

Заполнение реквизита формы Дерева Значений из Запроса в 1С 8.3:

&НаСервере
Процедура ЗаполнениеРеквизитаФормыДеревоЗначенийИзЗапроса()Запрос = Новый Запрос;
   
Запрос.Текст «ВЫБРАТЬ
    |  Материалы.Ссылка КАК Наименование
    |  Материалы.Родитель КАК Родитель
    |ИЗ
    |  Справочник.Материалы КАК Материалы
    |УПОРЯДОЧИТЬ ПО
    |  Наименование ИЕРАРХИЯ
    |ИТОГИ ПО
    |  Родитель»
;//Внимание! Если правильно не указать вид обхода результата выборки по запросу,
    //то мы получим обычную таблицу значений
   
ДеревоЗначений = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);// Заполнение дерева значений из результата запроса
    // колонка «Материалы» – это элемент справочника, колонка «Родитель» – это группа
   
ЗначениеВРеквизитФормы(ДеревоЗначений, «ДеревоЗначНаФорме»); // Преобразование в реквизит формы (табличное поле)КонецПроцедуры

Поиск строки в Дереве Значений в 1С 8.3:

&НаСервере
Процедура ПоискСтрокиВДеревеЗначений() // найдём 1-ю строку со значением «Элемент №1» в дереве значений

    // Преобразование реквизита формы в объект прикладного типа ДеревоЗначений

ДеревоЗначений = РеквизитФормыВЗначение(«ДеревоЗначНаФорме»);// Поиск строки… (если строка не найдена, вернёт «Неопределено»)
   
НайденнаяСтрокаДЗ = ДеревоЗначений.Строки.Найти(«Первый (вложенный) элемент», «Наименование», Истина);// Анализ результата поиска
   
Если НайденнаяСтрокаДЗ = Неопределено Тогда
       
Сообщить(«Строка не найдена»);
    Иначе
// вренёт первую найденную строку
       
Сообщить(«Найдена: «+НайденнаяСтрокаДЗ.Наименование + » (» + НайденнаяСтрокаДЗ.Родитель.Наименование + «)»);
    КонецЕсли;

КонецПроцедуры

Поиск всех строк в Дереве Значений в 1С 8.3:

&НаСервере
Процедура ПоискВсехСтрокВДеревеЗначений()// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
   
ДеревоЗначений = РеквизитФормыВЗначение(«ДеревоЗначНаФорме»);// Создаем структуру для поиска (условие)
   
НаименованиеДляПоиска = «Первый (вложенный) элемент»;
   
ПараметрыОтбора = Новый Структура;
   
ПараметрыОтбора.Вставить(«Наименование», НаименованиеДляПоиска);// Поиск всех строк содержащих наименование «Первый (вложенный) элемент»
   
МассивСтрок_ДЗ = ДеревоЗначений.Строки.НайтиСтроки(ПараметрыОтбора, Истина);// Проверка найдены ли строки
   
Если МассивСтрок_ДЗ.Количество() = 0 Тогда
       
Сообщить(«Ни одной строкис наименованием «+НаименованиеДляПоиска+» не найдено!»);
    КонецЕсли;
// Перебор строк
   
Для Каждого Строка_ДЗ Из МассивСтрок_ДЗ Цикл

        Если

Строка_ДЗ.Родитель = Неопределено Тогда
           
Сообщить(«Корень дерева значений: «+Строка_ДЗ.Наименование);
        Иначе
           
Сообщить(Строка_ДЗ.Наименование + » — » + Строка_ДЗ.Родитель.Наименование);
        КонецЕсли

    КонецЦикла;

КонецПроцедуры

Удаление строки из Дерева Значений в 1С 8.3:

&НаСервере
Процедура УдалениеСтрокиИзДереваЗначений()// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
   
ДеревоЗначений = РеквизитФормыВЗначение(«ДеревоЗначНаФорме»);
   
// С помощью данных методов возможно удаление конкретных строк
    // Важно! При удалении либо очистки строки — все её подчинённые строки удалятся

    // 1.Очистка всех строк

ДеревоЗначений.Строки.Очистить();// 2. Удаление по конкретному индексу
   
ДеревоЗначений.Строки.Удалить(0);// 3.Или удаление по конкретному наименованию
   
НайтиСтроку = ДеревоЗначений.Строки.Найти(«Легированная сталь«, «Наименование»);
    Если НЕ
НайтиСтроку = Неопределено Тогда
       
ДеревоЗначений.Строки.Удалить(НайтиСтроку);
    КонецЕсли;
ЗначениеВРеквизитФормы(ДеревоЗначений, «ДеревоЗначНаФорме»); // Преобразование в реквизит формы (табличное поле)КонецПроцедуры

Обход Дерева Значений (с помощью рекурсии) в 1С 8.3:

&НаСервере
Процедура ОбойтиДЗ_НаСервере()// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
   
ДеревоЗначений = РеквизитФормыВЗначение(«ДеревоЗначНаФорме»);
   
ОбходДЗ_Рекурсия(ДеревоЗначений);

КонецПроцедуры

&НаСервере
Процедура ОбходДЗ_Рекурсия(перДеревоЗначений)

    Для Каждого

Строка_Рек Из перДеревоЗначений.Строки Цикл

        Если

Строка_Рек.Строки.Количество()>0 Тогда
           
ОбходДЗ_Рекурсия(Строка_Рек);
        КонецЕсли;

    КонецЦикла;

КонецПроцедуры

Свертка всего Дерева Значений (на форме) в 1С 8.3:

&НаКлиенте
Процедура СверткаВсегоДереваЗначенийНаФорме()// ДеревоЗначНаФорме — на форме
   
КоллекцияЭлементовДерева=ДеревоЗначНаФорме.ПолучитьЭлементы();
   
//Свернуть дерево
   
Для Каждого СтрокаКоллекции Из КоллекцияЭлементовДерева Цикл
       
ИдСтроки=СтрокаКоллекции.ПолучитьИдентификатор();
       
Элементы.ДеревоЗначНаФорме.Свернуть(ИдСтроки); // Сворачиваем каждую строку тут
   
КонецЦикла;

КонецПроцедуры

Разворот всего Дерева Значений (на форме) в 1С 8.3:

&НаКлиенте
Процедура РазворотВсегоДереваЗначенийНаФорме()// ДеревоЗначНаФорме — на форме
   
КоллекцияЭлементовДерева=ДеревоЗначНаФорме.ПолучитьЭлементы();
   
//Развернуть дерево
   
Для Каждого СтрокаКоллекции Из КоллекцияЭлементовДерева Цикл
       
ИдСтроки=СтрокаКоллекции.ПолучитьИдентификатор();
       
Элементы.ДеревоЗначНаФорме.Развернуть(ИдСтроки);// Разворачиваем каждую строку тут
   
КонецЦикла;

КонецПроцедуры

Разворот текущей строки Дерева Значений (на форме) в 1С 8.3:

&НаКлиенте
Процедура РазворотТекСтрокиДереваЗначенийНаФорме() // Разворот текущей строки в дереве:СтрокаДЗ = Элементы.ДеревоЗначНаФорме.ТекущаяСтрока;
   
Элементы.ДеревоЗначНаФорме.Развернуть(СтрокаДЗ, Истина);// Определим, развернут ли узел дерева в указанной строке.
   
УзелРазвернут = Элементы.ДеревоЗначНаФорме.Развернут(СтрокаДЗ);
    Если
УзелРазвернут Тогда // Если узел Развернут, то Свернуть
       
Элементы.ДеревоЗначНаФорме.Свернуть(СтрокаДЗ);
    КонецЕсли;

КонецПроцедуры

Свернуть все выделенные строки Дерева Значений (на форме) в 1С 8.3:

&НаКлиенте
Процедура СвернутьВсеВыделенныеСтрокиДереваЗначенийНаФорме()

    Для Каждого

СтрокаДЗ Из Элементы.ДеревоЗначНаФорме.ВыделенныеСтроки Цикл
       
Элементы.ДеревоЗначНаФорме.Свернуть(СтрокаДЗ);
    КонецЦикла;

КонецПроцедуры

💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #ДеревоЗначений:

📰 Актуальные новости с тегом #ДеревоЗначений:

  • В версии 8.3.22 анонсирован дополнительный контроль заполнения значений в УФ. Проверка заполненности колонок дерева и таблицы значений

Copyright©, «Программист 1С в г.Минске», 14.10.2020

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

Дерево значений — это универсальная коллекция 1С, которая позволяет хранить данные в иерархическом виде. Данная коллекция похожа на таблицу значений, но в дереве каждая строка может иметь подчиненные строки.

Поиск, сортировка и получение итогов могут выполняться как только по одному уровню иерархии, так и включая подчиненные строки.

В толстом клиенте нельзя передавать дерево значений с клиента на сервер. На тонком клиенте дерево значений не доступно.

Создание дерева значений

Создать новое дерево значений можно с помощью конструктора:

//создание дерева без колонок и строк
ДеревоТоваров = Новый ДеревоЗначений;

У дерева значений есть свойства Колонки и Строки. Для добавления новых строк сначала нужно добавить колонки дерева:

//добавление колонок в дерево значений
ДеревоТоваров.Колонки.Добавить(«Номенклатура»);
ДеревоТоваров.Колонки.Добавить(«Цена»);

Теперь через свойство Строки можно добавлять строки дерева:

//добавление новых строк
СтрДерева = ДеревоТоваров.Строки.Добавить();
СтрДерева.Номенклатура = «Монитор»;
СтрДерева.Цена = 10000;

СтрДерева= ДеревоТоваров.Строки.Добавить();
СтрДерева.Номенклатура = «Системный блок»;
СтрДерева.Цена = 30000;

Новые строки будут добавлены на первый уровень иерархии. Чтобы добавить к существующей строке подчиненные строки нужно обратиться к свойству Строки существующей строки дерева значений:

ПодчиненнаяСтрока = СтрДерева.Строки.Добавить();
ПодчиненнаяСтрока.Номенклатура = «Процессор»;
ПодчиненнаяСтрока.Цена = 10000;

ПодчиненнаяСтрока = СтрДерева.Строки.Добавить();
ПодчиненнаяСтрока.Номенклатура = «Оперативная память»;
ПодчиненнаяСтрока.Цена = 5000;

В результате у строки с номенклатурой «Системный блок» будет 2 подчиненных строки с процессором и оперативной памятью.

Рассмотрим другие операции с деревом значений:

//вставить новую строку в самое начало
СтрДерева = ДеревоТоваров.Строки.Вставить(0); //указываем индекс строки,
//куда ее нужно вставить
СтрДерева.Номенклатура = «Клавиатура»;
СтрДерева.Цена = 1000;

//к строкам можно обращаться через квадратные скобки
//в квадратных скобках указывается индекс строки
Сообщить(ДеревоТоваров.Строки[1].Номенклатура); //Монитор

//через квадратные скобки можно обращаться к колонкам дерева через имя колонки
СтрДерева[«Цена»] = 1500; //теперь Клавиатура стоит 1500

//можно через методы Установить и Получить
СтрДерева.Установить(1, 2000); //первым параметром передается индекс колонки
Сообщить(СтрДерева.Получить(1)); //2000

//с помощью метода Владелец из строки можно получить само дерево
СсылкаНаДерево = СтрДерева.Владелец(); //получаем само дерево

//через свойство Родитель у подчиненной строки можно получить родительскую строку
РодСтрока = ПодчиненнаяСтрока.Родитель;
Сообщить(РодСтрока.Номенклатура); // Монитор

Колонки дерева значений

Вся работа с колонками дерева значений осуществляется через свойство Колонки дерева. Колонки одинаковые для всех строк, включая подчиненные строки.

ДеревоЗаказов = Новый ДеревоЗначений; //добавление новой колонки дерева значений ДеревоЗаказов.Колонки.Добавить("Заказ"); //добавление типизированной колонки ДеревоЗаказов.Колонки.Добавить("СуммаЗаказа", Новый ОписаниеТипов("Число")); //проверка есть ли такая колонка НайдКолДер = ДеревоЗаказов.Колонки.Найти("Заказ"); Если НайдКолДер = Неопределено Тогда //нет такой колонки Иначе //НайдКолДер- ссылка на колонку дерева КонецЕсли; //количество колонок Колво = ДеревоЗаказов.Колонки.Количество(); //перебор всех колонок Для Каждого КолДер Из ДеревоЗаказов.Колонки Цикл //у колонки есть свойства Имя, ТипЗначения, Заголовок и Ширина Сообщить(КолДер.Имя); Сообщить(КолДер.ТипЗначения); Сообщить(КолДер.Заголовок); Сообщить(КолДер.Ширина); //Заголовок и Ширина используются если дерево отображается на форме КонецЦикла; //удаление одной колонки ДеревоЗаказов.Колонки.Удалить(0); //удаляем первую строку //удаление всех колонок ДеревоЗаказов.Колонки.Очистить();

Итоги по дереву значений

Для получения итога по числовой колонке дерева значений можно использовать метод Итог:

ДеревоСумм = Новый ДеревоЗначений;
ДеревоСумм.Колонки.Добавить(«Сумма»);

//добавим 2 строки на первый уровень
СтрДерева = ДеревоСумм.Строки.Добавить();
СтрДерева.Сумма = 100;

СтрДерева = ДеревоСумм.Строки.Добавить();
СтрДерева.Сумма = 200;

//и 2 подчиненные строки у второй строки
ПодчиненнаяСтрока = СтрДерева.Строки.Добавить();
ПодчиненнаяСтрока.Сумма = 50;

ПодчиненнаяСтрока = СтрДерева.Строки.Добавить();
ПодчиненнаяСтрока.Сумма = 60;

//получим итог по строкам первого уровня
Сообщить(ДеревоСумм.Строки.Итог(«Сумма», Ложь)); //300

//чтобы получить итог по всем строкам, включая подчиненные
//нужно вторым параметром передать Истина
Сообщить(ДеревоСумм.Строки.Итог(«Сумма», Истина)); //410

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

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

ДеревоТоваров = Новый ДеревоЗначений;
ДеревоТоваров.Колонки.Добавить(«Товар»);

//добавим 3 строки на первый уровень
СтрДерева = ДеревоТоваров.Строки.Добавить();
СтрДерева.Товар = «Монитор»;

СтрДерева = ДеревоТоваров.Строки.Добавить();
СтрДерева.Товар = «Монитор»;

СтрДерева = ДеревоТоваров.Строки.Добавить();
СтрДерева.Товар = «Системный блок»;

//и 2 подчиненные строки у третьей строки
ПодчиненнаяСтрока = СтрДерева.Строки.Добавить();
ПодчиненнаяСтрока.Товар = «Процессор»;

ПодчиненнаяСтрока = СтрДерева.Строки.Добавить();
ПодчиненнаяСтрока.Товар = «Диск»;

//первый параметр значение поиска
//второй — колонка дерева для поиска
НайдСтр = ДеревоТоваров.Строки.Найти(«Монитор», «Товар», Ложь);
//вернет первую строку

НайдСтр = ДеревоТоваров.Строки.Найти(«Диск», «Товар», Ложь);
//вернет Неопределено, строка не найдена

НайдСтр = ДеревоТоваров.Строки.Найти(«Диск», «Товар», Истина);
//вернет подчиненную строку

//параметром передается структура
//ключ — колонка дерева для поиска
//значение — значение поиска
//можно указать несколько ключей, поиск будет выполняться по всем совпадениям
Отбор = Новый Структура(«Товар», «Монитор»);
НС = ДеревоТоваров.Строки.НайтиСтроки(Отбор, Ложь);
//вернет массив с двумя строками

Отбор = Новый Структура(«Товар», «Диск»);
НС = ДеревоТоваров.Строки.НайтиСтроки(Отбор, Ложь);
//вернет пустой массив

НС = ДеревоТоваров.Строки.НайтиСтроки(Отбор, Истина);
//вернет массив с одной подчиненной строкой

Удаление строк из дерева значений

Для удаления строк из дерева значений используются методы Удалить и Очистить. Метод Удалить удаляет строку, включая все подчиненные ей строки. Метод Очистить удаляет все строки из дерева значений.

ДеревоТоваров = Новый ДеревоЗначений;
ДеревоТоваров.Колонки.Добавить(«Товар»);

//добавим 3 строки на первый уровень
ПерваяСтрока = ДеревоТоваров.Строки.Добавить();
ПерваяСтрока.Товар = «Монитор»;

ВтораяСтрока = ДеревоТоваров.Строки.Добавить();
ВтораяСтрока.Товар = «Монитор»;

ТретьяСтрока = ДеревоТоваров.Строки.Добавить();
ТретьяСтрока.Товар = «Системный блок»;

//и 2 подчиненные строки у третьей строки
ПодчиненнаяСтрока = ТретьяСтрока.Строки.Добавить();
ПодчиненнаяСтрока.Товар = «Процессор»;

ПодчиненнаяСтрока = ТретьяСтрока.Строки.Добавить();
ПодчиненнаяСтрока.Товар = «Диск»;

//удалим строку с системным блоком:
ДеревоТоваров.Строки.Удалить(ТретьяСтрока);

//удалим строку с первым монитором по индексу
ДеревоТоваров.Строки.Удалить(0);

//удалим все строки дерева
ДеревоТоваров.Строки.Очистить();

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

Сортировка дерева значений

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

ДеревоТоваров = Новый ДеревоЗначений;
ДеревоТоваров.Колонки.Добавить(«Количество»);

//добавим 3 строки на первый уровень
ПерваяСтрока = ДеревоТоваров.Строки.Добавить();
ПерваяСтрока.Количество = «2»;

ВтораяСтрока = ДеревоТоваров.Строки.Добавить();
ВтораяСтрока.Количество = «1»;

ТретьяСтрока = ДеревоТоваров.Строки.Добавить();
ТретьяСтрока.Количество = «3»;

//и 3 подчиненные строки у третьей строки
ПодчиненнаяСтрока = ТретьяСтрока.Строки.Добавить();
ПодчиненнаяСтрока.Количество = «20»;

ПодчиненнаяСтрока = ТретьяСтрока.Строки.Добавить();
ПодчиненнаяСтрока.Количество = «10»;

ПодчиненнаяСтрока = ТретьяСтрока.Строки.Добавить();
ПодчиненнаяСтрока.Количество = «30»;

//отсортируем по возрастанию
ДеревоТоваров.Строки.Сортировать(«Количество», Ложь);
//так как второй параметр равен Ложь, то подчиненные строки
//не были отсортированы

//отсортируем по убыванию, включая подчиненные строки
//чтобы отсортировать по убыванию нужно после имени колонки указать Убыв
ДеревоТоваров.Строки.Сортировать(«Количество Убыв», Истина);

Создание копии дерева значений

Для создания полной копии дерева значений можно воспользоваться методом Скопировать.

ДеревоТоваров = Новый ДеревоЗначений;
ДеревоТоваров.Колонки.Добавить(«Количество»);

//добавим 3 строки на первый уровень
ПерваяСтрока = ДеревоТоваров.Строки.Добавить();
ПерваяСтрока.Количество = «2»;

ВтораяСтрока = ДеревоТоваров.Строки.Добавить();
ВтораяСтрока.Количество = «1»;

ТретьяСтрока = ДеревоТоваров.Строки.Добавить();
ТретьяСтрока.Количество = «3»;

//и 3 подчиненные строки у третьей строки
ПодчиненнаяСтрока = ТретьяСтрока.Строки.Добавить();
ПодчиненнаяСтрока.Количество = «20»;

ПодчиненнаяСтрока = ТретьяСтрока.Строки.Добавить();
ПодчиненнаяСтрока.Количество = «10»;

ПодчиненнаяСтрока = ТретьяСтрока.Строки.Добавить();
ПодчиненнаяСтрока.Количество = «30»;

// создание полной копии дерева, со всеми строками и колонками
КопияДерева = ДеревоТоваров.Скопировать();

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

Рекурсивный обход дерева значений

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

&НаСервере Процедура Команда1НаСервере() ДеревоТоваров = Новый ДеревоЗначений; ДеревоТоваров.Колонки.Добавить("Количество"); //добавим 3 строки на первый уровень ПерваяСтрока = ДеревоТоваров.Строки.Добавить(); ПерваяСтрока.Количество = "2"; ВтораяСтрока = ДеревоТоваров.Строки.Добавить(); ВтораяСтрока.Количество = "1"; ТретьяСтрока = ДеревоТоваров.Строки.Добавить(); ТретьяСтрока.Количество = "3"; //и 3 подчиненные строки у третьей строки ПодчиненнаяСтрока = ТретьяСтрока.Строки.Добавить(); ПодчиненнаяСтрока.Количество = "20"; ПодчиненнаяСтрока = ТретьяСтрока.Строки.Добавить(); ПодчиненнаяСтрока.Количество = "10"; ПодчиненнаяСтрока = ТретьяСтрока.Строки.Добавить(); ПодчиненнаяСтрока.Количество = "30"; //обход только строк верхнего уровня Для Каждого СтрДер Из ДеревоТоваров.Строки Цикл Сообщить(СтрДер.Количество); КонецЦикла; //обход всего дерева значений РекурсивныйОбходДереваЗначений(ДеревоТоваров); КонецПроцедуры &НаСервере Процедура РекурсивныйОбходДереваЗначений(ДеревоЗначенийИлиСтрокаДерева) Для Каждого СтрДер Из ДеревоЗначенийИлиСтрокаДерева.Строки Цикл Сообщить(СтрДер.Количество); //передаем строку дерева в эту же процедуру //чтобы обойти все ее подчиненные строки РекурсивныйОбходДереваЗначений(СтрДер); КонецЦикла; КонецПроцедуры

Смотрите также:
Электронный учебник по по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Программное решение для сдачи и подготовки к экзаменам
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Понравилась статья? Поделить с друзьями:
  • Потеряла серебряную серьгу как найти
  • Как найти улицу в красноярске
  • Как найти все сообщения в инстаграмме
  • Как найти мусульман вконтакте
  • Как найти видеозвонок на телефоне