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

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

1С: как ограничить список выбора для поля ввода

Как ограничить список выбора для поля ввода в 1С: свойство «Список выбора», отбор связанных данных, параметры выбора и типовые ошибки с примерами кода.

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

В 1С существует несколько механизмов ограничения: свойство «Список выбора» для фиксированных значений, параметры выбора для фильтрации ссылочных данных, связи параметров выбора для зависимых полей и динамическое формирование списка в коде. Каждый способ имеет свою область применения, и выбор зависит от типа данных поля и логики формы.

Ограничение через свойство «Список выбора»

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

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

Для динамического формирования списка используйте код в модуле формы:

&НаСервере

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

Элементы.СпособОплаты.СписокВыбора.Очистить();

Элементы.СпособОплаты.СписокВыбора.Добавить("Наличный расчёт");

Элементы.СпособОплаты.СписокВыбора.Добавить("Безналичный расчёт");

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

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

Параметры выбора для ссылочных полей

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

Пример: в документе нужно выбирать только номенклатуру с видом «Услуга». В конфигураторе откройте свойство «Параметры выбора» поля ввода, добавьте строку с именем «Отбор.ВидНоменклатуры» и значением — ссылкой на элемент перечисления «ВидыНоменклатуры.Услуга». После этого форма выбора откроется уже с установленным отбором.

В коде параметры выбора устанавливаются так:

&НаСервере

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

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

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

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

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

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

Частая задача — поле «Договор» должно показывать только договоры выбранного контрагента. Это реализуется через свойство «Связи параметров выбора». Откройте его у поля «Договор», добавьте строку: имя параметра — «Отбор.Владелец», путь к данным — «Объект.Контрагент», режим изменения — «Изменять значение».

После настройки при выборе контрагента список договоров автоматически отфильтруется по владельцу. Режим «Изменять значение» дополнительно очищает договор, если пользователь сменил контрагента и старый договор перестал соответствовать отбору — это защищает от логически противоречивых данных в документе.

В коде связь добавляется объектом СвязьПараметраВыбора:

&НаСервере

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

Связь = Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Контрагент", РежимИзмененияСвязанногоЗначения.Очищать);

МассивСвязей = Новый Массив;

МассивСвязей.Добавить(Связь);

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

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

Порядок настройки зависимого поля
  1. 1
    Откройте форму в конфигураторе и выделите зависимое поле ввода
  2. 2
    В свойстве «Связи параметров выбора» добавьте связь: Отбор.Владелец → путь к реквизиту-источнику
  3. 3
    Установите режим изменения «Очищать» или «Изменять значение»
  4. 4
    Проверьте, что реквизит-источник заполняется раньше зависимого поля
  5. 5
    Откройте форму в режиме предприятия и проверьте фильтрацию и очистку значения

Ограничение через обработчики событий

Когда стандартных механизмов недостаточно, ограничение реализуют в обработчиках поля ввода. Основные события: «ОбработкаВыбора» — перехватывает результат выбора из формы подбора, «АвтоПодбор» — управляет списком при вводе по строке, «ОкончаниеВводаТекста» — контролирует ручной ввод.

В обработчике «ОбработкаВыбора» можно проверить выбранное значение и отказаться от него:

&НаКлиенте

Процедура КонтрагентОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

Если КонтрагентЗаблокирован(ВыбранноеЗначение) Тогда

СтандартнаяОбработка = Ложь;

ПоказатьПредупреждение(, "Контрагент заблокирован, выбор запрещён");

КонецЕсли;

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

Обработчик «АвтоПодбор» позволяет сформировать собственный список при вводе по строке — например, исключить архивные элементы или добавить отбор по нескольким реквизитам одновременно. Внутри обработчика выполняется запрос к базе, и результат передаётся в параметр «ДанныеВыбора», а стандартная обработка отключается.

Сравнение способов ограничения

Каждый механизм занимает свою нишу, и выбор неправильного приводит либо к избыточному коду, либо к дырам в логике. Сопоставление основных вариантов помогает быстро определить подходящий.

Сравнение вариантов

Список выбора

Подходит для строковых полей и небольших фиксированных наборов значений. Не работает для фильтрации справочников по условию.

Параметры выбора

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

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

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

Обработчики событий

Максимальная гибкость: сложные условия, запросы, проверки. Требует кода и дублирования проверки на сервере.

СпособТип данных поляРеагирует на другие поляТребует кода
Список выбораСтрока, числоНетНет (или минимум)
Параметры выбораСсылка на справочникНетНет
Связи параметров выбораСсылка на справочникДаНет
Обработчики событийЛюбойДаДа

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

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

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

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

Форма выбора справочника
Норма

Показывает только элементы, удовлетворяющие отбору

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

Видны все элементы — параметр выбора не применён или имя отбора указано с ошибкой

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

Автоподбор предлагает только допустимые значения

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

Находятся исключённые элементы — нужен обработчик АвтоПодбор

Смена реквизита-источника
Норма

Зависимое поле очищается или фильтруется заново

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

Остаётся старое несоответствующее значение — проверьте режим изменения связи

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

Типичные ошибки
01
Опечатка в имени параметра отбора — отбор молча не применяется, пользователь видит весь справочник
02
Ограничение только на форме без проверки на сервере — значение записывается в обход через обмен или обработку
03
Забыт режим изменения связи — при смене контрагента в документе остаётся договор другого владельца
04
Список выбора без «Режима выбора из списка» — пользователь вводит произвольное значение вручную, ограничение не работает

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

Часто задаваемые вопросы

Можно ли ограничить список выбора без изменения конфигурации?

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

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

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

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

Добавьте несколько параметров выбора — они объединяются по логике «И». Например, «Отбор.ВидНоменклатуры» и «Отбор.ПометкаУдаления» одновременно. Если условия сложнее (логика «ИЛИ», отбор по списку значений), используйте обработчик «АвтоПодбор» или настройте динамический список формы выбора с произвольным запросом.

Что делать, если связь параметров выбора не срабатывает?

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

Как полностью запретить ручной ввод в поле?

Установите свойство «Режим выбора из списка» в значение «Истина» — поле станет выпадающим списком без возможности ввода текста. Для ссылочных полей альтернатива — отключить «Ввод по строке» и оставить только кнопку выбора, открывающую форму подбора с отбором.

Ограничит ли список выбора запись данных при программном заполнении?

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

Итог

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

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