Как программно вывести результаты запроса в отчет 1С с использованием СКД и табличного документа

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке конфигураций на платформе 1С:Предприятие часто возникает задача красиво оформить и вывести на экран результаты выполнения запроса. Для решения этой задачи разработчику доступны два основных подхода: использование традиционного ручного вывода в макет табличного документа и программный вывод с помощью Схемы компоновки данных (СКД). Рассмотрим подробно оба варианта, а также разберем способы передавать во внешние отчеты параметры и подготовленные таблицы значений.

Вывод результатов запроса через ручной макет и табличный документ

Разберем классический способ вывода данных через макет. Этот вариант подходит, если требуется жестко зафиксировать форму отчета и полностью контролировать обход результатов запроса в коде.

Процесс состоит из нескольких шагов:

  1. Создаем объект конфигурации Отчет и добавляем в него макет типа ТабличныйДокумент.
  2. Размечаем в макете области (например, Шапка, Элемент, Подвал) и задаем параметры в ячейках.
  3. В модуле отчета или формы выполняем запрос, заполняем параметры областей и последовательно выводим их в реквизит формы типа ТабличныйДокумент.

Проанализируем пример кода на сервере, формирующего макетный отчет на основании структуры отбора:


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

Программный вывод отчета с помощью СКД

Использование Схемы компоновки данных (СКД) дает гибкость: автоматическую группировку данных, оформление, возможность применения пользовательских настроек и группировок. Выполнить компоновку можно полностью программно без использования стандартных механизмов формы отчета.

Для программного формирования отчета СКД используется следующий алгоритм:

  1. Получаем объект СхемаКомпоновкиДанных.
  2. Инициализируем КомпоновщикМакетаКомпоновкиДанных и формируем МакетКомпоновки с учетом настроек.
  3. Передаем макет компоновки в ПроцессорКомпоновкиДанных.
  4. С помощью ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент выводим готовый результат в ТабличныйДокумент.

Рассмотрем базовый пример программного вывода отчета СКД:


&НаСервере
Функция СформироватьОтчетСКД()
    
    // Получаем схему из макета отчета
    Схема = Отчеты.КонтактыКлиентов.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = Схема.НастройкиПоУмолчанию;
    
    // Формируем макет компоновки
    КомпМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпМакета.Выполнить(Схема, Настройки);
    
    // Инициализируем процессор компоновки
    ПроцКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцКомпоновки.Инициализировать(МакетКомпоновки);
    
    // Выводим результат в табличный документ
    ТабДок = Новый ТабличныйДокумент;
    ПроцВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцВывода.УстановитьДокумент(ТабДок);
    ПроцВывода.Вывести(ПроцКомпоновки);
    
    Возврат ТабДок;
    
КонецФункции

Использование внешних источников данных (Таблицы Значений) в СКД

Часто перед выводом отчета данные необходимо предварительно рассчитать на сервере или сформировать сложную таблицу значений в коде, а затем передать её в СКД для оформления. В этом случае в СКД создается Набор данных вида Объект.

Выясним, как передать внешнюю ТаблицуЗначений в СКД:

  1. В конструкторе СКД добавляем Набор данных - объект и задаем ему имя, например, ВнешниеДанные. Указываем список полей и их типы.
  2. В коде подготавливаем ТаблицуЗначений, колонки которой совпадают с описанными полями набора данных.
  3. Создаем структуру ВнешниеНаборыДанных, где ключ совпадает с именем набора данных объекта в СКД ("ВнешниеДанные"), а значением является подготовленная таблица.
  4. Передаем структуру в метод Инициализировать() объекта ПроцессорКомпоновкиДанных.

Посмотрим на практическую реализацию перехвата события ПриКомпоновкеРезультата в модуле объекта отчета:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Формируем внешнюю таблицу значений
    ВнешниеДанные = Новый ТаблицаЗначений;
    ВнешниеДанные.Колонки.Добавить("Партнеры", Новый ОписаниеТипов("СправочникСсылка.Партнеры"));
    ВнешниеДанные.Колонки.Добавить("Контрагенты", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
    
    НоваяСтрока = ВнешниеДанные.Добавить();
    НоваяСтрока.Партнеры = ЗаполненныйПартнер;
    НоваяСтрока.Контрагенты = ЗаполненныйКонтрагент;
    
    // Помещаем ТЗ в структуру внешних наборов данных
    КонтейнерВнешнихДанных = Новый Структура;
    КонтейнерВнешнихДанных.Вставить("ВнешниеДанные", ВнешниеДанные);
    
    // Получаем схему и настройки
    Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Компоновка макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
    
    // Инициализация процессора с передачей внешнего набора
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, КонтейнерВнешнихДанных, ДанныеРасшифровки);
    
    // Вывод в документ
    ДокументРезультат.Очистить();
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Программное заполнение параметров компоновки данных

Если в схеме компоновки используются параметры (например, период или ссылка на документ-источник), их необходимо правильно заполнять в настройках компоновщика перед выполнением компоновки.

Важно помнить: параметры устанавливаются не в объекте СхемаКомпоновкиДанных, а в коллекции параметров текущих настроек компоновщика (объект КомпоновщикНастроек.Настройки.ПараметрыДанных).

Проанализируем пример установки параметра Ссылка:


&НаСервере
Функция СформироватьОтчетСПараметром(СсылкаНаДокумент)
    
    Схема = Отчеты.КонтактыКлиентов.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = Схема.НастройкиПоУмолчанию;
    
    // Установка значения параметра в настройках
    ПараметрСсылка = Настройки.ПараметрыДанных.Элементы.Найти("Ссылка");
    Если ПараметрСсылка <> Неопределено Тогда
        ПараметрСсылка.Значение = СсылкаНаДокумент;
        ПараметрСсылка.Использование = Истина;
    КонецЕсли;
    
    // Формирование макета и вывод
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    ТабДок = Новый ТабличныйДокумент;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабДок);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    Возврат ТабДок;
    
КонецФункции

Ключевые особенности и подводные камни СКД

При работе с СКД следует учитывать особенности работы платформы:

← На главную