Часто перед разработчиком встает задача: сформировать аналитический отчет по данным, которые пользователь только что ввел в табличную часть документа, но еще не успел нажать кнопку Записать. Стандартный механизм Системы компоновки данных (СКД) обычно ориентирован на работу с базой данных через запросы. Однако существуют проверенные способы вывести в отчет "грязные" (несохраненные) данные прямо из формы документа. Разберем подробно основные методы реализации этой задачи.
Это классический способ передачи произвольной таблицы значений в компоновку данных. Мы проанализируем ситуацию, когда данные берутся непосредственно из объекта документа в памяти.
Шаг 1. Настройка схемы СКД
В схеме компоновки данных вместо привычного НаборДанныхЗапрос необходимо создать НаборДанныхОбъект. В поле Имя объекта содержащего данные следует вписать идентификатор, например, ТаблицаДанныхТЧ. Важно заранее вручную описать все поля (имя и тип), которые вы планируете передавать из табличной части, иначе СКД не сможет построить группировки и итоги.
Шаг 2. Программный вызов отчета из формы
Разберем пример кода, который выгружает данные табличной части в таблицу значений и передает её в процессор компоновки:
// В модуле формы документа
&НаКлиенте
Процедура СформироватьОтчетПоТЧ(Команда)
ДанныеТЧ = ЭтаФорма.Объект.Товары.Выгрузить();
ПараметрыОтчета = Новый Структура("ВнешниеНаборыДанных", Новый Структура("ТаблицаДанныхТЧ", ДанныеТЧ));
ОткрытьФорму("Отчет.МойОтчетПоТЧ.Форма", ПараметрыОтчета);
КонецПроцедуры
Шаг 3. Обработка в модуле отчета
В форме отчета или в его модуле необходимо перехватить переданные данные и инициализировать компоновку:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем внешние данные, переданные при открытии
ВнешниеДанные = Новый Структура;
ВнешниеДанные.Вставить("ТаблицаДанныхТЧ", ЭтаФорма.ДанныеИзФормыДокумента);
Схема = Отчеты.МойОтчетПоТЧ.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеДанные, ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Если вам нужно не просто вывести строки ТЧ, а соединить их с другими данными из базы (например, получить остатки или цены), лучше использовать МенеджерВременныхТаблиц. Рассмотрим, как это работает.
Проанализируем алгоритм:
В самой схеме СКД вы пишите обычный НаборДанныхЗапрос, обращаясь к таблице ВТ_ДанныеТЧ, как если бы она существовала в базе. Это позволяет использовать всю мощь языка запросов 1С.
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ВТ_ДанныеТЧ ИЗ &ТЗ КАК ТЗ";
Запрос.УстановитьПараметр("ТЗ", ТаблицаДанныхДокумента);
Запрос.Выполнить();
// При инициализации процессора компоновки передаем менеджер
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Ложь, , Запрос.МенеджерВременныхТаблиц);
Важный нюанс: при таком подходе СКД увидит поля временной таблицы, если они описаны в запросе схемы. Это избавляет от необходимости вручную прописывать типы полей в наборе данных "Объект".
Если ваша конфигурация построена на БСП, мы рекомендуем использовать стандартный механизм печати. В БСП можно зарегистрировать отчет СКД как внешнюю или внутреннюю печатную форму.
Выясним преимущества этого способа:
ДанныеФормы.Для реализации в модуле менеджера объекта необходимо прописать процедуру ДобавитьКомандыПечати и в обработчике указать тип вывода ОтчетСКД. Если данные не записаны, БСП позволяет передать текущее состояние объекта в структуру параметров печати.
Если требование работать с "несохраненными" данными не является критичным, и отчет должен просто открываться по текущему документу, рассмотрим самый простой вариант — передачу ссылки.
В схеме СКД создаем параметр СсылкаНаДокумент и устанавливаем его в настройках отбора. При вызове отчета из формы документа используем следующий код:
&НаКлиенте
Процедура ОткрытьОтчетПоСсылке(Команда)
ПараметрыФормы = Новый Структура;
// Формируем отбор для СКД
ЗначениеОтбора = Новый Структура("Поле, ВидСравнения, Значение, Использование",
"Ссылка", ВидСравненияКомпоновкиДанных.Равно, Объект.Ссылка, Истина);
МассивОтборов = Новый Массив;
МассивОтборов.Добавить(ЗначениеОтбора);
ПараметрыФормы.Вставить("Отбор", Новый Структура("Ссылка", Объект.Ссылка));
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму("Отчет.МойАналитическийОтчет.Форма", ПараметрыФормы);
КонецПроцедуры
Подведем итог: для оперативного анализа данных "на лету" лучше всего подходит Метод 1 с внешним набором данных. Если требуется сложная аналитика с привлечением данных из регистров — выбирайте Метод 2. Для типовых решений и поддержки стандарта конфигурации наиболее правильным будет использование Метода 3 через механизмы БСП.