Выполнить пакетный запрос ПостроителемОтчета?

18.03.10

Разработка - Запросы

Выполнить пакетный запрос ПостроителемОтчета? Может каждый, но у вас не было времени :)

 

Не секрет, что ПостроительОтчета "не переваривает" пакетные запросы, однако можно поместить во временную таблицу результат некого (одного) запроса. "Ну и что?" - скажете Вы, - "Как потом такую ВТ прочитать и использовать??".
Тем не менее, всё предельно просто, если воспользоваться внешним по отношению в ПостроителюОтчета МенеджеромВременныхТаблиц, например, по такой схеме:

1)

//....
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Результат = ВыполнитьПакетВПостроителе(МенеджерВТ);
//..

Функция ВыполнитьПакетВПостроителе(МенеджерВТ)

       Построитель.Текст = 
       "ВЫБРАТЬ
       //..
       |ПОМЕСТИТЬ ВТ1
       |ИЗ
       //
       |
       |{ГДЕ
       |   Условие1 ,
       //....
       |   ОтборN
       | }
       |"
;

       Запрос = Построитель.ПолучитьЗапрос();
       Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
       Запрос.Текст = Запрос.Текст
+
       "
       |;
       |ВЫБРАТЬ

       //...
       |ИЗ ВТ1 КАК ВТ1
       //...
       |;
       |УНИЧТОЖИТЬ ВТ1;
       |"
;

       Возврат Запрос.Выполнить();

КонецФункции

Заметим, что ";" (точка с запятой), необходимая для первой ВТ, стоит не в текст  ПостроителяОтчета, а в тексте доработанного запроса. Это связано с тем, что  ПостроительОтчета, хоть и помещает результат во временную таблицу, но в тексте  своего запроса окончание (";") "съедает".

2) Если перед вызовом функции ВыполнитьПакетВПостроителе() настройки (Отбор,  ПараметрыДанных) были установлены, то простенький тестовый примерчик порадует  своей работоспособностью.
А что если решение задачи "требует" использования разных выборок данных в  различных разрезах, представлениях и т.п., причем желательно с использованием  однажды установленных пользователем настроек?
Очевидно, расширить схему:

Функция ВыполнитьПакетВПостроителе(МенеджерВТ)

       // Выборка1 с использованием настроек
       Построитель.Текст = 
       "ВЫБРАТЬ
       //..
       |ПОМЕСТИТЬ ВТ1
       |ИЗ
       //
       |
       |{ГДЕ
       |     Условие1 ,

       //....
       |     ОтборN
       | }
       |"
;

       Запрос = Построитель.ПолучитьЗапрос();
       Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
       Запрос.Текст = Запрос.Текст
+
       "
       |;
       |ВЫБРАТЬ
       //...
       |ИЗ ВТ1 КАК ВТ1
       //...
       |;
       |УНИЧТОЖИТЬ ВТ1;
       |"
;

       Запрос.Выполнить();

       // Выборка2 с использованием настроек, но в том же пакете 
       Построитель.Текст = 
       "ВЫБРАТЬ
       //..
       |ПОМЕСТИТЬ ВТ2
       |ИЗ
       //
       |
       |{ГДЕ
       |    Условие2 ,

       //....
       |    ОтборK
       | }
       |"
;

       Запрос = Построитель.ПолучитьЗапрос();
       Запрос.МенеджерВременныхТаблиц = МенеджерВТ; // менеджер тот же
       Запрос.Текст = Запрос.Текст
+
       "
       |;
       |ВЫБРАТЬ
       //...
       |ИЗ ВТ1 КАК ВТ1
       |ЛЕВОЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
       |ПО ВТ1.//...
       //...
       |;
       |УНИЧТОЖИТЬ ВТ1;
       |УНИЧТОЖИТЬ ВТ2;
       |"
;

       Возврат Запрос.Выполнить();

КонецФункции

3) На первый взгляд, дополнение 2) уже лучше. Но. Без "Но" ну никуда... Всякий  раз, когда текст Построителя меняется, система меняет в соответствии с текстом  и коллекцию ДоступныхПолей, в том числе и у отбора. И эта ситуация, мягко  говоря, неприятна.
Поэтому перед каждой генерацией запроса от Построителя, необходимо "руками"  указывать ему, где он прав и где виноват:

 //...
 УстановитьОтборИПараметры();
 Запрос = Построитель.ПолучитьЗапрос
();
 //...

Процедура УстановитьОтборИПараметры()

       //Отбор
       Доступные = Построитель.Отбор.ПолучитьДоступныеПоля();
       Поле = Доступные.Найти("ПараметрОтбора1");
       Если Поле <> Неопределено Тогда
              Поле.Отбор = Истина;

              Элт = Построитель.Отбор.Найти("ПараметрОтбора1");
              Если Элт = Неопределено Тогда
                    Элт = Построитель.Отбор.Добавить("ПараметрОтбора1");
                    //...
                    Элт.Использование
= Истина;
              КонецЕсли;
       КонецЕсли;
       // другие поля отбора...

       Построитель.Отбор.УстановитьДоступныеПоля(Доступные);


       //ПараметрыДанных

       Если НЕ Построитель.Параметры.Свойство("ПараметрДанных1") Тогда
             Построитель.Параметры.Вставить
("ПараметрДанных1",Истина);
       КонецЕсли;
       // другие параметры данных...

КонецПроцедуры

4) Еще одно "Но". Чтобы при написании текста пакета (выполнении запроса)  совсем уж не задумываться, "где он там найдет все параметры", Построитель нужно  проинициализировать каким-нибудь "общим" текстом, в котором будут участвовать  все необходимые отборы и параметры. Для этого не обязательно строить  Вавилонскую башню, достаточно минимально адекватного запроса вида:

 //..
 "ВЫБРАТЬ ЛОЖЬ
 |ИЗ <ВиртуальнаяТаблица>(&ДатаСреза, &ВидыСубконто {Отбор_1.*} ) КАК Запрос
 |{ЛЕВОЕ СОЕДИНЕНИЕ ...}
 |{ГДЕ Отбор1, Отбор2.* КАК Отбор2}
 |"
;
 //..

5) Вспомним о пользователе. Чтобы он "ничего не заметил", необходимо после  вызова функции ВыполнитьПакетВПостроителе() проиницилизировать  ПостроительОтчета "общим" текстом и еще раз УстановитьОтборИПараметры().

.. а кто слушал - молодец!

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    183433    1020    403    

966

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    2128    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5594    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    13004    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    8107    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3103    PROSTO-1C    0    

23

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    10678    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. direktorSan 298 24.03.10 18:37 Сейчас в теме
Может я НЕ понял сути статьи, но вот такая конструкция у меня отрабатывает на ура:
п = Новый ПостроительОтчета;
п.Текст = "выбрать истина поместить т1;
|выбрать * из т1
|объединить
|выбрать ложь";
п.Выполнить();
т = п.Результат.Выгрузить();
2. direktorSan 298 24.03.10 18:44 Сейчас в теме
К сожалению, не смог отредактировать свой предыдущий коммент...

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

А пакетные запросы он давно переваривает без каких-либо ухищрений.
pvl_mksv; MoneG2; +2 Ответить
3. MoneG2 27 26.03.10 05:36 Сейчас в теме
Да, согласен.
В моей задаче нужно было выгружать промежуточный результат в ТЗ. Ну а до менеджера ВТ у Построителя не достучаться )) И потом сильно смущало, когда Построитель.ПолучитьЗапрос().Текст - пустой, если в пакете больше, чем 1 ВТ.
Оставьте свое сообщение