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