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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1: Использование стандартного параметра формы «Отбор»

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

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

Разберем правильный алгоритм действий на стороне сервера и клиента:

На стороне сервера (подготовка параметров):


// Создаем структуру для отбора
ПараметрыОтбора = Новый Структура;

// Если мы передаем Массив или СписокЗначений, 
// система автоматически применит вид сравнения "В списке"
ПараметрыОтбора.Вставить("Ссылка", СписокНужныхСсылок); 

// Если передаем одиночное значение, применится "Равно"
ПараметрыОтбора.Вставить("Использование", Истина);
ПараметрыОтбора.Вставить("ДляМастера", Ложь);

// Формируем общую структуру параметров для открытия формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
ПараметрыФормы.Вставить("РежимВыбора", Истина);

На стороне клиента (открытие формы):


ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииВыбора", ЭтаФорма);

ОткрытьФорму("Справочник.Дизайн.ФормаВыбора", 
             ПараметрыФормы, 
             ЭтаФорма, 
             Истина, 
             , 
             , 
             ОписаниеОповещения);

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

Метод 2: Использование «ФиксированныеНастройки» для сложных условий

Если ваша задача выходит за рамки простого равенства или вхождения в список (например, нужно условие «Больше», «Содержит» или «Не равно»), стандартный параметр Отбор не поможет. В этом случае нам необходимо использовать объект НастройкиКомпоновкиДанных и передавать его в параметре ФиксированныеНастройки.

Рассмотрим по шагам, как это реализовать:

  1. Создадим объект настроек компоновки.
  2. Добавим новый элемент отбора.
  3. Укажем левое значение (поле компоновки), вид сравнения и правое значение.
  4. Поместим эти настройки в параметры формы.

Проанализируем пример кода:


НастройкиКД = Новый НастройкиКомпоновкиДанных;

// Создаем элемент отбора
ЭлементОтбора = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

// Указываем поле, по которому фильтруем
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");

// Устанавливаем гибкий вид сравнения
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;

// Указываем значение
ЭлементОтбора.ПравоеЗначение = "Арт";
ЭлементОтбора.Использование = Истина;

// Передаем настройки в параметры формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", НастройкиКД);

Преимущество этого метода в том, что пользователь не сможет отключить или изменить эти настройки через меню «Настроить список». Они жестко зафиксированы программно.

Важные нюансы и рекомендации

Разберем еще несколько критических моментов, которые помогут избежать пустого списка при открытии формы:

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

2. Использование Ключа Назначения. Если вы открываете одну и ту же форму выбора с разными наборами отборов в разных частях программы, используйте параметр КлючНазначенияИспользования. Это позволит системе сохранять настройки окна (ширину колонок, положение) отдельно для каждого случая.

3. Группы и элементы. Если справочник иерархический, обратите внимание на параметр ВыборГруппИЭлементов. Если в отбор попадают только элементы, а форма настроена на выбор только групп, список окажется пустым. Рекомендуется явно указывать значение из перечисления ИспользованиеГруппИЭлементов.

4. Параметры запроса. Если форма выбора построена на произвольном запросе с параметрами (например, ГДЕ Склад = &ВыбранныйСклад), передавайте их через структуру Параметры внутри ПараметрыФормы, а не через Отбор.

Посмотрим на финальный пример интеграции всех знаний:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);

// Комбинируем простой отбор и настройки
ПараметрыОтбора = Новый Структура("Статус", Перечисления.Статусы.Активен);
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);

// Добавляем уникальный ключ для сохранения настроек интерфейса
ПараметрыФормы.Вставить("КлючНазначенияИспользования", "ОтборДляСпецифическойЗадачи");

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

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

← На главную