Например так (ниже приведен не конечный код, а набросок реализации идеи)
Требуются 1c++, formex, база sql
Перем мСтрПоиска;
Процедура ПриОткрытии()
мСтрПоиска="";
КонецПроцедуры
Процедура ПриНажатииКнопкиКлавиатуры(кодКл,альт,шифт,ктрл,символ,ФСО)
Если Форма.АктивныйЭлемент()="Наименование" Тогда
Если (альт=0)И(ктрл=0)И(символ>"") Тогда
ФСО=0;
Если кодКл=8 Тогда
Если мСтрПоиска>"" Тогда
мСтрПоиска=Лев(мСтрПоиска,СтрДлина(мСтрПоиска)-1);
КонецЕсли;
ИначеЕсли кодКл=27 Тогда
мСтрПоиска="";
Иначе
мСтрПоиска=мСтрПоиска+символ;
КонецЕсли;
Если мСтрПоиска>"" Тогда
рсПоиск=СоздатьОбъект("ODBCRecordset");
рсПоиск.УстановитьТекстовыйПараметр("СтрПоиска","%"+мСтрПоиска+"%");
ТекстЗапроса="
|select top 1
| Спр.id [Ссылка $Справочник.Номенклатура]
|from $Справочник.Номенклатура Спр (nolock)
|where Спр.descr like :СтрПоиска
|/*УслГруппа*/
|order by /*isfolder*/ /*order*/ Спр.row_id
|";
Если ИерархическийСписок()=1 Тогда
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*isfolder*/","Спр.isfolder,");
//если количество уровней справочника> 1
рсПоиск.УстановитьТекстовыйПараметр("Группа",ИспользоватьРодителя());
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*УслГруппа*/","and Спр.parentid = :Группа");
//если подчиненный справочник
//рсПоиск.УстановитьТекстовыйПараметр("Владелец",ИспользоватьВладельца());
//ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*УслГруппа*/","and Спр.parentext = :Владелец");
КонецЕсли;
Сортировка=Сортировка();
Если Сортировка="Код" Тогда
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*order*/","Спр.code,");
ИначеЕсли Сортировка="Наименование" Тогда
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*order*/","Спр.descr,");
Иначе
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*order*/","$Спр."+Сортировка+",");
КонецЕсли;
Ссылка=рсПоиск.ВыполнитьСкалярный(ТекстЗапроса);
Если ПустоеЗначение(Ссылка)=0 Тогда
АктивизироватьОбъект(Ссылка);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Форма.подпСтрПоиска.Заголовок(мСтрПоиска);
КонецЕсли;
КонецПроцедуры