1) В обработку добавим Макет с типом “Схема компоновки данных” (СКД) (рис.1)
2) Откроем нашу СКД(Макет) и опишем её (Сделаем запрос, заполним “Выбранные поля” и “Отборы”). (рис.2 и рис.3)
3) Добавим реквизит формы “ОтборНаФорме” с типом “КомпоновщикНастроекКомпоновкиДанных”. Перенесём таблицу с отборами на форму.(рис.4). Реквизит мы назвали "ОтборНаФорме", но там не только настройки отбора. Помимо "Отбора", на форму можно вынести: "Параметры данных", "Выбор", "Порядок" - любую настройку Компоновщика Настроек - ОтборНаФорме.Настройки.
4) Добавим реквизит формы “ТаблицаОжиданий” с типом "ТаблицаЗначений", куда будем выгружать результата нашей СКД. Перенесём таблицу на форму. (рис.5).
5) В обработчике формы “ПриСозданииНаСервере” Инициализируем компоновку, чтобы окошко с отборами заполнялось выбранными отборами нашего СКД.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ИнициализироватьКомпоновкуДанных(Ложь);
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьКомпоновкуДанных(ВсегдаИспользоватьНастройкиПоУмолчанию)
СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Объект").ПолучитьМакет("СКДОтбора");
URLСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор());
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(URLСхемы);
ОтборНаФорме.Инициализировать(ИсточникНастроек);
ОтборНаФорме.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КонецПроцедуры
6) Осталось выполнить нашу СКД(Макет) по Настройкам на форме (ОтборНаФорме.Настройки) и результат загрузить в таблицу значений
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
ТаблицаОжиданий.Очистить();
СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Объект").ПолучитьМакет("СКДОтбора");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, ОтборНаФорме.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТЗ = Новый ТаблицаЗначений;
ТЗ = ТаблицаОжиданий.Выгрузить();
ПроцессорВывода.УстановитьОбъект(ТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
ТаблицаОжиданий.Загрузить(ТЗ);
КонецПроцедуры
Стоит отметить:
1) В компоновщик настроек можно передать параметры. Параметры должны быть в описании нашей СКД (закладка "Параметры"). "НастройкиКомпановщикаНастроек" - в нашем примере это "ОтборНаФорме.Настройки"
Процедура УстановитьЗначениеПараметраНастроек(НастройкиКомпоновщикаНастроек, ИмяПараметра, Значение)
Параметр = НастройкиКомпоновщикаНастроек.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
Если Параметр <> Неопределено Тогда
Параметр.Значение = Значение;
Параметр.Использование = Истина;
КонецЕсли;
КонецПроцедуры
2) Настройки нашего реквизита "ОтборНаФорме" можно сохранять/восстанавливать, например, в/из константы.
Сохраняем:
&НаСервере
Процедура СохранитьНастройкиНаСервере()
Константы.НастройкиНазначенияЗадачПоРезультатамАнкетирования.Установить(Новый ХранилищеЗначения(ОтборНаФорме.Настройки, Новый СжатиеДанных(9)));
КонецПроцедуры
&НаКлиенте
Процедура СохранитьНастройки(Команда)
СохранитьНастройкиНаСервере();
КонецПроцедуры
В процедуре инициализации восстанавливаем:
ТекНастройки = Константы.НастройкиНазначенияЗадачПоРезультатамАнкетирования.Получить().Получить();
Если ТекНастройки = Неопределено Или ВсегдаИспользоватьНастройкиПоУмолчанию Тогда
ОтборНаФорме.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Иначе
ОтборНаФорме.ЗагрузитьНастройки(ТекНастройки);
КонецЕсли;
ОтборНаФорме.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность);
3) Результат СКД можно выгрузить в "ДеревоЗначений". Имеет смысл, если Структура нашего СКД тоже имеет древовидную структуру, имеет больше одной группировки.
4) Результат СКД можно выгружать не только в КоллекциюЗначений, коей является ТаблицаЗначений, но и в ТабличныйДокумент. Для этого нужно указать другой объект для вывода результата и в параметрах процедуры выполнения компоновщика указать тип генератора.
Для таблицы значений:
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновщикаНастроек,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Для табличного документа(тут тип генератора можно не указывать, подходит тип по умолчанию):
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновщикаНастроек);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
5) Текст запроса СКД можно изменить. Конечно, менять текст имеет смысл только в процедуре выполнения компоновщика, в нашей случае это процедура ЗаполнитьНаСервере()
СхемаКомпоновкиДанных.НаборыДанных.Основной1.Запрос = СтрЗаменить(ТекстЗапроса, "ПЕРВЫЕ 7", "ПЕРВЫЕ " + Строка(КоличествоДокументов));
Таким образом, обработка может работать в ручном режиме и в автоматическом(в режиме регламентного задания, по сохранённым настройкам). Процедуры регламентного режима, которые выполняют СКД по Настройкам, конечно, должны быть размещены в модуле объекта обработки.
Для автоматического режима ничего восстанавливать не нужно. Форму мы не открываем. Передаём сохранённую настройку из константы(НастройкаИзКонстанты) прямо в функцию выполнения Компоновщика.
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкаИзКонстанты ,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Не нужно открывать конфигуратор и менять условия в запросах, достаточно изменить настройки компановщика в хранилище. Мало того, одна СКД может отрабатывать по нескольким настройкам.
Все описанные возможности есть в присоединённом файле.