Интерфейс, печатные формы и JEXL#
Выборки и отображения#
Выборка должна иметь понятное назначение и быть связана с классом, если она отображает данные конкретной сущности.
Если выборка связана с классом, универсальный фильтр и другие механизмы могут использовать метаданные класса:
атрибуты класса;
характеристики;
коллекции;
технические атрибуты.
Атрибуты выборки сопоставляются с атрибутами класса по системному имени. Поэтому имена атрибутов в выборке должны соответствовать именам атрибутов класса, если они представляют одно и то же поле.
Проектные выборки и отображения должны иметь проектные системные имена или размещаться в проектном модуле так, чтобы их можно было отличить от типовых.
Вычисляемые поля#
Вычисляемые поля в выборке допустимы, если значение требуется только для отображения или фильтрации в конкретном интерфейсном сценарии.
Если вычисляемое поле начинает использоваться в нескольких процессах, отчетах или интеграциях, необходимо рассмотреть перенос логики в Api, Pkg или модель данных.
Не следует размещать в вычисляемом поле сложную бизнес-логику, которую нужно переиспользовать в нескольких местах.
Универсальный фильтр#
При добавлении проектных атрибутов нужно учитывать, как они попадут в универсальный фильтр.
Для класса в универсальный фильтр формируются:
атрибуты класса;
объектные характеристики;
универсальные характеристики;
коллекции;
технические атрибуты.
Если атрибут не должен быть доступен в универсальном фильтре, это нужно явно отключить в ODM.
<attr name="bError">
<uniFilter isActive="false"/>
</attr>
Если нужно добавить в фильтр логически ссылочный или раскрываемый атрибут, который физически не является ссылкой в БД, необходимо использовать поддерживаемые точки расширения фильтра, а не обходные решения в интерфейсе.
Печатные формы#
Печатная форма — это способ построения отчета в виде файла заданного формата.
Печатные формы следует подключать к типу объекта через настройки, если печатная форма должна быть доступна пользователю из интерфейса.
Печатная форма должна иметь:
системное имя по правилам проектного именования;
пользовательское наименование;
модуль;
тип шаблона;
версию шаблона;
настройки доступности;
роли или профили доступа, если форма не должна быть доступна всем пользователям;
условия формирования, если доступность зависит от состояния или данных объекта.
Выбор типа шаблона#
Тип шаблона выбирается по назначению формы:
Тип |
Когда использовать |
|---|---|
Jasper |
сложные отчеты, несколько форматов вывода, сложная структура данных |
Xlsx |
табличные формы, расчетные таблицы, выгрузки в форматах |
Docx |
текстовые документы, договоры, акты, письма, шаблоны с текстовой структурой |
Не следует выбирать тип шаблона только по привычке. Нужно учитывать формат итогового документа, сложность данных и требования к сопровождению.
Версионирование печатных форм#
Изменение шаблона печатной формы должно оформляться новой версией.
В версии печатной формы необходимо фиксировать:
дату изменения;
причину изменения;
автора;
задачу или основание;
совместимость с текущей версией проектного модуля.
Если печатная форма используется в регламентированном процессе, изменение шаблона должно проходить проверку с реальными сценариями формирования.
JEXL-скрипты#
JEXL-скрипт должен быть коротким, понятным и привязанным к конкретному месту применения.
Для JEXL-скрипта необходимо фиксировать:
название;
описание;
место применения;
тип JEXL;
текст скрипта;
задачу или основание изменения.
Если JEXL вызывает Scala-метод, в описании нужно указать этот метод и его назначение.
Ограничения по JEXL#
В JEXL не следует размещать:
длинные алгоритмы;
массовую обработку данных;
сложные SQL-запросы;
повторяющуюся логику;
критичную бизнес-логику, которую необходимо покрывать тестами на уровне кода.
Если JEXL-скрипт становится большим или начинает дублироваться в нескольких местах, логику необходимо перенести в Scala-код, а в JEXL оставить только вызов подготовленного метода.
Доступность интерфейсных элементов#
Если доступность вкладки, операции, печатной формы или поля зависит от состояния объекта, роли пользователя или значения атрибута, условие должно быть описано в настройке или JEXL-скрипте.
Не следует реализовывать скрытие или блокировку интерфейсных элементов только в клиентской логике, если это влияет на права пользователя или безопасность данных. В таких случаях дополнительно должны быть проверены права и серверная логика.