СКД-отборы списков на обычных и управляемых формах

Иногда требуется вывести на форму отбор списка элементов с произвольными СКД-подобными отборами. В статье рассматривается как это сделать в управляемых и обычных формах.

 

Образец такого отбора:

 

Реализация в управляемых формах

Рассмотрим на примере отбора списка контрагентов в управляемой форме внешней обработки.

В форму добавляем реквизит "ОтборКонтрагентов" типа "КомпоновщикНастроекКомпоновкиДанных".

 

Размещаем созданный реквизит на форме перетаскиванием поля КомпоновщикНастроекКомпоновкиДанных.Отбор на форму:

Для красоты дополнительно:

  1. Указываем заголовок "Контрагенты"
  2. Указываем положение заголовка "Верх"
  3. Указываем положение командной панели "Нет"

В конструкторе поле выглядит так:

Добавляем в макеты внешней обработки новый макет с типом схема компоновки данных "СКД_Контрагенты":

Источником данных будет запрос:

 

ВЫБРАТЬ

       Контрагенты.Ссылка,

       Контрагенты.Наименование

ИЗ

       Справочник.Контрагенты КАК Контрагенты

 

Отборов на форме может быть несколько, поэтому для удобства программиста все они называются Ссылка, а вот для удобства пользователя нужно назначить для ссылки представление, для этого ставим галочку и вводим название поля для пользователя "Контрагент":

Больше ничего в схеме компоновки не заполняем.

 

Теперь нужно привязать компоновщик настроек к схеме компоновки:

 

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

       ОО = РеквизитФормыВЗначение("Объект"); //Для внешних обработок реквизиты получаем так

       СКД = ОО.ПолучитьМакет("СКД_Контрагенты");

       URLСКД = ПоместитьВоВременноеХранилище(СКД, Новый УникальныйИдентификатор());

       ОО.ОтборКонтрагентов.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(URLСКД));

       НастройкиПоУмолчанию = СКД.НастройкиПоУмолчанию;

       ОО.ОтборКонтрагентов.ЗагрузитьНастройки(НастройкиПоУмолчанию);

       ЗначениеВРеквизитФормы(ОО, "Объект"); //Для внешних обработок реквизиты сохраняем так

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

 

После этого настройки отображаются на форме в требуемом виде:

 

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

       ОО = РеквизитФормыВЗначение("Объект");

       СКД = ОО.ПолучитьМакет("СКД_Контрагенты");

       УстановитьСтруктуруНастроекДляВыводаВТаблицуСКолонкойСсылка(ОО.ОтборКонтрагентов.Настройки); 

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

 

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

В итоге в МассивКонтрагентов будет искомый перечень контрагентов.

 

Код используемых функций:

Функция УстановитьСтруктуруНастроекДляВыводаВТаблицуСКолонкойСсылка(Настройки)  Экспорт

       Настройки.Структура.Очистить();

       ТекГруппировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));

       ТекГруппировка.Использование = Истина;

       ТекПолеГруппировки = ТекГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));

       ТекПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Ссылка");

       ТекПолеГруппировки.Использование = истина;

       АвтоВыбор = ТекГруппировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));

    АвтоВыбор.Использование = Истина;

      

      

КонецФункции

Функция СкомпоноватьВТаблицуЗначений(СхемаКомпоновкиДанных, КомпоновщикНастроек) Экспорт

       //Запускаем компоновку

       КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

       МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

       //Создаем процессор компоновки

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

       ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

      

       //Выводим в таблицу значений

       ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

       ТЗ = ПроцессорВывода.Вывести(ПроцессорКомпоновки, истина);

      

       Возврат ТЗ;

КонецФункции

Реализация в обычных формах

Рассмотрим на примере отбора магазинов.

Добавляем в реквизиты реквизит "Компоновщик_Магазины" с типом " КомпоновщикНастроекКомпоновкиДанных".

Аналогично УФ заполняем макет "СКД_Магазины" с запросом:

 

ВЫБРАТЬ

       Т.Ссылка

ИЗ

       Справочник.Магазины КАК Т

 

Размещаем на форме табличное поле с данными "Компоновщик_Магазины.Настройки.Отбор".

В модуле объекта добавляем глобальную переменную мСКД_Магазины.

В процедуру " ПередОткрытием" добавляем код:

 

       мСКД_Магазины = ПолучитьМакет("СКД_Магазины");

       Компоновщик_Магазины.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(мСКД_Магазины));

       Компоновщик_Магазины.ЗагрузитьНастройки(мСКД_Магазины.НастройкиПоУмолчанию);

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

 

       УстановитьСтруктуруНастроекДляВыводаВТаблицуСКолонкойСсылка(ОО.ОтборКонтрагентов.Настройки); 

       МассивМагазинов = СкомпоноватьВТаблицуЗначений(мСКД_Магазины, Компоновщик_Магазины).ВыгрузитьКолонку("Ссылка")

 

В итоге в МассивМагазинов будет искомый перечень магазинов.