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

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

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

Как ограничить список выбора в 1С 8: параметры выбора, связи параметров, отборы в формах, ограничение типа и программные методы с примерами кода.

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

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

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

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

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

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

Параметры выбора в конфигураторе

Подходит для постоянных отборов по реквизиту (например, ПометкаУдаления = Ложь). Не требует кода, но условие статично.

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

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

Программный отбор в событии НачалоВыбора

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

Своя форма выбора

Когда нужен нестандартный интерфейс подбора. Трудоёмко, применяется при сложных сценариях.

Фиксированный список выбора для строк и перечислений

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

Программно список формируется через коллекцию ЭлементыФормы. Например, для поля «СпособДоставки» на форме документа:

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

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

Элементы.СпособДоставки.СписокВыбора.Добавить("Курьер");

Элементы.СпособДоставки.СписокВыбора.Добавить("Транспортная компания");

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

Параметры выбора: отбор по реквизитам без кода

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

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

Программный аналог — массив параметров выбора, который формируется в модуле формы:

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

МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.Владелец", Объект.Контрагент));

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

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

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

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

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

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

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

Программное ограничение через события формы

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

&НаКлиенте

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

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

ПараметрыФормы = Новый Структура;

Отбор = Новый Структура;

Отбор.Вставить("ТипНоменклатуры",

ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Товар"));

ПараметрыФормы.Вставить("Отбор", Отбор);

ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора",

ПараметрыФормы, Элемент);

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

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

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

bsl
&НаКлиенте
Процедура ДоговорАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ПараметрыПолученияДанных.Отбор.Вставить("Владелец", Объект.Контрагент);
КонецПроцедуры

Ограничение типа и отбор в управляемых формах

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

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

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

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

После настройки ограничения обязательно проверьте все каналы ввода: открытие формы выбора кнопкой, выпадающий список (F4), автоподбор при наборе текста и ввод по строке. Ограничение, работающее только в одном канале, приведёт к тому, что пользователи обойдут его через другой.

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

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

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

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

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

Видны все элементы справочника — параметры выбора не применились

Автоподбор при вводе текста
Норма

Подбираются только разрешённые элементы

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

Подбираются скрытые элементы — не задан отбор в событии АвтоПодбор

Смена главного поля в зависимой паре
Норма

Зависимое поле очищается, список обновляется

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

Старое значение остаётся — не установлен режим «Очищать»

Запись документа
Норма

Документ записывается без ошибок проверки заполнения

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

Ошибки типа или ссылок — ограничение конфликтует с уже введёнными данными

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

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

Итог

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

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

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

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

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

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

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

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

Добавьте параметр выбора «Отбор.ПометкаУдаления» со значением Ложь. Учтите побочный эффект: старые документы, где выбран удалённый позднее элемент, будут показывать его как «объект не найден» при повторном выборе. Часто вместо удаления лучше использовать признак «Архив» или «Не использовать» и фильтровать по нему.

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

Это динамическое условие, поэтому применяйте программный способ: в событии «ПриСозданииНаСервере» или «НачалоВыбора» формируйте параметры выбора с отбором по реквизиту, связанному с пользователем (например, «Отбор.Ответственный» = текущий пользователь из ПараметрыСеанса). Для системного ограничения доступа к данным используйте RLS — ограничение на уровне записей.

Чем ограничение списка выбора отличается от RLS?

Параметры выбора и отборы формы работают только в интерфейсе конкретного поля и легко обходятся программно. RLS (ограничение доступа на уровне записей) действует на уровне СУБД для всех запросов пользователя и является инструментом безопасности. Для разграничения прав используйте RLS, для удобства ввода — параметры выбора.

Можно ли задать разные списки выбора для разных документов?

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