среда, 10 мая 2017 г.

Использование запроса к таблице значений в построителе отчетов


Построитель отчетов очень удобен для использования интерактивных отборов. Но в построитель отчетов нельзя передавать в запрос таблицу значений. 

Приведенный ниже код позволяет обойти ограничение:



//Временная таблица "СоставИзОбработки" - является заглушкой
Построитель1 = Новый ПостроительОтчета;
Построитель1.Текст = 
 "ВЫБРАТЬ РАЗРЕШЕННЫЕ
 | NULL КАК Номенклатура,
 | NULL КАК Цвет,
 | ДАТАВРЕМЯ(1, 1, 1) КАК Период,
 | 0 КАК Количество
 |ПОМЕСТИТЬ СоставИзОбработки
 |;
 |
 |////////////////////////////////////////////////////////////
 |ВЫБРАТЬ РАЗРЕШЕННЫЕ
 | ПланЗакупокСоставПлана.Ссылка,
 | ПланЗакупокСоставПлана.Номенклатура,
 | ПланЗакупокСоставПлана.Период,
 | ПланЗакупокСоставПлана.Цвет,
 | СУММА(ПланЗакупокСоставПлана.Количество) КАК Количество
 |ПОМЕСТИТЬ СоставПланов
 ...
 ";

Построитель1.ЗаполнитьНастройки();
//В построитель передаются все параметры.
Построитель1.Параметры.Вставить("Дата1", НачПериода);
Построитель1.Параметры.Вставить("Дата2", КонПериода);

Отбор = Построитель1.Отбор;
//Устанавливается отбор в построитель

мМенеджерВТ = Новый МенеджерВременныхТаблиц;//Только для просмотра 
//временной таблицы

Запрос = Построитель1.ПолучитьЗапрос();
//После получения запроса из построителя, подменяем 
//заглушку на код получения данных из таблицы значений
//!!!!!необходио обратить внимание на то, что код заглушки 
//будет авоматически отформатирован, для получения формата
//кода заглушки нужно использовать конструктор запросов!!!
Запрос.Текст = СтрЗаменить(Запрос.Текст, 
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| NULL КАК Номенклатура,
| NULL КАК Цвет,
| ДАТАВРЕМЯ(1, 1, 1) КАК Период,
| 0 КАК Количество
|ПОМЕСТИТЬ СоставИзОбработки",
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
 | ВремТз.Номенклатура,
 | ВремТз.Цвет,
 | ВремТз.Период,
 | ВремТз.Количество
 |ПОМЕСТИТЬ СоставИзОбработки
 |ИЗ
 | &ВремТз КАК ВремТз");
 
Запрос.УстановитьПараметр("ВремТз", ВремТз);

//Запрос.МенеджерВременныхТаблиц = мМенеджерВТ;//Только для просмотра временной таблицы

Результат = Запрос.Выполнить();

//таб = ПросмотрВТ(Запрос, "СоставИзОбработки"); //Только для просмотра временной таблицы

//Возврат;

ВыборкаДокументы = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаДокументы.Следующий() Цикл
//Отработка выборки
...
//Для просмотра времменых таблиц
Функция ПросмотрВТ(Запрос, ИмяВнутреннейТаблицы)
 Перем ЗапросТМП, Р;
 
 ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ "+ИмяВнутреннейТаблицы);
 ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц; 
 Р=ЗапросТМП.Выполнить().Выгрузить(); 
 Возврат Р;
КонецФункции