К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как передать отбор в форму выбора в 1С

Как передать отбор в форму выбора 1С через Параметры.Отбор, программно и в обычных формах. Примеры кода, проверка результата, типичные ошибки и FAQ.

Передача отбора в форму выбора — одна из самых частых задач при разработке на платформе 1С:Предприятие. Пользователь нажимает кнопку выбора в поле ввода, и ему должна открыться форма списка, в которой уже отображаются только подходящие элементы: контрагенты конкретной группы, номенклатура определённого вида, договоры выбранной организации. Реализуется это через структуру параметров формы, где ключ Отбор содержит структуру с условиями.

В управляемых формах механизм стандартизирован: форма выбора динамического списка сама подхватывает переданный отбор и применяет его к списку. Разработчику остаётся правильно сформировать структуру и вызвать ОткрытьФорму или переопределить обработчик ОбработкаПолученияДанныхВыбора. В обычных формах подход похож, но используются свои свойства объекта Отбор списка.

Ниже разобраны основные способы передачи отбора: через параметры формы, через переопределение стандартной обработки выбора, для обычных и управляемых приложений, а также проверка результата и разбор типичных ошибок, из-за которых отбор «не срабатывает».

Как работает передача отбора в управляемых формах

В управляемом приложении формы выбора справочников и документов построены на динамическом списке. Когда форма открывается, платформа проверяет её параметры: если среди них есть структура с ключом Отбор, значения из неё автоматически добавляются в отбор динамического списка. Разработчику не нужно писать код в обработчике ПриСозданииНаСервере формы выбора — стандартная форма всё делает сама.

Ключи вложенной структуры должны совпадать с именами полей объекта: Владелец, Организация, Родитель, ПометкаУдаления и так далее. Значение — конкретная ссылка, примитивное значение или массив (список значений) для отбора «в списке». Если поля с таким именем в объекте нет, отбор молча не применится, и это одна из самых коварных ошибок.

Передача отбора при программном открытии формы выбора

Самый прямой сценарий — открыть форму выбора из своего кода, например по команде «Подобрать договор». Создаётся структура параметров, в неё вкладывается отбор, и вызывается ОткрытьФорму с указанием владельца формы, чтобы результат выбора вернулся в нужный обработчик.

&НаКлиенте

Процедура ПодобратьДоговор(Команда)

Отбор = Новый Структура;

Отбор.Вставить("Владелец", Объект.Контрагент);

Отбор.Вставить("Организация", Объект.Организация);

Отбор.Вставить("ПометкаУдаления", Ложь);

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Отбор", Отбор);

ПараметрыФормы.Вставить("РежимВыбора", Истина);

ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора",

ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор);

КонецПроцедуры

&НаКлиенте

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда

Объект.Договор = ВыбранноеЗначение;

КонецЕсли;

КонецПроцедуры

Владелец формы (четвёртый параметр — уникальный идентификатор) нужен, чтобы при повторном открытии не плодились копии одной и той же формы. Если результат выбора нужно обработать нестандартно, вместо владельца и ОбработкаВыбора используют ОткрытьФорму с описанием оповещения — тогда результат придёт в указанную процедуру через ОповеститьОВыборе или закрытие формы.

bsl
ПараметрыФормы = Новый Структура("Отбор", Новый Структура("Владелец", Контрагент));
ОткрытьФорму("Справочник.Договоры.ФормаВыбора", ПараметрыФормы, Элементы.Договор);

Отбор для поля ввода без программного открытия формы

Свойство «Параметры выбора» элемента формы

Когда отбор нужен при стандартном выборе из поля ввода (кнопка «Показать всё», подбор из выпадающего списка), открывать форму вручную не требуется. У поля ввода есть свойство ПараметрыВыбора — массив параметров вида «Отбор.ИмяПоля». Платформа сама передаст их в форму выбора и в механизм ввода по строке.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ПараметрВыбора = Новый ПараметрВыбора("Отбор.Владелец", Объект.Контрагент);

МассивПараметров = Новый Массив;

МассивПараметров.Добавить(ПараметрВыбора);

Элементы.Договор.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);

КонецПроцедуры

Если отбор зависит от другого поля и должен меняться динамически (выбрали контрагента — обновился список договоров), параметры выбора переназначают в обработчике ПриИзменении поля контрагента. Дополнительно полезно при смене контрагента очищать договор, если он больше не подходит под отбор, иначе в документе останется «чужое» значение.

Связи параметров выбора

Для типовой связи «владелец — подчинённый справочник» есть более простой механизм — свойство СвязиПараметровВыбора. Связь вида «Отбор.Владелец» → «Объект.Контрагент» заставит платформу автоматически подставлять текущего контрагента в отбор формы выбора без единой строки кода. В типовых конфигурациях именно так связаны, например, банковские счета с контрагентами.

Сложные условия: отбор по списку значений и произвольные запросы

Стандартный параметр Отбор поддерживает сравнение на равенство и «в списке», если передать массив или список значений. Но условия вида «больше даты», «содержит подстроку» или отбор по полю табличной части через параметры формы не передаются. В таких случаях есть два пути.

Первый — создать собственную форму выбора, в которой в ПриСозданииНаСервере программно настраивается отбор динамического списка через Список.КомпоновщикНастроек или свойство ПроизвольныйЗапрос с нужным текстом запроса. Второй — переопределить в модуле менеджера объекта обработчик ОбработкаПолученияДанныхВыбора, где формируется собственный список значений для быстрого выбора при вводе по строке.

Способы передать отбор

Параметр Отбор при ОткрытьФорму

Подходит для программного открытия и простых условий на равенство или «в списке». Не работает для сложных видов сравнения.

ПараметрыВыбора поля ввода

Стандартный выбор из поля, работает и для ввода по строке. Требует переназначения при смене зависимых полей.

СвязиПараметровВыбора

Нулевой код для связей владелец/подчинённый. Не подходит для вычисляемых условий.

Своя форма выбора с настройкой списка

Любые условия, включая запросы и отбор по табличным частям. Требует разработки и сопровождения отдельной формы.

Проверка результата и типичные ошибки

После настройки отбора проверьте три сценария: открытие формы выбора кнопкой, ввод по строке в поле и быстрый выбор из выпадающего списка. Во всех трёх случаях список должен быть одинаково ограничен. Часто отбор работает в форме списка, но не работает при вводе по строке — это признак того, что использовано программное открытие формы вместо ПараметрыВыбора.

Типичные ошибки
01
Опечатка в имени поля отбора — платформа не сообщает об ошибке, отбор просто не применяется, и пользователь видит весь список
02
Передача отбора только через ОткрытьФорму — при вводе по строке отбор игнорируется, пользователь может выбрать недопустимое значение
03
Не очищается зависимое поле при смене контрагента или организации — в документе остаётся договор другого контрагента
04
В обычной форме отбор установлен после открытия формы — список показывается без ограничений
05
Отбор по ПометкаУдаления не добавлен — в выбор попадают помеченные на удаление элементы

Ещё одна частая проблема — тип значения отбора. Если в отбор по ссылочному полю передать строку с наименованием вместо ссылки, условие не сработает. Перед передачей убедитесь, что значение имеет нужный тип: ссылка, полученная из реквизита объекта, а не из строкового представления.

Контрольные точки

Как проверить результат

Открытие формы выбора
Норма

В списке только элементы, удовлетворяющие отбору; в панели отбора видно установленное условие

Тревожный признак

Показывается полный список — отбор не применился

Ввод по строке в поле
Норма

Подсказка ввода предлагает только подходящие элементы

Тревожный признак

Находятся любые элементы — не настроены ПараметрыВыбора

Смена поля-источника отбора
Норма

Зависимое поле очищается или перевыбирается из нового ограниченного списка

Тревожный признак

Старое значение остаётся и сохраняется в документе

Ограничения и меры предосторожности

Отбор формы выбора — это удобство интерфейса, а не механизм защиты данных. Пользователь с достаточными правами может открыть полный список объекта другим способом и ввести ссылку в обход отбора. Если требуется реально запретить выбор «чужих» данных, ограничение нужно дублировать на уровне проверки при записи объекта (подписка на событие ОбработкаПроверкиЗаполнения) или через RLS.

При изменении типовых форм выбора в конфигурациях на поддержке учитывайте последствия обновлений: доработанная форма потребует ручного сопоставления при каждом обновлении. По возможности используйте расширения конфигурации или собственные формы выбора, назначенные только для конкретных полей.

Итог

Что важно запомнить

Простой отбор передаётся структурой в параметре Отбор при ОткрытьФорму, для полей ввода используются ПараметрыВыбора и СвязиПараметровВыбора, сложные условия требуют собственной формы выбора. Всегда проверяйте отбор во всех трёх режимах выбора и дублируйте критичные ограничения на сервере.

Частые вопросы

Почему отбор передан, но форма показывает все элементы?

Чаще всего имя поля в структуре отбора не совпадает с именем реквизита объекта — платформа в этом случае не выдаёт ошибку, а просто игнорирует условие. Проверьте точное имя реквизита в конфигураторе и тип передаваемого значения: для ссылочного поля нужна ссылка, а не строка.

Как передать отбор по нескольким значениям одного поля?

Передайте в качестве значения массив или список значений: Отбор.Вставить("Организация", МассивОрганизаций). Платформа автоматически преобразует его в условие «В списке». Это работает и в параметре Отбор формы, и в ПараметрахВыбора поля ввода.

Отбор работает в форме списка, но не работает при вводе по строке. Что делать?

При вводе по строке платформа использует ПараметрыВыбора поля, а не параметры программно открываемой формы. Перенесите условия в свойство ПараметрыВыбора элемента формы или переопределите ОбработкаПолученияДанныхВыбора в модуле менеджера объекта.

Можно ли передать отбор с условием «не равно» или «больше»?

Через стандартный параметр Отбор — нет, поддерживается только равенство и «в списке». Для других видов сравнения создайте собственную форму выбора и в обработчике ПриСозданииНаСервере добавьте элемент отбора в компоновщик настроек динамического списка с нужным видом сравнения.

Как запретить пользователю снимать установленный отбор?

В управляемой форме можно сделать отбор недоступным для редактирования через настройки динамического списка или скрыть панель отбора. Но надёжнее дублировать ограничение проверкой при записи объекта — тогда даже обход отбора не позволит сохранить некорректное значение.

Нужно ли очищать поле при смене значения, от которого зависит отбор?

Да, это хорошая практика. Если при смене контрагента договор не очищается и не проверяется, в документе останется ссылка, не подходящая под новый отбор. В обработчике ПриИзменении поля-источника либо очищайте зависимое поле, либо проверяйте его соответствие новому отбору.