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