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

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

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

Выясним причину: почему отбор не отображается в настройках списка

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

Особенности работы с ФиксированныеНастройки:

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

Исправление базовой ошибки в коде: тип передаваемого значения

Перед тем как решать вопрос с отображением отбора, обратим внимание на важную деталь в передаче данных. При формировании структуры отбора в базу данных необходимо передавать исключительно ссылку на объект (ДокументСсылка), а не сам объект (ДокументОбъект).

Рассмотрим некорректный вариант:


// НЕВЕРНО: передается объект документа
СтруктураОтбора = Новый Структура("Регистратор", ДокументОбъект);
ОткрытьФорму("РегистрНакопления.Продажи.ФормаСписка", Новый Структура("Отбор", СтруктураОтбора));

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


// ВЕРНО: передается ссылка на документ
СтруктураОтбора = Новый Структура("Регистратор", ДокументСсылка);
ОткрытьФорму("РегистрНакопления.Продажи.ФормаСписка", Новый Структура("Отбор", СтруктураОтбора));

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

Если стоящая задача требует, чтобы пользователь мог интерактивно управлять отбором (включать, отключать или менять документ), использовать параметр Отбор при открытии формы нельзя. Разберем рабочие варианты решения.

Вариант 1. Установка отбора в пользовательские настройки после открытия формы

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

При использовании Библиотеки Стандартных Подсистем (БСП) программный код выглядит следующим образом:


// 1. Открываем форму списка без параметра "Отбор"
ФормаСписка = ОткрытьФорму("РегистрНакопления.Продажи.ФормаСписка");

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

При таком подходе фильтр сразу же применится к списку, но при этом будет полностью доступен для управления через диалог «Настроить список».

Вариант 2. Использование расширения конфигурации

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

  1. В расширении для формы списка регистра перехватываем обработчик ПриСозданииНаСервере.
  2. Проверяем наличие переданных параметров отбора.
  3. Удаляем переданные элементы из коллекции ФиксированныеНастройки и переносим их в ПользовательскиеНастройки компоновщика настроек.
  4. Для добавляемого элемента устанавливаем режим отображения РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ или Обычный.

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

← На главную