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