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