Произвольный поиск с отбором "Содержит" в СКД

1. DesertPunk 01.06.23 18:31 Сейчас в теме
Добрый день! Столкнулся со следующей проблемой: хочу реализовать произвольный поиск по наименованию. Нужно чтобы выводился общий результат отбора как по "ключ газовый", так и по "газовый ключ". Прошу помочь.
По теме из базы знаний
Найденные решения
4. SlavaKron 01.06.23 19:14 Сейчас в теме
Примерный вариант реализации
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	ОбработатьНастройки(Настройки);
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

Процедура ОбработатьНастройки(Настройки)
	
	ПолеОтбора = Новый ПолеКомпоновкиДанных("Наименование");
	
	НайденныйЭлемент = Неопределено;
	
	Для Каждого Элемент Из Настройки.Отбор.Элементы Цикл
		
		Если Элемент.Использование
			И ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных")
			И Элемент.ЛевоеЗначение = ПолеОтбора
			И Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит Тогда
			
			СловаПоиска = СтрРазделить(Элемент.ПравоеЗначение, " ", Ложь);
			
			Если СловаПоиска.Количество() > 1 Тогда
				НайденныйЭлемент = Элемент;
				Прервать;
			КонецЕсли;
				
		КонецЕсли;
			
	КонецЦикла;
	
	Если НайденныйЭлемент = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Настройки.Отбор.Элементы.Удалить(НайденныйЭлемент);
	
	Для Каждого Слово Из СловаПоиска Цикл
		ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлементОтбора.ЛевоеЗначение = ПолеОтбора;
		ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
		ЭлементОтбора.ПравоеЗначение = Слово;
	КонецЦикла;
	
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SlavaKron 01.06.23 18:51 Сейчас в теме
(1) Можно в ПриКомпоновкеРезультата отловить такой отбор и преобразовать его в группу отборов И, разделив текст поиска по словам.
3. DesertPunk 01.06.23 18:52 Сейчас в теме
(2)Спасибо. Будем посмотреть
4. SlavaKron 01.06.23 19:14 Сейчас в теме
Примерный вариант реализации
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	ОбработатьНастройки(Настройки);
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

Процедура ОбработатьНастройки(Настройки)
	
	ПолеОтбора = Новый ПолеКомпоновкиДанных("Наименование");
	
	НайденныйЭлемент = Неопределено;
	
	Для Каждого Элемент Из Настройки.Отбор.Элементы Цикл
		
		Если Элемент.Использование
			И ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных")
			И Элемент.ЛевоеЗначение = ПолеОтбора
			И Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит Тогда
			
			СловаПоиска = СтрРазделить(Элемент.ПравоеЗначение, " ", Ложь);
			
			Если СловаПоиска.Количество() > 1 Тогда
				НайденныйЭлемент = Элемент;
				Прервать;
			КонецЕсли;
				
		КонецЕсли;
			
	КонецЦикла;
	
	Если НайденныйЭлемент = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Настройки.Отбор.Элементы.Удалить(НайденныйЭлемент);
	
	Для Каждого Слово Из СловаПоиска Цикл
		ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлементОтбора.ЛевоеЗначение = ПолеОтбора;
		ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
		ЭлементОтбора.ПравоеЗначение = Слово;
	КонецЦикла;
	
КонецПроцедуры
Показать
5. DesertPunk 02.06.23 11:36 Сейчас в теме
(4) Получилось с минимальной доработкой примера:
	Для Каждого Слово Из СловаПоиска Цикл
		ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлементОтбора.ЛевоеЗначение = ПолеОтбора;
		ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Подобно;
		ЭлементОтбора.ПравоеЗначение = "%" + Слово + "%";
	КонецЦикла;
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот