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