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