# Отчет с дополнительными полями (примеры скриптов) **Category:** [Отчеты](https://community.tezis-doc.ru/c/otchety/64) **Created:** 2024-07-03 13:15 UTC **Views:** 591 **Replies:** 0 **URL:** https://community.tezis-doc.ru/t/otchet-s-dopolnitelnymi-polyami-primery-skriptov/311 --- ## Post #1 by @d.slepnev Из-за специфики реализации хранения дополнительных полей в системе не имеется возможности вывести их в печатную форму посредством мастера конструктора отчета. Однако вывести данные поля возможно с помощью запросов на sql\jpql или скриптом groovy. Ниже представлены примеры работы с дополнительными полями. В виде документа добавлено три поля: ![image|690x381](upload://65x4rzzwbBjXSwxEjs12M5SUofo.png) Каждому полю присвоен уникальный код для однозначной идентификации поля в таблице SYS_ATTR_VALUE #### Способ первый – запрос sql. ![image|690x386](upload://5rYKVwh8g8FAl3KnDivsz2QGu5L.png) **запрос sql** ``` select max(case when t.code='txt' then t.STRING_VALUE else null end) as txtv, max(case when (t.code='boolean' and t.BOOLEAN_VALUE = true) then 'Да' when (t.code='boolean' and t.BOOLEAN_VALUE =false) then 'Нет' else null end) as boolv, max(case when t.code='int' then t.integer_value else null end) as intv from ( select v.code,v.integer_value,v.STRING_VALUE, v.BOOLEAN_VALUE from df_doc d join sys_attr_value v on d.card_id=v.entity_id where v.entity_id=${entity} ) t --txt, boolean, int - коды доп.полей вида документа ``` Вложенный SELECT позволяет нам выбрать из таблицы SYS_ATTR_VALUE все строки значений всех доп.полей для текущей карточки ${entity}. С помощью функции MAX и условия CASE мы отбираем нужные нам значения и помещаем их в алиасы для шаблона печатной формы. Описание таблицы SYS_ATTR_VALUE можно посмотреть в модели данных системы. В шаблоне печатной формы обращаемся к полученным данным как обычно - ${имя_полосы.имя_параметра} ![image|545x491](upload://j1c5XWHunBidjX5roZcCxEJ8dHR.png) #### Способ второй – запрос jpql В данном случае потребуется для каждого доп.поля определить свой набор данных. Для удобства каждый набор назовите кодом доп.поля. Сами запросы будут уже обращаться к сущности sys$CategoryAttributeValue. Ее описание так же можно посмотреть в модели данных. ![image|690x388](upload://i0qKYpHYmDl5CdmFdsFOXUliA1Y.png) jpqlBOOLEAN ``` select t.booleanValue as boolv from sys$CategoryAttributeValue t where t.entityId=${entity} and t.code ='boolean' ``` jpqlTXT ``` select t.stringValue as txtv from sys$CategoryAttributeValue t where t.entityId=${entity} and t.code ='txt' and t.stringValue is not null ``` jpqlINT ``` select t.intValue as intv from sys$CategoryAttributeValue t where t.entityId=${entity} and t.code ='int' ``` В шаблоне печатной формы обращаемся к полученным данным как обычно - ${имя_полосы.имя_параметра} ![image|540x383](upload://uyOxaebhhceuY4YcZZQcunbyPc1.png) #### Способ третий – скрипт groovy При наличии навыков написания скриптов groovy для отчетов этот способ будет наиболее гибким. В начале потребуется загрузить через *LoadContext* данные из БД о текущем документе. При загрузке обязательно выставить *ctx.setLoadDynamicAttributes(true)* – этот флаг говорит загрузчику, что требуется кроме стандартных данных о документе загрузить так же связанные данные из *sys$CategoryAttributeValue* После этого возможно обращаться к доп полям как к системным через метод *d.getValue(‘+код_поля’)* *ВНИМАНИЕ: рекомендуется проверять на заполненность поля, чтобы обрабатывать вывод пустых значений. Кроме того может понадобиться явное приведение типов.* ``` import com.haulmont.cuba.core.global.AppBeansimport com.haulmont.cuba.core.global.DataManager import com.haulmont.cuba.core.global.LoadContext import com.haulmont.thesis.core.entity.Doc import com.haulmont.thesis.core.entity.SimpleDoc import java.text.SimpleDateFormat SimpleDateFormat sdf = new SimpleDateFormat('dd.MM.yyyy HH:mm') DataManager dataManager = AppBeans.get(DataManager.NAME) LoadContext ctx List> result = [] //контейнер для пар ключ-значение для вывода в печатную форму Doc entity = (Doc) params.get("entity"); //загружаем документ из параметра отчета ctx = new LoadContext(SimpleDoc.class) ctx.setUseSecurityConstraints(false) .setView("browse") .setQueryString("select d from df\$SimpleDoc d where d.id = :entityId") .setParameter("entityId", entity) //выгружаем из базы данных информацию по документу ctx.setLoadDynamicAttributes(true); //флаг загрузки связанных с документом доп.полей SimpleDoc d = dataManager.load(ctx) def dataInfo =[ 'txtv' : d.getValue('+txt') ? d.getValue('+txt'): "", //обязательно проверять на null. Если поле пустое, то выводить на печать пустую строку 'boolv' : d.getValue('+boolean'), 'intv' : d.getValue('+int') ] result.add(dataInfo) return result ``` В шаблоне печатной формы обращаемся к полученным данным как обычно - ${имя_полосы.имя_параметра} ![image|538x383](upload://vKS9FJQVkg22opvdnNCZDQ12zhM.png) Ниже скриншот результата вывода тестового отчета. ![image|447x500](upload://iyP8XRJkT1Qny6Fe6gMo0yGkBeo.png) --- **Canonical:** https://community.tezis-doc.ru/t/otchet-s-dopolnitelnymi-polyami-primery-skriptov/311 **Original content:** https://community.tezis-doc.ru/t/otchet-s-dopolnitelnymi-polyami-primery-skriptov/311