Поиск по дереву значений рекурсией, методом НайтиСтроки(), с помощью СКД. Вывод результата поиска в отдельную таблицу. Активация строки в дереве значений при выборе в таблице

29.10.18

Разработка - Работа с интерфейсом

В данной статье рассматриваются три способа поиска по дереву значений, отображённому на форме (ДанныеФормыДерево), с дальнейшим выводом результата в таблицу и возможностью перехода к строкам дерева при выборе в таблице. В статье приведены пошаговые примеры реализации всех трех способов.

Скачать исходный код

Наименование Файл Версия Размер
Поиск по дереву значений рекурсией, методом НайтиСтроки(), с помощью СКД. Вывод результата поиска в отдельную таблицу. Активация строки в дереве значений при выборе в таблице.
.rar 22,29Kb
3
.rar 22,29Kb 3 Скачать
Пример реализация поиска по дереву значений рекурсией. Вывод результата поиска в отдельную таблицу. Активация строки в дереве значений при выборе в таблице.
.epf 9,98Kb
3
.epf 9,98Kb 3 Скачать
Пример реализация поиска по дереву методом НайтиСтроки(). Вывод результата поиска в отдельную таблицу. Активация строки в дереве значений при выборе в таблице.
.epf 9,72Kb
1
.epf 9,72Kb 1 Скачать
Пример реализация поиска по дереву значений с помощью СКД. Вывод результата поиска в отдельную таблицу. Активация строки в дереве значений при выборе в таблице.
.epf 11,89Kb
1
.epf 11,89Kb 1 Скачать

В данной статье рассматриваются три способа поиска по дереву значений, отображённому на форме (ДанныеФормыДерево):

  1. обход дерева рекурсией;
  2. методом НайтиСтроки();
  3. наложение отборов через схему компоновки данных (СКД).

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

  1. при поиске рекурсией записывать идентификатор строки в таблицу результата поиска;
  2. для способа 2 и 3 строить таблицу значений с данными из дерева с указанием идентификатора строки.

Для примера было создано дерево значений (далее ДЗ) со следующими колонками:

  1. ФИО - Строка(150);
  2. состояние - Строка(20);
  3. ФОТ - Число(10,2);
  4. выплатили - Число(10,2).

 

             

Заполнение дерева во всех трёх способах осуществляется следующими функциями в модуле формы.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ЗаполнитьДерево();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДерево()
	МФИО = СтрРазделить("Абр Мария Сергеевна,Аве Александр Александрович,Авер Елена Валериевна,Тушенко Владимир Петрович,Ага Андрей Эдуардович,Геев Андрей Афанасьевич,Аге Дарья Викторовна,Аки Виктор Николаевич,Але Алексей Андреевич,Але Алексей Владимирович,Кема Зарина Карушовна,Реев Илья Ильич,Андр Александр Степанович,Риашина Ирина Михайловна,Рющенко Евгения Васильевна,Ющенко Кирилл Александрович,Канова Наталья Борисовна,Тонов Владимир Иванович,Тропов Евгений Алексеевич,Опова Яна Олеговна,Ина Светлана Васильевна,Анша Анатолий Алексеевич,Арда Вероника Евгеньевна,Аржа Евгений Сергеевич,Арте Надежда Юрьевна,Аста Ольга Александровна,Атё Николай Владимирович,Ахре Виктор Александрович,Бин Владимир Иванович,Байд Анастасия Николаевна,Баку Евгений Иванович,Бала Галина Ивановна,Бухин Валерий Валерьевич,Бан Константин Александрович,Кина Евгения Алексеевна,Бар Николай Анатольевич",",",Ложь);
	МСостояний = Стрразделить("Работает,В отпуске,Уволился",",",ЛОЖЬ);
	ГСЧ = Новый ГенераторСлучайныхЧисел(0);
	ДеревоЗнч = РеквизитФормыВЗначение("Дерево", Тип("ДеревоЗначений"));
	Для каждого элем из МФИО Цикл
		НС = ДеревоЗнч.Строки.Добавить();
		НС.ФИО = элем;
		НС.Состояние = МСостояний.Получить(ГСЧ.СлучайноеЧисло(0,2));
		НС.ФОТ = ГСЧ.СлучайноеЧисло(9999,250000); 
		НС.Выплатили = ГСЧ.СлучайноеЧисло(10000,НС.ФОТ);
		ЗаполнитьДеревоСтроки(НС, ГСЧ, ГСЧ.СлучайноеЧисло(1, 4));
	КонецЦикла;
	ЗначениеВРеквизитФормы(ДеревоЗнч,"Дерево");
КонецПроцедуры // ЗаполнитьДерево()

&НаСервере
Процедура ЗаполнитьДеревоСтроки(РодСтрока, ГСЧ, КоличествоСтрок)
	Если КоличествоСтрок = 0 Тогда
		Возврат;
	КонецЕсли;
	Для Ай = 1 по КоличествоСтрок Цикл
		НС = РодСтрока.Строки.Добавить();
		НС.ФИО = РодСтрока.ФИО;
		НС.Состояние = РодСтрока.Состояние;
		НС.ФОТ = ГСЧ.СлучайноеЧисло(9999,250000); 
		НС.Выплатили = ГСЧ.СлучайноеЧисло(10000,НС.ФОТ);
		Если ГСЧ.СлучайноеЧисло(0,1) Тогда
			ЗаполнитьДеревоСтроки(НС, ГСЧ, ГСЧ.СлучайноеЧисло(0, 2));
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры // ЗаполнитьДеревоСтроки()

Рассмотри каждый способ отдельно.

Способ первый - Обход дерева рекурсией.

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

Структура таблицы РезультатПоиска:

  1. ФИО - Строка(150);
  2. состояние - Строка(20);
  3. ФОТ - Число(10,2);
  4. выплатили - Число(10,2);
  5. индексВДереве – Число(10).

 

Созданное дерево и таблицу вынесем на форму и перейдём к созданию команд поиска.

Имена команд должны соответствовать формату ИмяКолонкиПоиска_ВидСравнения

Созданным командам назначим одинаковое действие ПоискРекурсией:

 

&НаКлиенте
Процедура ПоискРекурсией(Команда)

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

Далее в контекстном меню создадим подменю и добавим команды:

Так как поиск по дереву будет осуществляться из контекстного меню дерева, то для наглядности команды добавим следующий код в обработку события ПриАктивизацииСтроки для дерева:

&НаКлиенте
Процедура ДеревоПриАктивизацииСтроки(Элемент)
	ДанныеСтроки = Элементы.Дерево.ТекущиеДанные;
	//Колонка ФИО
	Элементы.ФИО_Равно.Заголовок = "ФИО = " + ДанныеСтроки.ФИО;
	Элементы.ФИО_НеРавно.Заголовок = "ФИО <> " + ДанныеСтроки.ФИО;
	//Колонка Состояние
	Элементы.Состояние_Равно.Заголовок = "Состояние = " + ДанныеСтроки.Состояние;
	Элементы.Состояние_НеРавно.Заголовок = "Состояние <> " + ДанныеСтроки.Состояние;
	//Колонка ФОТ
	Элементы.ФОТ_Равно.Заголовок = "ФОТ = " + ДанныеСтроки.ФОТ;
	Элементы.ФОТ_НеРавно.Заголовок = "ФОТ <> " + ДанныеСтроки.ФОТ;
	Элементы.ФОТ_МеньшеИЛИРавно.Заголовок = "ФОТ <= " + ДанныеСтроки.ФОТ;
	Элементы.ФОТ_Меньше.Заголовок = "ФОТ < " + ДанныеСтроки.ФОТ;
	Элементы.ФОТ_БольшеИлиРавно.Заголовок = "ФОТ >= " + ДанныеСтроки.ФОТ;
	Элементы.ФОТ_Больше.Заголовок = "ФОТ > " + ДанныеСтроки.ФОТ;
	//Колонка Выплатили
	Элементы.Выплатили_Равно.Заголовок = "Выплатили = " + ДанныеСтроки.Выплатили;
	Элементы.Выплатили_НеРавно.Заголовок = "Выплатили <> " + ДанныеСтроки.Выплатили;
	Элементы.Выплатили_МеньшеИЛИРавно.Заголовок = "Выплатили <= " + ДанныеСтроки.Выплатили;
	Элементы.Выплатили_Меньше.Заголовок = "Выплатили < " + ДанныеСтроки.Выплатили;
	Элементы.Выплатили_БольшеИлиРавно.Заголовок = "Выплатили >= " + ДанныеСтроки.Выплатили;
	Элементы.Выплатили_Больше.Заголовок = "Выплатили > " + ДанныеСтроки.Выплатили;
КонецПроцедуры

Заполним тело процедуры ПоискРекурсией следующим кодом:

&НаКлиенте
Процедура ПоискРекурсией(Команда)
	Соответствие = Новый Соответствие;
	Соответствие.Вставить("Равно", "=");
	Соответствие.Вставить("Больше", ">");
	Соответствие.Вставить("БольшеИлиРавно", ">=");
	Соответствие.Вставить("Меньше", "<");
	Соответствие.Вставить("МеньшеИЛИРавно", "<=");
	Соответствие.Вставить("НеРавно", "<>");
	
	ИмяКомандыПоСтрокам = СтрРазделить(Команда.Имя, "_", Ложь);
	
	ИмяКолонки = ИмяКомандыПоСтрокам.Получить(0);
	ВидСравненияПоиска = Соответствие.Получить(ИмяКомандыПоСтрокам.Получить(1));
	ЗнчПоиска = Элементы.Дерево.ТекущиеДанные[ИмяКолонки];
	
	РезультатПоиска.Очистить();
	
	ПоискПоДеревуРекурсией(Дерево.ПолучитьЭлементы(), ИмяКолонки, ЗнчПоиска, ВидСравненияПоиска);
КонецПроцедуры

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

Осталось реализовать переход к строке дерева при выборе строки в таблице результата. Для это создадим обработку события Выбор для таблицы результата (ТаблицаРезультат):

И вставим следующий код:

&НаКлиенте
Процедура РезультатПоискаРекурсиейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Элементы.Дерево.ТекущаяСтрока = Элементы.РезультатПоиска.ТекущиеДанные.ИндексВДереве;
КонецПроцедуры

На этом реализация первого способа закончена.

Способ второй – Метод НайтиСтроки().

Для реализации данного способа нам понадобиться создать таблицу РезультатПоиска, описанную в первом способе и таблицу значений ТаблицаИндексов аналогичную таблице РезультатПоиска.

Данная таблица заполняется процедурой ЗаполнитьТаблицуИндексовРекурсией, которая вызывается в событии ПриСозданииНаСервере после процедуры ЗаполнитьДерево.

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

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

Поиск по дереву будет осуществляться аналогично первому способу - из контекстного меню. Для этого создадим команды, соответствующие формату Выгрузка_ИмяКолонкиПоиска_Равно. В отличие от первого способа тут можно осуществлять только операцию сравнения.

Созданным командам назначим одинаковое действие ПоискВыгрузкой

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

Для наглядности команд создадим процедуру обработки события ПриАктивизацииСтроки для ДЗ:

 И вставим в неё следующий код:

&НаКлиенте
Процедура ДеревоПриАктивизацииСтроки(Элемент)
	ДанныеСтроки = Элементы.Дерево.ТекущиеДанные;
	//Колонка ФИО
	Элементы.Выгрузка_ФИО_Равно.Заголовок = "(ВЫГРУЗКА) ФИО = " + ДанныеСтроки.ФИО;
	//Колонка Состояние
	Элементы.Выгрузка_Состояние_Равно.Заголовок = "(ВЫГРУЗКА) Состояние = " + ДанныеСтроки.Состояние;
	//Колонка ФОТ
	Элементы.Выгрузка_ФОТ_Равно.Заголовок = "(ВЫГРУЗКА) ФОТ = " + ДанныеСтроки.ФОТ;
	//Колонка Выплатили
	Элементы.Выгрузка_Выплатили_Равно.Заголовок = "(ВЫГРУЗКА) Выплатили = " + ДанныеСтроки.Выплатили;
КонецПроцедуры

У данного способа есть два пути реализации поиска по дереву:

  1. Искать по дереву значений. Для этого необходимо используя функцию РеквизитФормыВЗначение для преобразования ДанныеФормыДерево в тип Деревозначений и использовать метод НайтиСтроки().
  2. Искать по построенной таблице индексов, что является более оптимальным способом поиска.

Для реализации первого пути в тело процедуры ПоискВыгрузкойНаСервере необходимо вставить следующий код:

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

Для реализации второго пути в процедуру необходимо вставить:

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

Осталось реализовать переход к строке дерева при выборе строки в таблице результата. Для это создадим обработку события Выбор для таблицы результата (ТаблицаРезультат):

В зависимости от выбранного пути в процедуру необходимо вставить следующий код:

Путь 1:

&НаКлиенте
Процедура РезультатПоискаЧерезВыгрузкуВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	МКолонок = СтрРазделить("ФИО,Состояние,ФОТ,Выплатили", ",", Ложь);
	ДанныеОтбора = Новый Структура;
	Данные = Элементы.РезультатПоиска.ТекущиеДанные;
	Для каждого элем из МКолонок Цикл
		ДанныеОтбора.Вставить(элем, Данные[элем]);
	КонецЦикла;
	Элементы.Дерево.ТекущаяСтрока = ТаблицаИндексов.НайтиСтроки(ДанныеОтбора)[0].ИндексВДереве;
КонецПроцедуры

Путь 2:

&НаКлиенте
Процедура РезультатПоискаЧерезВыгрузкуВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Элементы.Дерево.ТекущаяСтрока = Элементы.РезультатПоиска.ТекущиеДанные.ИндексВДереве;
КонецПроцедуры

На этом реализация второго способа закончена.

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

Для реализации данного способа необходимо создать таблицы РезультатПоиска и ТаблицаИндексов описанные в предыдущих способах. Дополнительно в форме обработки создадим реквизит КомпоновщикНастроекКомпоновкиДанных с типом КомпоновщикНастроекКомпоновкиДанных и АдресМакетаОтчетаСКД с типом строка (неограниченной длины).

Также в самой обработке необходимо создать макет с именем Макет с типом Схема компоновки данных.

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

Перейдём в настройки СКД и создадим вариант отчета (если он ещё не создан). Добавим новую группировку – детальные записи. В «выбранные поля» добавим все доступные поля, кроме системных.

На этом настройка подготовка макета закончена. Перейдём в форму обработки.

Вынесем на форму реквизит КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор. При выборе нового типа элемента выберем «Таблица».

В событие ПриСозданииНаСервере помимо процедур ЗаполнитьДерево и ЗаполнитьТаблицуИндексовРекурсией добавим процедуру ИнициализацияОтборовДерева.

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

В процедуру добавим следующий код:

&НаСервере
Процедура ИнициализацияОтборовДерева()
	МОбъект = РеквизитФормыВЗначение("Объект");
	СКД = МОбъект.ПолучитьМакет("Макет");
	АдресМакетаОтчетаСКД = ПоместитьВоВременноеХранилище(СКД, Новый УникальныйИдентификатор);
	КомпоновщикНастроекКомпоновкиДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресМакетаОтчетаСКД));
	КомпоновщикНастроекКомпоновкиДанных.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);
КонецПроцедуры // ИнициализацияОтборовДерева()

Создадим команду НайтиЧерезСКД и добавим в неё следующий код:

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

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

Вынесем созданную команду на форму в командную панель отборов СКД

Осталось реализовать переход к строке дерева при выборе строки в таблице результата. Для это создадим обработку события Выбор для таблицы результата (ТаблицаРезультат):

&НаКлиенте
Процедура РезультатОтбораСКДВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Элементы.Дерево.ТекущаяСтрока = Элементы.РезультатПоиска.ТекущиеДанные.ИндексВДереве;
КонецПроцедуры

На этом реализация третьего способа и сама статья закончена.

Спасибо за внимание! Надеюсь, эта статья была полезна:)

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

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61971    43    59    

81

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54599    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16849    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    11036    757    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    9809    153    acces969    31    

119

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3867    kalyaka    4    

29

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12228    1    5    

10
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. buganov 200 30.10.18 06:06 Сейчас в теме
1. Почему таблица индексов, если это таблица идентификаторов(ну, это я притянул за уши, конечно)
2. Что будет, если добавить строку интерактивно? Нужно сразу же и в таблицу индексов добавить строку?
3. Было бы неплохо сделать замеры времени каждого типа поиска на дереве 1000+ строк с двумя-тремя уровнями, чтобы сделать однозначные выводы о производительности. Подозреваю, что самым быстрым окажется поиск по идентификатору
4. СКД по хорошему формировать программно на случай изменения реквизитов таблицы и получения универсального механизма

В целом проделана неплохая работа за которую однозначно плюс.
+
2. Vyacheslav_Kochnev 140 30.10.18 06:26 Сейчас в теме
(1)
1) Не знаю, почему-то захотелось назвать так. Но правильнее всё же будет назвать ТаблицаИдентификаторов.
2) При добавлении строки нужно будет дописать код в события добавления/изменения строк дерева, который будет добавлять/изменять строку в таблицу индексов.
3) Про замер производительности думал, но по каким-то причинам не сделал :) Допишу.
4) Да, так будет намного удобнее. Тоже реализую в ближайшее время
+
3. Новиков 292 30.10.18 11:44 Сейчас в теме
Спасибо за статью, человек!

Конечно, она полезна в плане консолидации такого хорошего опыта. В будущем, если будет время, хотелось бы побольше аналитики и рекомендаций типа:
- какой способ предпочтительнее использовать в каких случаях, и почему?
- как в типовых в подобных случаях поступаю, каким способом, и на ваш взгляд, почему так?
+
4. Поручик 4674 11.11.21 16:00 Сейчас в теме
Воспользовался первым вариантом через рекурсию. Так оказалось проще и без затей.
+
5. Поручик 4674 12.11.21 14:35 Сейчас в теме
А так ещё проще и короче.
// Допустимые значения для ВидСравнения: = <= >= <> < >
//
&НаКлиенте
Процедура ПоискПоДеревуРекурсией(ЭлементыДерева, ИмяКолонки, ЗначениеПоиска, ВидСравнения = "=", НайденноеЗначение = Неопределено)
	Если НайденноеЗначение <> Неопределено Тогда
		Возврат;
	КонецЕсли; 
	Для каждого ЭлементДерева Из ЭлементыДерева Цикл
		РезудьтатВычисления = Вычислить("(ЭлементДерева[ИмяКолонки]" + ВидСравнения + "ЗначениеПоиска)");
		Если РезудьтатВычисления Тогда
			НайденноеЗначение = ЭлементДерева.ПолучитьИдентификатор();
			Возврат;
		КонецЕсли;
		ПоискПоДеревуРекурсией(ЭлементДерева.ПолучитьЭлементы(), ИмяКолонки, ЗначениеПоиска, ВидСравнения, НайденноеЗначение);
	КонецЦикла;
КонецПроцедуры // ПоискПоДеревуРекурсией()
Показать
Strange Device; +1
Оставьте свое сообщение