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

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

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

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

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

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

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

Где именно ограничивается список: уровни решения

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

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

Маршрут решения

Как выбрать подход

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

Способ 1: свойство «СписокВыбора» поля формы

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

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

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

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

Способ 2: обработчик «НачалоВыбора» с отбором

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

Для перечислений отбор работает по ссылке с видом сравнения «В списке». Список допустимых значений передаётся через параметры формы выбора.

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

Этот способ даёт больше контроля: можно открыть собственную форму выбора, добавить пояснения, картинки или дополнительные колонки. Недостаток — код сложнее, и при быстром вводе с клавиатуры отбор может не сработать, если не обработать также событие «АвтоПодбор» или не задать СписокВыбора параллельно.

Способ 3: динамический список, зависящий от другого реквизита

Частая задача — менять доступные значения перечисления в зависимости от другого поля. Например, вид операции определяет допустимые статусы. Реализуется это через обработчик «ПриИзменении» управляющего реквизита, в котором перестраивается СписокВыбора зависимого поля.

Дополнительно стоит проверять текущее значение зависимого реквизита: если после смены вида операции оно стало недопустимым, очищайте его или устанавливайте значение по умолчанию. Иначе в документе останется противоречивая комбинация, которую пользователь не заметит.

bsl
&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
	ЗаполнитьСписокСтатусов();
	Если Элементы.Статус.СписокВыбора.НайтиПоЗначению(Объект.Статус) = Неопределено Тогда
		Объект.Статус = Неопределено;
	КонецЕсли;
КонецПроцедуры

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

Защита на уровне данных: проверка при записи

Интерфейсные ограничения обходятся программно: обработкой, обменом данными, вводом на основании. Если бизнес-правило критично, добавьте контроль в модуль объекта — в процедуре «ОбработкаПроверкиЗаполнения». Там проверяется, входит ли выбранное значение в допустимый перечень, и при нарушении выводится сообщение с отказом от записи.

bsl
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	Допустимые = Новый Массив;
	Допустимые.Добавить(Перечисления.СтатусыДокумента.Новый);
	Допустимые.Добавить(Перечисления.СтатусыДокумента.Принят);
	Если ЗначениеЗаполнено(Статус) И Допустимые.Найти(Статус) = Неопределено Тогда
		ОбщегоНазначения.СообщитьПользователю("Недопустимый статус для этого документа",, "Объект.Статус",, Отказ);
	КонецЕсли;
КонецПроцедуры

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

Альтернатива: справочник вместо перечисления

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

Перечисление или справочник

Перечисление + СписокВыбора

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

Справочник с параметрами выбора

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

Перечисление + проверка при записи

Подходит для критичных правил. Ограничение: требует предварительной чистки исторических данных.

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

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

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

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

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

Выпадающий список поля
Норма

Показывает только допустимые значения

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

Видны все значения перечисления

Быстрый ввод с клавиатуры
Норма

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

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

Можно ввести запрещённое значение вручную

Запись документа с запрещённым значением через обработку
Норма

Запись блокируется с понятным сообщением

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

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

Старые документы
Норма

Открываются и перепроводятся

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

Ошибка при перепроведении из-за новой проверки

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

Отдельно отметим: ограничение доступа к значениям перечисления через роли и RLS невозможно — механизм ограничения доступа на уровне записей работает только с объектными данными (справочниками, документами). Для перечислений единственные инструменты — интерфейсные фильтры и программные проверки.

Итог

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

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

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

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

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

Почему запрещённое значение всё равно можно ввести с клавиатуры?

Обработчик «НачалоВыбора» перехватывает только открытие списка. Быстрый ввод обрабатывается отдельно. Задайте свойство «СписокВыбора» поля — оно работает и для автоподбора, либо добавьте проверку при записи.

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

Определите роль пользователя на сервере (функция РольДоступна или проверка через ПользователиИнформационнойБазы) и в ПриСозданииНаСервере заполните СписокВыбора разными наборами значений. Для надёжности продублируйте правило в ОбработкаПроверкиЗаполнения.

Что будет со старыми документами после добавления проверки?

Открываться и просматриваться они будут без проблем. Но перезапись или перепроведение потребует приведения значения к допустимому. Поэтому перед включением проверки выполните запрос по существующим данным и исправьте нарушения.

Работает ли ограничение в обычных формах (не управляемых)?

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

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

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