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