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