При работе в интерфейсе Обычные формы конфигурации Управление торговлей 10.3 пользователи часто сталкиваются с ограничением стандартного механизма Поиск по строке, который по умолчанию ищет элементы только по началу наименования. Давайте разберемся, как расширить этот функционал и дать пользователям возможность находить нужные элементы справочника по любой части слова.
Самым прямым способом реализации является перехват ввода текста в поле ввода с помощью обработчика события АвтоПодборТекста. В этом случае мы самостоятельно формируем запрос к базе данных с использованием оператора ПОДОБНО.
Рассмотрим пошагово, как это реализовать:
АвтоПодборТекста.Для реализации поиска по произвольной части строки мы используем спецсимвол % (процент), который в языке запросов 1С означает любое количество символов. Наш запрос будет выглядеть следующим образом:
// В обработчике события АвтоПодборТекста
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 20
| СправочникСсылка.Наименование КАК Представление,
| СправочникСсылка.Ссылка
|ИЗ
| Справочник.ВашСправочник КАК СправочникСсылка
|ГДЕ
| СправочникСсылка.Наименование ПОДОБНО &ПараметрПоиска";
Запрос.УстановитьПараметр("ПараметрПоиска", "%" + Текст + "%");
Результат = Запрос.Выполнить().Выгрузить();
// Заполняем список выбора
СписокВыбора.Очистить();
Для Каждого СтрокаРезультата Из Результат Цикл
СписокВыбора.Добавить(СтрокаРезультата.Ссылка, СтрокаРезультата.Представление);
КонецЦикла;
Важное замечание: При использовании ПОДОБНО с ведущим процентом "%Текст%", SQL-сервер не может использовать индекс по полю Наименование, что на очень больших справочниках может вызвать замедление работы. Всегда старайтесь ограничивать выборку конструкцией ПЕРВЫЕ 20, чтобы не перегружать интерфейс лишними данными.
Для работы с большими объемами данных предпочтительнее использовать встроенный механизм ПолнотекстовыйПоиск. Этот инструмент позволяет искать данные не только по полному совпадению, но и с учетом словоформ. В типовых конфигурациях, таких как УТ 10.3, для этого предусмотрена специальная обработка ПоискОбъектовВСпискахДанных.
Разберем пример создания объекта поиска для номенклатуры:
Функция СоздатьОбъектПоискаДанныхДляНоменклатуры(ЭлементФормы, ОбъектФормыСписок, СписокДанных)
мПоискОбъектов = Обработки.ПоискОбъектовВСпискахДанных.Создать();
мПоискОбъектов.ТипОбъектовПоиска = Тип("СправочникСсылка.Номенклатура");
// Настраиваем поля для поиска
мПоискОбъектов.СписокБыстрыхОтборовПоРеквизитам.Добавить("Наименование", "Наименование");
мПоискОбъектов.СписокБыстрыхОтборовПоРеквизитам.Добавить("Артикул", "Артикул");
// Привязываем элементы формы
мПоискОбъектов.ОбъектФормыЗначениеОтбораСпискаДанных = ЭлементФормы;
мПоискОбъектов.ОбъектФормыСписок = ОбъектФормыСписок;
мПоискОбъектов.Список = СписокДанных;
Возврат мПоискОбъектов;
КонецФункции
Преимущество этого метода в том, что он индексирует данные заранее. Однако, не забывайте, что для актуальности поиска полнотекстовый индекс должен обновляться регламентным заданием.
Если вы работаете с СправочникСписок в табличном поле, вы можете использовать встроенный механизм отборов, который транслирует условие Содержит в корректный запрос к базе данных. Это самый простой способ, не требующий написания сложных SQL-запросов вручную.
Проанализируем реализацию в событии ПриИзменении поля ввода:
// Очищаем существующие отборы
ЭлементыФормы.СправочникСписок.Отбор.Наименование.Использование = Ложь;
// Устанавливаем новый отбор
ЭлементыФормы.СправочникСписок.Отбор.Наименование.ВидСравнения = ВидСравнения.Содержит;
ЭлементыФормы.СправочникСписок.Отбор.Наименование.Значение = ВведеннаяСтрока;
ЭлементыФормы.СправочникСписок.Отбор.Наименование.Использование = Истина;
Этот подход позволяет платформе самостоятельно оптимизировать запрос. Он идеально подходит для справочников среднего размера (до 20-50 тысяч элементов) и делает код максимально читаемым и поддерживаемым.
Мы выяснили, что для решения задачи поиска по части строки в Обычных формах существует три пути:
Обычных формах.Совет: Всегда анализируйте количество данных в справочнике. Если вы планируете использовать АвтоПодбор, обязательно ограничивайте вывод результата 10-20 элементами, иначе интерфейс будет подтормаживать при каждом нажатии клавиши пользователем. Удачи в доработке вашего функционала!