Осуществляет поиск строки в коллекции строк дерева значений по значению
Синтаксис
Метод Найти()
имеет следующий синтаксис:
СтрокаДереваЗначений Найти(Значение, [Колонки=""], [ВключатьПодчиненные])
А также альтернативный англоязычный синтаксис:
ValueTreeString Find(Value, [Columns=""], [IncNested])
Параметры
Описание параметров метода Найти()
:
Имя параметра* | Тип | Описание |
---|---|---|
Значение | Произвольный | Искомое значение. |
Колонки | Строка | Список имен колонок, разделенных запятыми, по которым производится поиск.
Значение по умолчанию: пустая строка. |
ВключатьПодчиненные | Булево | Признак включения в поиск подчиненных строк.
Значение по умолчанию: Ложь |
*Жирным шрифтом выделены обязательные параметры |
Возвращаемое значение
СтрокаДереваЗначений | — первая найденная строка, в которой содержится искомое значение |
Неопределено |
— строка не найдена |
Описание
Метод Найти()
осуществляет поиск строки в коллекции строк дерева значений, содержащей искомое значение. По умолчанию, поиск осуществляется по всем колонкам дерева значений. Однако, если указать параметр Колонки
, поиск будет осуществляется только в указанной колонкеколонках.
Внимание! Метод эффективно использовать для поиска уникальных значений.
Внимание!! Метод находит только первую строку с указанным значением. Чтобы найти все строки, воспользуйтесь методом ДеревоЗначений.Строки.НайтиСтроки()
Доступность
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример использования
Пример кода с использованием метода Найти()
:
//ДеревоЗначений - табличное поле на форме //добавим корневую строку КорневаяСтрока = ДеревоЗначений.Строки.Добавить(); КорневаяСтрока.Наименование = "МЕБЕЛЬ"; //добавим подчиненные строки для корневой НоваяСтрока = КорневаяСтрока.Строки.Добавить(); НоваяСтрока.Наименование = "Стол деревянный"; НоваяСтрока.КодТовара = "СТО_Д_1"; НоваяСтрока = КорневаяСтрока.Строки.Добавить(); НоваяСтрока.Наименование = "Стул деревянный"; НоваяСтрока.КодТовара = "СТУ_Д_1"; НайдСтрока = ДеревоЗначений.Строки.Найти("СТУ_Д_1", "КодТовара", Истина); Если НЕ НайдСтрока = Неопределено Тогда //установим строку на форме текущей ЭлементыФормы.ДеревоЗначений.ТекущаяСтрока = НайдСтрока; КонецЕсли;
Читайте также:
- Дерево значений 1с. Описание и примеры использования
Поделиться страницей в соц.сетях
- АКТУАЛЬНЫЕ РЕЛИЗЫ 1С
- ПРИМЕРЫ КОДА НА ПЛАТФОРМЕ 1С
Работа с деревом значений в 1С 8.x
- Как самостоятельно заполнить дерево значений?
- Как в дереве значений найти строку по определенному условию?
Как самостоятельно заполнить дерево значений?
Процедура ЗаполнениеДерева(Кнопка)
Дерево.Колонки.Очистить();
Дерево.Колонки.Добавить("ИмяКолонки");
// Создать первую строку. Правильнее сказать создать элемент
// коллекции. Он помещается в переменную "СтрокаВерхнегоУровня".
СтрокаВерхнегоУровня = Дерево.Строки.Добавить();
// В колонку "ИмяКолонки" записать значение "Старшая".
СтрокаВерхнегоУровня.ИмяКолонки = "Старшая";
// Создать строку подчиненную "Старшей".
ПодчиненнаяСтрока =СтрокаВерхнегоУровня.Строки.Добавить();
ПодчиненнаяСтрока.ИмяКолонки = "Первая подчиненная";
ПодчиненнаяВторогоУровня = ПодчиненнаяСтрока.Строки.Добавить();
ПодчиненнаяВторогоУровня.ИмяКолонки = "Первая нижняя";
ПодчиненнаяВторогоУровня = ПодчиненнаяСтрока.Строки.Добавить();
ПодчиненнаяВторогоУровня.ИмяКолонки = "Вторая нижняя";
ПодчиненнаяСтрока = СтрокаВерхнегоУровня.Строки.Добавить();
ПодчиненнаяСтрока.ИмяКолонки = "Вторая подчиненная";
// Использование метода позволит увидеть результат работы
// с деревом значений в табличном поле.
ЭлементыФормы.Дерево.СоздатьКолонки();
КонецПроцедуры
Процедура ОткрытиеВетки(Кнопка)
// Сделать текущим именно элемент коллекции "Строки".
РезультатПоиска = Дерево.Строки.Найти("Первая нижняя", "ИмяКолонки", Истина);
Если РезультатПоиска <> Неопределено Тогда
ЭлементыФормы.Дерево.ТекущаяСтрока = РезультатПоиска;
КонецЕсли;
КонецПроцедуры
Как в дереве значений найти строку по определенному условию?
// С деревом значений проблема в том, что по сути это массив строк с данными,
// каждая строка в котором может иметь свой массив строк, а может и не иметь.
// Ниже приведен пример функции, которая возвращает строку, найденную по
// определенному условию
// Получаем искомую строку вызвав функцию, в функцию передаем строки дерева
// значений на первом уровне:
ОписаниеМетаданныхЗагрузки = НайтиОтмеченноеЗначениеВДеревеЗначений(ДеревоМетаданных.Строки);
// Эта функция осуществляет поиск строки
// Если строка найдена, возвращает найденною строку дерева
// Если строка не найдена, возвращает неопределено
Функция НайтиОтмеченноеЗначениеВДеревеЗначений(СтрокиДерева)
// пробежимся по всем строкам (по всем строкам одного уровня, которые были переданы!)
Для каждого Строка из СтрокиДерева Цикл
// Вот наше условие, значение Выгружать у строки равно 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.Количество = 100;
детали по первому контрагенту
СтрокаОстатки = ОстаткиКонтрагент1.Строки.Добавить();
СтрокаОстатки.Контрагент = “Первый покупатель”;
СтрокаОстатки.Номенклатура = “Корзина”;
СтрокаОстатки.Количество = 50;
СтрокаОстатки = ОстаткиКонтрагент1.Строки.Добавить();
СтрокаОстатки.Контрагент = “Первый покупатель”;
СтрокаОстатки.Номенклатура = “Прутья”;
СтрокаОстатки.Количество = 50;
ОстаткиКонтрагент2 = ДеревоОстатки.Строки.Добавить();
ОстаткиКонтрагент2.Контрагент = “Второй покупатель”;
ОстаткиКонтрагент2.Количество = 200;
детали по первому контрагенту
СтрокаОстатки = ОстаткиКонтрагент2.Строки.Добавить();
СтрокаОстатки.Контрагент = “Второй покупатель”;
СтрокаОстатки.Номенклатура = “Корзина”;
СтрокаОстатки.Количество = 160;
СтрокаОстатки = ОстаткиКонтрагент1.Строки.Добавить();
СтрокаОстатки.Контрагент = “Второй покупатель”;
СтрокаОстатки.Номенклатура = “Прутья”;
СтрокаОстатки.Количество = 40;
Как получить количество элементов в дереве значений
КоличествоСтрокВерхУровня = ДеревоОстатки.Строки.Количество();
количество верхнего уровня
КоличествоПервый = ОстаткиКонтрагент1.Строки.Количество(); //количество первого уровня
КоличествоВторой = ОстаткиКонтрагент1.Строки.Количество();//количество второго уровня
Как найти один элемент в дереве значений
СтрокаПрутья = ДеревоОстатки.Строки.Найти(“Прутья”,”Номенклатура”,Истина);
Если СтрокаПрутья = Неопределено Тогда
Сообщить(“Строка не найдена”);
Иначе
Сообщить(“” + СтрокаПрутья.Количество);
КонецЕсли;
Как найти все элементы дерева значений, которые удовлетворяют условию поиска
ПараметрыОтбора = Новый Структура(“Номенклатура”,”Корзина”);
ВсеСтрокиКорзина = ДеревоОстатки.Строки.НайтиСтроки(ПараметрыОтбора,Истина);
Сообщить(“Найдено строк: ” + ВсеСтрокиКорзина.Количество());
Как выполнить сортировку в дереве значений
ДеревоОстатки.Строки.Сортировать(“Количество Убыв”,Истина);
Обход всех элементов дерева значения
для обхода необходима процедура, которая будет вызывать сама себя(рекурсия)
ОбходДереваЗначения(ДеревоОстатки.Строки);
Как очистить дерево значения
ДеревоОстатки.Строки.Очистить();
/////////////////////////////
&НаСервере
Процедура ОбходДереваЗначения(КолекцияСтрокДерева)
Для каждого СтрокаДерева Из КолекцияСтрокДерева Цикл
Сообщить(“Уровень: ” + СтрокаДерева.Уровень() + “, ” + СтрокаДерева.Контрагент + “, ” + СтрокаДерева.Номенклатура + “, ” + СтрокаДерева.Количество);
Если СтрокаДерева.Строки.Количество()>0 Тогда
ОбходДереваЗначения(СтрокаДерева.Строки);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Шпаргалка по массиву
Шпаргалка по структуре
Шпаргалка по соответствию
Шпаргалка по списку значений
Шпаргалка по таблице значений
Шпаргалка по дереву значений
Обработка с универсальными коллекциями
Дерево значений представляет из себя некую структуру с иерархией. Каждая строка имеет свойства «Родитель» и «Строки». У каждой строки может быть сколько угодно подчиненных строк. При этом такие операции как поиск, сортировка, подсчет итогов можно проводить с учетом уровня иерархии и подчиненных строк.
Программное создание дерева значений
Как уже упоминалось выше, каждая строка имеет свойство Строки
, которое содержит коллекцию дочерних строк. И сам объект ДеревоЗначений
имеет свойство Строки
, которое содержит коллекцию строк верхнего уровня.
&НаКлиенте Процедура СоздатьДеревоЗначений(Команда) СоздатьДеревоЗначенийНаСервере(); КонецПроцедуры &НаСервере Процедура СоздатьДеревоЗначенийНаСервере() // создаем объект ДеревоЗначений и добавляем колонки ДеревоЗначений = Новый ДеревоЗначений(); ДеревоЗначений.Колонки.Добавить("Код"); ДеревоЗначений.Колонки.Добавить("Наименование"); ДеревоЗначений.Колонки.Добавить("Количество"); // добавляем две строки верхнего уровня ГруппаТовары = ДеревоЗначений.Строки.Добавить(); ГруппаТовары.Код = "001"; ГруппаТовары.Наименование = "Товары"; ГруппаТовары.Количество = ""; ГруппаУслуги = ДеревоЗначений.Строки.Добавить(); ГруппаУслуги.Код = "002"; ГруппаУслуги.Наименование = "Услуги"; ГруппаУслуги.Количество = ""; // для первой строки верхнего уровня добавляем дочерние строки ПервыйТовар = ГруппаТовары.Строки.Добавить(); ПервыйТовар.Код = "003"; ПервыйТовар.Наименование = "Первый товар"; ПервыйТовар.Количество = 5; ПервыйТовар = ГруппаТовары.Строки.Добавить(); ПервыйТовар.Код = "004"; ПервыйТовар.Наименование = "Второй товар"; ПервыйТовар.Количество = 7; // для второй строки верхнего уровня добавляем дочерние строки ПерваяУслуга = ГруппаУслуги.Строки.Добавить(); ПерваяУслуга.Код = "005"; ПерваяУслуга.Наименование = "Первая услуга"; ПерваяУслуга.Количество = ""; ВтораяУслуга = ГруппаУслуги.Строки.Добавить(); ВтораяУслуга.Код = "006"; ВтораяУслуга.Наименование = "Вторая услуга"; ВтораяУслуга.Количество = ""; // цикл по строкам верхнего уровня Для Каждого ТекущаяГруппа Из ДеревоЗначений.Строки Цикл Сообщить("Код: " + ТекущаяГруппа.Код + ", Группа: " + ТекущаяГруппа.Наименование); // цикл по дочерним строкам текущей строки верхнего уровня Для Каждого ТекущийТоварИлиУслуга Из ТекущаяГруппа.Строки Цикл Сообщить( "Код: " + ТекущийТоварИлиУслуга.Код + ", Товар или услуга: " + ТекущийТоварИлиУслуга.Наименование ); КонецЦикла; КонецЦикла; КонецПроцедуры
Код: 001, Группа: Товары Код: 003, Товар или услуга: Первый товар Код: 004, Товар или услуга: Второй товар Код: 002, Группа: Услуги Код: 005, Товар или услуга: Первая услуга Код: 006, Товар или услуга: Вторая услуга
КоллекцияКолонокДереваЗначений.Добавить(Имя, Тип, Заголовок, Ширина)
- Добавляет колонку в конец коллекции колонок дерева значений.
- Возвращаемое значение:
КолонкаДереваЗначений
.
КоллекцияСтрокДереваЗначений.Добавить()
- Добавляет строку в конец коллекции строк данного уровня дерева значений.
- Возвращаемое значение:
СтрокаДереваЗначений
.
Заполнить табличное поле на форме
Визуальное представление дерева значений на форме обеспечивает элемент Таблица
.
Пример программного заполнения дерева значений для управляемых форм:
&НаКлиенте Процедура ЗаполнитьТабличноеПоле(Команда) ЗаполнитьТабличноеПолеНаСервере(); КонецПроцедуры &НаСервере Процедура ЗаполнитьТабличноеПолеНаСервере() ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений"); // Добавляем строку в корень дерева ПерваяСтрока = ДеревоЗначений.Строки.Добавить(); ПерваяСтрока.ПерваяКолонка = "Первая строка, первая колонка"; ПерваяСтрока.ВтораяКолонка = "Первая строка, вторая колонка"; // Дочерняя строка первой строки ВтораяСтрока = ПерваяСтрока.Строки.Добавить(); ВтораяСтрока.ПерваяКолонка = "Вторая строка, первая колонка"; ВтораяСтрока.ВтораяКолонка = "Вторая строка, вторая колонка"; // Дочерняя строка второй строки ТретьяСтрока = ВтораяСтрока.Строки.Добавить(); ТретьяСтрока.ПерваяКолонка = "Третья строка, первая колонка"; ТретьяСтрока.ВтораяКолонка = "Третья строка, вторая колонка"; ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений"); КонецПроцедуры
Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом Выгрузить()
и указать параметр ТипОбхода
отличным от того, что стоит по умолчанию, т.е. ПоГруппировкам
или ПоГруппировкамСИерархией
.
&НаКлиенте Процедура ЗаполнитьТабличноеПоле(Команда) ЗаполнитьТабличноеПолеНаСервере(); КонецПроцедуры &НаСервере Процедура ЗаполнитьТабличноеПолеНаСервере() Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Наименование КАК ПерваяКолонка, | Номенклатура.Код КАК ВтораяКолонка |ИЗ | Справочник.Номенклатура КАК Номенклатура |УПОРЯДОЧИТЬ ПО | ПерваяКолонка ИЕРАРХИЯ"; ДеревоЗначений = Запрос.Выполнить().Выгрузить( ОбходРезультатаЗапроса.ПоГруппировкамСИерархией ); ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений"); КонецПроцедуры
Свернуть и развернуть строки дерева значений
Свернуть и развернуть дочерние строки элемента дерева значений можно с помощью методов Свернуть()
и Развернуть()
.
ВсеЭлементыФормы.ЭлементТаблицаФормы.Свернуть(ИдектификаторСтроки)
- Сворачивает узел в указанной строке дерева.
ИдектификаторСтроки
— идентификатор строки таблицы.
ВсеЭлементыФормы.ЭлементТаблицаФормы.Развернуть(ИдектификаторСтроки, СПодчиненными)
- Разворачивает узел в указанной строке дерева.
ИдектификаторСтроки
— идентификатор строки таблицы.СПодчиненными
— определяет необходимость раскрытия подчиненных узлов.
&НаКлиенте Процедура СвернутьТекущуюСтрокуДерева(Команда) Элементы.ЭлементДеревоЗначений.Свернуть( Элементы.ЭлементДеревоЗначений.ТекущаяСтрока ); КонецПроцедуры &НаКлиенте Процедура СвернутьВерхниеСтрокиДерева(Команда) СтрокиДерева = РеквизитДеревоЗначений.ПолучитьЭлементы(); Для Каждого ТекущаяСтрока Из СтрокиДерева Цикл Элементы.ЭлементДеревоЗначений.Свернуть( ТекущаяСтрока.ПолучитьИдентификатор() ); КонецЦикла; КонецПроцедуры &НаКлиенте Процедура СвернутьВсеСтрокиДерева(Команда) СтрокиДерева = РеквизитДеревоЗначений.ПолучитьЭлементы(); СвернутьДочерниеСтрокиДерева(СтрокиДерева); КонецПроцедуры &НаКлиенте Процедура СвернутьДочерниеСтрокиДерева(СтрокиДерева) Для Каждого ТекущаяСтрока Из СтрокиДерева Цикл ДочерниеСтроки = ТекущаяСтрока.ПолучитьЭлементы(); // рекурсивный вызов процедуры СвернутьДочерниеСтрокиДерева() СвернутьДочерниеСтрокиДерева(ДочерниеСтроки); Элементы.ЭлементДеревоЗначений.Свернуть( ТекущаяСтрока.ПолучитьИдентификатор() ); КонецЦикла; КонецПроцедуры
&НаКлиенте Процедура РазвернутьТекущуюСтрокуДерева(Команда) Элементы.ЭлементДеревоЗначений.Развернуть( Элементы.ЭлементДеревоЗначений.ТекущаяСтрока, Истина ); КонецПроцедуры &НаКлиенте Процедура РазвернутьВсеСтрокиДерева(Команда) СтрокиДерева = РеквизитДеревоЗначений.ПолучитьЭлементы(); Для Каждого ТекущаяСтрока Из СтрокиДерева Цикл Элементы.ЭлементДеревоЗначений.Развернуть( ТекущаяСтрока.ПолучитьИдентификатор(), Истина ); КонецЦикла; КонецПроцедуры
ДанныеФормыДерево.ПолучитьЭлементы()
- Получает коллекцию элементов дерева верхнего уровня.
- Возвращаемое значение:
ДанныеФормыКоллекцияЭлементовДерева
.
ДанныеФормыЭлементДерева.ПолучитьЭлементы()
- Получает коллекцию дочерних элементов.
- Возвращаемое значение:
ДанныеФормыКоллекцияЭлементовДерева
.
Для представления в форме объектов конфигурации (справочники, документы и т.п.) существуют специальные типы данных:
ДанныеФормыСтруктура
— содержит набор свойств произвольного типа. Свойствами могут быть другие структуры, коллекции или структуры с коллекциями. Таким типом представляется, например, в формеСправочникОбъект
.ДанныеФормыКоллекция
— это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.ДанныеФормыСтруктураСКоллекцией
— это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.ДанныеФормыДерево
— объект предназначен для хранения иерархических данных.
Прикладной объект представлен либо одним, либо несколькими элементами данных формы. Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура
(собственно документ), которому подчинен объект типа ДанныеФормыКоллекция
(табличная часть документа).
Удалить строку и очистить дерево значений
&НаКлиенте Процедура УдалитьСтрокуДереваЗначений(Команда) УдалитьСтрокуДереваЗначенийНаСервере(); КонецПроцедуры &НаСервере Процедура УдалитьСтрокуДереваЗначенийНаСервере() ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений"); // удаляем первую строку дерева значений ДеревоЗначений.Строки.Удалить(0); ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений"); КонецПроцедуры
&НаКлиенте Процедура ОчиститьДеревоЗначений(Команда) ОчиститьДеревоЗначенийНаСервере(); КонецПроцедуры &НаСервере Процедура ОчиститьДеревоЗначенийНаСервере() ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений"); ДеревоЗначений.Строки.Очистить(); ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений"); КонецПроцедуры
Поиск в дереве значений
Среди наиболее часто используемых методов стоит отметить метод Найти()
коллекции строк дерева значений.
КоллекцияСтрокДереваЗначений.Найти(Значение, Колонки, ВключатьПодчиненные)
Значение
(обязательный, типПроизвольный
). Искомое значение.Колонки
(необязательный, типСтрока
). Список имен колонок, в которых будет осуществляться поиск, разделенных запятыми. Если параметр не указан, поиск осуществляется по всем колонкам дерева. Значение по умолчанию — Пустая строка.ВключатьПодчиненные
(необязательный, типБулево
). Определяет, будут ли участвовать в поиске строки подчиненных коллекций (если таковые имеются). ЕслиИстина
— строки подчиненных коллекций участвуют в поиске. Значение по умолчанию —Ложь
.
Метод осуществляет поиск значения в дереве в указанных колонках коллекции строк дерева значений. Возвращает строку (тип СтрокаДереваЗначений
), которая содержит искомое значение. Если значение не найдено, то возвращается значение Неопределено
. Предназначен для поиска уникальных значений.
&НаКлиенте Процедура НайтиСтрокуДереваЗначений(Команда) ЗаполнитьТабличноеПолеНаСервере(); НайтиСтрокуДереваЗначенийНаСервере(); КонецПроцедуры &НаСервере Процедура НайтиСтрокуДереваЗначенийНаСервере() ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений"); РезультатПоиска = ДеревоЗначений.Строки.Найти( ИскомоеЗначение, "ПерваяКолонка,ВтораяКолонка", Истина ); Если РезультатПоиска <> Неопределено Тогда Сообщить( "Первая колонка: " + РезультатПоиска.ПерваяКолонка + ", Вторая колонка: " + РезультатПоиска.ВтораяКолонка ); Иначе Сообщить("Ничего не найдено"); КонецЕсли; КонецПроцедуры &НаСервере Процедура ЗаполнитьТабличноеПолеНаСервере() Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Наименование КАК ПерваяКолонка, | Номенклатура.Код КАК ВтораяКолонка |ИЗ | Справочник.Номенклатура КАК Номенклатура |УПОРЯДОЧИТЬ ПО | ПерваяКолонка ИЕРАРХИЯ"; ДеревоЗначений = Запрос.Выполнить().Выгрузить( ОбходРезультатаЗапроса.ПоГруппировкамСИерархией ); ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений"); КонецПроцедуры
Поиск:
1С:Предприятие • Дерево значений • Иерархия • Коллекция • Таблица формы • Типы данных • Управляемая форма