gifts2017

Использование временных таблиц в построителе отчета

Опубликовал Альберт Кадымов (sword444) в раздел Программирование - Практика программирования

Использование временных таблиц в построителе отчета

Как известно платформа 8.1 не предполагает использование временных таблиц в построителе отчета.

Хотя часто это бывает необходимо.

Расмотрим вариант как это сделать.

Пример реализован в обработке для типовых конфигураций УПП и БП.

Для этих целей воспользуемся пакетом запросов, который стал с недавних пор доступен для построителя отчетов.

Необходимо специальным образом создать в первом пакете временную таблицу.

Смысл следующий, нужно создать колонки с нужными нам типами.

Например, у нас есть следующая таблица значений ТЗ

-------------------------------------------------------------------------------------------

Имя колонки                            Тип колонки

-------------------------------------------------------------------------------------------

Организация                           Справочник.Организации

Контагент                               Справочник.Контагенты

Договор                                   Справочник.ДоговорыКонтагентов

ВидДоговора                           Перечисление.ВидыДоговоровКонтрагентов

Сумма                                      число (15,2)

----------------------------------------------------------------------------------------------------------

Формируем тект построителя

ВЫБРАТЬ
    ЗНАЧЕНИЕ(Справочник.Организации.пустаяСсылка) КАК Организация,                           // Это и есть наша
    ЗНАЧЕНИЕ(Справочник.Контрагенты.пустаяСсылка) КАК Контрагент,                               // наша временная
    ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.пустаяСсылка) КАК Договор,                    // таблица
    ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.пустаяСсылка) КАК ВидДоговора,
    ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 2)) КАК Сумма
ПОМЕСТИТЬ Таб_Временная
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    НДСРасчетыСПокупателямиОстатки.Организация,
    НДСРасчетыСПокупателямиОстатки.Покупатель,
    НДСРасчетыСПокупателямиОстатки.ДоговорКонтрагента,
    Таб_Временная.ВидДоговора,
    НДСРасчетыСПокупателямиОстатки.Документ,
    НДСРасчетыСПокупателямиОстатки.СуммаОстаток КАК СуммаНДС,
    Таб_Временная.Сумма КАК СуммаизВременнойТаблицы
ИЗ
    РегистрНакопления.НДСРасчетыСПокупателями.Остатки КАК НДСРасчетыСПокупателямиОстатки
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таб_Временная КАК Таб_Временная
        ПО НДСРасчетыСПокупателямиОстатки.Организация = Таб_Временная.Организация
            И НДСРасчетыСПокупателямиОстатки.Покупатель = Таб_Временная.Контрагент
            И НДСРасчетыСПокупателямиОстатки.ДоговорКонтрагента = Таб_Временная.Договор

Как видим построитель отчета этот запрос прекрасно понимает, и мы можем оперировать с его полями как нам угодно.

Задача все-таки выполнить построитель чтоб он возвращал нужный нам результат!

Для этого необходимо выполнять не построитель отчета, а получить текст запроса и параметры из построителя и поставить его в запрос, где в менеджере временных таблиц уже находиться наша временная таблица!

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

Запрос.УстановитьПараметр("ВременнаяТаблица",ТЗ);

Запрос.Текст="ВЫБРАТЬ * ПОМЕСТИТЬ Таб_Временная ИЗ &ВременнаяТаблица КАК ОБ_Таб"; // Помещаем во временную таблицу

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

// ....

//  

// ....

ЗапросПостроителя=ПостроительОтчета.ПолучитьЗапрос();
ТекстЗапросаПостроителя=ЗапросПостроителя.Текст;
Ч_Поз=Найти(ТекстЗапросаПостроителя,";"); // Находи начало текста запроса

ТекстЗапросаДляВыполнения=Сред(ТекстЗапросаПостроителя,Ч_Поз+1);
Запрос.Текст=ТекстЗапросаДляВыполнения; // Устанавливаем текст основного запроса

Запрос.Параметры.Очистить();

Для каждого Парам Из ЗапросПостроителя.Параметры Цикл
    Запрос.УстановитьПараметр(Парам.Ключ,Парам.Значение); // Устанавливаем параметры запроса
КонецЦикла;
       
Попытка
    Результат=Запрос.Выполнить(); // И выполняем запрос
Исключение
    Сообщить(ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
КонецПопытки;

 В переменную  Результат получаем нужный нам результат запроса.

 

Имя колонки   Тип колонки
 Организация  Справочник.Организации
 Контрагент  Справочник.Контрагенты
 Договор  Справочник.ДоговорыКонтрагентов
 ВидДоговора  Перечисление.ВидыДоговоровКонтрагентов
 Сумма

 Число (15,2)

См. также

Подписаться Добавить вознаграждение
Комментарии
0. Альберт Кадымов (sword444) 02.11.11 22:12
Использование временных таблиц в построителе отчета

Перейти к публикации

1. Сергей Ожерельев (Поручик) 02.11.11 22:12
В эпиграфе надо написать: Фанатам платформы 8.1. посвящается.
2. Александр Медведев (anig99) 03.11.11 08:14
в 8.1 уже есть СКД. Фанатам 8.0
Проблема не достойна статьи.
3. Валерий Гайдабура (director04) 03.11.11 09:07
Поставил плюс за изворотливость ума. Но не закисни, давно пора освоить СКД.
4. Сергей Ожерельев (Поручик) 03.11.11 11:44
(2) (3) СКД не в каждую дыру сунешь, всё-таки меру надо знать.
5. ediks (ediks) 06.11.11 11:12
Что-то я не понял к чему эта статья...
1. Может кто-то объяснит, что хотел автор получить в результате? Что даст внутреннее соединение пустой таблицы с регистром НДС?
2. К какому году относится эта статья? Поиск в Интернете указал на статью уважаемого Groovy, датированную маем 2008 года, в которой он пишет, что начиная с версии 8.1.11 платформа поддерживает пакетные запросы.Сейчас уже на дворе конец 2011 года и версия 8.1.15. Это к тому, что автор пишет:

Как известно платформа 8.1 не предполагает использование временных таблиц в построителе отчета.
...
Для этих целей воспользуемся пакетом запросов, который стал с недавних пор доступен для построителя отчетов.
6. Михаил Журавлев (Gmix) 15.02.12 09:38
Уважаемый sword444
Первоисточник нужно сообщать.
Если вы будете перепечатывать статьи с моего сайта придется сообщить модераторам.

На счет статьи, алгоритм описан действительно для платформы 8.1.
Алгоритм придуман еще в 2006 году
Статья написана 11.12.08 21:03 тут

На счет СКД иногда её не целесообразно использовать.
Например: Нужно использовать возможности построителя в части установки произвольных отборов для получения текста запроса.
Synoecium; +1 Ответить