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