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

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

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

В наличии

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

Категория:

Описание

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

 

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

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

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

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

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

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

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

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

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

 

ВЫБРАТЬ
       Контрагенты.Ссылка,
       Контрагенты.Наименование
ИЗ
       Справочник.Контрагенты КАК Контрагенты

 

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

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

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

 

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

 

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

 

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

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

 

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

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

 

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

Функция УстановитьСтруктуруНастроекДляВыводаВТаблицуСКолонкойСсылка(Настройки)  Экспорт
       Настройки.Структура.Очистить();
       ТекГруппировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
       ТекГруппировка.Использование = Истина;
       ТекПолеГруппировки = ТекГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
       ТекПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
       ТекПолеГруппировки.Использование = истина;
       АвтоВыбор = ТекГруппировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    АвтоВыбор.Использование = Истина;
      
      
КонецФункции
Функция СкомпоноватьВТаблицуЗначений(СхемаКомпоновкиДанных, КомпоновщикНастроек) Экспорт
       //Запускаем компоновку
       КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
       МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
       //Создаем процессор компоновки
       ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
       ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
      
       //Выводим в таблицу значений
       ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
       ТЗ = ПроцессорВывода.Вывести(ПроцессорКомпоновки, истина);
      
       Возврат ТЗ;
КонецФункции

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

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

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

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

 

ВЫБРАТЬ
       Т.Ссылка
ИЗ
       Справочник.Магазины КАК Т

 

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

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

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

 

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

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

 

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

 

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

has been added to your cart:
Оформление заказа