Что нового в версии 7.0
Эта статья описывает, чем версия 7.0 отличается от версий 6.x: какие возможности в ней появились и что нужно учесть при переходе на неё. Версия 7.0 ещё не выпущена: статья описывает текущее состояние ветки master и дополняется вместе с ней.
Полный перечень задач, вошедших в релиз, содержится в журнале изменений CHANGELOG.md, который формируется при выпуске релиза в ветке его версии. Изменения, которые могут нарушить работу приложения после обновления, вместе со способами вернуть прежнее поведение описаны в MIGRATION.md.
Переход на версию 7.0
- Клиент и сервер обновляются одновременно: версия API изменилась, и клиент версии 6.x не подключается к серверу версии 7.0.
- Внешний API по умолчанию выключен: параметр работы
enableAPIтеперь равен0(раньше1), поэтому вызовы/exec,/evalи HTTP-вызовы действий отклоняются, пока API не включён глобально или для нужных ролей. Пользователь с доступом к формеSystem.interpreterсохраняет доступ к API. Какие ещё вызовы разрешены и как вернуть прежнее поведение, описано в MIGRATION.md. Multipart-запрос к/evalбольше не связывает свою частьscriptс$1, поэтому клиент, который брал первое значение из$2, снова берёт его из$1(#1930). - Некорректная логика больше не проходит незамеченной: приложение, которое раньше запускалось, может не запуститься или завершиться ошибкой при выполнении, если в нём другая сессия или взаимодействие с пользователем выполняются внутри транзакции (#1726), свойство зависит само от себя, папка верхнего уровня навигатора не имеет
WINDOW,CUSTOMокна либо контейнера задан несогласованно, в спискеTOмножественной формыNEWпропущен или повторён параметр, введённый вWHERE(#1917, #1918), или имена полей двух свойств одной таблицы отличаются только регистром букв (#1946). Сообщения об ошибках и способы отката для каждого случая приведены в MIGRATION.md. - Результаты и планы запросов могут измениться: агрегации, зависящие от порядка, и порядок независимых глобальных событий стали детерминированными, а планировщик чаще использует индексы (см. Планирование запросов и производительность и MIGRATION.md).
- Тип элемента выбора принимается только там, где выбор рисует собственный элемент платформы: форма с
SELECT 'type'(select = 'type'в дизайне) там, где свойство рисует функция отрисовкиCUSTOMили представление React, отклоняется, и сервер не запускается.NOCUSTOMдаёт элемент платформы — то, что в 6.x значилоCUSTOM 'fn' SELECT 'type', где побеждала настройка, заданная последней, — а без типа выбор остаётся функции отрисовки или представлению. - Удалены встроенные модули JKanban, FrappeGantt, Chart и Carousel (#1739), свойства дизайна
showGroup,changeKeyPriorityиchangeMousePriority, а также параметры работы, которые ни на что не влияли или годами не менялись (#1809–#1812, #1820). - Устаревшими объявлены
USERFILTERS(вместо него используетсяFILTERS ... USER),NEWTHREAD ... CONNECTIONи ключевое словоDOCKEDпри открытии формы (вместо него используетсяWINDOW). - Собственный код на Java (действия
INTERNAL, Spring-бины) может потребовать изменений из-за обновления библиотек: jdom 1 заменена на jdom2 (пакетorg.jdomсталorg.jdom2), log4j 1.2 — на reload4j, Apache POI обновлена с 4.1 до 5.5.
Язык
- Возвращаемые значения действий. Оператор
RETURNможет возвращать значение выражения,TOзаписывает результат вызова в свойство, а действия можно использовать в выражениях (#1561). HTTP-действия передают возвращаемое значение в ответе (#1562). - Даты и время. Для дат и времени определены арифметические операторы (#1570), а цикл может перебирать числовые диапазоны и интервалы дат и времени (#1571). Операторы перебора учитывают явно заданные классы параметров (#1489).
- Потоки и службы выполнения.
NEWTHREAD ... TOзаписывает результат потока в свойство,NEWEXECUTOR CLIENTвыполняет действия на клиенте, в том числе с задержкой (DELAY) и периодически (PERIOD) (#1626, #1627), а ожиданиеNEWEXECUTOR ... WAITможно ограничить по времени. - Тип
XML. Появился встроенный классXML; пространства имён XML определяются поEXTIDформы (#1584, #1585, #1591). ЗначенияJSON,JSONTEXTиXMLотображаются отформатированными. - Новые операторы. Снимок (
SCREENSHOT) захватывает текущее состояние интерфейса в виде изображения или HTML-разметки (#1629), операторы выделения (SELECT) сообщают, какие строки и колонки группы объектов выделил пользователь, аINPUT MULTIпозволяет выбрать несколько файлов (#1608). - Формулы времени возвращают целое число секунд класса
LONG(#1785),currentYear()возвращает значение классаYEAR.
Формы
- Расширение, наследование и композиция форм (#1559) описаны в статье Расширение форм.
- Фильтры и сортировки. Для
FILTER(S)иORDER(S)используется единая записьUSER | FIXED(#1594). ОператорыORDER,FILTERиFILTERGROUPизменяют сортировки и фильтры формы из действия, на сервере (#1856, #1857). ОбработчикиORDERSиFILTERSсрабатывают только при изменении пользователем (#1871). - Окна для форм. Появились окна вида
FORMSи опция окнаAUTOSIZE(WINDOW); форму можно открыть в именованном окне, аSHOW ... ACTIVATEактивирует уже открытую форму вместо открытия ещё одной.ACTIVATE FORMиCLOSE FORMобращаются к открытым формам (#1842–#1844). - Открытие и редактирование.
SHOWиDIALOGпринимают действие инициализации (#1588). Опция свойстваAPPLYсохраняет изменения сразу после редактирования (#1647). Действие с явно заданнымSHOWIFне скрывается из-за того, что неявно неприменимо в текущем состоянии формы, например приNULLв текущем объекте (#1613). - Представления группы объектов. Свойства группы в представлении
TOOLBARилиPOPUPпопадают в её панель инструментов или всплывающий контейнер, если у свойства не задано своё представление; раньше они попадали на панель группы (#1891). - Пользовательские настройки форм. Ошибочная настройка больше не мешает открыть форму, а администратор видит и сбрасывает настройки других пользователей (#1765, #1766).
- Экспорт в Excel включает итоговую строку
FOOTER(#1593).
Пользовательские представления и клиент
- Представления на React. React отрисовывает группы объектов, контейнеры (
DESIGN ... custom), окно форм и окно журнала (#1679, #1742, #1743). Компонент со стандартным представлением платформы —custom = NULLв дизайне,NOCUSTOMу свойства или элемента навигатора — внутри представления рисует платформа, а представление размещает его через<Platform name/>(#1887); таблица, тулбар, управляющие элементы фильтров, группа фильтров и фильтр по свойству сами принимают компонент React, без контейнера вокруг них (GRID(o) { custom = 'OrderCards'; }, #1893). Свойство сSELECTпредставление рисует по всем его вариантам сразу (select) и изменяет выбранным;SELECTне зависит от того, кто рисует свойство, так что сNOCUSTOMплатформа рисует свой элемент выбора, а сCUSTOMего рисует функция отрисовки; тип элемента уSELECTотносится к элементу платформы, и форма с ним там, где свойство рисует функция отрисовки или представление React, отклоняется. Модули.jsxработают без отдельной сборки и обрабатываются React Compiler без Node (#1708, #1709); преобразованные файлы хранятся на диске, поэтому перезапуск веб-сервера не преобразует их заново, а сколько страница их ждёт, задаёт параметр веб-сервераjsxTransformTimeout(#1907); дляsrc/main/webесть и полноценная сборка (#1678). - Пользовательские представления. Они поддерживают деревья, сортировки и пользовательские фильтры (#1672, #1859, #1860); ячейка говорит
loading, пока её изменение ждёт ответа сервера, узел дерева — пока загружаются его дети, а кнопка «Обновить» формы, которую рисует React (formRefresh), — пока форма ждёт ответов на свои асинхронные запросы (#1669),useShownсообщает серверу, какие из нарисованных самим представлением контейнеров оно показывает, так что внутри скрытого ничего не читается, аuseVisibleговорит представлению, видно ли оно на экране (#1673), а примитивBucketsупрощает построение сводных представлений (#1703). Тулбар и пользовательские фильтры платформы работают над строками, которые рисует представление, — списка или дерева, а управляющие элементы фильтров платформы и клавиши фильтров её таблицы — над пользовательскими фильтрами, которые рисует представление и которые перечисляют, на чём может быть условие (filterProperties). Представление может и само рисовать тулбар (TOOLBARSYSTEM) и управляющие элементы фильтров (FILTERCONTROLS) группы или дерева, а также группы фильтров (FILTERGROUP) группы и фильтры по её свойствам (FILTER(<property>); фильтр, который рисует платформа, — её строка, которую представление размещает через<Platform>, и над условиями, которые рисует оно само, #1937): их состояние — в его данных, команды — в его контроллере, у дерева — в его собственном узле,data.<tree>, вместе с его пользовательскими фильтрами, а там, где представление рисует строки дерева, — с его сортировками (orders), текущей строкой (current) иexpandCurrent()(#1884). Фильтр по свойству и условие, добавленное вручную, — F3,filters.change, — задаются по одному правилу: значение встаёт на место первого условия по свойству, сохраняя то, чего не указывают, из его сравнения, отрицания и связки (or, которую фильтр по свойству тоже показывает и задаёт), отсутствие значения снимает это условие, а условие без значения в списке сравнивает сNULL. Пользовательские фильтры группы — один список, кто бы их ни рисовал и ни задавал: ручной режим применения (userFiltersManualApplyMode) придерживает изменение представления так же, как изменение панели,applyFilters()отправляет то, что ждёт, а фильтр по свойству никогда не удаляется и без условия сохраняет своё сравнение (#1936). Подробнее — в How-to: Пользовательские представления формы на React. - Клавиши и привязки мыши React-представлений. Клавиши и привязки мыши, которые дизайн даёт тому, что рисует React-представление, —
CHANGEKEYиCHANGEMOUSEдействия или свойства, которое не просит значение в ячейке, собственные кнопки формы (Escзакрывает форму), фильтры группы фильтров — работают, как в обычной форме, пока компонент показан (#1901). Подробнее — в How-to: Пользовательские представления формы на React. - Контроллер пользовательского представления. Из JavaScript в пользовательских представлениях и
INTERNAL CLIENTдоступныexec,eval,evalActionиchange(#1648); блок формыCUSTOMSоткрывает контроллеру свойства и действия формы (#1650, #1692). Контроллер React-представления построен на членах, которые повторяют его данные, а контроллер формы,controller.form, — на именах: кроме этих вызовов, он делает то же, что члены представления, с тем, что рисует другой контейнер или платформа, — текущий объект, сортировки, пользовательские фильтры, группа фильтров, вызовы тулбара, узлы дерева, список подсказок свойства, — по имени группы, дерева или свойства.change,execиgetValuesчлена свойства иbatchвозвращаютPromiseсвоего запроса. Подробнее — в How-to: API контроллера пользовательского представления. - Таблицы. В таблице можно выделять строки и колонки, копировать выделенное, выделять всё по
Ctrl+Aи вставлять одно значение во все выделенные колонки (#1597). Опция дизайнаresizeShrinkтаблицы или свойства позволяет пользователю перетащить колонку уже её ширины. Сумма и количество на панели инструментов считаются по отмеченным строкам (#1712); контейнерTOOLBARBOXостаётся последним вBOXформы, поэтому добавленные дизайном компоненты располагаются над панелью инструментов (#1764). - Модальные диалоги.
Escзакрывает только верхний диалог, фокус не покидает его (#1788–#1790). - Веб-агент. Через локальный агент веб-клиент печатает на принтеры компьютера пользователя и записывает на него файлы.
- Десктоп-клиент показывает HTML-заголовки форм и элементов навигатора (#1190) и работает на Java 24 и новее (#1815).
Сервер, интеграция и ИИ
- MCP-сервер. Приложение может работать как MCP-сервер (#1620) со встроенным сервером авторизации OAuth 2.1 (#1621), через который к нему обращаются ИИ-клиенты. Работа с файлами (File API) позволяет просматривать ресурсы сервера (#1639).
- Горизонтальное масштабирование базы данных с ведущим и ведомыми серверами (#1458, #1518).
- Проверка логики без базы данных. Параметр
dryRunпроверяет логику и находит циклические зависимости свойств, не подключаясь к базе данных (#1737, #1757). Проверка может сообщать сразу о нескольких ошибках (#1797, #1798), аlogics.topModuleпринимает список модулей (#1740). - Параметры работы. Любой параметр работы задаётся в файлах
.properties, переменных окружения или через-Dsettings.*(#1814); все параметры теперь описаны. - Прочее. Действия
INTERNALкомпилируются из исходников.java, лежащих в ресурсах (#1707). Для RabbitMQ можно указать точку обмена (exchange) (#1768).IMPORT XMLне обрабатывает внешние сущности (#1728). Разделитель CSV иCHARSETвIMPORTиEXPORTзадаются выражениями, которые вычисляются при выполнении действия (#1883).
Планирование запросов и производительность
- Детерминированность. Агрегации и выбор строк, зависящие от порядка, всегда дают одинаковый результат (#1700). Глобальные события, между которыми нет зависимости, выполняются в порядке, который следует из логики и не меняется от запуска к запуску (#1835).
- Индексы. Планировщик использует индексы для упорядоченных агрегаций по колонкам, допускающим
NULL(#1727), и при несохранённых изменениях в сессии (#1767), а также учитывает интервал по любому полю индекса, а не только по первому (#1761). Проталкивание условий в агрегации переработано (#1699). - Ресурсы. Внутри транзакции временные таблицы очищаются через
DELETE(#1792). Память при запуске больше не растёт с числом циклов зависимостей (#1831), разбор модулей и запуск сервера ускорились.