Пользователь кликают ячейку в колонку которая его интересует, когда решил что пора искать нажимает CTRL+S, набирает первые символы искомого объекта и далее нажимает вперед или назад. Поиск работает аналогично как обычных формах.
Краткое описание алгоритма:
Осуществляем выборку всех объектов, по правилам отбора которые настроены в динамическом списке и упорядочиваем наш результат выборки. Для того что бы результат запроса был пронумерован используем СКД с выводом в таблицу значений. Для того чтобы таблицу значений хранить на клиенте создаем реквизит на форме с типом таблица значений. Полученную таблицу из СКД, выгружаем в реквизит формы. И если пользователь нажал вперед то в динамическом списке делаем текущую строку, ссылку на следующий объект, после объекта активной строки из нашей таблицы значений в реквизите формы. И если пользователь нажал назад то в динамическом списке делаем текущую строку, ссылку на предыдущий объект, после объекта активной строки из нашей таблицы значений в реквизите формы.
Далее идет краткое описание пунктов на которые нужно обратить внимание когда вы будите писать аналогичный механизм на реальные управляемые формы. Эти пункты нельзя назвать инструкцией к написанию, вашего поиска, это скорее пункты по которым можно внести четкую ясность как работает код в опубликованной конфигурации на что можно ориентироваться при написании уже ваших алгоритмов.
1) Создаем форму списка
2) У формы списка создаем два реквизита
а) СтрокаПоиска с типом Строка
б) ВыборкаПоОбъект с типом таблица значений
3)На форме списка размещаем реквизит формы "СтрокаПоиска" в поле ввода и назначаем горячую клавишу "Ctrl+S".
4) Создаем две команды формы Вперед и Назад, размещаем их на форме списка. Командам назначаем обработчики.
5)В объекте, в нашем случае в номенклатуре создаем СКД с помощью которой будет формироваться список объектов по которым будет ходить курсор поиска. В СКД пишем запрос так что бы потом представлялось возможным открыть его в конструкторе запроса, а в коде заменить определенные подстроки и получить запрос к исполнению. А именно в время поиска важна Сортировка в списке объектов и то в какая ячейка сейчас выделена (по ней искать и нужно).
К примеру запрос
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Родитель,
Номенклатура.ОсновнойПоставщик.Наименование КАК ОсновнойПоставщик,
Номенклатура.Наименование
ПОМЕСТИТЬ ТаблицаНоменклатуры
ИЗ
Справочник.Номенклатура КАК Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаНоменклатуры.Ссылка,
ТаблицаНоменклатуры.Родитель,
ТаблицаНоменклатуры.ОсновнойПоставщик,
ТаблицаНоменклатуры.Наименование
ИЗ
ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
ГДЕ
(&актинаяЯчйка ПОДОБНО &СтрокаПоиска
ИЛИ ТаблицаНоменклатуры.Ссылка = &Ссылка)
УПОРЯДОЧИТЬ ПО
&ПараметрУПР
В этом запросе потом меняем
ЯчекааПоиска="ТаблицаНоменклатуры."+АктинаяЯчейка;
ТекстЗапроса=СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос;
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&ПараметрУПР",Порядок);
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&актинаяЯчйка",ЯчекааПоиска);
СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос=ТекстЗапроса;
Обращаю внимание что все колонки по которым будет осуществляться поиск, выбираем данные во временную таблицу и преобразуем их в строки для возможности дальнейшего сравнения.
5) программно переносим отборы настроенные в динамическом списке в нашу СКД поиска (этого пока не реализовано в примере, если будет актуально хотя бы нескольким пользователям то можно и доработать).
6) Так же в настройках СКД предусмотрительно добавляем возможные отборы, для иерархического справочника это будет Родитель элемента.
В случае если поиск в иерархическом справочнике, и отображение не списком то будет заполнять отбор
Если ПараметрыПоиска.Отображение<>"Список" тогда
// Натсройка отборов
НастройкиР.Отбор.Элементы[0].Использование=истина;
НастройкиР.Отбор.Элементы[0].ПравоеЗначение=ССылка.Родитель;
КонецЕсли;
7) У элемента формы СПИСОК создаем событие "СписокПриАктивизацииЯчейки" в нем прописываем заполнение переменой "АктинаяЯчейка" объявленной в модуле формы:
&НаКлиенте
Перем АктинаяЯчейка;
&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
АктинаяЯчейка=Элемент.ТекущийЭлемент.Имя;
КонецПроцедуры
8) У поля ввода "СтрокаПоиска" (пункт 3), создаем обработчик события "АвтоПодбор", в нем прописываем:
&НаКлиенте
Процедура СтрокаПоискаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
ПараметрыПоиска=ФормированиеСтруктурыПоиска();
ПоискПодобноНаСервер(ПараметрыПоиска);
КонецПроцедуры
9)В обработчиках команд форм "ВПЕРЕД" и "НАЗАД" пишем
&НаКлиенте
Процедура Вперед(Команда)
СтрокаДокумента=КонтрлоьПеремещения();
НомерТекущегоДокумента=СтрокаДокумента[0].СистемныеПоляНомерПоПорядку;
Если ВыборкаПоОбъект.Количество() > НомерТекущегоДокумента Тогда
Элементы.Список.ТекущаяСтрока=ВыборкаПоОбъект[НомерТекущегоДокумента].ССылка;
Иначе
Сообщить("Элемент не найден, или поиск окончен");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Назад(Команда)
СтрокаДокумента=КонтрлоьПеремещения();
НомерТекущегоДокумента=СтрокаДокумента[0].СистемныеПоляНомерПоПорядку;
Если НомерТекущегоДокумента-2 >=0 Тогда
Элементы.Список.ТекущаяСтрока=ВыборкаПоОбъект[НомерТекущегоДокумента-2].ССылка;
Иначе
Сообщить("Элемент не найден, или поиск окончен");
КонецЕсли;
КонецПроцедуры
10) Пишем вспомогательные процедуры
&НаКлиенте
Функция ФормированиеСтруктурыПоиска()
ПараметрыПоиска=Новый Структура;
ПараметрыПоиска.Вставить("Порядок",Строка(ЭтаФорма.Список.Порядок));
ПараметрыПоиска.Вставить("Ссылка",Элементы.Список.ТекущаяСтрока);
ПараметрыПоиска.Вставить("АктинаяЯчейка",АктинаяЯчейка);
ПараметрыПоиска.Вставить("СтрокаПоиска",Элементы.СтрокаПоиска.ТекстРедактирования);
ПараметрыПоиска.Вставить("Отображение",Строка(Элементы.Список.Отображение));
Возврат ПараметрыПоиска;
КонецФункции // ()
&НаСервереБезКонтекста
Функция ПоискПодобно(ПараметрыПоиска)
Порядок=ПараметрыПоиска.Порядок;
АктинаяЯчейка=ПараметрыПоиска.АктинаяЯчейка;
ССылка=ПараметрыПоиска.ССылка;
СтрокаПоиска=ПараметрыПоиска.СтрокаПоиска+"%";
СхемаКомпановкиДанныхР=Справочники.Номенклатура.ПолучитьМакет("Поиск");
ЯчекааПоиска="ТаблицаНоменклатуры."+АктинаяЯчейка;
ТекстЗапроса=СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос;
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&ПараметрУПР",Порядок);
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&актинаяЯчйка",ЯчекааПоиска);
СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос=ТекстЗапроса;
КомпновщиеНастроекР=Новый КомпоновщикНастроекКомпоновкиДанных;
КомпновщиеНастроекР.ЗагрузитьНастройки(СхемаКомпановкиДанныхР.НастройкиПоУмолчанию);
НастройкиР=КомпновщиеНастроекР.Настройки;
НастройкиР.ПараметрыДанных.Элементы[0].Значение=СтрокаПоиска;
НастройкиР.ПараметрыДанных.Элементы[1].Значение=ССылка;
если ПараметрыПоиска.Отображение<>"Список" тогда
// Натсройка отборов
НастройкиР.Отбор.Элементы[0].Использование=истина;
НастройкиР.Отбор.Элементы[0].ПравоеЗначение=ССылка.Родитель;
КонецЕсли;
КомпоновщикМакетаР=Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиР=КомпоновщикМакетаР.Выполнить(СхемаКомпановкиДанныхР,НастройкиР, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанныхР=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанныхР.Инициализировать(МакетКомпоновкиР);
ПроцессорВыводВКолецкцию=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ВыборкаПоОбъект = Новый ТаблицаЗначений;
ПроцессорВыводВКолецкцию.УстановитьОбъект(ВыборкаПоОбъект);
ПроцессорВыводВКолецкцию.Вывести(ПроцессорКомпоновкиДанныхР);
Возврат ВыборкаПоОбъект;
КонецФункции // ПоискПодобно()
&НаСервере
Процедура ПоискПодобноНаСервер(ПараметрыПоиска)
табл=ПоискПодобно(ПараметрыПоиска);
Если ТипЗнч(табл)=ТИп("ТаблицаЗначений") тогда
ЗначениеВРеквизитФормы(табл,"ВыборкаПоОбъект");
ЭтаФорма.СтрокаПоиска=ПараметрыПоиска.СтрокаПоиска;
КонецЕсли;
КонецПроцедуры