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