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