При разработке современных интерфейсов в 1С часто возникает задача сделать поиск «как в браузере» или на популярных маркетплейсах: пользователь вводит часть названия товара, и система тут же предлагает выпадающий список с подходящими вариантами. Однако начинающие разработчики часто сталкиваются с тем, что стандартные инструменты ведут себя не так, как ожидалось. Разберем, почему штатная «Строка поиска» таблицы не подходит для этой задачи и как правильно реализовать «живой» поиск.
Проанализируем ситуацию: когда мы включаем свойство таблицы «Положение строки поиска», платформа добавляет элемент, который жестко связан с данными, уже выведенными на экран. Его задача — фильтровать строки, которые физически присутствуют в табличной части или динамическом списке.
Если пользователь вводит текст в такое поле и нажимает Enter, фокус управления передается в саму таблицу (ТЧ), и если соответствий не найдено, таблица просто оказывается пустой. Этот механизм не предназначен для обращения к базе данных и поиска новых элементов, которых еще нет в вашей таблице. Для реализации полноценного поиска нам потребуется создать отдельный элемент управления.
Рассмотрим самый простой и эффективный способ создания выпадающего списка. Для этого нам понадобится обычное поле ввода на форме, связанное с реквизитом типа СправочникСсылка.Номенклатура или просто строковым реквизитом.
Разберем по шагам логику работы события АвтоПодбор:
СтрокаПоискаТоваров (тип: Строка).АвтоПодбор.Посмотрим на пример кода, который выполняет поиск по справочнику и подставляет результаты в выпадающее меню:
&НаСервере
Процедура СтрокаПоискаТоваровАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Если введено меньше 3 символов, поиск не запускаем для экономии ресурсов
Если СтрДлина(Текст) < 3 Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 10
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Представление
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &ТекстПоиска";
Запрос.УстановитьПараметр("ТекстПоиска", "%" + Текст + "%");
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ДанныеВыбора = Новый СписокЗначений;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Представление);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
При таком подходе, как только пользователь начнет вводить текст, система будет предлагать список из 10 подходящих товаров. Выбор из этого списка автоматически заполнит поле ввода.
Если нам нужно сделать интерфейс еще более динамичным (например, отображать дополнительные данные в списке: цену или остаток), проанализируем использование события ИзменениеТекста. В отличие от автоподбора, это событие срабатывает при каждом нажатии клавиши.
Важный нюанс: чтобы не «спамить» запросами к базе данных на каждую букву, рекомендуется использовать параметр Ожидание или проверять длину введенной строки. Для вывода кастомного списка мы будем использовать метод ПоказатьВыборИзСписка.
Рассмотрим пример реализации:
&НаКлиенте
Процедура СтрокаПоискаИзменениеТекста(Элемент, Текст, СтандартнаяОбработка)
Если СтрДлина(Текст) > 3 Тогда
// Вызываем серверный метод для получения списка
СписокРезультатов = ПолучитьСписокПоискаНаСервере(Текст);
Если СписокРезультатов.Количество() > 0 Тогда
Оповещение = Новый ОписаниеОповещения("ПослеВыбораИзПоиска", ЭтотОбъект);
ПоказатьВыборИзСписка(Оповещение, СписокРезультатов, Элемент);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если база товаров огромная и нам нужно учитывать опечатки, морфологию или искать по свойствам (как на Wildberries), выясним причину, по которой обычный ПОДОБНО может не подойти. В таких случаях следует использовать встроенный механизм Полнотекстового поиска (ППД).
Метод ПолнотекстовыйПоиск.СоздатьСписок() позволяет искать данные с высокой скоростью. Выясним, как это работает программно:
СписокЗначений для отображения пользователю.Использование ППД позволяет находить «Молоко 3.2%», даже если пользователь ввел «малоко», при условии правильной настройки поискового индекса в конфигурации.
Если задача стоит именно в том, чтобы сделать поиск удобным при заполнении строк документа (внутри ТЧ), разберем следующие инструменты:
Мы выяснили, что «Строка поиска» у таблицы — это лишь инструмент фильтрации текущего экрана. Для создания настоящего поискового окна необходимо:
1. Использовать отдельный реквизит формы.
2. Обрабатывать событие АвтоПодбор для формирования списка подсказок.
3. При необходимости сложной логики (поиск по артикулу, бренду и остаткам одновременно) задействовать Запрос или ПолнотекстовыйПоиск на сервере.
Такой подход сделает работу пользователя с программой максимально комфортной и соответствующей современным стандартам веб-интерфейсов.