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