Предлагаю способ, наверное уже избитый, но в поиске не нашел.
Смысл решения, практически тоже самое что предложено Ёпрст. На практике это использую почти год.
Фильтрация происходит по набранным символам разделенных пробелами. Сортировка происходит по первому набору символов (до пробела)
Требования: 1С++
Версия: SQL (с DBF сто лет не работал, наверное что-то нужно поменять :) )
Ограничения. Если установлен отбор из диалога 1С, фильтрация не работает (скорее всего я не разобрался как программно снимать отбор, надеюсь в комментах подскажут)
Код приведенный ниже, добавить в нужную форму.
У меня в ГМ при начале работы системы присвоена глРС = СоздатьОбъект("ODBCRecord");
и глСтрокаРазрешенныхСимволов = " .,-+*/\_0123456789абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz";
Их необходимо создать и объявить для работы данного алгоритма.
Перем СтрокаСимволов;
Перем ТекФлагИерархическогоСписка;
Перем СпЗн;
Перем ОтборУстановлен;
Процедура ПриУстановкеОтбора(ТипОтбора,ЗначениеОтбора)
ОтборУстановлен = ТипОтбора;
КонецПроцедуры
Функция ПолучитьСписокЭлементов(ВидСправочника, СтрокаСимволов)
СтрДляПозиции = СтрокаСимволов;
Пробел = Найти(СтрДляПозиции," ");
Если Пробел>0 Тогда
СтрДляПозиции = Лев(СтрДляПозиции,Пробел-1);
КонецЕсли;
ТекстЗапроса = "
|SELECT ID [Ссылка $Справочник."+ВидСправочника+"]
| , case when CHARINDEX ('"+СтрДляПозиции+"', "+ВидСправочника+".DESCR)=0 then 999 else CHARINDEX ('"+СтрДляПозиции+"', "+ВидСправочника+".DESCR) end ПозицияВСтроке
|FROM $Справочник."+ВидСправочника+" AS "+ВидСправочника+" With (NOLOCK)
|WHERE ("+ВидСправочника+".ISFOLDER >= 0)
|";
Если ПустаяСтрока(СтрокаСимволов)=0 Тогда
СтрДляЗапроса = "
|AND ("+ВидСправочника+".DESCR LIKE '%"+СтрЗаменить(СтрокаСимволов," ","%') AND ("+ВидСправочника+".DESCR LIKE '%");
СтрДляЗапроса = СтрДляЗапроса + "%')
|";
ТекстЗапроса=ТекстЗапроса+СтрДляЗапроса;
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|ORDER BY ПозицияВСтроке, "+ВидСправочника+".DESCR
|";
глРС.ВыполнитьИнструкцию(ТекстЗапроса, СпЗн);
Возврат СпЗн;
КонецФункции
Процедура ПриНажатииКнопкиКлавиатуры(_код, _а, _ш, _к, _симв, ФСО)
Если Лев(Форма.ТекущаяКолонка(),12)="Наименование" Тогда
Если ПустоеЗначение(ОтборУстановлен)=0 Тогда
УстановитьОтбор("","");
Возврат;
КонецЕсли;
Если (_а=1) или (_ш=1) или (_к=1) Тогда
ФСО=1;
Возврат;
КонецЕсли;
Если _код = 27 Тогда
Если СтрокаСимволов="" Тогда
Фсо = 1;
Возврат;
КонецЕсли;
КурсорНаЭлементе = ТекущийЭлемент();
СтрокаСимволов = "";
Форма.Наименование.Заголовок("Наименование");
СпЗн.УдалитьВсе();
ИспользоватьСписокЭлементов();
ИерархическийСписок(ТекФлагИерархическогоСписка,1);
Попытка
АктивизироватьОбъект(КурсорНаЭлементе);
Исключение
КонецПопытки;
ФСО = 1;
Возврат;
ИначеЕсли _код = 8 Тогда
СтрокаСимволов = Лев(СтрокаСимволов, СтрДлина(СтрокаСимволов)-1);
ИначеЕсли _симв="" Тогда
ФСО = 1;
Возврат;
ИначеЕсли Найти(глСтрокаРазрешенныхСимволов, Нрег(_симв))>0 Тогда
СтрокаСимволов = СтрокаСимволов + _симв;
Иначе
ФСО = 1;
Возврат;
КонецЕсли;
Форма.Наименование.Заголовок("Наименование ("+СтрокаСимволов+")");
СпЗн = ПолучитьСписокЭлементов("Номенклатура", СтрокаСимволов);
ИспользоватьСписокЭлементов(СпЗн);
ИерархическийСписок(0,0);
ФСО = 0;
КонецЕсли;
КонецПроцедуры
Процедура ПриОткрытии()
ТекФлагИерархическогоСписка = ВосстановитьЗначение("ТекФлагИерархическогоСпискаНоменклатура");
СтрокаСимволов = "";
СпЗн = СоздатьОбъект("СписокЗначений");
КонецПроцедуры
Процедура ПриСменеИерархии(Способ)
ТекФлагИерархическогоСписка = Способ;
КонецПроцедуры
Процедура ПриЗакрытии()
СохранитьЗначение("ТекФлагИерархическогоСпискаНоменклатура",ТекФлагИерархическогоСписка);
КонецПроцедуры