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