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