Как правильно наложить отбор на динамический список при открытии формы выбора в 1С?

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

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

Понимание ограничений параметра Отбор

Важно различать два подхода к передаче условий при открытии формы. Первый — использование параметра Отбор. Это самый простой способ, который работает аналогично стандартному отбору в списке. Если вы передаете структуру вида Структура("ПометкаУдаления, Проведен", Ложь, Истина), платформа применит условия на равенство. Ограничение: через этот механизм невозможно передать условия Больше, Меньше, В списке или сложные группы И/ИЛИ.

Решение 1: Использование ФиксированныхНастроек

Если вам нужно задать сложные критерии, такие как отбор по периоду (БольшеИлиРавно), используйте ФиксированныеНастройки. Эти настройки передаются в параметрах открытия как объект НастройкиКомпоновкиДанных. Главное преимущество этого способа в том, что пользователь не сможет отключить такие отборы в интерфейсе.

Разберем пример создания таких настроек в коде:


// На клиенте формируем структуру параметров
НастройкиКомпоновки = Новый НастройкиКомпоновкиДанных;

// Создаем группу условий для логики И
ГруппаОтбора = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

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

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

ПараметрыВыбора = Новый Структура;
ПараметрыВыбора.Вставить("ФиксированныеНастройки", НастройкиКомпоновки);
ПараметрыВыбора.Вставить("РежимВыбора", Истина);

ОткрытьФорму("Документ.ЭкземплярБюджета.Форма.ФормаВыбора", ПараметрыВыбора);

Решение 2: Программная установка отбора через объект формы

Если механизм ФиксированныхНастроек кажется избыточным или требуется динамическая настройка уже открытой формы, рекомендуем применить подход с получением формы и последующим обращением к ее динамическому списку. Это самый гибкий метод, позволяющий накладывать любые условия.

  1. Получите форму с помощью функции ПолучитьФорму().
  2. Обратитесь к элементу формы, который является динамическим списком (обычно называется Список).
  3. Добавьте необходимый элемент в коллекцию Отбор.Элементы этого списка.
  4. Обязательно установите свойство Использование = Истина.
  5. Вызовите метод Открыть().

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

Почему отбор мог не срабатывать?

В ходе анализа мы выяснили основные причины неудач:

Рекомендуем придерживаться второго способа для сложных задач, так как он позволяет легко отлаживать каждый этап добавления условий, визуально контролируя содержимое коллекции Отбор.Элементы в отладчике 1С.

← На главную