# Отчеты Отчеты системы GlobalFramework лежат в базе данных, что позволяет легко перекрывать их на проектах. Для управления отчетами необходимо зайти в приложение Global `Настройка системы` ## Типы шаблонов печатных форм Определяют формат, в котором задаются шаблоны печатных форм. - jasper \ Шаблон представляет из себя zip архив содержащий набор xml файлов, сформированных в [jasper studio](../060_reports/120_jasper_reports.md). Jasper studio это специализированное средство построения печатных форм. - xlsx \ Шаблон представляет из себя файл в формате xls со спец тэгами - docx \ Шаблон представляет из себя файл в формате docx со спец тэгами ## Печатная форма Печатная форма (cокр. `ПФ`) определяет правила построения отчета, а также доступность этого отчета для приложения, [типа объекта](../030_class/075_тип_объекта.md) и пользователя. При выполнении печатной формы формируется отчет в виде файла с заданным форматов. Печатную форму можно подключить к выборке на проекте без внесения изменений в программный код. ### Версии печатной формы Версия печатной формы позволяет: - Безопасно вернутся к предыдущей реализации - Запускать реализацию в зависимости от периода Версия печатной формы содержит: - Тип шаблона печатной формы - Бинарный файл для построителя отчетов - Дату версии - Описание #### Доступные форматы В случае если тип шаблона печатной формы поддерживает конвертацию в другие форматы можно указать перечень доступных форматов. В случае если указано несколько доступных форматов, то при печати печатной формы пользователю будет задан вопрос в каком формате построить отчет. ### Подписи для печатных бланков В случае если отчет должен быть подписан после печати. В запрос печатной формы необходимо добавить атрибуты необходимые для формирования блока подписания. ``` with signs as(select * from jsonb_array_elements( $P{SIGNDATA_DZ}::jsonb ->'data')) select t.* , (select s.value ->>'sFIO' from signs s WHERE s.value->>'idBlankSignTypeMC' = 'matching1') as sMatching1 , (select s.value ->>'sPosition' from signs s WHERE s.value->>'idBlankSignTypeMC' = 'matching1') as sMatching1Pos ``` На печатный бланк необходимо вывести блок с подписями. Блок с подписями формируется перед печатью и передается в отчет в формате json, в параметр `SIGNDATA_DZ` пример: ```json { "data": [ { "idBlankSignTypeMC": "HeadOfDepartment", "bReadOnly": 0, "idBlankSignTypeHL": "Руководитель подразделения", "nOrder": 1, "dDate": "10.12.2020", "idBlankSignType": 95401, "sPosition": "Начальник отдела", "sFIO": "Дьяченко Евгений Владимирович" } ] } ``` Где: - idBlankSignType \ идентификатор тип подписи - idBlankSignTypeMC \ код типа подписи - nOrder \ порядковый номер подписи - sPosition \ Должность - sFIO \ ФИО - dDate \ дата Блок формируется на основе настроек данной закладки. \ Настройки могут быть переопределены\уточнены на конкретном объекте в закладке `Подписи` (`Bs_OBjectSign`) ### Аудит построения отчета Содержит информацию о построении отчетов пользователями. ### Параметры отчета Параметры отчета передаются в запрос, формирующий данные отчета. #### Пользовательские параметры Настраиваются на печатной форме. Перед выполнением отчета пользователь может ввести данные в эти параметры. #### Служебные параметры Формируются автоматически - `SIGNDATA_DZ` - Блок подписи - `IDUSER` - Пользователь - `IDSRCOBJECT` - Объект источник \ Идентификатор объекта от которого выполняется печатная форма. - `IDSRCCLASS` - Класс источник \ Идентификатор класса объекта от которого выполняется печатная форма ## Вызов печатных форм Печатные формы могут вызываться: - из операции выборки - [из запроса к сервису печати](../080_addition/140_сервисы_сервера.md#сервис-отчётов) - [из rest сервиса](#формирования-файла-с-отчетом) - От произвольного объекта системы - От интерфейса свободные отчеты ### Вызов печатной формы из операции выборки Для вызова отчета из операции выборки используйте функцию `ru.bitec.app.gtk.gl.Reports#createReportEx`: ```scala /** * Выполняет построение отчёта по системному имени отчёта. * * @param reportName Имя отчёта * @param reportVersionDate Дата * @param postBuildAction Действие, которое необходимо произвести после заполнения отчёта * @param propertyMap Карта входящих параметров */ @throws[ApplicationException] def createReportEx(reportName: String, reportVersionDate: Date, postBuildAction: PostBuildAction, propertyMap: Map[String, Any]): Unit ``` Данная функция может быть вызвана только в контексте интерактивной бизнес логики(интерфейса пользователя). Пример: ```scala reports.createReportEx("Mct_OrderSheetMaterials2", null, PostBuildAction.print, Map[String, Any]("IDSRCOBJECT" -> getVar("id").asNLong, "GIDSRCOBJECT" -> getVar("gid").asNString, "SDESIGNATION" -> getVar("sCode").asNString) ) ``` ### Формирования файла с отчетом Для формирования файла с отчетом используйте функцию `ru.bitec.app.rpt.Rpt_Pkg#getReportStreamEx`: ```scala /** * Выполняет построение отчёта по системному имени отчёта. * Если для версии отчета указано несколько доступных для печати форматов, * то будет выдана ошибка построения. * Требуется явно указать формат построения, указав параметр [[Rpt_Pkg.ParamFormatType]] * * @param reportName Имя отчёта * @param reportVersionDate Дата * @param propertyMap Карта входящих параметров * @return InputStream, содержащий результат построения отчёта. ByteArrayInputStream не требует закрытия. */ def getReportStreamEx(reportName: String, reportVersionDate: Date, propertyMap: Map[String, Any]): Option[InputStream] ``` Данная функция может быть вызвана в контексте автономной логики(rest сервиса) ```{attention} В случае если получен поток, его необходимо обязательно закрыть. При формировании файла с отчётом в потоке переменные выборки не доступны. ``` ### Вызов печатной формы от произвольного объекта При открытии карточки любого объекта, выводятся стандартные операции печати по которым можно выполнять вызов печатных форм. Для добавления печатной формы к списку печати для типа объекта: 1. Откройте приложение `Настройка системы` 2. Откройте типы объектов \ Выполните пункт меню `Сущности > Типы объектов > Типы объектов` 3. Перейдите на вкладку `Печатные формы` 4. Добавьте необходимые печатные формы ### Вызов печатной формы в свободных отчетах Свободные отчеты позволяют настроить для пользователя и приложения перечень отчетов, которые можно построить без привязки к каким-либо типам объектов. Для вызова интерфейса построения свободных отчетов: 1. Откройте приложение, в котором есть пункт меню `Отчеты` 2. Откройте свободные отчеты \ Выполните пункт меню `Отчеты > Свободные отчеты` 3. Выберите нужный отчет 4. Заполните параметры 5. Напечатайте отчет \ Для этого выполните операцию `Печать` Для того чтобы ПФ могла быть вызвана из свободных отчетов: 1. Откройте приложение `Настройки системы` 2. Откройте печатные формы \ Пункт меню `Отчеты > Печатные формы` 3. Выберете требуемую печатную форму 4. Включите признак `Свободный отчет` 5. Настройте параметры отчета 6. Укажите приложение для печати 7. Укажите требуемые роли ```{note} Если роли не указаны, печатная форма будет доступна всем пользователям ``` ## Создание печатной формы 1. Откройте приложение `Настройки системы` 2. Откройте печатные формы \ Пункт меню `Отчеты > Печатные формы` 3. Выполните операцию `Создать` 4. Заполните `Системное имя`, `Наименование`, `Модуль` 5. Создайте версию печатной формы 6. Выберете тип шаблона 7. Загрузите файл шаблона выбранного типа \ Для этого выполните операцию `Загрузить файл в базу` ## Настройки вставки изображений в печатную форму типа docx Данная настройка производится в коллекции к печатной форме. Все поля данной коллекции обязательны для заполнения. - `Активность`\ Данное поле отвечает будет ли вставленные изображения в печатную форму - `Шаблон(Тег)`\ Определяет тег по которому будет вставлено изображение. Тег должен содержаться в печатной форме иначе изображение не будет вставлено. Существует два вида тегов: - `Общий`\ Общий тег не имеет динамической части и изображение будет вставлено при нахождении данного тега в документе. - Пример: - В поле: SomeTag - В документе: [SomeTag] - `Подпись`\ Тег для подписи состоит из двух частей: общая часть для всех тегов, которые задаётся в данном поле, и имя пользователя подпись которого необходимо вставить в данный документ - Пример: - В поле: SomeSignTag - В документе(с динамической частью): [SomeSignTagAdmin] - `Печатная форма изображения`\ В поле указывается печатная форма с типом jasper и форматом png. В зависимости от типа изображения данный печатной форме будут переданы следующие аргументы: - `Подпись` - "PSDATE" - дата подписания документа - "PSSERNUMBER" - № сертификата подписи - "PSDBEGIN" - дата начала действия подписи - "PSDENG" - дата окончания действия подписи - "PSFIO" - ФИО сотрудника подписавшего документ - "IDDOC" - id документа - "IDDOCVER" - id версии документа(если документ версионный то подписывается именно версия а не сам документ) - "JOBJ" - json объект подписи документа - `Общий` - "IDDOC" - id документа - "IDDOCVER" - id версии документа(если документ версионный то подписывается именно версия а не сам документ) - `Масштаб` и `Разрешение`\ Размер изображения высчитывается по формуле: Масштаб *= Measures.DOTS_PER_INCH / Разрешение - `Тип`\ В поле указывается тип изображения: - `Общий`\ Изображение вставляется при печати в любом случае - `Подпись`\ Изображение вставляется если на документе есть хотя бы одна подпись ## Вставка изображений в печатную форму docx Для вставки изображений в печатную форму типа docx должны быть выполнены следующие условия: 1. Печатная форма должна содержать теги вида [SomeTag] 2. Тип шаблона печатной формы - docx 3. Формат печатной формы - pdf 4. В коллекции к печатной форме(Настройки вставки изображений в печатную форму) настроены необходимые изображения для вставки Если все требования выполнены корректно, то при печати такой печатной формы будет получен pdf файл с изображениями на месте тегов.