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

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

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

Как в 1С открыть форму списка справочника с отбором: параметры формы, структура Отбор, примеры кода для управляемых и обычных форм, типичные ошибки.

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

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

Ниже разобраны рабочие примеры кода для управляемых и обычных форм, отбор по нескольким условиям, особенности отбора по владельцу и родителю, а также типичные ошибки, из-за которых отбор «молча» не срабатывает.

Базовый способ: ОткрытьФорму с параметром «Отбор»

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

&НаКлиенте

Процедура ПоказатьПоставщиков(Команда)

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

Отбор.Вставить("Поставщик", Истина);

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

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

ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ПараметрыФормы);

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

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

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

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

Отбор по нескольким условиям и по списку значений

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

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

Отбор.Вставить("Поставщик", Истина);

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

Если нужно показать элементы с одним из нескольких допустимых значений (условие «В списке»), передайте массив или список значений вместо одиночного значения:

СписокОрганизаций = Новый Массив;

СписокОрганизаций.Добавить(Организация1);

СписокОрганизаций.Добавить(Организация2);

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

Отбор.Вставить("Организация", СписокОрганизаций);

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

Отбор по владельцу и по родителю (иерархия)

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

&НаКлиенте

Процедура ПоказатьДоговорыКонтрагента(Команда)

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

Отбор.Вставить("Владелец", Объект.Ссылка);

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

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

ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаСписка", ПараметрыФормы);

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

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

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

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

Открытие формы выбора с отбором

Тот же механизм работает для форм выбора. Это удобно, когда пользователю нужно выбрать элемент из уже суженного списка — например, договор только конкретного контрагента. Форма выбора открывается с описанием оповещения о закрытии, чтобы получить результат:

&НаКлиенте

Процедура ВыбратьДоговор(Команда)

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

Отбор.Вставить("Владелец", Объект.Контрагент);

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

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

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

Оповещение = Новый ОписаниеОповещения("ПослеВыбораДоговора", ЭтотОбъект);

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

ПараметрыФормы, ЭтотОбъект, , , , Оповещение);

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

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

В типовых конфигурациях для полей ввода часто вместо открытия формы вручную используют «Параметры выбора» и «Связи параметров выбора» у реквизита формы. Это декларативный способ: связь «Отбор.Владелец → Объект.Контрагент» автоматически фильтрует список выбора без единой строки кода открытия формы.

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

ОткрытьФорму с параметром «Отбор»

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

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

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

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

Полный контроль: любые виды сравнения, фиксированный отбор. Требует доработки модуля формы списка

Обычные формы: Процедура ПолучитьФормуСписка

В обычном приложении (устаревший режим, встречается в старых конфигурациях на платформе 8.2 и ранних 8.3) механизм другой. Форму списка получают через менеджер объекта, а отбор устанавливают напрямую в элемент формы «СправочникСписок»:

ФормаСписка = Справочники.Номенклатура.ПолучитьФормуСписка();

ФормаСписка.СправочникСписок.Отбор.Поставщик.Установить(Истина);

ФормаСписка.Открыть();

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

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

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

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

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

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

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

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

Содержимое списка после открытия
Норма

Видны только элементы, подходящие под условие

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

Список полный, отбор не применился

Настройки списка (Ещё → Настроить список)
Норма

В отборе присутствует переданное условие

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

Отбор пуст — параметр не дошёл до формы

Тип значения в структуре отбора
Норма

Ссылка на объект или примитивный тип, совпадающий с типом реквизита

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

Строка вместо ссылки — условие не сработает

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

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

Да, вручную: откройте список справочника, нажмите «Ещё» → «Настроить список» и задайте условие отбора. Это подходит для разовой работы пользователя. Программное открытие нужно, когда отбор должен устанавливаться автоматически из кнопки, команды или другого объекта.

Почему отбор по ссылке не работает, хотя значение передано?

Чаще всего передаётся строка с наименованием вместо ссылки, либо ссылка на объект другого типа. Проверьте тип значения и тип реквизита отбора — они должны совпадать. Также убедитесь, что ссылка не пустая: отбор по пустой ссылке покажет только элементы с незаполненным реквизитом.

Как сделать отбор, который пользователь не сможет снять?

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

Как открыть список с отбором «в иерархии» по папке?

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

Работает ли параметр «Отбор» для документов и регистров?

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

Чем отличается «РежимВыбора» от обычного открытия формы списка?

Режим выбора отключает лишние команды (создание, изменение могут быть недоступны в зависимости от формы) и возвращает выбранное значение через оповещение о закрытии. Форма списка в обычном режиме предназначена для просмотра и редактирования, а не для возврата результата вызвавшему коду.

Итог

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

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