Поиск по произвольным частям текста

Часто мы точно не знаем точное и полное название элемента справочника. Но знаем примерно его части. Например, хотим найти валюту «Доллар США», но помним только что название точно содержит два слова «олл» и «ША».

Демо-база работает на платформе 1с.8.3.12 и выше.

Часто мы точно не знаем точное и полное название элемента справочника. Но знаем примерно его части. Например, хотим найти валюту "Доллар США", но помним только что название точно содержит два слова "олл" и "ША".

Паттерн получения запроса:

Функция ПолучитьЗапросНаПоискПоЛексемамВСправочнике(Текст,Справочник="Валюты",Тип="Справочник",Поле="Наименование") Экспорт

// может будет медленно, когда ссылок будет много.
// разделим строку поиска на лексемы через пробел
МассивЛексем = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Текст," ");
Для Счетчик = 0 По МассивЛексем.Количество()-1 Цикл
МассивЛексем[Счетчик] = "%"+МассивЛексем[Счетчик]+"%";
КонецЦикла;
//Если СтрокаМассива.Количество()>5 Тогда
// Сообщить("Поиск будет произведен только по первым пяти частям строки.",СтатусСообщения.Внимание);
//КонецЕсли;

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Лексема0",МассивЛексем[0]);
Запрос.УстановитьПараметр("Лексема0Р",ВосстановитьРаскладку(МассивЛексем[0]));
Запрос.Текст =
"ВЫБРАТЬ различные
| Справочник.Ссылка,Справочник.ПометкаУдаления
|ИЗ
| Справочник.Валюты КАК Справочник
|ГДЕ
| (Справочник.Наименование ПОДОБНО &Лексема0
| ИЛИ Справочник.Наименование ПОДОБНО &Лексема0Р)"
;

Для Счетчик = 1 По МассивЛексем.Количество()-1 Цикл
Запрос.УстановитьПараметр("Лексема"+Счетчик+"",МассивЛексем[Счетчик]);
Запрос.УстановитьПараметр("Лексема"+Счетчик+"Р",ОбщегоНазначения.ВосстановитьРаскладку(МассивЛексем[Счетчик]));
Запрос.Текст = Запрос.Текст+"
|И (Справочник.Наименование ПОДОБНО &Лексема"+Счетчик+"
| ИЛИ Справочник.Наименование ПОДОБНО &Лексема"+Счетчик+"Р)";
КонецЦикла;

Запрос.Текст = СтрЗаменить(Запрос.Текст,"Валюты",Справочник);
Запрос.Текст = СтрЗаменить(Запрос.Текст,"Справочник",Тип);
Запрос.Текст = СтрЗаменить(Запрос.Текст,"Наименование",Поле);

Возврат Запрос;

КонецФункции

 

Использование запроса в управляемых формах — подключение к полю выбора:

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Запрос   = ОбщегоНазначения.ПолучитьЗапросНаПоискПоЛексемамВСправочнике(Параметры.СтрокаПоиска,"Валюты");
//Запрос.Текст = Запрос.Текст+" И НЕ Справочник.НеИспользоватьВВыборе";

Результат    = Запрос.Выполнить();

ДанныеВыбора   = Новый СписокЗначений;
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Структура = Новый Структура("Значение,ПометкаУдаления",ВыборкаДетальныеЗаписи.Ссылка,ВыборкаДетальныеЗаписи.ПометкаУдаления);

Элемент = ДанныеВыбора.Добавить();
Элемент.Значение = Структура;

КонецЦикла;

КонецПроцедуры

 

4 Comments

  1. tormozit

    Чем не устроил стандартный механизм?

    Reply
  2. Rustig

    (0) интересный способ!

    (1) то, что обратили внимание на типовой механизм +

    а так-то можно и порассуждать:

    а) типовой механизм — работает только для справочников, а в статье универсально механизм — можно применить алгоритм для поиска всех документов с комментарием «Иванов» + «наличка»

    б) типовой механизм работает только для поля ввода, а в статье универсально — для любого элемента формы можно запустить поиск — например, обход строк в ТабличномДокументе и поиск чего-либо

    в) неизвестно как запрограммирован типовой алгоритм, а тут код открыт — можно свою функциональность довнести.

    Reply
  3. Evg-Lylyk
  4. user635629_exter

    (1) спасибо, не знал про это.

    (3) спасибо, перед публикацией честно искал дубли, не нашел. По ссылке хорошая вещь, но мне бы по-проще.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *