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