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