Как создать внешний отчет на управляемых формах без использования СКД

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

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

В данной статье мы разберем процесс создания внешнего отчета «вручную», проанализируем особенности получения макета во внешних объектах и научимся программно управлять выводом данных на управляемую форму.

Структура внешнего отчета

Для начала создадим новый внешний отчет. В отличие от отчетов на СКД, где основной акцент делается на схеме компоновки, здесь наша работа сосредоточится на трех компонентах:

  1. Макет: Мы создадим макет типа «Табличный документ», где нарисуем шапку, строки и подвалы нашего будущего отчета.
  2. Форма: Нам потребуется управляемая форма, на которой мы разместим поле для вывода результата и кнопки управления.
  3. Модуль: В модуле формы или объекта мы напишем алгоритм запроса и заполнения макета.

Особенности получения макета во внешнем отчете

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

Для корректной работы мы должны обращаться непосредственно к объекту. Если код исполняется в модуле объекта, мы используем ЭтотОбъект.ПолучитьМакет("ИмяМакета"). Если же мы пишем код в модуле управляемой формы, процедура получения макета будет выглядеть следующим образом:


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

Проектирование управляемой формы

Разберем, как подготовить форму отчета. Нам недостаточно просто создать форму, нужно добавить на нее элемент, который будет отображать данные. Выполним следующие шаги:

  1. Добавим новый реквизит формы с именем Результат и типом ТабличныйДокумент.
  2. Перетащим этот реквизит в дерево элементов формы. 1С автоматически создаст Поле табличного документа.
  3. Добавим команду (кнопку) «Сформировать», которая будет запускать наш программный код.

Важно помнить: перед каждым формированием отчета необходимо очищать таблицу, иначе данные будут наслаиваться друг на друга. Для этого используем метод Результат.Очистить().

Алгоритм программного вывода данных

Проанализируем классическую схему вывода отчета: Запрос — Обход выборки — Заполнение параметров — Вывод области. Допустим, нам нужно вывести отчет по реализациям товаров и связанным с ними счетам-фактурам.


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

Работа с расшифровкой

Одним из преимуществ СКД является автоматическая расшифровка (возможность кликнуть на документ и открыть его). В ручном отчете нам нужно настроить это самостоятельно. Посмотрим, как это реализовать:

  1. В макете, в свойствах ячейки, найдем поле Параметр расшифровки. Укажем там имя, например, СсылкаРасшифровки.
  2. В коде, при заполнении параметров области, передадим в этот параметр ссылку на объект: ОбластьСтрока.Параметры.СсылкаРасшифровки = Выборка.Реализация;.
  3. На управляемой форме для поля табличного документа по умолчанию включена обработка расшифровки. Если в параметре передана ссылка, платформа 1С сама предложит ее открыть.

Преимущества ручного метода

Выясним, какие дополнительные возможности открываются при отказе от СКД. Мы можем использовать метод Присоединить() вместо Вывести(). Это позволяет динамически формировать колонки отчета. Например, если нам нужно вывести продажи по месяцам, где количество месяцев заранее неизвестно, мы создаем область «КолонкаМесяц» и в цикле присоединяем ее справа к текущей строке.

Также мы имеем полный доступ к оформлению. Если сумма реализации превышает лимит, мы можем программно изменить цвет текста конкретной ячейки непосредственно в момент вывода:


Если Выборка.СуммаРеализации > 100000 Тогда
    ОбластьСтрока.Область("СуммаРеализации").ЦветТекста = WebЦвета.Красный;
КонецЕсли;

Таким образом, создание внешнего отчета без СКД — это гибкий способ решения специфических задач визуализации данных, который требует более тщательного написания кода, но предоставляет разработчику неограниченные возможности управления результатом.

← На главную