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