Как программно настроить отбор и сортировку в списке 1С?

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

При работе с обычными формами в 1С часто возникает задача управления фильтрацией списков: например, нужно скрыть часть полей в стандартной форме отбора или реализовать сложный фильтр, который невозможно настроить «из коробки» через кнопку воронки. Рассмотрим пошагово, как можно управлять этими механизмами.

Управление доступностью полей в стандартной настройке отбора

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

Реализуем это в событии ПередОткрытием формы:


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

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

Программная установка значений отбора

Иногда требуется установить отбор при открытии формы автоматически. Например, для фильтрации документов за последние 10 дней. Мы можем обратиться к свойству Отбор конкретного списка на форме.


Процедура ПриОткрытии()
    КонДата = ТекущаяДата();
    НачДата = КонДата - 10 * 86400;
    
    // Устанавливаем интервал дат
    Задачи.Отбор.Дата.Использование = Истина;
    Задачи.Отбор.Дата.ВидСравнения = ВидСравнения.БольшеИлиРавно;
    Задачи.Отбор.Дата.Значение = НачДата;
    Задачи.Отбор.Дата.Установить();
КонецПроцедуры

Если ваш ВидСравнения установлен как Интервал, используйте свойства ЗначениеС и ЗначениеПо для задания границ диапазона.

Реализация сложных отборов по «реквизитам реквизитов»

Стандартный механизм НастройкаОтбора работает только с реквизитами самого объекта, содержащегося в списке. Если же вам нужно отфильтровать список, скажем, документов Реализация товаров и услуг по свойству СекретныйРеквизит, который находится внутри справочника Контрагенты, стандартная воронка не поможет. В этом случае мы используем подход с предварительным запросом.

Рассмотрим алгоритм действий:

  1. Добавьте на форму кнопку или команду, при нажатии на которую будет выполняться отбор.
  2. С помощью Запрос выберите все ссылки объектов, которые удовлетворяют вашему сложному условию.
  3. Загрузите результат запроса в СписокЗначений.
  4. Установите этот список в качестве значения для отбора текущего списка.

Пример реализации:


Процедура УстановитьОтборСписка()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Контрагенты.Ссылка
        |ИЗ
        |	Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |	Контрагенты.СекретныйРеквизит = ИСТИНА";
    
    РезультатЗапроса = Запрос.Выполнить();
    МассивСсылок = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка");
    
    СписокСсылок = Новый СписокЗначений;
    СписокСсылок.ЗагрузитьЗначения(МассивСсылок);
    
    // Применяем отбор к списку формы
    Отбор.Контрагент.ВидСравнения = ВидСравнения.ВСписке;
    Отбор.Контрагент.Значение = СписокСсылок;
    Отбор.Контрагент.Использование = Истина;
КонецПроцедуры

Альтернативный вариант: Построитель отчета

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

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

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

← На главную