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

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

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

См. также

SALE! 20%

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122167    670    389    

714

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5746    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6284    31    mkalimulin    25    

50

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1742    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5388    user1923546    26    

43

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16185    skovpin_sa    14    

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

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

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