Как программно установить отбор при открытии формы списка в 1С

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

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

Метод 1: Использование стандартного параметра «Отбор»

Самый быстрый и часто используемый способ — передача структуры Отбор через параметры метода ОткрытьФорму. Проанализируем, как это работает. Система 1С при открытии формы ищет в переданных параметрах ключ с именем Отбор. Если он найден, платформа автоматически пытается применить эти значения к основному динамическому списку формы.

Разберем конкретный пример. Допустим, нам нужно открыть список документов «Внутреннее потребление товаров», отфильтрованный по конкретному складу (подразделению). Посмотрим на реализацию:


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

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

Важный нюанс: Этот метод работает исключительно по принципу «Равно». Мы не можем таким способом передать условие «Не равно», «В списке» или «Больше». Если поле, по которому идет отбор, не выведено в динамический список или недоступно для поиска, отбор может не примениться.

Метод 2: Использование «Фиксированных настроек» (FixedSettings)

Если перед нами стоит более сложная задача — например, показать документы за определенный период или по списку контрагентов, — стандартного параметра Отбор будет недостаточно. В этом случае мы воспользуемся механизмом ФиксированныеНастройки. Рассмотрим этот подход подробнее.

Фиксированные настройки — это часть системы компоновки данных (СКД), которая управляет динамическим списком. Отборы, установленные таким образом, пользователь не сможет изменить или удалить через стандартную кнопку «Настроить список». Они «жестко» закреплены программно.

Разберем по шагам, как программно создать такой отбор:

  1. Создадим объект НастройкиКомпоновкиДанных.
  2. Добавим в коллекцию Отбор новый элемент.
  3. Установим левое значение (имя поля), вид сравнения и правое значение.
  4. Передадим эти настройки в параметры открытия формы.

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

Метод 3: Обработка параметров в «ПриСозданииНаСервере»

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

Выясним причину, почему это удобно: вы получаете полный контроль над объектом Список. Вы можете не только менять отборы, но и динамически изменять текст запроса (например, добавлять соединения с другими таблицами в зависимости от переданных параметров).

Рассмотрим пример. В вызывающем коде пишем:


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

А в модуле формы списка документа пропишем следующую логику:


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

Дополнительные возможности и тонкости

Проанализируем еще несколько важных параметров, которые сделают работу с формами более профессиональной:

Подводя итог, можно сказать, что для простых задач идеально подходит структура Отбор в методе ОткрытьФорму. Для создания неизменяемых фильтров со сложной логикой (интервалы, вхождения в список) лучше использовать ФиксированныеНастройки. А для максимальной гибкости управления списком — переносить логику в обработчик ПриСозданииНаСервере открываемой формы.

← На главную