Разработка и Конфигурация · 11 мин
Как открыть форму списка с отбором в управляемых формах 1С
Как в 1С открыть форму списка с отбором в управляемых формах: ОткрытьФорму, параметры, отбор, ОтборНаСервере, примеры кода и типичные ошибки разработчика.
Открытие формы списка с заранее установленным отбором — одна из самых частых задач при разработке на управляемых формах 1С:Предприятие 8.3. Пользователь нажимает кнопку «Показать документы контрагента», «Открыть остатки по складу» или переходит по гиперссылке — и видит уже отфильтрованный список, а не полный журнал. Реализуется это через метод ОткрытьФорму() с передачей структуры параметров, где ключевую роль играет параметр Отбор.
Механизм работает одинаково для справочников, документов, регистров сведений и других объектов, у которых есть форма списка. Платформа сама анализирует переданные параметры и устанавливает отбор динамического списка, если имена полей отбора совпадают с именами реквизитов объекта. При этом важно понимать ограничения: отбор через параметры работает только по равенству (или вхождению в список значений), а для сложных условий потребуется другой подход.
Ниже разобраны основные способы: простой отбор по одному полю, отбор по нескольким условиям, передача списка значений, работа с ключом уникальности формы и альтернативные варианты для нестандартных сценариев. Все примеры применимы к типовым и самописным конфигурациям на управляемых формах.
Базовый синтаксис: ОткрытьФорму с параметром Отбор
Метод ОткрытьФорму() принимает имя формы и структуру параметров. Для формы списка среди стандартных параметров есть Отбор — структура, где каждый элемент описывает одно условие отбора. Имя элемента структуры должно точно совпадать с именем реквизита объекта метаданных, иначе платформа проигнорирует условие или выдаст ошибку.
Минимальный пример — открыть список договоров конкретного контрагента:
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Владелец", КонтрагентСсылка);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаСписка", ПараметрыФормы);
Обратите внимание: для подчинённых справочников отбор по владельцу часто устанавливается автоматически, если форма открывается из элемента-владельца. Но при программном вызове из произвольного места (команды, кнопки, обработчика) параметр Отбор нужно передавать явно.
Отбор, установленный таким способом, отображается в панели настройки списка, и пользователь при желании может его снять. Если нужно запретить изменение отбора, потребуется доработка самой формы списка — об этом ниже.
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Организация", ТекущаяОрганизация));
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыФормы);Отбор по нескольким полям и по списку значений
В структуру отбора можно добавить несколько элементов — условия объединятся по логическому «И». Например, показать только проведённые документы конкретного склада за контрагента:
Отбор = Новый Структура;
Отбор.Вставить("Склад", СкладСсылка);
Отбор.Вставить("Контрагент", КонтрагентСсылка);
Отбор.Вставить("Проведен", Истина);
ОткрытьФорму("Документ.РасходнаяНакладная.ФормаСписка",
Новый Структура("Отбор", Отбор));
Если нужно отобрать по нескольким возможным значениям одного поля (условие «В списке»), передайте массив или список значений:
СписокСкладов = Новый СписокЗначений;
СписокСкладов.Добавить(Склад1);
СписокСкладов.Добавить(Склад2);
Отбор = Новый Структура("Склад", СписокСкладов);
ОткрытьФорму("Документ.ПеремещениеТоваров.ФормаСписка",
Новый Структура("Отбор", Отбор));
Ограничение механизма: через параметр Отбор нельзя задать сравнение «больше», «меньше», «содержит» или «не равно». Для таких условий используют установку отбора программно после открытия формы (через оповещение или владельца формы) либо передачу готовых настроек динамического списка.
Ключ уникальности и повторное открытие формы
Третий параметр метода ОткрытьФорму() — ключ уникальности. Если не указать его, при повторном вызове с теми же параметрами платформа активирует уже открытую форму вместо создания новой. Это удобно, когда отбор один и тот же, но мешает, когда нужно открыть два списка с разными отборами одновременно.
Решение — передавать в качестве ключа уникальное значение, например сами параметры отбора или новый UUID:
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка",
ПараметрыФормы, , Новый УникальныйИдентификатор);
Помимо ключа уникальности, метод принимает параметры Владелец (форма-владелец, при закрытии которой закроется и список), ОписаниеОповещенияОЗакрытии и РежимОткрытияОкна. Владельца стоит указывать всегда, когда список логически связан с текущей формой, — это предотвращает «висящие» окна после закрытия родительского документа.
Отбор в форме списка с произвольным запросом
Если форма списка построена на динамическом списке с произвольным запросом (свойство «Произвольный запрос» включено), стандартный параметр Отбор может работать некорректно или не работать вовсе — особенно когда поле отбора отсутствует в выборке запроса или является вычисляемым.
В этом случае есть два рабочих варианта. Первый — добавить в запрос параметры и передавать их как обычные параметры формы, а в обработчике ПриСозданииНаСервере формы списка устанавливать значения параметров динамического списка:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Организация") Тогда
Список.Параметры.УстановитьЗначениеПараметра(
"Организация", Параметры.Организация);
КонецЕсли;
КонецПроцедуры
Второй вариант — программно добавить элемент отбора в Список.Отбор на сервере. Это даёт полный контроль над видом сравнения, включая «Содержит», «Больше» и «Не равно»:
ЭлементОтбора = Список.Отбор.Элементы.Добавить(
Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сумма");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементОтбора.ПравоеЗначение = 100000;
ЭлементОтбора.Использование = Истина;
Сравнение способов установки отбора
Самый простой способ, работает «из коробки». Ограничение: только равенство и «в списке», пользователь может снять отбор
Полный контроль над видом сравнения и возможность скрыть отбор от пользователя. Требует доработки формы списка
Подходит для произвольных запросов и сложных условий на уровне SQL-запроса. Требует изменения текста запроса списка
Открытие формы выбора с отбором
Для формы выбора (подбор элемента из поля ввода) механизм тот же, но вызов обычно выполняется в обработчике НачалоВыбора поля формы, а результат возвращается через оповещение. Отбор передаётся аналогично — через параметр Отбор:
&НаКлиенте
Процедура ДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор",
Новый Структура("Владелец", Объект.Контрагент));
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора",
ПараметрыФормы, Элемент);
КонецПроцедуры
Обратите внимание на третий параметр — владельцем указано поле ввода (Элемент). Тогда платформа сама поместит выбранное значение в это поле без дополнительного кода оповещения. Это стандартное поведение для полей ввода ссылочного типа.
В тонком клиенте и веб-клиенте вместо модального открытия следует использовать ОписаниеОповещения — модальные вызовы в управляемом приложении запрещены настройками по умолчанию и могут быть заблокированы.
- 1Определите точное имя реквизита, по которому нужен отбор (в конфигураторе, не по синониму)
- 2Сформируйте структуру отбора: Новый Структура("ИмяРеквизита", Значение)
- 3Оберните её в параметры формы: Новый Структура("Отбор", СтруктураОтбора)
- 4Вызовите ОткрытьФорму с именем формы списка, параметрами и ключом уникальности
- 5Откройте форму и проверьте, что отбор применился и отображается в панели настройки списка
Проверка результата и диагностика проблем
После открытия формы отбор должен быть виден в строке настройки списка (панель «Ещё → Настроить список» или аналогичная, в зависимости от конфигурации). Если список показывает все записи без фильтрации — проверьте имя поля отбора и тип переданного значения.
Если список пуст, хотя данные точно есть, чаще всего причина в несовпадении типов: передана строка вместо ссылки, или ссылка относится к другому объекту метаданных (например, организация из другого справочника в объединённой конфигурации). Полезно временно вывести значение и тип через Сообщить() перед открытием формы.
Для отладки динамического списка можно открыть настройки списка в пользовательском режиме и посмотреть, какой именно отбор установила платформа. Если элемент отбора присутствует, но снят флажок использования — вероятно, форма списка переопределяет отбор в своих обработчиках.
Как проверить результат
Условие видно в панели настройки и включено
Отбора нет — проверить имя поля и структуру параметров
Показаны только записи, удовлетворяющие условию
Пустой список при наличии данных — несовпадение типа или значения
Открывается новое окно с новым отбором
Активируется старое окно — не задан ключ уникальности
Частые вопросы
Можно ли задать отбор по периоду (дата больше/меньше) через параметр Отбор?
Нет, параметр Отбор поддерживает только равенство и вхождение в список. Для отбора по периоду добавьте элемент отбора программно в обработчике ПриСозданииНаСервере формы списка с видом сравнения «БольшеИлиРавно»/«МеньшеИлиРавно», либо используйте стандартную настройку периода динамического списка.
Почему отбор по владельцу подчинённого справочника не работает?
Проверьте, что у справочника действительно задан владелец в метаданных и поле называется именно «Владелец». Также убедитесь, что передаётся ссылка нужного типа — если у справочника несколько владельцев, тип ссылки имеет значение.
Как запретить пользователю снимать установленный отбор?
Стандартный отбор через параметр пользователь может отключить. Чтобы зафиксировать условие, установите отбор программно в ПриСозданииНаСервере и скройте его от пользователя (свойство РежимОтображения элемента отбора — Недоступный) либо используйте параметры произвольного запроса динамического списка.
Работает ли параметр Отбор для регистров сведений?
Да, форма списка регистра сведений поддерживает тот же механизм. Отбор можно установить по измерениям и реквизитам регистра, например: Новый Структура("Отбор", Новый Структура("Номенклатура", Товар)) для регистра цен.
Чем отличается ОткрытьФорму от ПолучитьФорму с последующим Открыть()?
ОткрытьФорму — декларативный вызов: платформа сама создаёт и открывает форму. ПолучитьФорму возвращает объект формы, что позволяет перед открытием обратиться к её реквизитам и экспортным процедурам. Для простой передачи отбора достаточно ОткрытьФорму; ПолучитьФорму нужен, когда требуется дополнительная инициализация формы.
Как открыть список в новом окне браузера при работе через веб-клиент?
Штатного способа открыть отдельное окно браузера из кода нет — управляемое приложение работает в рамках одного окна с внутренними окнами форм. Можно сформировать навигационную ссылку на форму с параметрами и открыть её через ПерейтиПоНавигационнойСсылке, но поведение будет зависеть от настроек клиента.
Что важно запомнить
Отбор формы списка передаётся через параметр Отбор метода ОткрытьФорму в виде структуры «имя реквизита — значение». Поддерживаются равенство и список значений; сложные условия задаются программно в ПриСозданииНаСервере. Не забывайте про ключ уникальности при открытии нескольких списков и про точное совпадение имён полей с метаданными.