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