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