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