Перейти к основному содержимому
Версия: 7.0

Что нового в версии 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), разбор модулей и запуск сервера ускорились.