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

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

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

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

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

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

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

Определяем тип ограничения перед настройкой

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

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

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

Как выбрать способ

Условие отбора постоянное и одинаковое вездеНастройте параметры выбора в конфигураторе у реквизита
Отбор зависит от другого поля формы (владелец, организация)Используйте связи параметров выбора
Нужна сложная логика или отбор по списку значенийПерехватите событие НачалоВыбора и откройте форму выбора с параметром Отбор
Ограничение должно работать во всех полях выбора этого справочникаДобавьте отбор в модуль менеджера справочника или основную форму выбора

Настройка параметров выбора в конфигураторе

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

Аналогично можно отобрать по любому реквизиту справочника: «Отбор.ЭтоГруппа» = Ложь, «Отбор.ВидНоменклатуры» = конкретное значение и т.д. Платформа автоматически применит эти параметры при открытии списка выбора, быстром выборе и вводе по строке.

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

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

Связи параметров выбора: отбор по значению другого поля

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

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

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

Связь через код в управляемой форме

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

Программный отбор через событие «НачалоВыбора»

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

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

&НаКлиенте

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

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

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

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

Отбор.Вставить("ЭтоГруппа", Ложь);

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

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

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

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

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

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

Отбор по списку значений

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

Ограничение на уровне формы выбора справочника

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

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

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

В типовых конфигурациях часто уже есть готовые механизмы: например, параметр «ВыборГруппИЭлементов» у формы выбора позволяет запретить выбор групп, а подсистема контактной информации и обменов может накладывать собственные отборы. Перед доработкой проверьте, не решается ли задача штатными параметрами формы.
ПЗ
Практическое замечание

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

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

Распространённые ошибки при ограничении выбора встречаются настолько стабильно, что их стоит перечислить отдельно.

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

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

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

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

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

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

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

Видны помеченные на удаление или чужие элементы

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

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

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

По фрагменту наименования находится запрещённый элемент

Очистка поля-источника связи
Норма

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

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

Остаются элементы от прежнего значения

Программная запись объекта
Норма

Серверная проверка отклоняет недопустимое значение

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

Значение записывается в обход ограничения

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

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

Добавьте в параметры выбора реквизита строку «Отбор.ЭтоГруппа» со значением «Ложь». Альтернатива — передать в форму выбора параметр «ВыборГруппИЭлементов» со значением «Использование.Элементы», тогда группы будут видны для навигации, но выбрать их нельзя.

Почему связь параметров выбора не срабатывает?

Чаще всего неверно указан путь к данным: для управляемой формы документа это обычно «Объект.ИмяРеквизита», а не просто имя реквизита. Также проверьте, что поле-источник действительно заполнено и что тип его значения совпадает с типом реквизита отбора в справочнике.

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

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

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

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

Как отобрать элементы по условию «ИЛИ»?

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

Ограничение работает в списке, но ввод по строке находит лишние элементы. Что делать?

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

Итог

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

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