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