Дерево значений как найти в поиске

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

Синтаксис

Метод Найти() имеет следующий синтаксис:

СтрокаДереваЗначений Найти(Значение, [Колонки=""], [ВключатьПодчиненные])

А также альтернативный англоязычный синтаксис:

ValueTreeString Find(Value, [Columns=""], [IncNested])

Параметры

Описание параметров метода Найти():

Имя параметра* Тип Описание
Значение Произвольный Искомое значение.
Колонки Строка Список имен колонок, разделенных запятыми, по которым производится поиск.

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

ВключатьПодчиненные Булево Признак включения в поиск подчиненных строк.

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

*Жирным шрифтом выделены обязательные параметры

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

СтрокаДереваЗначений — первая найденная строка, в которой содержится искомое значение
Неопределено — строка не найдена

Описание

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

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

Внимание!! Метод находит только первую строку с указанным значением. Чтобы найти все строки, воспользуйтесь методом ДеревоЗначений.Строки.НайтиСтроки()

Доступность

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).

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

Пример кода с использованием метода Найти():

//ДеревоЗначений - табличное поле на форме
//добавим корневую строку
КорневаяСтрока = ДеревоЗначений.Строки.Добавить();
КорневаяСтрока.Наименование = "МЕБЕЛЬ";

//добавим подчиненные строки для корневой
НоваяСтрока = КорневаяСтрока.Строки.Добавить();
НоваяСтрока.Наименование = "Стол деревянный";
НоваяСтрока.КодТовара = "СТО_Д_1";

НоваяСтрока = КорневаяСтрока.Строки.Добавить();
НоваяСтрока.Наименование = "Стул деревянный";
НоваяСтрока.КодТовара = "СТУ_Д_1";

НайдСтрока = ДеревоЗначений.Строки.Найти("СТУ_Д_1", "КодТовара", Истина);
Если НЕ НайдСтрока = Неопределено Тогда
	//установим строку на форме текущей
	ЭлементыФормы.ДеревоЗначений.ТекущаяСтрока = НайдСтрока;
КонецЕсли;

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

  1. Дерево значений 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.Контрагент = “Первый покупатель”;

ОстаткиКонтрагент1.Количество = 100;

детали по первому контрагенту

СтрокаОстатки = ОстаткиКонтрагент1.Строки.Добавить();

СтрокаОстатки.Контрагент = “Первый покупатель”;

СтрокаОстатки.Номенклатура = “Корзина”;

СтрокаОстатки.Количество = 50;

СтрокаОстатки = ОстаткиКонтрагент1.Строки.Добавить();

СтрокаОстатки.Контрагент = “Первый покупатель”;

СтрокаОстатки.Номенклатура = “Прутья”;

СтрокаОстатки.Количество = 50;

ОстаткиКонтрагент2 = ДеревоОстатки.Строки.Добавить();

ОстаткиКонтрагент2.Контрагент = “Второй покупатель”;

ОстаткиКонтрагент2.Количество = 200;

детали по первому контрагенту

СтрокаОстатки = ОстаткиКонтрагент2.Строки.Добавить();

СтрокаОстатки.Контрагент = “Второй покупатель”;

СтрокаОстатки.Номенклатура = “Корзина”;

СтрокаОстатки.Количество = 160;

СтрокаОстатки = ОстаткиКонтрагент1.Строки.Добавить();

СтрокаОстатки.Контрагент = “Второй покупатель”;

СтрокаОстатки.Номенклатура = “Прутья”;

СтрокаОстатки.Количество = 40;

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

КоличествоСтрокВерхУровня = ДеревоОстатки.Строки.Количество();

количество верхнего уровня

КоличествоПервый = ОстаткиКонтрагент1.Строки.Количество(); //количество первого уровня

КоличествоВторой = ОстаткиКонтрагент1.Строки.Количество();//количество второго уровня

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

СтрокаПрутья = ДеревоОстатки.Строки.Найти(“Прутья”,”Номенклатура”,Истина);

Если СтрокаПрутья = Неопределено Тогда

Сообщить(“Строка не найдена”);

Иначе

Сообщить(“” + СтрокаПрутья.Количество);

КонецЕсли;

Как найти все элементы дерева значений, которые удовлетворяют условию поиска

ПараметрыОтбора = Новый Структура(“Номенклатура”,”Корзина”);

ВсеСтрокиКорзина = ДеревоОстатки.Строки.НайтиСтроки(ПараметрыОтбора,Истина);

Сообщить(“Найдено строк: ” + ВсеСтрокиКорзина.Количество());

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

ДеревоОстатки.Строки.Сортировать(“Количество Убыв”,Истина);

Обход всех элементов дерева значения

для обхода необходима процедура, которая будет вызывать сама себя(рекурсия)

ОбходДереваЗначения(ДеревоОстатки.Строки);

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

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

/////////////////////////////

&НаСервере

Процедура ОбходДереваЗначения(КолекцияСтрокДерева)

Для каждого СтрокаДерева Из КолекцияСтрокДерева Цикл

Сообщить(“Уровень: ” + СтрокаДерева.Уровень() + “, ” + СтрокаДерева.Контрагент + “, ” + СтрокаДерева.Номенклатура + “, ” + СтрокаДерева.Количество);

Если СтрокаДерева.Строки.Количество()>0 Тогда

ОбходДереваЗначения(СтрокаДерева.Строки);

КонецЕсли;

КонецЦикла;

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

Шпаргалка по массиву

Шпаргалка по структуре

Шпаргалка по соответствию

Шпаргалка по списку значений

Шпаргалка по таблице значений

Шпаргалка по дереву значений

Обработка с универсальными коллекциями

Дерево значений — это универсальная коллекция 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-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

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

Я
   AlexHP

31.03.10 – 08:41

Сабж

   Невский Александр

1 – 31.03.10 – 08:44

КоллекцияСтрокДереваЗначений (ValueTreeRowCollection)

Найти (Find)

Синтаксис:

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

Параметры:

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

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

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

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

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

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

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

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

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

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

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

Описание:

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

Примечание:

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

Пример:

НайденнаяСтрока = СтрокиСостава.Найти(ТекЗатрата, “Затрата”);

Если НайденнаяСтрока = Неопределено Тогда

   Предупреждение(“Затрата не найдена!”);

Иначе

   Количество = НайденнаяСтрока.Норма;

КонецЕсли;

   AlexHP

2 – 31.03.10 – 08:50

уточню:

ПараметрыОтбора = Новый Структура;

   ПараметрыОтбора.Вставить( “Наименование”,”Банк”);

   ПараметрыОтбора.Вставить( “Наименование”,”Касса”);

   РезультатПоиска = ОбработкаОбмен.ТаблицаПравилВыгрузки.Строки.НайтиСтроки(ПараметрыОтбора,ИСТИНА);

   Для Каждого НайдСтрока Из РезультатПоиска Цикл

       НайдСтрока.ИспользоватьОтбор = Истина;

   КонецЦикла;

хз почему но не находит

   Невский Александр

3 – 31.03.10 – 08:57

(2) А точно – “Банк” или “Касса”, без пробелов?

   AlexHP

4 – 31.03.10 – 09:12

Точно!

Самое интересное находит только то что в структуре добавлено последней строкой

   AlexHP

5 – 31.03.10 – 09:12

Тоесть в данном варианте “Касса”

   butterbean

6 – 31.03.10 – 09:13

(5) надо     ПараметрыОтбора.Вставить( “Банк”,”Наименование”);
   ПараметрыОтбора.Вставить( “Касса”,”Наименование”);

   AlexHP

7 – 31.03.10 – 09:16

(6) нет))

   butterbean

8 – 31.03.10 – 09:19

(7) что “нет”?? ты два раза вставил ключ “Наименование”… но если “Наименование” это колонка, то через НайтиСтроки() ты не найдешь два значения

   AlexHP

9 – 31.03.10 – 09:22

(8) семен семёныч)))

Спасибо!

Но предложенный вариант(6) не сработает… Параметры в функцию

РезультатПоиска = ОбработкаОбмен.ТаблицаПравилВыгрузки.Строки.НайтиСтроки(ПараметрыОтбора,ИСТИНА);

Передадутся в неправильном порядке!

  

butterbean

10 – 31.03.10 – 09:28

(9) я же не знаю какие у тебя в дереве колонки

Добавить комментарий