Формулы и поля

Формулы в редакторе EasyJasper

Статья описывает формулы, которые поддерживает текущая версия редактора EasyJasper. Под «поддерживает» понимается сразу два условия:

  1. формула разрешена безопасным parser'ом Jasper Worker и может попасть в компиляцию/экспорт;
  2. формула распознаётся предпросмотром редактора и показывает результат в UI.

Редактор хранит формулу в JRXML. Поле «Формула» позволяет вводить выражение вручную, но произвольный Java-код не разрешён: неизвестная конструкция блокируется, а в предпросмотре отображается сообщение «Предпросмотр этого выражения не поддерживается.»

Ссылки на данные

Поддерживаются три вида ссылок:

СинтаксисНазначениеПример
$F{name}поле отчёта$F{article}
$P{name}параметр отчёта$P{expiryDate}
$V{name}переменная отчёта$V{REPORT_COUNT}

Имена могут содержать латинские буквы, цифры, _, . и -. Если значение отсутствует, оно рассматривается как null.

Пример вывода поля с заменой пустого значения:

($F{country} == null) ? "Не указано" : $F{country}

При $F{country} = "Россия" результатом будет Россия, а при null — Не указано.

Литералы, операторы и условия

Разрешены строковые литералы в двойных кавычках, целые и десятичные числа, true, false, null, круглые скобки и следующие операторы:

+ складывает числа, а если один из операндов является строкой — объединяет строки.

"Артикул: " + $F{article}
$F{price} > 0 ? "В наличии" : "Нет цены"
$F{country} == null || !$F{country}.equals("Россия")

Последнее выражение особенно удобно в printWhenExpression: оно возвращает true или false и управляет видимостью элемента.

Строковые операции

Для строк поддерживаются следующие методы:

МетодПримерРезультат для значения " ab-123 "
length()$F{code}.length()8
isEmpty()$F{code}.isEmpty()false
trim()$F{code}.trim()"ab-123"
toUpperCase()$F{code}.toUpperCase()" AB-123 "
toLowerCase()$F{code}.toLowerCase()" ab-123 "
toString()$F{code}.toString()строковое значение
startsWith(...)$F{code}.startsWith(" ab")true
contains(...)$F{code}.contains("123")true
endsWith(...)$F{code}.endsWith(" ")true
equals(...)$F{code}.equals("ab-123")false
substring(...)$F{code}.substring(2, 8)"ab-123"
replace(...)$F{code}.replace("-", " ")" ab 123 "
replaceAll(...)$F{code}.replaceAll("-", " ")" ab 123 "

Методы можно объединять в цепочки:

$F{name}.trim().toUpperCase().contains("ГОСТ")

Для ограничения длины текста используется условие:

($F{model} == null) ? "--" :
($F{model}.length() <= 30 ? $F{model} : $F{model}.substring(0, 29))

replaceAll в безопасном режиме принимает только строковые литералы длиной до 256 символов. Регулярные выражения, динамические patterns и replacement с $ или \\ запрещены. Для обычной буквальной замены предпочтительнее replace.

Готовые формулы каталога полей

При добавлении обычного текстового поля из каталога редактор создаёт выражение:

($F{name} == null) ? "--" : $F{name}

Такая схема используется для большинства полей: cis, gtin, name, color, brand, country, address, полей одежды и обуви.

Поле «Артикул» и поле «Модель / артикул» используют очистку служебных префиксов:

(($F{model}.replaceAll("Модель / Артикул ", ""))
 .replaceAll("Артикул ", ""))
 .replaceAll("Модель ", "")

Для значения Модель / Артикул EJ-TEST-001 результатом будет EJ-TEST-001.

Встроенные barcode-формулы каталога:

// Data Matrix
$F{dataMatrix}
// Code 128 с резервным значением
($F{code} == null) ? "01234567890123456789" : $F{code}
// EAN-13 из GTIN-14
($F{gtin} == null || $F{gtin}.length() != 14 || !$F{gtin}.startsWith("0"))
    ? null
    : $F{gtin}.substring(1, 13)

EAN-13 требует GTIN из 14 цифр, начинающийся с 0. Формула передаёт в barcode-компонент первые 12 цифр после ведущего нуля; контрольную цифру рассчитывает barcode-компонент.

Форматирование дат

Поддерживается точная конструкция SimpleDateFormat:

new java.text.SimpleDateFormat("dd.MM.yyyy").format($F{productionDate})

Например, ISO-значение 2026-09-25 будет показано как 25.09.2026.

Аргументом может быть одна ссылка $F, $P, $V или текущая дата:

new java.text.SimpleDateFormat("dd.MM.yyyy HH:mm").format($P{expiryDate})
new java.text.SimpleDateFormat("yyMMdd.HHmm").format(new java.util.Date())

Разрешены только токены yyyy, yy, MM, dd, HH, mm, ss и разделители ., :, /, _, -, пробел. Парсинг строк методом parse, календарная арифметика и динамический pattern не поддерживаются.

Для времени в фиксированном часовом поясе поддерживается форма:

java.time.ZonedDateTime.now(java.time.ZoneId.of("GMT+3"))
    .format(java.time.format.DateTimeFormatter.ofPattern("yyMMdd.HHmm"))

Допустимы UTC, GMT и фиксированные смещения от GMT-18:00 до GMT+18:00. IANA-зоны (Europe/Moscow), systemDefault() и вычисляемая зона запрещены.

Числовые формулы

Для вычислений доступны арифметические операторы и DecimalFormat:

new java.text.DecimalFormat("0.00").format($F{price} * $F{quantity}) + " ₽"

При цене 12.5 и количестве 2 результатом будет 25,00 ₽ в локали ru-RU.

Другие примеры:

new java.text.DecimalFormat("0.###").format($F{weight}) + " кг"
new java.text.DecimalFormat("000000").format($V{REPORT_COUNT})

Шаблон DecimalFormat может содержать 0, #, ., ,, %, - и пробел. Валютные символы, научные нотации, динамические паттерны и parse запрещены.

Математические функции

Разрешены только полностью квалифицированные функции java.lang.Math:

java.lang.Math.abs($F{amount})
java.lang.Math.round($F{price})
java.lang.Math.floor($F{weight})
java.lang.Math.ceil($F{weight})
java.lang.Math.min($F{left}, $F{right})
java.lang.Math.max($F{amount}, 0)

Функции можно вкладывать:

java.lang.Math.max(java.lang.Math.abs($F{amount}), 2)

Для $F{amount} = -4.25 результат — 4.25.

Не поддерживаются Math.random(), короткое имя Math, StrictMath и остальные методы Java Math API.

GS1 и составные значения штрихкодов

Строки GS1 можно собирать конкатенацией и форматированием даты:

"01" + $F{gtin}
    + "17" + new java.text.SimpleDateFormat("yyMMdd").format($F{expiryDate})
    + "10" + $F{batch}

При GTIN 04630097825918, датой 2026-09-25 и партией B-7 результат будет:

01046300978259181726092510B-7

Проверка кода GTIN/SSCC, вставка FNC1 и полноценная интерпретация не являются функциями проверки. Их нужно проверять при подготовке данных или специализированным штрихкод-компонентом.

Что не поддерживается

Следующие выражения будут отклонены:

Runtime.getRuntime().exec("id")
System.getenv("PATH")
new java.io.File("/tmp/file")
java.lang.Math.random()
new java.text.SimpleDateFormat($F{pattern}).format($F{date})
new java.text.SimpleDateFormat("dd.MM.yyyy").parse($F{date})
$F{name}.replaceAll($F{pattern}, "")

Причина ограничений — безопасность пользовательских JRXML/Jasper-файлов.

Ограничения предпросмотра и экспорта

Предпросмотр поддерживает перечисленные ссылки, операторы, строки, даты, числа, математические функции и фиксированные часовые пояса.

Подпишитесь на наш Telegram-канал

В нём новости по развитию редактора, промокоды на подписку, а также ответы на ваши вопросы и поддержка.

Перейти в Telegram-канал