Как мы сделали веб-аналог Jaspersoft Studio (и зачем вообще это понадобилось)

от автора

Привет! На связи Анатолий Тлупов и Дмитрий Потапов, разработчики Platform V One Report — low-code инструмента генерации документов корпоративной отчетности. В Сбере он используется для визуального проектирования шаблонов, централизованного управления и массовой генерации печатных форм. Расскажем, как и почему мы написали собственный браузерный редактор печатных форм, и как он помог разработчикам и аналитикам быстро и самостоятельно создавать сложные отчёты.

Полная схема решения Platform V One Report: слева – Report Designer для разработчиков и аналитиков, в центре движок Print, справа – системы, которые получают готовые документы

Полная схема решения Platform V One Report: слева – Report Designer для разработчиков и аналитиков, в центре движок Print, справа – системы, которые получают готовые документы

Введение: когда масштаб делает боль системной

Представьте сотни уникальных шаблонов строгой отчётности — от актов выполненных работ до счетов-фактур, — которые являются неотъемлемой частью работы одного из крупнейших банков страны. Каждый шаблон — JRXML-файл, каждый файл — чья-то зона ответственности.

Инструментом для создания этих шаблонов долгое время был Jaspersoft Studio. Зрелое, мощное решение с двадцатилетней историей, но не без особенностей. Мы достаточно хорошо изучили Jaspersoft, чтобы понять: в команде он нередко становится источником системных проблем, которые невозможно решить одними лишь инструкциями. Вот немногие из этих трудностей:

Высокий порог входа. Studio — это Eclipse-плагин. Он влечёт за собой всю сложность IDE: панели, перспективы, вложенные конфигурации. Разработчик без опыта тратил неделю на первый рабочий шаблон, а аналитик или внедренец без специального обучения и вовсе не мог с ним справиться.

Проблема локального окружения. «У меня работало» — это не баг, а архитектурное свойство десктопного инструмента. Типичная ситуация: шаблон работает на машине разработчика, но почему-то не работает у коллеги. А все, потому что разные версии Studio, разные JDK, разные системные шрифты, разные пути к ресурсам…Инструкции по настройке среды, скринкасты — мы перепробовали все, но глобально ничего из этого не помогало. 

Зависимость от узкого специалиста. Один-два человека, которые знали Studio достаточно глубоко, становились узким местом. Все нетривиальные шаблоны шли через них.

Когда внешние обстоятельства ставят точку

Пока мы решали повседневные задачи, к началу 2024 года перед нами встал новый, уже стратегический вопрос. Jaspersoft Studio — продукт компании TIBCO, американского вендора. В условиях курса на импортозамещение и с учётом санкционных рисков строить ключевые процессы на иностранном коммерческом продукте было рискованно с точки зрения доступа к обновлениям и лицензиям.

Одновременно вендор объявил: начиная с седьмой версии Studio меняется архитектура, open source-ветка закрывается. Совместимость шаблонов между шестой и седьмой версиями под вопросом. Всё, что накоплено за годы, придётся проверять заново.

Тогда мы задались другим вопросом: «А сможем ли мы работать без Studio вообще?» Studio — это только оболочка. Движок, который компилирует и генерирует документы — open source JasperReports, и он никуда не делся. Ответ казался логичным: нужно написать новую оболочку — браузерную и без иностранных коммерческих зависимостей.

Три требования, которые определили архитектуру

Задача звучала просто: «чтобы можно было открыть браузер и сразу работать». Но за внешней простотой стояли как минимум три жёстких требования: 

Никакой установки. И как следствие — никакой проблемы локального окружения. Браузер у всех одинаковый, версия инструмента одна, среда и шрифты тоже. 

Полная обратная совместимость с JRXML. Мы не могли предложить команде переписать сотни существующих шаблонов. Шаблоны из Jaspersoft Studio должны были открываться без конвертации, иначе вся идея не работала.

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

Из этих трёх ограничений выросла архитектура из двух независимых компонентов:

  • Print — бэкенд-сервис генерации документов. Внутри тот же JasperReports. Принимает JRXML-шаблон и JSON с данными, отдаёт документ в нужном формате: PDF, DOCX, XLSX, RTF, HTML, PNG, PPTX. Взаимодействие через REST API, аутентификация OAuth 2.0, авторизация OPA. Никаких новых зависимостей в генераторе — тот же движок, просто за REST-интерфейсом.

  • Report Designer — браузерный WYSIWYG-редактор, который генерирует JRXML. Пользователь работает визуально, редактор под капотом генерирует корректный XML. Preview — это реальный вызов Print-сервиса с теми же данными и той же средой, что и в эксплуатации.

Рабочее пространство Report Designer (Дизайнера отчётов) в браузере

Рабочее пространство Report Designer (Дизайнера отчётов) в браузере

Как мы упростили три самых болезненных сценария

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

Изображения: от параметра до трёх кликов

В Studio процесс добавления логотипа в шапку отчёта выглядит так: 

  • положить файл в правильную папку;

  • объявить в шаблоне параметр $P{IMAGES_DIR};

  • убедиться, что генератор получает этот параметр с нужным значением;

  • добавить null-проверку на случай отсутствия файла;

  • синхронизировать структуру папок со всеми коллегами. 

Если у пользователя другой путь, то картинка в итоговом документе просто будет отсутствовать.

В Report Designer нужно сделать всего три шага: 

  • перетащить компонент изображения на холст;

  • кликнуть по заглушке;

  • выбрать файл. 

Изображение хранится как base64 внутри JRXML-файла. Никаких путей, параметров и зависимостей от файловой системы.

Логотип встраивается в шаблон за три действия

Логотип встраивается в шаблон за три действия

Работа с данными: JSON-редактор вместо JDBC

Чтобы протестировать в Studio шаблон, нужна живая база данных: создать DataSource, настроить JDBC, написать SQL, обработать null. Без локальной базы нормальная отладка была невозможна.

В Report Designer источник данных — JSON. Добавляете в шаблон поле $F{actNumber} — редактор автоматически добавляет его в схему. Открываете «Редактор данных», вставляете тестовые значения, нажимаете «Применить» — и можно идти в Preview. Данные сохраняются в файл и загружаются в следующих сессиях.

На скриншоте показан реальный JSON для шаблона акта выполненных работ: параметры документа (номер акта, дата, ФИО провайдера, адрес клиента) и наборы данных для двух таблиц оборудования.

Тестовые данные — JSON в браузере, без баз данных и JDBC—соединений

Тестовые данные — JSON в браузере, без баз данных и JDBC—соединений

Таблицы: два уровня вместо семи

Таблица в Studio — это компонент Table, отдельный subdataset, параметры привязки между основным датасетом и subdataset, выражения передачи данных, band-секции для заголовка, строки и итогов. Семь и более уровней вложенности в XML — новые пользователи смотрели на это, закрывали файл и уходили плакать. 

В Report Designer всё опять-таки укладывается в три шага: перетащить компонент таблицы, добавить колонки, указать поля из источника данных. Subdataset создаётся автоматически. На скриншоте — тот же акт с двумя таблицами (оборудование и ЗИП): видна структура бэндов, справа — дерево наборов данных с полями installedEquipmentName и installedEquipmentSerial.

Таблица с автоматически созданным subdataset: два уровня вместо семи

Таблица с автоматически созданным subdataset: два уровня вместо семи

Preview = эксплуатация

В Studio между Preview и финальным документом есть различия: разные шрифты, разные пути к ресурсам, разное поведение компилятора на разных машинах. Документ, который выглядел красиво и стройно на локальной машине, на стенде легко мог разъехаться.

В Report Designer Preview вызывает тот же Print-сервис с теми же шрифтами и той же средой, поэтому результат в браузере идентичен финальному документу. На скриншоте ниже — реальный акт выполненных работ ИТ-оборудования, отрендеренный прямо в браузере.

Preview вызывает тот же Print—сервис, что и продакшн — результат идентичен

Preview вызывает тот же Print—сервис, что и продакшн — результат идентичен

Результаты

Вот четыре примера из практики.

Адаптация сократилась с недели до двух часов. Разработчик без опыта работы с JasperReports делает первый рабочий шаблон за один сеанс: открыл ссылку, перетащил компоненты, подключил JSON с тестовыми данными, нажал Preview, получил PDF. Всё это без установки и сложной настройки среды.

Исчез класс проблем «тут у меня работало, а там съехало». Единая среда для всех — разночтений между локальной машиной и стендом больше нет.

Аналитик создаёт типовой шаблон в три раза быстрее, чем разработчик создавал в Studio. Ускорение создания накладных, актов, счетов-фактур особенно заметно для людей без опыта в JasperReports.

Аналитики и внедренцы перестали зависеть от специалиста по JasperReports. Порог входа снизился благодаря инструменту, а не дополнительному обучению.

Что пока не закрыто

Report Designer — не универсальная замена Studio во всех сценариях. Стандартный корпоративный документооборот — плоские и двухуровневые таблицы, документы с изображениями и группировками — инструмент закрывает уверенно. Сложные кросс-таблицы с многоуровневыми группировками и нестандартными агрегациями пока на стороне Studio. Этот пробел планируем закрыть в следующих релизах.

Как попробовать

Report Designer доступен как SaaS, без установки, с документацией на русском. Существующие шаблоны из Jaspersoft Studio открываются через «Файл → Открыть» без конвертации.

Мы не стали переизобретать JasperReports: в основе остался тот же надёжный движок и знакомый JRXML. Зато удалось убрать то, что мешало работе: локальную привязку среды, иностранную коммерческую лицензию и высокий барьер входа для нетехнических участников команды. В результате получили веб-редактор, одинаковый для всех, который делает задачу создания шаблонов, доступной для любого бизнес-аналитика. 

А как вы генерируете отчёты в своих проектах? Используете JasperReports, что-то другое, или обходитесь своей генерацией? Напишите в комментариях, будет интересно сравнить подходы.

ссылка на оригинал статьи https://habr.com/ru/articles/1067798/