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

Публикация № 931494

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

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

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

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

  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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Скачать файлы

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

.rar 22,29Kb
29.10.18
3
.rar 22,29Kb 3 Скачать
Пример реализация поиска по дереву значений рекурсией. Вывод результата поиска в отдельную таблицу. Активация строки в дереве значений при выборе в таблице.

.epf 9,98Kb
29.10.18
0
.epf 9,98Kb Скачать
Пример реализация поиска по дереву методом НайтиСтроки(). Вывод результата поиска в отдельную таблицу. Активация строки в дереве значений при выборе в таблице.

.epf 9,72Kb
29.10.18
0
.epf 9,72Kb Скачать
Пример реализация поиска по дереву значений с помощью СКД. Вывод результата поиска в отдельную таблицу. Активация строки в дереве значений при выборе в таблице.

.epf 11,89Kb
29.10.18
1
.epf 11,89Kb 1 Скачать

Специальные предложения

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

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

Конечно, она полезна в плане консолидации такого хорошего опыта. В будущем, если будет время, хотелось бы побольше аналитики и рекомендаций типа:
- какой способ предпочтительнее использовать в каких случаях, и почему?
- как в типовых в подобных случаях поступаю, каким способом, и на ваш взгляд, почему так?
Оставьте свое сообщение

См. также

Редактирование текстов интерфейса … Промо

Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

Редактирование текстов интерфейса … (перевод интерфейса конфигурации на другой язык английский – немецкий – китайский – японский и многие другие). У вас есть стандартная конфигурация, в которой надо перевести интерфейс на другой язык, легко! А вот со справкой придется немного помучаться. Просьба не путать с данными, которые хранятся в реквизитах объектов.

1 стартмани

26.06.2012    37734    Nykyanen    39    

Настройка колонок для вывода в отчет

Практика программирования Работа с интерфейсом v8::СКД 1cv8.cf Украина Абонемент ($m)

Иногда возникает задача вывести в отчет по запросу не все колонки, а только определенные.

1 стартмани

12.07.2020    1389    user847462    1    

Сохранение настроек колонок

Практика программирования Работа с интерфейсом Универсальные функции v8 Абонемент ($m)

Сохранение настроек колонок табличных полей. Получение имени формы из модуля формы. Для обычных форм.

1 стартмани

10.07.2020    878    Arc    1    

1С+Firebase. Оперативное отображение информации

Интеграция Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

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

1 стартмани

06.04.2020    1788    oyti    0    

Приятная глазу цветовая схема 1С 8.х Промо

Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

Несколько цветовых схем для встроенного языка 1С, которые минимизирует нагрузку на глаза, за счет чего повышается производительность!

1 стартмани

26.03.2012    60379    NDM    125    

Управление состоянием для шаблона MVC и работы с данными объекта

Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

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

1 стартмани

18.03.2020    3266    kalyaka    33    

Генерация управляемой формы на основе обычной (proof of concept)

Работа с интерфейсом v8 v8::УФ 1cv8.cf Абонемент ($m)

В статье рассматривается техническая возможность автоматизированной генерации управляемой формы на основе обычной.

1 стартмани

06.11.2019    6350    user700211_a.straltsou    17    

"Живые" картинки со Snap.SVG

Практика программирования WEB Работа с интерфейсом v8 Абонемент ($m)

В статье рассмотрен пример использования http-сервисов для визуализации данных

1 стартмани

24.10.2019    12793    blackhole321    7    

Полное копирование одной формы в другую

Практика программирования Универсальные обработки Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Однажды я столкнулся с необходимостью открыть форму ЛЮБОГО документа с определенными изменениями, не зависящими от структуры объекта (например, заблокировать все кнопки). В интернете решения я не нашел. Обычно на форумах на запросы подобного рода отвечают чем-то вроде "покажи первоначальную задачу, а не спрашивай как реализовать то, что ты придумал". Тем не менее, мне стало интересно, как это можно сделать.

1 стартмани

03.10.2019    4495    nekit_rdx    23    

Еще один способ программной модификации управляемых форм

Работа с интерфейсом v8 v8::УФ 1cv8.cf Абонемент ($m)

Пример программной модификации управляемой формы для случая когда вызов метода СобытияФорм.ПриСозданииНаСервере разработчиком конфигурации не предусмотрен.

1 стартмани

03.09.2019    4341    infosoft-v    15    

Изменяющееся контекстное меню в 1С 8.3

Практика программирования Работа с интерфейсом Разработка v8 v8::УФ Абонемент ($m)

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

1 стартмани

06.08.2019    14621    signum2009    16    

Совместное использование 1С:Сервер взаимодействия и Документооборот 8 КОРП, редакция 2.1.13 - Уведомления для рабочего стола

Пользователю системы Работа с интерфейсом Интеграция Документооборот и делопроизводство Документооборот и делопроизводство v8 ДО УУ Абонемент ($m)

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

1 стартмани

18.06.2019    13080    ilya.rudziak    9    

Изменение реквизитов существующих объектов (документов) 1С без сохранения

Практика программирования Работа с интерфейсом Разработка v8 Абонемент ($m)

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

1 стартмани

14.06.2019    4298    BraunAlex    8    

Как вывести в СКД две независимые таблицы, объединенные одним полем

Работа с интерфейсом v8::СКД Абонемент ($m)

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

1 стартмани

06.06.2019    5876    swimdog    13    

Табличная часть из дополнительных реквизитов с обработкой событий в расширении

Практика программирования Работа с интерфейсом Разработка v8::УФ 1cv8.cf Абонемент ($m)

Эмуляция табличной части с помощью дополнительных реквизитов и расширения. Подход применим к любой конфигурации на управляемых формах с БСП и режимом совместимости, допускающим использование расширений. Весь код в статье.

1 стартмани

13.05.2019    9244    mvxyz    17    

Вывод вариантов СКД в таблицы на управляемой форме

Практика программирования Работа с интерфейсом v8 v8::УФ v8::СКД 1cv8.cf Абонемент ($m)

Задача стояла такая: есть 2 различных запроса, результаты которых выгружаются на форму обработки в таблицы значений (далее ТЗ) и программно "соприкасаются" между собой определенным образом (как именно- в рамках данной статьи неважно). Нюанс в том, что запросы должны иметь свой компоновщик настроек и могут интерактивно на форме изменяться пользователем. На оригинальность публикации не претендую - изначально в рамках поставленной задачи пытался найти что-то подобное (уже готовый шаблон) на инфостарте, возможно "плохо искал" ;)

05.04.2019    10447    artkor    1    

Управление состоянием формы через конечный автомат

Практика программирования Работа с интерфейсом v8 Россия Абонемент ($m)

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

1 стартмани

19.06.2018    15268    kalyaka    37    

Отборы (поиск) в табличной части либо таблице значений (управляемые формы)

Практика программирования Работа с интерфейсом v8 v8::УФ Абонемент ($m)

В управляемых формах для нас доступен мощный ресурс работы с динамическими списками посредством СКД - отборы, сортировки и далее. Но вот табличная часть (таблица значений) на управляемой форме не позволяет работать так гибко. Мы можем научить пользователей пользоваться комбинацией клавиш "Ctrl+F", но давайте немного упростим жизнь и позволим нашим пользователям настраивать отборы (осуществлять поиск) по табличной части прямо в нашем окне.

1 стартмани

22.03.2018    34971    Kim1C    18    

Шаблон MVC для управляемого интерфейса

Работа с интерфейсом v8::УФ 1cv8.cf Россия Абонемент ($m)

Мы воспринимаем как что-то само собой разумеющееся интуитивно понятный интерфейс, мгновенно реагирующий на наши клики, подстраивающийся под уже сделанный нами выбор. А между тем за этой возможностью - решение серьезных алгоритмических задач. В общем случае решения этих задач уже найдены, но проблема их конкретного применения остается как для выбранного окружения (веб-браузер, экран мобильного телефона, компьютер), так и возможностей языка программирования. В следующей статье представлено одно из таких применений общего решения на основе шаблона MVC для 1С в сочетании с возможностями управляемых форм и декларативного описания интерфейса.

1 стартмани

14.03.2018    19446    kalyaka    37    

Варианты отображений свертываемых групп

Практика программирования Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Как пользователю только одним внешним видом сказать "Тут есть нужные данные. Только нажми". Используем разные варианты свертываемых групп.

1 стартмани

19.12.2017    15539    Kim1C    10    

Размеры управляемой формы

Практика программирования Работа с интерфейсом Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

08.10.2017    26091    json    9    

Добавление отчета на панель

Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

В очередной раз разработчики 1с поправили УТ и непонятно стало, как добавлять отчеты на панель. Метод получился самый простой из всех , что я видел ( http://infostart.ru/public/87945/, http://infostart.ru/public/91729/, http://chistov.spb.ru/forum/26-1766-2 (при подготовке к спецу видел 10 способов, но они уже не актуальны, да и сложны)).

15.01.2014    23765    dobrynin.i.s    11    

Условное оформление таблицы управляемой формы

Практика программирования Работа с интерфейсом v8 Абонемент ($m)

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

1 стартмани

17.05.2013    37559    akomar    6    

Уровни группировок в отчете СКД в управляемых формах

Практика программирования Работа с интерфейсом v8::ОУ v8::СКД УНФ Абонемент ($m)

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

1 стартмани

08.05.2013    21375    Pralva    16    

Кнопки сворачивания и разворачивания группировок в отчете СКД в управляемых формах

Практика программирования Работа с интерфейсом v8::СКД 1cv8.cf Абонемент ($m)

Сверуть и развернуть группировки можно через контекстное меню, горячими клавишами, а можно разместить соответствующие кнопки на форме отчета. Как оказалось, для этого не нужно ни строчки кода.

1 стартмани

10.04.2013    44788    mxm2    9    

Программная настройка рабочего стола или Как на лету добавить скрыть, подменить формы.

Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

07.11.2012    33191    NittenRenegade    12    

1С:Предприятие 8.2. Управляемая Форма. Меняем иконку рабочего стола.

Сервисные утилиты Производительность и оптимизация (HighLoad) Практика программирования Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

Для конфигураций имеющих свой дизайн важно иметь возможность сменить не только картинки разделов для созданных подсистем, но и картинку рабочего стола, но менять ее нет возможности. Сама 1С объясняет это тем что интерфейс любой конфигурации должен быть унифицирован: "Дело не в одной картинке, а в общей стилистике для любых конфигураций. Важно чтобы пользователи привыкали к общему стилю и одинаково воспринимали одинаковые элементы в разных конфигурациях - это ускорит и освоение конфигураций и повседневную работу пользователей с ними." Но все же можно попытаться ее сменить.

1 стартмани

28.09.2012    28753    ghostaz    39    

Нестандартная расшифровка СКД или расшифровка одного отчета СКД при помощи другого отчета СКД установкой пользовательских настроек (в управляемых формах, методика + пример для УТ11)

Практика программирования Работа с интерфейсом v8::ОУ v8::СКД УТ11 Россия Абонемент ($m)

Если требуется расшифровка одного отчета СКД при помощи другого отчета СКД, можно использовать представленный вариант. Казалось-бы все просто, однако дело усложняется тем, что с одной стороны, нужно предусмотреть разделение функционала между клиентом и сервером, с другой, нет достаточно четкого описания поведения передачи параметров расшифровки. В итоге: все решается "элементарно", но чтобы дойти до этого, лично мне пришлось убить уйму времени, так что экономьте своё ))). Под "нестандартной расшифровкой" имеется ввиду расшифровка данных одного вида отчета - другим видом, отличным от первого (с предварительной установкой нужных параметров и отборов в отчете-расшифровке).

1 стартмани

12.09.2012    90698    mxm2    49    

Картинки для 1С

Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Подборка картинок для 1С.

1 стартмани

03.09.2012    27489    pyrkin_vanya    17    

Вывод изображений в системе компоновки данных и отчётах

Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

Как выводить изображения в СКД, отчетах ? Как хранить картинки, чтобы они не занимала много места?

1 стартмани

19.03.2012    4420    igorvs66    1    

Сохранение/восстановление настроек динамического списка

Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

29.07.2011    35378    Stepa86    31    

Подмена рабочего стола

Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

Несколько слов о рабочем столе в 1С 8.2, о том, что нельзя открыть произвольную форму при переключении подсистемы, а так же простой способ "обмануть" это ограничение (с примером).

1 стартмани

13.03.2011    33857    zfilin    31    

1С 8.1: Интерфейс: Работа с формами

Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

10.02.2011    16418    jan27    29    

Методика добавления нового интерфейса для типовой конфигурации 1С:Бухгалтерия предприятия ред. 2.0

Работа с интерфейсом v8 БП2.0 Россия Абонемент ($m)

Целью данной инструкции является описать методику действий разработчика при добавлении нового интерфейса пользователя для типовой конфигурации 1С:Бухгалтерия предприятия 2.0.

1 стартмани

30.12.2010    45756    tomvlad    5    

Оповещения пользователям об изменении конфигурации

Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

Как сообщить всем пользователям, что добавлен новый, очень нужный и полезный механизм в 1С: Предприятие 8.1 или 8.2? В этой статье я расскажу как это сделать с минимальным исправлением конфигурации поставщика.

1 стартмани

20.08.2010    19433    opx    24    

Стандартная "Настройка периода" в отчетах на базе СКД

Практика программирования Работа с интерфейсом v8 Россия Абонемент ($m)

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

1 стартмани

31.12.2009    12245    yuraskas    8    

Вывод дополнительной информации - ИНН и адреса контрагента - в список значений при вводе по строке

Практика программирования Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

Когда в информационной базе много контрагентов, пользователи при заполнении реквизитов форм документов активно используют понравившуюся им функцию «ввод по строке» Это ускоряет ввод большого объема информации за счет эффективного использования клавиатуры и уменьшения нагрузки на базу. Бывают случаи, когда существует очень много контрагентов с одинаковыми наименованиями, то просто невозможно быстро выбрать нужного из списка, так как код в скобках не несет смысловой нагрузки. Хотя возможен ввод по ИНН, но он не получил широкого распространения из-за сравнительно большой длины ИНН и психологического неприятия ввода рутинных операций. По этой причине представляется интересным решение, позволяющее выводить дополнительно в списке информацию об ИНН контрагента и его адресе. Пример программной реализации обработчика для конфигурации Управление торговлей 8.1 релиз 10.3.8.9, продемонстрирован в присоединенном к данной статье файле.

1 стартмани

05.12.2009    13478    its    9