Поле JS
Введение
Поле JS используется для пользовательской отрисовки содержимого в позиции поля с помощью JavaScript. Обычно применяется в блоках «Детали», в элементах формы только для чтения или как «прочие пользовательские элементы» в столбцах таблицы. Подходит для индивидуального отображения: сводная вычисляемая информация, индикаторы статусов, форматированный текст или диаграммы.

Типы
- Только для чтения: используется для отображения без редактирования; читает
ctx.value, чтобы отрисовать результат. - Редактируемое: используется для пользовательской логики ввода. Доступны
ctx.getValue()/ctx.setValue(v)и контейнерное событиеjs-field:value-changeдля двусторонней синхронизации со значениями формы.
Сценарии использования
-
Только для чтения
- Блок «Детали»: отображение только для чтения — например, результаты вычислений, индикаторы статусов, фрагменты форматированного текста, диаграммы и т. д.
- Блок «Таблица»: используется как «Другая пользовательская колонка» → «Поле JS» для режима только для чтения (если нужен столбец без привязки к полю коллекции, используйте колонку JS).
-
Редактируемое
- Блок формы (создание или редактирование записи): пользовательские элементы ввода или составные поля ввода, которые проходят валидацию и отправляются вместе с формой.
- Подходит для сценариев вроде: полей ввода из внешних библиотек, форматированного текста и редакторов кода, сложных динамических компонентов и т. д.
API контекста выполнения
Код поля JS может напрямую использовать следующие возможности контекста:
ctx.element: контейнер DOM поля (ElementProxy), поддерживаетinnerHTML,querySelector,addEventListenerи т.д.ctx.value: текущее значение поля (только для чтения).ctx.record: текущий объект записи (только для чтения).ctx.collection: метаданные коллекции, к которой относится поле (только для чтения).ctx.requireAsync(url): асинхронная загрузка библиотеки в формате AMD или UMD по URL.ctx.importAsync(url): динамический импорт модуля в формате ES-модулей по URL.ctx.openView(options): открывает настроенный элемент просмотра (всплывающее окно, выдвижной блок или страницу).ctx.i18n.t()/ctx.t(): функции интернационализации.ctx.onRefReady(ctx.ref, cb): вызывает отрисовку после готовности контейнера.ctx.libs.React/ctx.libs.ReactDOM/ctx.libs.antd/ctx.libs.antdIcons/ctx.libs.dayjs/ctx.libs.lodash/ctx.libs.math/ctx.libs.formula: встроенные библиотеки React, ReactDOM, Ant Design, иконки Ant Design, dayjs, lodash, math.js и formula.js для разметки на JSX, работы с датой и временем, обработки данных и вычислений. (ctx.React/ctx.ReactDOM/ctx.antdсохранены для совместимости.)ctx.render(vnode): отрисовывает элемент на React, строку разметки HTML или узел дерева документа в контейнер по умолчаниюctx.element. Повторный вызов снова использует корень и перезаписывает содержимое контейнера.
Особенности редактируемого типа (JSEditableField):
ctx.getValue(): возвращает текущее значение формы (приоритет: состояние формы, затем свойства поля).ctx.setValue(v): задаёт значение формы и свойства поля, сохраняя двустороннюю синхронизацию.- контейнерное событие
js-field:value-change: срабатывает при изменении внешнего значения; упрощает обновление отображения поля ввода из сценария.
Редактор и сниппеты
Редактор сценариев для поля JS поддерживает подсветку синтаксиса, подсказки по ошибкам и встроенные сниппеты кода.
- Сниппет ы: открывает список встроенных сниппетов — можно искать и вставлять их в позицию курсора одним щелчком.
- Запуск: выполняет текущий код напрямую. Вывод выполнения показывается на панели Журнал внизу; поддерживаются вызовы
console.log,console.info,console.warn,console.errorи подсветка ошибок для удобного поиска по месту.

Также можно генерировать код с помощью ИИ-сотрудника:
Типовое использование
1) Базовый рендеринг (чтение значения поля)
2) Использование JSX для рендеринга React-компонента
3) Загрузка сторонних библиотек (AMD, UMD или ES-модули)
4) Щелчок для открытия всплывающего окна или выдвижного блока (openView)
5) Редактируемое поле ввода (JSEditableFieldModel)
Примечания
- Рекомендуется использовать доверенную сеть доставки контента для загрузки внешних библиотек и предусмотреть запасной сценарий на случай ошибок (например,
if (!lib) return;). - Рекомендуется использовать селекторы по атрибуту
classили[name=...]вместо фиксированныхid, чтобы избежать дублирования идентификатор ов в разных блоках или модальных окнах. - Очистка событий: поле может перерисовываться несколько раз из-за изменения данных или смены вида. Перед привязкой обработчика очищайте подписки или исключайте дубликаты, чтобы избежать повторных срабатываний.

