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