Как исключить невидимые поля динамического списка из поиска в 1С?

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

При работе с управляемыми формами в 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда стандартный поиск (вызываемый по Ctrl+F или через строку поиска) ведет себя избыточно. Представим ситуацию: в динамическом списке справочника "Номенклатура" присутствуют поля Наименование, Артикул и Код. На форму выведены только первые два, однако при попытке поиска платформа находит соответствия и по полю Код, которое пользователь даже не видит. Это может путать сотрудников и замедлять работу с большими списками.

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

Разберем причину: почему платформа ищет по скрытым полям?

Прежде чем переходить к решениям, выясним причину такого поведения системы. В платформе 1С поиск в динамическом списке неразрывно связан с данными, которые фактически выбираются с сервера. Если поле включено в состав запроса динамического списка и для него установлено свойство Использовать всегда (AlwaysUse), платформа включает его в поисковый индекс текущего сеанса. Более того, даже если поле не выведено на форму, оно может считаться "активным" для системы отборов и поиска, если оно присутствует в коллекции ВыбранныеПоля компоновщика настроек.

Способ 1. Управление свойством «Использовать всегда»

Рассмотрим наиболее простой и эффективный метод (включая флажок в динамическом списке), который не требует написания сложного кода. Этот способ основан на механизме оптимизации платформы, начиная с версий 8.3.19 и выше.

Проанализируем связь видимости колонки и её участия в поиске. Если у поля динамического списка снять признак Использовать всегда, то его участие в поиске будет напрямую зависеть от его видимости на форме:

  1. Если колонка отображается на форме — поиск по ней работает.
  2. Если колонка скрыта (через свойства элемента формы Видимость) — платформа исключает её из запроса и, соответственно, из области поиска.

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

Способ 2. Программное ограничение использования в отборе

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

Посмотрим на пример кода, который позволяет ограничить поле:


// Пример программного ограничения поля "Код" для динамического списка
СписокПоля = ЭтаФорма.Список.КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора;
ПолеКод = СписокПоля.Элементы.Найти("Код");

Если ПолеКод <> Неопределено Тогда
    // Запрещаем использование поля в отборе, что автоматически исключает его из поиска
    Список.УстановитьОграниченияИспользованияВОтборе(ПолеКод, Истина);
КонецЕсли;

Рассмотрим подробнее последствия применения этого метода. Как только мы устанавливаем ограничение использования в отборе, поле полностью исчезает из интерфейса поиска и из окна настройки фильтров. Пользователь больше не сможет самостоятельно добавить отбор по этому реквизиту. Если ваша задача — оставить возможность фильтрации, но убрать только "быстрый" поиск по Ctrl+F, этот метод может оказаться слишком радикальным.

Способ 3. Ручное управление коллекцией полей через СКД

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


// Добавление поля в коллекцию и установка ограничения
НовоеПоле = ЭтаФорма.РеквизитСписокПодбор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
НовоеПоле.ПутьКДанным = "ОписаниеУслуги";
НовоеПоле.Поле = "ОписаниеУслуги";

// Устанавливаем ограничение на условие
ЭлементПоля = ЭтаФорма.РеквизитСписокПодбор.Поля.Найти("ОписаниеУслуги");
ЭлементПоля.ОграничениеИспользования.Условие = Истина;

Этот подход полезен, когда список создается динамически в коде и коллекция Поля изначально пуста. Установка ОграничениеИспользования.Условие = Истина блокирует использование реквизита в любых поисковых операциях.

Способ 4. Особенности для платформы 8.3.20 и новее

Проанализируем изменения в последних версиях платформы (8.3.20+). Механизм поиска был существенно переработан. Теперь платформа старается ориентироваться на фактическую видимость данных пользователю. Если вы используете режим Поиск по любой части, система агрегирует данные всех строковых полей.

Чтобы исключить поле из такого "умного" поиска, убедитесь, что:

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

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

Подведем итог нашему анализу. Выбор метода зависит от ваших требований к гибкости интерфейса:

  1. Если нужно просто скрыть колонку и убрать её из Ctrl+F, сохранив возможность отбора в настройках — используйте связку "Видимость = Ложь" + "Использовать всегда = Ложь".
  2. Если поле техническое и пользователь вообще не должен взаимодействовать с ним (ни в поиске, ни в отборах) — используйте метод УстановитьОграниченияИспользованияВОтборе или свойство ОграничениеИспользования.Условие в схеме.
  3. Если вы работаете с версиями ниже 8.3.19, единственным надежным способом остается программное исключение поля из выбранных полей компоновщика настроек Список.КомпоновщикНастроек.Настройки.Выбор.

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

← На главную