Как ограничить поиск в динамическом списке только определенными колонками

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с перегруженными формами, где динамический список содержит десятки колонок, стандартный поиск (Ctrl+F) или общая строка поиска могут работать неэффективно. Платформа 1С по умолчанию пытается искать введенную строку во всех видимых строковых полях, что не только замедляет работу системы, но и выдает пользователю массу лишних результатов. В данной статье мы разберем, как сузить область поиска до конкретных колонок, используя как стандартные настройки, так и программные методы.

Метод 1. Настройка свойств полей в схеме компоновки данных

Самый простой и правильный с точки зрения архитектуры платформы способ — это управление свойством Использовать для поиска. Каждое поле, которое входит в состав динамического списка, обладает этим признаком. Если мы снимем этот флаг, стандартные механизмы поиска будут игнорировать данную колонку.

Рассмотрим, как это сделать в конфигураторе:

  1. Откроем форму, на которой размещен динамический список.
  2. Перейдем в свойства динамического списка и откроем Настройку списка (или основную схему компоновки данных, если список строится на ней).
  3. В таблице доступных полей найдем нужную колонку.
  4. Снимем флажок в колонке Использовать для поиска.

Если нам необходимо управлять этим поведением динамически, в зависимости от прав пользователя или других условий, мы можем обратиться к настройкам программно. Проанализируем пример кода:


// Пример отключения поиска для конкретного поля при создании формы
ЭлементПоля = Список.КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора.Элементы.Найти("ИмяВашегоПоля");
Если ЭлементПоля <> Неопределено Тогда
    ЭлементПоля.ИспользованиеВПоиске = Ложь;
КонецЕсли;

Метод 2. Использование метода УстановитьОграниченияИспользованияВОтборе

Как было отмечено в ходе обсуждения проблемы, одним из эффективных способов является метод УстановитьОграниченияИспользованияВОтборе. Этот метод позволяет жестко ограничить возможность использования полей в механизмах компоновки данных, что напрямую влияет на поведение строки поиска.

Разберем, как применить этот метод. Обычно он вызывается в модуле формы, например, в обработчике ПриСозданииНаСервере. Мы явно указываем списку, какие поля нельзя использовать для фильтрации и поиска.


// Ограничиваем использование полей в отборе и поиске
МассивИсключаемыхПолей = Новый Массив;
МассивИсключаемыхПолей.Добавить("ЛишняяКолонка1");
МассивИсключаемыхПолей.Добавить("ЛишняяКолонка2");

Список.УстановитьОграниченияИспользованияВОтборе(МассивИсключаемыхПолей, Истина);

Важный нюанс: при использовании этого метода поле может стать недоступным и для ручной настройки отбора пользователем через "Настроить список". Это следует учитывать, если пользователям все же нужна возможность устанавливать точечные фильтры по этим колонкам.

Метод 3. Реализация собственной строки поиска (Custom Search)

В типовых конфигурациях, таких как УТ 11 или ERP 2 (например, в справочнике Партнеры), часто отказываются от стандартной строки поиска в пользу собственного поля ввода. Это дает разработчику полный контроль над процессом.

Выясним причину популярности этого метода: он позволяет не только ограничить колонки, но и реализовать сложную логику (например, поиск по части слова в разных полях с использованием оператора ИЛИ). Разберем алгоритм реализации:

  1. Добавим на форму строковый реквизит (например, СтрокаПоиска) и вынесем его на панель над списком.
  2. Для этого поля создадим событие ПриИзменении.
  3. В обработчике будем программно изменять фиксированные настройки динамического списка.

Посмотрим на пример программной реализации такого фильтра:


&НаСервере
Процедура ОбновитьПоискНаСервере()
    
    // Очищаем старый поиск, созданный этим механизмом
    ГруппаПоиска = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
    ГруппаПоиска.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
    
    // Добавляем условия только по нужным нам колонкам
    ЭлементОтбора = ГруппаПоиска.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
    ЭлементОтбора.ПравоеЗначение = Объект.СтрокаПоиска;
    ЭлементОтбора.Использование = Истина;
    
    ЭлементОтбора = ГруппаПоиска.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Артикул");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
    ЭлементОтбора.ПравоеЗначение = Объект.СтрокаПоиска;
    ЭлементОтбора.Использование = Истина;
    
КонецПроцедуры

Этот метод также решает задачу фиксации истории поиска. Поскольку поиск инициируется вашим кодом, вы можете записывать значение Объект.СтрокаПоиска в регистр сведений или журнал регистрации, чтобы потом проанализировать, что именно искали пользователи.

Метод 4. Индексация и полнотекстовый поиск

Проанализируем ситуацию, когда платформа продолжает искать по полям, даже если мы пытаемся их ограничить. Это часто связано с настройками метаданных. Стандартный поиск в 1С активно использует Полнотекстовый поиск (ППД).

Если для объекта метаданных включен полнотекстовый поиск, то поиск в динамическом списке может использовать индекс ППД. Чтобы исключить поле из этого механизма:

Внимание: это изменение повлияет на глобальный поиск в программе (через значок лупы в заголовке), а не только на конкретный динамический список.

Рекомендации по выбору метода

Выясним, какой метод лучше подходит под ваши задачи:

Таким образом, комбинируя стандартные настройки платформы и программное управление отборами, мы можем добиться максимально точного и быстрого поиска в динамических списках, повышая удобство работы конечных пользователей.

← На главную