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