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

· 9 мин

Содержание

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

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

Что именно ограничивают параметры выбора

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

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

Отбор можно ставить по любому реквизиту объекта, который есть в выбираемом справочнике, плюс по стандартным полям:

  • Отбор.Владелец — подчинённые справочники, например договоры только выбранного контрагента;
  • Отбор.Родитель — элементы только внутри одной группы;
  • Отбор.ЭтоГруппа — только группы или только элементы;
  • Отбор.ПометкаУдаления — скрыть помеченные на удаление;
  • Отбор.<ИмяРеквизита> — любой собственный реквизит, например Отбор.Вид.

Для выбора групп и элементов есть отдельное свойство реквизита, режим выбора групп и элементов. Если нужно просто запретить выбор папок, не городите отбор по ЭтоГруппа. Переключите режим на «Элементы».

Значение отбора бывает константой, ссылкой на элемент справочника или перечисления, а также массивом значений. Массив даёт сравнение «в списке»: подойдёт любое из перечисленных.

Задаём отбор в конфигураторе: пошагово

Так настраивается постоянное ограничение, которое действует во всех формах, где поле выводится из этого реквизита.

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

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

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

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

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

Связь говорит: «значение отбора берём из вот этого реквизита». Добавляется строка из трёх частей:

Элемент связиЧто означает
Параметр отбораПоле, по которому фильтруем, например Отбор.Владелец
Поле-источникРеквизит объекта или формы, откуда берётся значение
Режим измененияЧто делать с уже выбранным значением, когда источник сменился

Режим изменения решает судьбу выбранного элемента. Вариант «Очищать» сбрасывает значение, если оно перестало подходить. «Не очищать» оставляет его как есть. «Не изменять» запрещает менять само значение при смене источника.

На практике для владельца ставят «Очищать»: сменили контрагента, договор старого контрагента из поля уходит. Иначе в документе останется чужой договор, и никто этого не заметит до проведения.

Как работает механизм изнутри

Чтобы не удивляться странностям, полезно знать последовательность событий. Когда пользователь открывает список поля, платформа делает три шага.

  1. Берёт параметры выбора, заданные в метаданных.
  2. Накладывает на них связи: подставляет текущие значения полей-источников.
  3. Добавляет то, что установлено программно в форме, и строит запрос.

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

Программная фильтрация в форме

Когда условие зависит от логики, а не от одного поля, отбор задают кодом. Обычно это делают в ПриСозданииНаСервере или в обработчике изменения поля-источника.

Параметры выбора хранятся в фиксированной коллекции, менять её по месту нельзя. Собирайте новый массив и присваивайте целиком:

&НаСервере
Процедура УстановитьОтборДоговоров()

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

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

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

Для отбора «любое из значений» передайте массив вторым аргументом:

Виды = Новый Массив;
Виды.Добавить(Перечисления.ВидыДоговоров.СПокупателем);
Виды.Добавить(Перечисления.ВидыДоговоров.СПоставщиком);

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

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

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

Если не скопировать старые, вы молча потеряете отбор, настроенный разработчиком типовой конфигурации.

Когда отбора мало: обработка получения данных выбора

Бывает, что условие нельзя выразить сравнением полей. Например, показать контрагентов, по которым за последний месяц была реализация. Тогда подключают обработчик в модуле менеджера справочника, ОбработкаПолученияДанныхВыбора.

В нём вы сами формируете список значений для выбора и возвращаете его в параметре ДанныеВыбора. Не забудьте выставить СтандартнаяОбработка = Ложь, иначе платформа выполнит обычный выбор поверх вашего.

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

Динамические списки и управляемые формы

Всё сказанное выше относится к полям ввода. Динамический список на форме (список элементов справочника, журнал документов ) устроен иначе. Там нет параметров выбора как такового, зато есть отбор самого списка.

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

  • 🔹 Отбор в свойствах списка — условие, которое пользователь не видит и не может снять. Подходит для постоянных ограничений;
  • 🔹 Пользовательский отбор — пользователь сам добавляет условия кнопкой «Ещё» → «Настройки»;
  • 🔹 Программный отбор — меняете Список.Отбор или параметры запроса из кода формы;
  • 🔹 Параметры запроса списка — если список построен на произвольном запросе с параметрами, значения передаёт Список.Параметры.УстановитьЗначениеПараметра("Имя", Значение).

Пример программного отбора:

&НаСервере
Процедура ОтобратьПоОрганизации(Организация)

	ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Организация;
	ЭлементОтбора.Использование = Истина;

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

Отбор динамического списка лучше создавать один раз и потом менять значение, а не добавлять новый элемент при каждом вызове. Иначе условия копятся, и список пустеет.

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

Мини-кейс: договоры только выбранного контрагента

Задача знакома по любому документу продажи. В шапке два поля: Контрагент и Договор. Пользователи жалуются, что в договорах видят весь справочник, и однажды провели реализацию с чужим договором.

Решение занимает десять минут и состоит из трёх действий:

  1. У реквизита Договор добавляете связь параметров выбора: параметр Отбор.Владелец, источник — реквизит Контрагент, режим «Очищать».
  2. Добавляете постоянный параметр Отбор.ПометкаУдаления со значением «Ложь», чтобы закрытые договоры не мешали.
  3. Проверяете в форме три сценария: пустой контрагент, смена контрагента при заполненном договоре, выбор нового контрагента.

Если в одном сценарии поведение удивило, поправьте режим связи. В остальном переписывать код не придётся.

Проверка после настройки отбора
Выполнено: 0 / 5

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

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

Что помогает:

  • 🔹 отбирать по владельцу, родителю и другим полям, которые платформа и так индексирует;
  • 🔹 для реквизита-фильтра включать индексирование в свойствах реквизита справочника, если по нему постоянно ищут;
  • 🔹 не нагружать ОбработкаПолученияДанныхВыбора тяжёлыми запросами: она срабатывает при каждом наборе символов в строке автоподбора;
  • 🔹 в динамическом списке не добавлять отбор по вычисляемым полям, которые считаются во вложенном запросе.

Проверить медленный список проще всего через технологический журнал или замер времени в режиме отладки. Но чаще всего хватает убрать лишний реквизит из отбора.

Что проверить и как выбрать способ

Не каждая задача решается одним и тем же инструментом. Сводка:

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

Когда параметры выбора не сработали

Типичные причины, по которым отбор «не держится», сводятся к нескольким историям.

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

Список пустой после смены поля-источника. Источник очистился или пуст, связь строит отбор по пустому значению. Проверьте заполнение владельца и режим связи.

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

Метаданные настроены, форма игнорирует. В форме поле привязано не к реквизиту объекта, а к реквизиту формы без связи с метаданными. Параметры выбора реквизита объекта тогда не подхватываются. Задайте их на самом элементе формы.

Данные из обмена нарушают отбор. Загрузка не проходит через поле ввода, поэтому параметры выбора её не остановят. Если нужен контроль целостности, делайте проверку в ОбработкаПроверкиЗаполнения или в обработчике записи.

Ограничить ввод — не значит защитить данные. Если правило обязательно, дублируйте его проверкой при записи. Параметры выбора — это удобство для пользователя.

Диагностика: выберите симптом

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

Параметры выбора запрещают ввод вручную другого значения?
Ограничивают подбор и автодополнение. При вводе строки, которой нет в отфильтрованном списке, платформа не примет значение. Но через код или загрузку данных можно записать любое.
Можно ли отключить параметры выбора для одного пользователя?
Свойством метаданных нет, оно действует для всех. Различие по ролям делают программно: задают ПараметрыВыбора в форме с учётом прав пользователя.
Чем связь параметров выбора отличается от самих параметров?
Параметры задают фиксированное значение отбора. Связь берёт значение из другого поля и подставляет его динамически.
Работают ли параметры выбора в отчётах?
Нет, у настроек отчёта на СКД своя система отборов. Параметры выбора относятся к полям ввода в формах объектов.
Как отфильтровать значение по нескольким вариантам сразу?
Передайте в ПараметрВыбора массив значений, обёрнутый в ФиксированныйМассив. Платформа сравнит поле «в списке».