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