Формулы и поля
Формулы в редакторе EasyJasper
Статья описывает формулы, которые поддерживает текущая версия редактора EasyJasper. Под «поддерживает» понимается сразу два условия:
- формула разрешена безопасным parser'ом Jasper Worker и может попасть в компиляцию/экспорт;
- формула распознаётся предпросмотром редактора и показывает результат в 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, круглые скобки и следующие операторы:
- арифметические:
+,-,*,/,%; - сравнения:
==,!=,<,<=,>,>=; - логические:
&&,||,!; - условный оператор:
условие ? значение1 : значение2.
+ складывает числа, а если один из операндов является строкой — объединяет строки.
"Артикул: " + $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-файлов.
Ограничения предпросмотра и экспорта
Предпросмотр поддерживает перечисленные ссылки, операторы, строки, даты, числа, математические функции и фиксированные часовые пояса.