Что нового в версии 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. - Некорректная логика больше не проходит незамеченной: приложение, которое раньше запускалось, может не запуститься или завершиться ошибкой при выполнении, если в нём другая сессия или взаимодействие с пользователем выполняются внутри транзакции (#1726), свойство зависит само от себя, папка верхнего уровня навигатора не имеет
WINDOWилиCUSTOMокна либо контейнера задан несогласованно. Сообщения об ошибках и способы отката для каждого случая приведены в MIGRATION.md. - Результаты и планы запросов могут измениться: агрегации, зависящие от порядка, и порядок независимых глобальных событий стали детерминированными, а планировщик чаще использует индексы (см. Планирование запросов и производительность и MIGRATION.md).
- Удалены встроенные модули 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). - Пользовательские настройки форм. Ошибочная настройка больше не мешает открыть форму, а администратор видит и сбрасывает настройки других пользователей (#1765, #1766).
- Экспорт в Excel включает итоговую строку
FOOTER(#1593).
Пользовательские представления и клиент
- Представления на React. React отрисовывает группы объектов, контейнеры (
DESIGN ... custom), окно форм и окно журнала (#1679, #1742, #1743). Модули.jsxработают без отдельной сборки и обрабатываются React Compiler без Node (#1708, #1709); дляsrc/main/webесть и полноценная сборка (#1678). Пользовательские представления поддерживают деревья, сортировки и пользовательские фильтры (#1672, #1859, #1860), а примитивBucketsупрощает построение сводных представлений (#1703). Подробнее — в How-to: Пользовательские представления формы на React. - Контроллер пользовательского представления. Из JavaScript в пользовательских представлениях и
INTERNAL CLIENTдоступныexec,eval,evalActionиchange(#1648); блок формыCUSTOMSоткрывает контроллеру свойства и действия формы (#1650, #1692). Подробнее — в How-to: API контроллера пользовательского представления. - Таблицы. В таблице можно выделять строки и колонки, копировать выделенное, выделять всё по
Ctrl+Aи вставлять одно значение во все выделенные колонки (#1597). Сумма и количество на панели инструментов считаются по отмеченным строкам (#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).
Планирование запросов и производительность
- Детерминированность. Агрегации и выбор строк, зависящие от порядка, всегда дают одинаковый результат (#1700). Глобальные события, между которыми нет зависимости, выполняются в порядке, который следует из логики и не меняется от запуска к запуску (#1835).
- Индексы. Планировщик использует индексы для упорядоченных агрегаций по колонкам, допускающим
NULL(#1727), и при несохранённых изменениях в сессии (#1767), а также учитывает интервал по любому полю индекса, а не только по первому (#1761). Проталкивание условий в агрегации переработано (#1699). - Ресурсы. Внутри транзакции временные таблицы очищаются через
DELETE(#1792). Память при запуске больше не растёт с числом циклов зависимостей (#1831), разбор модулей и запуск сервера ускорились.