Как программно установить отбор в форме выбора 1С, чтобы пользователь мог его отключить?

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

При разработке на платформе 1С:Предприятие 8.3 (Управляемые формы) перед программистом часто возникает задача: открыть форму выбора (или форму списка) с уже установленным отбором. Например, при выборе документа-основания нужно показать только документы по определенному контрагенту. Однако стандартные механизмы платформы часто делают этот отбор «жестким», и пользователь не может его отключить или изменить, если ему понадобилось выбрать другой документ. В этой статье мы подробно разберем, почему так происходит, и как правильно реализовать интерактивный программный отбор, управляемый пользователем.

Выясняем причину: почему стандартный параметр «Отбор» блокирует фильтры?

Рассмотрим стандартное поведение платформы. Когда мы передаем структуру параметров в функцию ОткрытьФорму() с ключом "Отбор", платформа автоматически помещает эти условия в так называемые Фиксированные настройки компоновщика настроек динамического списка (КомпоновщикНастроек.ФиксированныеНастройки).

У фиксированных настроек есть ряд особенностей, которые делают их непригодными для интерактивного изменения:

  1. Невидимость для пользователя: Фиксированные настройки не отображаются в составе пользовательских настроек на форме и в окне «Настроить список».
  2. Невозможность отключения: Пользователь никак не может повлиять на эти настройки из пользовательского интерфейса. Они накладываются поверх всех остальных фильтров «намертво».
  3. Конфликты при ручном отборе: Если пользователь попытается вручную через меню «Еще» -> «Настроить список» установить аналогичный отбор по тому же самому полю, платформа выдаст ошибку: «Невозможно применить фиксированные настройки. Пересекаются элементы отбора».

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

Ключевая роль свойства ИдентификаторПользовательскойНастройки

Проанализируем, почему обычное программное добавление элемента отбора в коллекцию настроек списка часто не дает результата (отбор применяется, но пользователь его все равно не видит). Главная причина кроется в свойстве ИдентификаторПользовательскойНастройки.

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

Давайте посмотрим, как решить эту задачу на практике.

Вариант 1. Установка отбора с использованием функций БСП (рекомендуемый способ)

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


// В обработчике события, где необходимо открыть форму выбора
ПараметрыОткрытия = Новый Структура;
ФормаВыбора = ПолучитьФорму("Документ.РеализацияТоваровУслуг.ФормаВыбора", ПараметрыОткрытия, Источник);

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

ФормаВыбора.Открыть();

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

Вариант 2. Программная установка отбора вручную (без БСП)

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


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

Проблема дублирования и правильный алгоритм установки отборов

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

Проанализируем правильный алгоритм программной работы с пользовательскими настройками:

  1. Поиск: Перед добавлением нового условия всегда обходим существующую коллекцию КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.
  2. Изменение: Если отбор по целевому полю уже присутствует в настройках, мы просто обновляем его значение (ПравоеЗначение) и принудительно включаем признак использования (Использование = Истина).
  3. Создание: И только в случае отсутствия элемента в списке мы инициируем процедуру его создания и связываем его с пользовательскими настройками.

Требования к интерфейсу для режима «Быстрый доступ»

Установка свойства РежимОтображения в значение БыстрыйДоступ сама по себе не выведет отбор на форму непосредственно над списком, если в свойствах формы не выполнены соответствующие настройки интерфейса.

Для того чтобы добавленный нами «быстрый отбор» отобразился в шапке списка на форме, выполните следующие шаги:

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


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

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

← На главную