Всем привет! В этой статье мы хотим рассказать о том, каким образом мы в платформе "Юнидата" формируем отчетность. Любая работа с данными неизбежно ведет к построению специализированных отчетов, в которых пользователи могут эффективно эти данные обрабатывать и принимать на их основе бизнес-решения. Создавать модуль построения отчетов в платформе – задача нетривиальная и дорогостоящая, поэтому возникла необходимость поиска подходящего инструментария для построения отчетов. Главными нашими критериями были: Бесплатное использование ПО в коммерческих проектах с открытым исходным кодом Инструмент для построения данных должен работать с основными форматами источников данных, а так же напрямую БД. Использование языка Java для построения отчетов ПО должно быть поддерживаемым и обновляемым c поддержкой обратной совместимости Редактор построения отчетов должен быть удобным и понятным Инструмент должен позволять создавать шаблоны отчетов всех основных форматов: excel, csv, pdf, html, и т.д Богатые возможности визуализации и построения дашбордов. Мы провели исследование части наиболее известных open-source систем построения отчетов, и результаты нашего исследование мы собрали в таблицу, которой хотим поделиться. Наименование Производитель Лицензия Возможности и достоинства Недостатки BIRT The Business Intelligence and Reporting Tools (BIRT) Eclipse Foundation Eclipse Public License Последняя версия 4.5.0 (Июнь 24, 2015) т.е. проект живой; Есть визуальный редактор отчетов в среде разработки Eclipse IDE; Сконструированные отчеты BIRT сохраняются в XML и имеют доступ к целому ряду различных источников данных, включая хранилище данных JDO, JFire, Plain Old Java Object, SQL, database, Web Service и XML; Содержит технологию построения графиков, которая полностью интегрирована в дизайнер отчетов и может использоваться автономно для интеграции графиков в приложение; Много документации; Сырой и неудобный редактор; Ставится отдельным web-приложением; Для использования необходим Eclipse; Отчеты, созданные в разных версиях несовместимы; JasperReports Jaspersoft GNU Lesser General Public License Последняя версия 6.2.2 (6 мая 2016 года)отчёты могут выводиться на экран, принтер, либо в форматы PDF, RTF,HTML, XLS, CSV и XML; Использование динамических языков JavaScript и Groovy при реализации логики отчета; Реализация диаграмм (charts) на основе библиотеки JFreeChart; Реализация подотчётов (subreports) с неограниченной глубиной вложенности; Реализация кросстаблиц (crosstabs);  Pentaho Reporting JFreeReport  Project Corporation Pentaho Community Edition (CE): Apache version 2.x; Pentaho Enterprise Edition (EE): Commercial License Гибкое позиционирование элементов дашборда на макете; Развитые инструменты визуализации отчетов; Возможность вывода отчетов в форматах HTML, Excel, csv, xml,  PDF, текстовых форматах; Мало информации о применении; Все основные фичи реализованы в коммерческой версии от Hitachi Group Company; YARG CUBA Apache 2.0 License Генерировать отчет в формате шаблона или конвертировать результат в PDF; Создавать шаблоны отчетов в привычных и распространенных форматах: DOC, ODT, XLS, DOCX,XLSX, HTML; Создавать сложные XLS и XLSX шаблоны: с вложенными областями данных, графиками, формулами и т.д.; Использовать в отчетах изображения и HTML-разметку; Хранить структуру отчетов в формате XML; Запускать standalone приложение для генерации отчетов, что делает возможным использование библиотеки вне Java-экосистемы (например для генерации отчетов в PHP); Интегрироваться с IoC-фреймворками (Spring, Guice). Нет внятного редактора; Есть UI, который предоставляет платформа CUBA; Как видно из нашего небольшого исследования, наиболее подходящим инструментом для нас стал JasperReports.  В пользу этого open-source инструмента говорит наличие весьма удобного визуального редактора проектирования  отчетов, богатого набора визуализаций, включая кросстаблицы, а самое главное - наличие REST API. Проектирование макетов отчетов в JasperReports не требует особых глубоких знаний, а результаты проекта сохраняются в xml-формат. Так же мы ориентируемся на опыт коллег, например, наши партнеры КРОК в своей статье https://habr.com/ru/company/croc/blog/244085/  рекомендуют использовать Jasper. «JasperSoft наибольшим образом подходит для построения фиксированной отчетности. Интересны любой компании, которой необходимы инструменты анализа данных». Конечно, у jasper есть определенные проблемы, когда требуется сделать гибкий шаблон, например, когда необходимо сделать гибкий вывод полей в таблице, но в нашей практике мы сталкиваемся как правило с фиксированными отчетами, которые обозначает заказчик. Мы полагаем, что может быть интересным то, как именно мы встраиваем jasper отчеты непосредственно в платформу без лишних запросов к Jasper Server. JasperReports Server –  это основной компонент системы. Его задача - хранить отчеты, которые будут встраиваться в платформу, а так же предоставлять возможность просмотра отчетов напрямую через специальный интерфейс. Вот пример как это выглядит в платформе При построении отчетов наша задача состоит в том, чтобы получить от пользователя параметры отчета, собрать на основе переданных параметров данные из источников, построить визуализацию данных, и готовую визуализацию данных интегрировать в виде iframe на интерфейс или выгрузить в файл. Описание данного механизма представлена ниже на схеме. Для того, чтобы получить отчет необходима авторизация в Jasper Server. Авторизация происходит путем передачи пары логин/пароль, а в ответ Jasper создает сессию и сохраняет session_id в куках. В обычном случае для того, чтобы напрямую взаимодействовать с JasperServer из JavaScript, нам необходимо авторизоваться, получить session_id из куки и запросить сам отчет. Однако на практике мы столкнулись с проблемой, что в случае использования кластера серверов с дублированием Jasper на всех инстансах, jasper отчеты то доступны, то недоступны для пользователя.  Проблема заключается в том, что балансировщик, получив запрос от клиента, запрашивает ответ с разных JasperServer, но использует session_id только одного инстанса . То есть мы авторизовались в  JasperServer на первом инстансе,  получили от него session_id, затем c этим же session_id мы идем на другой инстанс и получаем ошибку доступа «с сообщением «Авторизуйтесь на JasperServer». Для решения этой задачи мы используем специальный проксировщик, который по сути является расширением бэкэнда платформы и устанавливается на все ноды кластера. Так как проксировщик установлен на том же сервере, что и Jasper server, ему нет необходимости обращаться по IP к ноде, а достаточно обратиться по localhost. Таким образом, балансировщик, передавая запрос от клиента на ту или иную ноду,  запрашивает у проксировщика авторизацию уже на месте и гарантировано Jasper Server вернет ответ. Ниже представлен код проксировщика. Проксировщик получает на вход некий URL отчета, который собирается из параметров на клиенте. По этому URL происходит авторизация в jasperServer, далее проксировщик достает из куки session_id и уже по нему запрашивает ответ непосредственно самого отчета. Ответ от jasper приходит виде html-страницы. Именно эту html-страницу мы передаем в iframe для отрисовки на клиенте, а не url, как это обычно бывает. Таким образом мы один раз запрашиваем отчет, далее вся работа с ним идет уже непосредственно на клиенте платформы. Создаем Iframe Подкладываем html страницу от Jasper Server  generateReportUrl - метод, который генерирует URL с нужными параметрами для отчета и session_id. Далее поговорим про непосредственно создание отчетов и дашбордов в Jasper. Создание  jasper отчета состоит из набора визуализаций, скомпонованных на едином макете: Для создания макета отчета мы используем визуальный редактор JasperSoft Studio, который может быть отдельным приложением или плагином для eclipse. Подробнее об этом инструменте можно легко найти информацию в документации и открытых источниках, Нам же важно выделить то, что в данном редакторе достаточно легко можно построить дашборд, а сам редактор достаточно удобен и понятен. Достаточно выбрать нужные визуализации, перетащить их на макет, заполнить параметры и функциональные элементы. Построение дашбордов не требует навыков программирования и каждый может разобраться с ними в достаточно короткое время. Ниже пример простого отчета в JasperStudio. После того, как создали макет отчета, переходим к построению логики самого отчета. Jasper отчет представляет xml-файл в специальном формате jrxml. Структура jrxml файла условно можно поделить на три части: в первой части определяются параметры отчета, во второй части пишется запрос к данным, в третьей части описываются функциональные блоки макета, в которых происходит обработка результатов запроса и отображение данных в макете. Начало структуры файла: пример параметров отчета Далее предположим, что источником данных является во второй части после параметров пишем SQL-запрос Стоит обратить внимание, что в запросе мы используем параметры $P{date_to_param}, которые динамически приходят от клиента, что так же является фишкой Jasper. Далее описывается тело всего отчета по функциональным разделам. Подробнее о описании всех разделов можно найти в документации. Ниже пример как это может выглядеть Отдельно стоит отметить еще одну полезную функцию Jasper отчетов - это наличие подотчетов. В случае, когда мы хотим переиспользовать какой-либо отчет в другом отчете с тем же параметрами, нам не нужно писать с нуля, а достаточно обраться к готовому отчету по его идентификатору, передав новые значения параметров Ключевым вопросом в построении отчета является передача параметров (фильтров) отчета от клиента на сервер.   Для того, чтобы не отправлять пользователя на JasperServer и все параметры отчета заполнять в платформе удобным способом, Jasper предлагает использовать собственный REST API. Наличие такого мощного API было решающим аргументом в сторону выбора JasperSoft  для автоматизации отчетности. Вместо того, чтобы создавать ресурсы и заполнять параметры в среде Jasper Server мы просто воспользуемся методами, которое предоставляет нам API и передадим параметры GET-запросом от клиента. API jasper позволяет не только параметризировать данные, используемые в отчетах, но и сами отчеты, что позволяет очень гибко отображать нужные дашборды Резюмируя все выше описанное мы рекомендуем к использованию JasperSoft когда есть потребность в создании гибких отчетов согласно шаблонам заказчика. Для этого Jasper предоставляет весь необходимый инструментарий, а работать в ним достаточно просто и удобно.