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