Перейти к основному содержанию
`Ctrl`+`K`

# Типы отчетов

## Произвольный

Произвольный отчет — это отчет, параметры которого берутся напрямую из существующей Печатной Формы (ПФ) с возможностью выбора только нужных параметров.

Как это работает?

В системе существует Печатная Форма (ПФ), содержащая множество параметров. При создании произвольного отчета можно выбрать только те параметры из ПФ, которые действительно необходимы для конкретной задачи.

Итоговая форма предзаполнения и параметры для фоновых операций при построении отчета зависят от выбранных параметров исходной ПФ.

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

Для чего используется?

- Построение отчетов с произвольной структурой на основе существующих ПФ.

- Упрощение сложных печатных форм путем выбора только релевантных параметров.

- Создание специализированных версий отчетов из универсальных ПФ.

## Динамический

Динамический отчет — это отчет, параметры которого формируются через построитель запросов в интерфейсе системы, без необходимости программирования.

Для открытия построителя отчетов необходимо выбрать отчет с динамическим типом - `Редактировать - Объектные характеристики - Построитель запросов`.

Как это работает? Через интерфейс системы необходимо открыть построитель запросов и задать необходимые колонки отчета, доступные поля для заполнения, условия и параметры, по которым будет строиться отчет.

На предпечатный экран можно вывести нужные поля для заполнения и указать дополнительные условия. Система автоматически формирует итоговый отчет на основе заданной конфигурации.

Для чего используется?

- Настройка и изменение отчетов бизнес-пользователями через интерфейс.

- Быстрое построение типовых и уникальных отчетов без необходимости создания новых печатных форм и выборок.

## Экранная форма

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

Как это работает? Через интерфейс системы в Объектных характеристиках экранной формы необходимо указать выборку данных и тип ее отображения — например, таблица, карточка, древовидный список. После чего система напрямую отображает данную выборку (списки классов, логи, справочники и т.д.) в указанном виде.

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

Для чего используется?

- Прямой вывод данных системы без промежуточных преобразований.

- Единый интерфейс для просмотра информации из разных модулей.

## Отчет с селекционным экраном

Отчет с селекционным экраном — это отчет, где данный экран генерируется из параметров выборки, которую программист задает в коде.

Перед печатью данного отчета открывается сам селекционный экран — интерфейс для заполнения полей. На основе заполненных данных строится отчет.

Как это работает? Разработчик в коде создает выборку, где прописывает необходимые параметры. Эти параметры определяют структуру селекционного экрана и логику обработки данных.

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

Для чего используется?

- Реализация сложной бизнес-логики проверок и расчетов.

- Разработка универсальных отчетов с максимальной гибкостью настройки.

- Автоматизация специализированных процессов формирования отчетности.

### Выборка для селекционного экрана

Выборка для селекционного экрана указывается в `Настройка отчетных форм → Объектные характеристики` через поля:

- `Имя выборки`;

- `Имя отображения`.

#### Создание выборки

Выборку для селекционного экрана нужно унаследовать от базовой выборки `ru.bitec.app.rpt.Rpt_ScreenCardAbsAvi.BaseSelectionScreenCard`. Эта выборка по умолчанию содержит фильтр с отчетами отчетной формы, который определяет, какая печатная форма будет напечатана. Если этого фильтра нет или он не заполнен, будет напечатана печатная форма по умолчанию.

#### Валидация введенных значений

Для валидации значений полей нужно переопределить метод `validateFields`, который вызывается перед печатью.

#### Параметры выборки

Для передачи параметров в селекционный экран используется параметр `jParams#`, который содержит JSON следующего вида:

    {
      "attribute_1_name": "attribute_1_value",
      "attribute_2_name": "attribute_2_value"
    }

#### Карта параметров отчета

Для указания логики получения карты параметров отчета переопределите метод `getPropertyMap`.
По умолчанию получает значения всех фильтров `StdLink` и стандартных фильтров.
Для редактирования полученной карты параметров можно переопределить метод `preparePropertyMap`.

### Селекционные экраны

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

Селекционные экраны позволяют:

- Задавать фильтры для отчетов.

- Выбирать типы отчетов и их параметры.

- Автоматически формировать условия для выборки данных.

#### Как использовать селекционные экраны

Шаг 1: Наследование от базовой выборки

Для начала разработчику необходимо отнаследоваться от базовой выборки `Rpt_ScreenCardAbsAvi#BaseSelectionScreenCard`.

Шаг 2: Переопределение методов setReportName и setPropertyMap

После создания наследника, необходимо переопределить два метода:

- `setReportName` — определяет системное имя отчета, которое будет использоваться при генерации.

- `setPropertyMap` — в этом методе заполняется логика формирования результирующей карты параметров (`reportParamsResultMap`), которая будет передаваться в метод печати.

Пример:

    override def setReportName: String = "MyCustomReport"

    override def setPropertyMap: Unit = {
      fltMacroGeneratorPkg.updateResultMap(
        fltMacroGeneratorPkg.getAllFltValuesMap,
        {
          case (key, value) =>
            val newKey = key.stripPrefix("flt_").toUpperCase
            newKey -> value
        })
      fltMacroGeneratorPkg.updateResultMap(Map("WHERECOND" -> fltMacroGeneratorPkg.generateReportMacro()))
    }

Шаг 3: Работа с результирующей картой параметров

В методе `setPropertyMap` разработчик заполняет результирующую карту `reportParamsResultMap`, которая передается как параметры в метод `printReport`. Для помощи в формировании этой карты используется пакет `ru.bitec.app.btk.FltMacroGeneratorPkg`, который содержит необходимые методы для работы с фильтрами и формирования карт значений.

Пример использования пакета `fltMacroGeneratorPkg` (см. выше):

Шаг 4: Дополнительные возможности — выбор печатной формы

Разработчик может позволить пользователю самостоятельно выбирать нужный отчет. Для этого необходимо вставить фильтр для выбора отчета в свой .avm-файл:

    <condition id="idReport">
        <filterAttr name="flt_idReport" attribute-type="Long" caption="Отчет" order="10" isVisible="false"/>
        <filterAttr name="flt_idReportHL" attribute-type="Varchar" caption="Отчет" order="10.1">
            <card isControlWidthFixed="true" controlWidth="60"/>
            <editor>
                <lookup changeableAttr="flt_idReport" lookupQuery="gtk-Rpt_EntityAvi#Lookup_SelReport"
                        lookupListAttr="sHeadLine" lookupKeyAttr="id" isResetButtonVisible="true"/>
            </editor>
        </filterAttr>
    </condition>

Шаг 5: Метод печати отчета

Метод `printReport` отвечает за формирование и печать отчета. Он вызывает метод генерации отчета с передачей системного имени отчета и параметров, сформированных в методе `setPropertyMap`.