При интерактивной работе с динамическим списком пользователи часто используют комбинацию клавиш Alt+F или поиск в контекстном меню. В результате над таблицей появляется специальная информационная плашка — Состояние просмотра (элемент строки поиска и примененных фильтров). Пользователю удобно видеть текущее ограничение и быстро отключать его нажатием на крестик. Разберем, можно ли управлять этой панелью программно, почему стандартные исполняемые настройки СКД не обновляют список и как правильно решать подобные задачи во встроенном языке 1С.
Нередко разработчики пытаются программно извлечь схему и настройки динамического списка через следующие методы:
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
После добавления элементов в коллекцию Настройки.Отбор.Элементы многие ожидают, что вызов обновления формы или перерисовка обновят таблицу списка. Однако динамический список не реагирует на такие изменения. Проанализируем причину такого поведения:
ПолучитьИсполняемуюСхемуКомпоновкиДанных() и ПолучитьИсполняемыеНастройкиКомпоновкиДанных() формируют результирующий снимок текущего состояния списка (результат слияния фиксированных настроек, пользовательских настроек и интерактивного поиска). Этот снимок предназначен исключительно для анализа и чтения, например, для выгрузки текущих видимых строк в отчет или табличный документ.Для того чтобы установленный фильтр реально применился к запросу динамического списка и обновил отображаемые данные, необходимо добавлять элемент отбора напрямую в структуру настроек динамического списка. Разберем базовый пример добавления отбора:
НовыйОтбор = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата");
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
НовыйОтбор.ПравоеЗначение = НачалоДня(ТекущаяДата());
НовыйОтбор.Использование = Истина;
Этот код мгновенно применяет фильтрацию к динамическому списку на форме без необходимости ручного вызова методов перерисовки.
Если бизнес-задача заключается в том, чтобы отборы были наглядно видны пользователю над таблицей (как в «Состоянии просмотра») с возможностью интерактивного включения, отключения и смены значений, правильным решением является использование пользовательских настроек в режиме быстрого доступа. Рассмотрим пошаговый порядок реализации:
ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = НужнаяОрганизация;
ЭлементОтбора.Использование = Истина;
// Включаем отображение в пользовательских настройках
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
ЭлементОтбора.ИдентификаторПользовательскойНастройки = "ОтборПоОрганизации";
ГруппаПользовательскихНастроек или программно вызываем метод генерации элементов:
Элементы.Список.СоздатьЭлементыФормыПользовательскихНастроек(
Элементы.ГруппаБыстрыхОтборов,
РежимОтображенияНастроекКомпоновкиДанных.БыстрыйДоступ
);
В результате пользователь получает удобную панель быстрых отборов непосредственно над списком, которой можно полностью управлять из встроенного языка 1С.
Если разработка ведется в типовой или доработанной конфигурации на базе БСП, рекомендуется использовать готовые функции общего модуля ОбщегоНазначенияКлиентСервер. Это исключает дублирование элементов отбора при повторном открытии формы и корректно синхронизирует пользовательские настройки.
Посмотрим на пример установки отбора через БСП:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
Список,
"Контрагент",
ВыбранныйКонтрагент,
ВидСравненияКомпоновкиДанных.Равно,
"Отбор по покупателю",
Истина,
РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ
);
Для отключения или очистки установленного фильтра используется парный метод:
ОбщегоНазначенияКлиентСервер.УдалитьЭлементыОтбораДинамическогоСписка(
Список,
"Контрагент"
);
Такой подход обеспечивает надежную работу отборов, сохраняет настройки пользователя между сеансами и не нарушает логику компоновки данных формы.