Как ограничить тип элементов в СпискеЗначений на форме 1С для выбора из справочника?

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

При разработке внешних обработок и отчетов разработчики часто сталкиваются с задачей предоставления пользователю возможности выбора нескольких объектов из справочника (например, нескольких контрагентов или номенклатур) для использования в качестве фильтра в запросе. Для этих целей обычно применяется реквизит формы или объекта с типом СписокЗначений.

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

Выясняем причину возникновения ошибки при установке типа

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


// Ошибочный вариант
СписокДомов.ТипЗначения = Тип(Справочники.Контрагенты);

Данный код вызывает ошибку выполнения по двум причинам:

  1. Неверный параметр функции Тип(): системная функция Тип() принимает в качестве параметра строго строковый литерал с именем типа, например Тип("СправочникСсылка.Контрагенты"). Выражение Справочники.Контрагенты является менеджером справочника, а не строковым представлением типа.
  2. Тип свойства ТипЗначения: свойство ТипЗначения у объекта СписокЗначений хранит не объект типа Тип, а объект типа ОписаниеТипов.

Правильная программная настройка типа элементов

Рассмотрим, как правильно сформировать ограничение типов для СписокЗначений с помощью конструктора ОписаниеТипов.

Если необходимо программно задать тип непосредственно для объекта СписокЗначений, используем следующий код:


// Правильное назначение типа для объекта СписокЗначений
СписокДомов.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");

Для взаимодействия с пользователем на форме подход различается в зависимости от того, какая технология форм используется:

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


Процедура ПриОткрытии()
    ЭлементыФормы.ПолеВводаСписокДомов.ТипЗначенияСписка = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
КонецПроцедуры

2. Управляемые формы (УФ)
В управляемых формах ограничение задается для реквизита формы через свойство ТипЗначения:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЭтаФорма.СписокДомов.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
КонецПроцедуры

Использование СпискаЗначений в параметрах запроса

После того как пользователь заполнил список контрагентов на форме, эти данные необходимо передать в запрос для фильтрации с помощью оператора В. Проанализируем пример кода установки параметра запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Взаиморасчеты.Контрагент КАК Контрагент,
    |	Взаиморасчеты.СуммаОстаток КАК СуммаОстаток
    |ИЗ
    |	РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК Взаиморасчеты
    |ГДЕ
    |	Взаиморасчеты.Контрагент В (&СписокКонтрагентов)";

// Передаем весь объект СписокЗначений в параметр запроса
Запрос.УстановитьПараметр("СписокКонтрагентов", СписокДомов);

РезультатЗапроса = Запрос.Выполнить();

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


МассивСсылок = СписокДомов.ВыгрузитьЗначения();
Запрос.УстановитьПараметр("СписокКонтрагентов", МассивСсылок);

Альтернативный вариант: Использование табличной части

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

← На главную