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