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