Как программно установить отбор в динамическом списке и можно ли передать его в состояние просмотра?

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

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

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

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


Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

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

  1. Односторонний режим чтения: методы ПолучитьИсполняемуюСхемуКомпоновкиДанных() и ПолучитьИсполняемыеНастройкиКомпоновкиДанных() формируют результирующий снимок текущего состояния списка (результат слияния фиксированных настроек, пользовательских настроек и интерактивного поиска). Этот снимок предназначен исключительно для анализа и чтения, например, для выгрузки текущих видимых строк в отчет или табличный документ.
  2. Отсутствие метода обратной загрузки: в платформе «1С:Предприятие» не предусмотрено метода вроде «УстановитьИсполняемыеНастройки()», который мог бы применить модифицированный объект обратно к динамическому списку.
  3. Закрытый API «Состояния просмотра»: плашки активного поиска и фильтрации по Alt+F формируются ядром платформы на уровне клиентского интерфейса. Платформа не предоставляет программного интерфейса для добавления или изменения плашек в этой системной строке.

Способ 1. Установка отбора в динамический список через КомпоновщикНастроек

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


НовыйОтбор = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Дата");
НовыйОтбор.ВидСравнения   = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
НовыйОтбор.ПравоеЗначение = НачалоДня(ТекущаяДата());
НовыйОтбор.Использование  = Истина;

Этот код мгновенно применяет фильтрацию к динамическому списку на форме без необходимости ручного вызова методов перерисовки.

Способ 2. Отображение отборов для пользователя в режиме «Быстрый доступ»

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

  1. Программно или через настройки динамического списка в конфигураторе создаем элемент отбора.
  2. Устанавливаем свойство отображения в значение быстрого доступа:

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

// Включаем отображение в пользовательских настройках
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
ЭлементОтбора.ИдентификаторПользовательскойНастройки = "ОтборПоОрганизации";
  1. Для автоматического размещения элементов управления над таблицей на форме создаем обычную группу и связываем ее со свойством таблицы ГруппаПользовательскихНастроек или программно вызываем метод генерации элементов:

Элементы.Список.СоздатьЭлементыФормыПользовательскихНастроек(
    Элементы.ГруппаБыстрыхОтборов, 
    РежимОтображенияНастроекКомпоновкиДанных.БыстрыйДоступ
);

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

Способ 3. Управление отборами с помощью Библиотеки Стандартных Подсистем (БСП)

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

Посмотрим на пример установки отбора через БСП:


ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
    Список,
    "Контрагент",
    ВыбранныйКонтрагент,
    ВидСравненияКомпоновкиДанных.Равно,
    "Отбор по покупателю",
    Истина,
    РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ
);

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


ОбщегоНазначенияКлиентСервер.УдалитьЭлементыОтбораДинамическогоСписка(
    Список,
    "Контрагент"
);

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

← На главную