Как в управляемых формах 1С реализовать выборочную отмену отбора по одной колонке

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

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

Различие между механизмом «Поиска» и «Отбора»

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

  1. Поиск (Ctrl+F): Это интерактивный инструмент. Когда пользователь нажимает «Найти», платформа накладывает временный фильтр на динамический список. В старых релизах платформы отмена такого поиска действительно приводила к сбросу всех условий.
  2. Отбор (Настройка списка): Это часть системы компоновки данных (СКД), на которой базируется ДинамическийСписок. Отборы более стабильны, их можно комбинировать в группы «И», «ИЛИ» и выводить на форму для быстрого доступа.

Для решения задачи пользователя «снимать отбор по одной колонке» мы можем использовать несколько стратегий. Рассмотрим их по шагам.

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

Начиная с современных релизов платформы 8.3 (в частности, в интерфейсе «Такси»), проблема выборочной очистки поиска была решена на уровне ядра. Если пользователь выполняет поиск последовательно по нескольким колонкам, в верхней части таблицы появляется специальная панель. Рассмотрим, как убедиться, что она включена и работает корректно:

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

Как это работает для пользователя: При вводе значений через «Найти» над списком появляются визуальные теги (облака) с названиями колонок и значениями. Чтобы отменить поиск только по «Организации», достаточно нажать на «крестик» рядом с соответствующим тегом. Остальные фильтры (по складу, контрагенту и т.д.) останутся активными. Это самый простой и правильный путь, не требующий написания кода.

Способ 2. Настройка «Быстрых отборов» над списком

Если пользователям неудобно постоянно нажимать Ctrl+F, мы можем вынести наиболее важные поля (Организация, Касса, Ответственный) непосредственно на форму. Это позволит управлять ими точечно. Проанализируем процесс настройки:

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

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

Способ 3. Программное управление элементами отбора

В некоторых случаях требуется реализовать специфическую логику, например, кнопку в контекстном меню «Сбросить текущий фильтр». Для этого нам понадобится программно обратиться к компоновщику настроек. Выясним причину, почему это эффективно: мы можем напрямую управлять коллекцией Элементы в пользовательских настройках.

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


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

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

Способ 4. Расширенный поиск как альтернатива

Стоит напомнить пользователям о существовании диалога «Расширенный поиск» (вызывается сочетанием клавиш Ctrl+Alt+F). В отличие от простого поиска, это окно содержит список всех полей, по которым в данный момент установлены фильтры. Рассмотрим ситуацию: если пользователь хочет изменить или удалить один из критериев, он может вызвать это окно, очистить нужное значение и нажать «ОК». Это стандартный механизм платформы 1С 8.3, который позволяет видеть всю картину фильтрации в одном месте.

Резюме и рекомендации

Мы проанализировали ситуацию и пришли к выводу, что в управляемых формах нет нужды «рисовать свои кнопки» для каждого действия, если знать возможности платформы. Основная рекомендация — использовать Строку поиска в верхней части списка с отображением тегов условий или выносить поля в Быстрый доступ.

Основные выводы:

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

← На главную