Ввод по строке вхождением с доп параметрами и подсветкой вхождения

ChOP 226 3 8 7

К оригиналу добавил возможность передать дополнительно свои условия к запросу

Модуль менеджера

//Параметры.ДопУсловияПоиска - строка - значение подставится в параметры запроса
// Пример: Справочники.ПодразделенияОрганизаций.ПолучитьДанныеВыбора(Новый Структура("СтрокаПоиска, ВводПоСтрокеРасширенный, ДопУсловияПоиска",
//		СтрокаПоиска, Истина, 
//		"И ПодразделенияОрганизаций.ПометкаУдаления = Ложь 
//		|И ПодразделенияОрганизаций.КОРВ_ЭтоГруппаПодразделения = Ложь
//		|И ПодразделенияОрганизаций.Расформировано = Ложь"))
&После("ОбработкаПолученияДанныхВыбора")
Процедура КОРВ_ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
	
	СтрокаПоиска = СтрЗаменить(Параметры.СтрокаПоиска, """", ""); // нормализация
	
	Если СтрокаПоиска <> "" И Параметры.Свойство("ВводПоСтрокеРасширенный") Тогда
		
		МаксимумСтрокРезультата = 10;
		
		МассивСловПоиска     = СтрРазделить(СтрокаПоиска, " ", Ложь);
		КоличествоСловПоиска = МассивСловПоиска.Количество();
		
		Если КоличествоСловПоиска > 0 Тогда
			
			МассивСоединенияУсловий    = Новый Массив;
			МассивСоединенияПриоритета = Новый Массив;
			СтандартнаяОбработка       = Ложь;
			СписокВыбора               = Новый СписокЗначений;
			Запрос                     = Новый Запрос;
			
			Если Параметры.Свойство("ДопУсловияПоиска") Тогда				
				 МассивСоединенияУсловий.Добавить(Параметры.ДопУсловияПоиска);
			КонецЕсли;
			
			Если Параметры.Свойство("ПараметрыЗапроса") Тогда				
				Для Каждого Парам Из Параметры.ПараметрыЗапроса Цикл 
					Запрос.Параметры.Вставить(Парам.Ключ, Парам.Значение);
				КонецЦикла;
			КонецЕсли;
			
			Для НомерСловаПоиска = 1 По КоличествоСловПоиска Цикл
				
				СловоПоиска      = МассивСловПоиска[НомерСловаПоиска - 1];
				ДлинаСловаПоиска = СтрДлина(СловоПоиска);
				
				Запрос.УстановитьПараметр("СловоПоиска" + НомерСловаПоиска, "%" + СловоПоиска + "%");
				
				МассивСоединенияУсловий.Добавить("
				|	И (ПодразделенияОрганизаций.Наименование ПОДОБНО &СловоПоиска" + НомерСловаПоиска + "
				|  ИЛИ ПодразделенияОрганизаций.Код ПОДОБНО &СловоПоиска" + НомерСловаПоиска + ")");
				
				МассивСоединенияПриоритета.Добавить(СтрШаблон("
				|		КОГДА ПОДСТРОКА(ПодразделенияОрганизаций.Наименование, 1, %1) = ""%2""
				|		  ТОГДА %3", Формат(ДлинаСловаПоиска, "ЧГ="), СловоПоиска, НомерСловаПоиска));
				
			КонецЦикла;
			
			ПриоритетСортировки = СтрСоединить(МассивСоединенияПриоритета);
			УсловияПоиска       = СтрСоединить(МассивСоединенияУсловий,"");
			
			МассивСоединенияЗапроса = Новый Массив;
			
			МассивСоединенияЗапроса.Добавить("ВЫБРАТЬ ПЕРВЫЕ ");
			МассивСоединенияЗапроса.Добавить(МаксимумСтрокРезультата);
			МассивСоединенияЗапроса.Добавить("
											|	ПодразделенияОрганизаций.Ссылка КАК Ссылка,
											|	ПодразделенияОрганизаций.Код КАК Код,
											|	ПодразделенияОрганизаций.Наименование КАК Наименование,
											|	ПодразделенияОрганизаций.ПометкаУдаления КАК ПометкаУдаления,
											|	ВЫБОР");
			МассивСоединенияЗапроса.Добавить(ПриоритетСортировки);
			МассивСоединенияЗапроса.Добавить("
											|		ИНАЧЕ 9
											|	КОНЕЦ КАК ПриоритетСортировки
											|ИЗ
											|	Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
											|ГДЕ
											|	ИСТИНА ");
			МассивСоединенияЗапроса.Добавить(УсловияПоиска);
			МассивСоединенияЗапроса.Добавить("
											|УПОРЯДОЧИТЬ ПО
											|	ПриоритетСортировки, Наименование");
			
			Запрос.Текст = СтрСоединить(МассивСоединенияЗапроса);
			
			Выборка = Запрос.Выполнить().Выбрать(); 
			
			Пока Выборка.Следующий() Цикл
				
				СписокВыбора.Добавить(Новый Структура("Значение, ПометкаУдаления", Выборка.Ссылка, Выборка.ПометкаУдаления), ПодсветитьСлова(Выборка.Наименование + 
										" (" + Выборка.Код + ")", МассивСловПоиска));
				
			КонецЦикла;
			
			ДанныеВыбора = СписокВыбора;
			
		КонецЕсли;
		
	КонецЕсли; 
	
КонецПроцедуры

Функция ПодсветитьСлова(ИсходнаяСтрока, МассивСловПодсветки, Знач ШрифтПодсветки = Неопределено, Знач ЦветПодсветки = Неопределено)
	
	МассивРезультирующихСтрок = Новый Массив;
	
	Если ШрифтПодсветки = Неопределено Тогда
		ШрифтПодсветки = Новый Шрифт(,, Истина); // жирный
	КонецЕсли;
	
	Если ЦветПодсветки = Неопределено Тогда
		ЦветПодсветки = Новый Цвет(0, 153, 0); // светло-зеленый из стандартной подсветки ввода по строке
	КонецЕсли;
	
	ИсходнаяСтрокаНормализованная = НРег(ИсходнаяСтрока); // нормализация
	ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрокаНормализованная);
	
	// получим список диапазонов символов для подсветки
	СписокДиапазонов = Новый СписокЗначений;
	Для НомерСлова = 1 По МассивСловПодсветки.Количество() Цикл
		СловоПодсветки     = НРег(МассивСловПодсветки[НомерСлова - 1]); // нормализация
		ПозицияНачалаСлова = 1;
		ДлинаСлова         = СтрДлина(СловоПодсветки);
		Пока ПозицияНачалаСлова <> 0 И ПозицияНачалаСлова <= ДлинаИсходнойСтроки Цикл
			ПозицияНачалаСлова = СтрНайти(ИсходнаяСтрокаНормализованная, СловоПодсветки, , ПозицияНачалаСлова);
			Если ПозицияНачалаСлова > 0 Тогда
				МассивДиапазона = Новый Массив;
				МассивДиапазона.Добавить(ПозицияНачалаСлова);
				МассивДиапазона.Добавить(ПозицияНачалаСлова + ДлинаСлова - 1);
				СписокДиапазонов.Добавить(МассивДиапазона, Формат(ПозицияНачалаСлова, "ЧЦ=3; ЧВН="));
				ПозицияНачалаСлова = ПозицияНачалаСлова + ДлинаСлова;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	// отсортируем список диапазонов по возрастанию начал диапазонов
	СписокДиапазонов.СортироватьПоПредставлению();
	
	// сформируем массив результирующих строк с разным оформлением (подсветкой)
	СтартоваяПозиция = 1;
	Для Каждого ЭлементДиапазона Из СписокДиапазонов Цикл
		НачалоДиапазона = ЭлементДиапазона.Значение[0];
		КонецДиапазона  = ЭлементДиапазона.Значение[1];
		Если НачалоДиапазона > СтартоваяПозиция Тогда // часть строки без подсветки
			ЧастьБезВыделения = Сред(ИсходнаяСтрока, СтартоваяПозиция, НачалоДиапазона - СтартоваяПозиция);
			МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(ЧастьБезВыделения));
			СтартоваяПозиция = НачалоДиапазона;
		КонецЕсли;
		Если КонецДиапазона >= СтартоваяПозиция Тогда // часть строки с подсветкой
			ЧастьВыделяемая = Сред(ИсходнаяСтрока, СтартоваяПозиция, КонецДиапазона - СтартоваяПозиция + 1);
			МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(ЧастьВыделяемая, ШрифтПодсветки, ЦветПодсветки));
			СтартоваяПозиция = КонецДиапазона + 1;
		КонецЕсли;
	КонецЦикла;
	
	Если СтартоваяПозиция <= ДлинаИсходнойСтроки Тогда // "хвост" без выделения
		Хвост = Сред(ИсходнаяСтрока, СтартоваяПозиция, ДлинаИсходнойСтроки - СтартоваяПозиция + 1);
		МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(Хвост));
	КонецЕсли;
	
	Возврат Новый ФорматированнаяСтрока(МассивРезультирующихСтрок);
	
КонецФункции

Модуль формы

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

&НаСервереБезКонтекста
Функция ПолучитьДанныеВыбораРасширенные(СтрокаПоиска)
	
	Возврат Справочники.ПодразделенияОрганизаций.ПолучитьДанныеВыбора(Новый Структура("СтрокаПоиска, ВводПоСтрокеРасширенный, ДопУсловияПоиска",
		СтрокаПоиска, Истина, 
		"И ПодразделенияОрганизаций.ПометкаУдаления = Ложь И ПодразделенияОрганизаций.КОРВ_ЭтоГруппаПодразделения = Ложь
		|И ПодразделенияОрганизаций.Расформировано = Ложь"));
	
КонецФункции

Источник

0

См. также

СинонимыДопПараметровМетодов (БСП)

ПослеВводаСтрокНаРазныхЯзыках (БСП)

ОткрытьФормуПараметровПроксиСервера (БСП)

ПоказатьПараметрыАдминистрирования (БСП)

ПодставитьПараметрыВСтрокуИзМассива (БСП)

ПараметрыИзСтроки (БСП)

ПодставитьПараметрыВСтроку (БСП)

Модератору