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