1с построитель отчета менеджер временных таблиц
В общем, необходимо сделать отчет на базе универсального отчета. Проблема в том, что необходимо было преобразовать значение из строки в число, что в запросе невозможно. Поэтому решили сначала отдельно преобразовать нужные значения с созданием ТЗ, а далее помещать ее в запрос. Но в построителе отчета никак не пойму как сделать менеджер временных таблиц. Подскажите, плиз, решение) вот текущий код:
Через ОписаниеИсточникаДанных можно попробовать ТЗ построителю передать.
сделала через источник данных, но при формировании отчета не выводятся показатели по измерениям, ставлю "показывать детальные записи" в истина, выводятся. Делала все стандартно, как нужно формировать универсальный отчет. Может при использовании источника данных нужны еще какие то специальные настройки?
1. 2. Все это дело можно перенести в запрос: 3. Для чего создается МенеджерВременныхТаблиц? 4. Добавьте Итоги в колонки описания источника данных. Поиск в СП: КолонкаОписанияИсточникаДанных.
к п.2 и 3: Т.к в запросе невозможно привести строку к числу, для этого осуществляем преобразование отдельно, и потому и создаем менеджер временных таблиц к п. 4: вот именно это и помогло, надо было для каждого показателя такую вот строчку писать:
Просто, всё можно сделать в одном запросе (пусть, с временной таблицей), без менеджера временных таблиц. Менеджер временных таблиц нужен, когда разные запросы к какой-то временной таблице обращаются. Он хранит ВТ до тех пор, пока не будет уничтожен или закрыт. СП: Если временная таблица создается, используется и уничтожается в рамках одного пакета запросов, менеджер временных таблиц создавать не нужно.
подскажите тогда, как сделать проще? просто первый раз работаю с временными таблицами
Ну, вот пример простого пакетного запроса с временными таблицами без использования менеджера временных таблиц:
ну это то я знаю, но мне то надо чтобы извне таблица значений помещалась во временную таблицу, а кроме как менеджера я не знаю как это сделать
Как известно платформа 8.1 не предполагает использование временных таблиц в построителе отчета.
Хотя часто это бывает необходимо.
Расмотрим вариант как это сделать.
Пример реализован в обработке для типовых конфигураций УПП и БП.
Для этих целей воспользуемся пакетом запросов, который стал с недавних пор доступен для построителя отчетов.
Необходимо специальным образом создать в первом пакете временную таблицу.
Смысл следующий, нужно создать колонки с нужными нам типами.
Например, у нас есть следующая таблица значений ТЗ
Имя колонки Тип колонки
Сумма число (15,2)
Формируем тект построителя
ВЫБРАТЬ
ЗНАЧЕНИЕ( Справочник.Организации.пустаяСсылка ) КАК Организация , // Это и есть наша
ЗНАЧЕНИЕ( Справочник.Контрагенты.пустаяСсылка ) КАК Контрагент , // наша временная
ЗНАЧЕНИЕ( Справочник.ДоговорыКонтрагентов.пустаяСсылка ) КАК Договор , // таблица
ЗНАЧЕНИЕ( Перечисление.ВидыДоговоровКонтрагентов.пустаяСсылка ) КАК ВидДоговора ,
ВЫРАЗИТЬ ( 0 КАК ЧИСЛО( 15 , 2 )) КАК Сумма
ПОМЕСТИТЬ Таб_Временная
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НДСРасчетыСПокупателямиОстатки.Организация ,
НДСРасчетыСПокупателямиОстатки.Покупатель ,
НДСРасчетыСПокупателямиОстатки.ДоговорКонтрагента ,
Таб_Временная.ВидДоговора ,
НДСРасчетыСПокупателямиОстатки.Документ ,
НДСРасчетыСПокупателямиОстатки.СуммаОстаток КАК СуммаНДС ,
Таб_Временная.Сумма КАК СуммаизВременнойТаблицы
ИЗ
РегистрНакопления.НДСРасчетыСПокупателями.Остатки КАК НДСРасчетыСПокупателямиОстатки
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таб_Временная КАК Таб_Временная
ПО НДСРасчетыСПокупателямиОстатки.Организация = Таб_Временная.Организация
И НДСРасчетыСПокупателямиОстатки.Покупатель = Таб_Временная.Контрагент
И НДСРасчетыСПокупателямиОстатки.ДоговорКонтрагента = Таб_Временная.Договор
Как видим построитель отчета этот запрос прекрасно понимает, и мы можем оперировать с его полями как нам угодно.
Задача все-таки выполнить построитель чтоб он возвращал нужный нам результат!
Для этого необходимо выполнять не построитель отчета, а получить текст запроса и параметры из построителя и поставить его в запрос, где в менеджере временных таблиц уже находиться наша временная таблица!
Запрос =Новый Запрос ;
Запрос . М енеджерВременныхТаблиц =Новый МенеджерВременныхТаблиц ;Запрос . УстановитьПараметр ( " ВременнаяТаблица " , ТЗ );
Запрос . Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ Таб_Временная ИЗ &ВременнаяТаблица КАК ОБ_Таб " ; // Помещаем во временную таблицу
Запрос . Выполнить ();
// .
//
// .
ЗапросПостроителя = ПостроительОтчета . ПолучитьЗапрос ();
ТекстЗапросаПостроителя=ЗапросПостроителя . Текст ;
Ч_Поз = Найти ( ТекстЗапросаПостроителя , ";" ); // Находи начало текста запроса
ТекстЗапросаДляВыполнения = Сред ( ТекстЗапросаПостроителя , Ч_Поз + 1 );
Запрос . Текст = ТекстЗапросаДляВыполнения ; // Устанавливаем текст основного запроса
Запрос . Параметры . Очистить ();
Для каждого Парам Из ЗапросПостроителя . Параметры Цикл
Запрос . УстановитьПараметр ( Парам.Ключ , Парам.Значение ); // Устанавливаем параметры запроса
КонецЦикла;
Мой глаз зацепился за этот анонс еще в стадии бета-версии, уж больно заманчиво выглядела возможность компоновать отчет с использованием внешних данных.
Напомню, раньше при попытке подцепить временную таблицу, не описанную в запросе, СКД выдавала ошибку.
И для использования внешних источников данных приходилось использовать Набор данных объект.
Нельзя сказать, что он не выполнял свои задачи, нет. Но вручную набивать все поля набора, прописывать роли и типы значений было весьма утомительно.
С выходом платформы 8.3.17 ситуация в корне поменялась.
Рассмотрим задачу. Необходимо вывести начисления и удержания сотрудников (сотрудник, вид расчета, сумма) с их кадровыми данными (подразделение, должность, график работы, вид занятости). Раньше нужно было писать многостраничный пакетный запрос с обращением к нескольким регистрам сведений (упомянутые данные хранятся минимум в 6 регистрах сведений).
Да, да, я знаю, что данные надо выбирать не из всех этих регистров, но позвольте нагнать немного саспенса)
Либо воспользоваться механизмом представлений, который тоже имеет свои ограничения и нюансы. И да, временные таблицы в запросе все равно пришлось бы описывать.
Теперь в запросе можно использовать данные временных таблиц, не описанных в самом наборе данных.
Как можно заметить, таблица ВТКадровыеДанныеСотрудников в запросе появляется сразу в соединении с основной таблицей, без ее предварительного объявления. Для того, чтобы компоновщик настроек мог понять, с каким типами данных из временной таблицы он имеет дело, желательно прописать это в тексте запроса, используя выражения языка запросов ВЫРАЗИТЬ (ВТ.ЗначениеПоля КАК < Описание типа >) или ЕСТЬNULL (ВТ.ЗначениеПоля, < Пустое значение такого же типа >). Для составных типов можно будет использовать выражение ВЫБОР КОГДА с последовательным описанием типов.
Затем в предопределенной процедуре ПриКомпоновкеРезультата модуля отчета, инициализируем менеджер временных таблиц с требуемыми данными. В результате инициализации в МВТ должа быть сформирована временная таблица с именем, идентичным объявленному в наборе данных.
Само получение данных и помещение их в менеджер временных таблиц занимает ровно две строки
Таким образом можно получать данные любой структуры и сложности и использовать их в наборе данных схемы компоновки. Как по мне - отличная новость. Скорость разработки увеличивается на порядок. Можно помещать в МВТ свои таблицы значений, собранных по сложному алгоритму с обходом их в цикле. Можно, как в моем примере, использовать типовые функции получения данных. Можно использовать результат формирования других отчетов, скомпонованных в таблицу значений. Можно. Впрочем, оставлю простор для ваших фантазий)
Данный механизм работает в том числе и в режиме совместимости (я проверял на 8.3.14).
Пример взят предельно упрощенный, лишь для того, чтобы продемонстрировать работу механизма. На практике я уже применил этот метод работы СКД при разработке отчета, в котором начисления выводились вместе с численностью по штатному расписанию, фактической и среднесписочной численностью.
За рамками статьи остались некоторые вопросы вроде производительности и нагрузки на сервер.
Многие знают, что временные таблицы используются в пакетах запросов, когда нужно сначала одним запросом получить какую-то информацию, а потом обработать ее уже с помощью другого запроса и получить результат. Таким образом, менеджеры временных таблиц существуют у любых запросов.
Но что делать, когда использования пакетного запроса недостаточно для решения задачи? Например, когда после создания временной таблицы требуется произвести какие-то действия с помощью встроенного языка 1С и только после этого получить окончательный результат запроса. Или, когда временная таблица должна быть получена различными способами, в зависимости от некоторых условий.
Очевидно, что в этих случаях нужно, чтобы различные запросы использовали один и тот же менеджер временных таблиц. Рассмотрим методы работы с менеджером временных таблиц в запросах 1С.
Как создать менеджер временных таблиц
Как назначить менеджер временных в запрос 1С
//создадим запрос
запрос = новый запрос ;
//Назначим созданный ранее менеджер временных таблиц
запрос . МенеджерВременныхТаблиц = МВТ ;
Как добавить временную таблицу в менеджер
Для того чтобы добавить временную таблицу в запрос, нужно выполнить запрос в режиме Создание временной таблицы, назначив ему менеджер временных таблиц.
Как удалить временную таблицу из менеджера
Для этого нужно создать запрос на уничтожение временной таблицы и выполнить его.
Как использовать таблицы из менеджера временных таблиц в запросах 1С
К сожалению, конструктор запроса не может видеть временные таблицы из менеджера. Поэтому запрос к временной таблице нужно либо писать вручную, либо все-таки воспользоваться конструктором, но указать в нем структуру временной таблицы.
После этого можно как обычно составить и выполнить запрос к временной таблице, не забывая подключать общий менеджер временных таблиц.
Читайте также: