К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как запустить JavaScript в 1С: способы, примеры и ограничения

Как выполнить JavaScript-код внутри 1С через ПолеHTMLДокумента, внешние компоненты и Node.js. Примеры кода, ограничения методов, типичные ошибки и FAQ.

Встроенный язык 1С не исполняет JavaScript напрямую: конструкции вроде Выполнить("alert(1)") работают только с кодом на языке 1С. Однако потребность запустить JS возникает часто — для отрисовки сложных диаграмм, использования готовых JS-библиотек, криптографических операций или интеграции с веб-сервисами, которые отдают логику в виде скриптов.

Существует три практических подхода: выполнение скрипта в поле HTML-документа (встроенный браузерный движок), подключение внешней компоненты по технологии Native API и вынос JS-логики во внешний процесс, например Node.js, с обменом данными по HTTP или через файлы. У каждого способа свои ограничения по клиенту (толстый, тонкий, веб), безопасности и переносимости.

Ниже разобраны все три подхода с примерами кода, условиями выбора и способами проверки результата. Отдельно рассмотрены типичные ошибки, из-за которых скрипт «молча» не выполняется, и границы, где самостоятельная реализация становится рискованной.

Какой способ выбрать под свою задачу

Выбор зависит от трёх факторов: на каком клиенте работает решение, нужно ли получить результат обратно в 1С и допустимо ли добавлять внешние зависимости. Поле HTML-документа доступно на толстом и тонком клиенте, но в веб-клиенте поведение зависит от браузера. Внешняя компонента требует сборки под каждую платформу, а внешний процесс — развёртывания и поддержки отдельного сервиса.

Сравнение вариантов

ПолеHTMLДокумента

Подходит для визуализации и несложных вычислений внутри формы. Ограничение: зависимость от браузерного движка, сложности с возвратом данных в веб-клиенте.

Внешняя компонента Native API

Подходит для быстрых вызовов и тесной интеграции с 1С. Ограничение: нужна разработка на C++ и сборка под Windows/Linux, 32/64 бита.

Node.js как внешний сервис

Подходит для тяжёлых JS-библиотек и асинхронной логики. Ограничение: требуется отдельный сервер, мониторинг и защита канала обмена.

Если задача — показать график, карту или отчёт на JS-библиотеке внутри формы, берите ПолеHTMLДокумента. Если нужен синхронный вызов JS-функции с возвратом значения и вы готовы сопровождать компоненту — Native API. Если скрипт тяжёлый, использует npm-пакеты или должен работать на сервере без клиентского сеанса — выносите его в Node.js.

Маршрут решения

Как выбрать действие

Нужно отобразить результат JS в форме 1СИспользуйте ПолеHTMLДокумента и формируйте HTML со встроенным скриптом
Нужен результат вычисления JS обратно в код 1С на толстом клиентеИспользуйте ПолеHTMLДокумента с доступом к DOM или внешнюю компоненту
Код должен работать на сервере или в фоновом заданииВыносите JS в Node.js и обращайтесь по HTTP
Решение должно работать в веб-клиенте без установки ПОТолько ПолеHTMLДокумента с учётом ограничений браузера

Запуск JavaScript через ПолеHTMLДокумента

Основной рабочий инструмент — реквизит формы типа «ПолеHTMLДокумента». В него помещается HTML-страница, внутри которой выполняется любой JavaScript: браузерный движок 1С (Internet Explorer в старых версиях платформы, WebKit/Chromium в новых) исполняет скрипт при загрузке документа.

Минимальный пример: создайте реквизит формы ПолеHTML с типом «Строка», добавьте элемент формы «Поле HTML-документа» и в модуле формы сформируйте страницу.

&НаКлиенте

Процедура ПриОткрытии(Отказ)

ПолеHTML = "<html><body>

|<div id='out'></div>

|<script>

| var x = 2 * 40 + 2;

| document.getElementById('out').innerHTML = 'Результат: ' + x;

|</script>

|</body></html>";

КонецПроцедуры

Чтобы получить результат обратно в 1С, на толстом клиенте доступен объект Документ поля HTML: через него можно читать DOM, вызывать функции и забирать значения из скрытых элементов. На тонком клиенте прямой доступ к DOM ограничен, поэтому результат обычно передают через навигационные ссылки: скрипт формирует переход по специальной ссылке, а 1С перехватывает событие ПриНажатии с отменой перехода и разбирает URL.

Порядок действий
  1. 1
    Добавьте в форму реквизит типа Строка и элемент ПолеHTMLДокумента
  2. 2
    Сформируйте HTML-текст со встроенным тегом script и присвойте его реквизиту
  3. 3
    Для возврата результата добавьте скрытый элемент или специальную ссылку с данными
  4. 4
    Обработайте событие ПриНажатии или ДокументСформирован для чтения результата
  5. 5
    Проверьте работу на всех целевых клиентах: толстом, тонком, веб

Особенности браузерного движка

В старых версиях платформы используется движок Internet Explorer, который не поддерживает современные стандарты ES6: стрелочные функции, let/const, промисы могут не работать. Если код падает без сообщений — первым делом проверьте синтаксис на совместимость с ES5 или обновите платформу до версии с движком WebKit.

Вызов JS через внешнюю компоненту Native API

Технология внешних компонент позволяет написать библиотеку на C++, внутри которой встраивается JS-движок (например, Duktape или V8), и вызывать JS-функции из кода 1С как обычные методы объекта. Компонента подключается через ПодключитьВнешнююКомпоненту и работает синхронно: передал строку кода — получил строку результата.

Этот путь оправдан, когда нужны частые вызовы с минимальной задержкой, работа на сервере 1С без клиентского интерфейса или строгий контроль окружения скрипта. Цена решения — разработка и сопровождение компоненты: сборка под все используемые платформы, подписание, распространение вместе с конфигурацией.

Готовые компоненты с JS-движками существуют в сообществе, но перед использованием проверяйте лицензию, поддержку вашей версии платформы и разрядности, а также отсутствие в поставке непроверенного кода.

Вынос JavaScript в Node.js с обменом по HTTP

Для тяжёлых сценариев — генерация документов через JS-шаблонизаторы, работа с npm-пакетами, сложная криптография — удобно поднять небольшой HTTP-сервис на Node.js. Скрипт на 1С отправляет POST-запрос с входными данными, сервис выполняет JS и возвращает JSON.

HTTPСоединение = Новый HTTPСоединение("127.0.0.1", 3000);

Запрос = Новый HTTPЗапрос("/run");

Запрос.Заголовки.Вставить("Content-Type", "application/json");

Запрос.УстановитьТелоИзСтроки("{""code"":""1+2""}");

Ответ = HTTPСоединение.ОтправитьДляОбработки(Запрос);

Если Ответ.КодСостояния = 200 Тогда

Результат = Ответ.ПолучитьТелоКакСтроку();

КонецЕсли;

Такой сервис работает и с серверного, и с клиентского вызова, не зависит от браузерного движка и легко масштабируется. Минусы: нужно сопровождать ещё один процесс, следить за его доступностью и защищать endpoint — как минимум ограничением по сети и токеном в заголовке, иначе любой в сегменте сможет исполнять код на вашем сервере.

javascript
// Минимальный сервис на Node.js
const http = require('http');
http.createServer((req, res) => {
  let body = '';
  req.on('data', c => body += c);
  req.on('end', () => {
    const { code } = JSON.parse(body);
    const result = String(eval(code)); // только в доверенной сети!
    res.end(JSON.stringify({ result }));
  });
}).listen(3000, '127.0.0.1');

Проверка результата и отладка

Главная сложность отладки JS внутри ПолеHTMLДокумента — отсутствие консоли. Ошибки скрипта не пробрасываются в 1С, страница просто остаётся пустой. Практичный приём: обернуть код в try/catch и выводить текст ошибки в видимый элемент страницы.

Перед встраиванием в 1С прогоните HTML-страницу в обычном браузере с открытыми инструментами разработчика — большинство ошибок ловится там за минуты. Затем проверяйте уже в целевом клиенте 1С, потому что движок может отличаться.

Контрольные точки

Как проверить результат

Отображение страницы
Норма

HTML отрисован, скрипт выполнился, виден ожидаемый результат

Тревожный признак

Пустое поле или частичная отрисовка — ошибка в JS или неподдерживаемый синтаксис

Возврат данных в 1С
Норма

Событие ПриНажатии срабатывает, параметры ссылки содержат данные

Тревожный признак

Событие не вызывается — проверьте формирование ссылки и отмену стандартной обработки

Вызов Node.js сервиса
Норма

Код состояния 200, тело содержит корректный JSON

Тревожный признак

Таймаут или код 500 — сервис недоступен или скрипт упал с исключением

Типичные ошибки и ограничения

Большинство проблем связано не с самим JavaScript, а с окружением: устаревшим движком, экранированием кавычек при сборке HTML строкой 1С и попытками получить DOM на клиенте, где он недоступен.

Типичные ошибки
01
Использование синтаксиса ES6 на платформе с движком IE — скрипт молча не выполняется, страница пустая
02
Экранирование кавычек в HTML-строке 1С забыто — страница собирается с синтаксической ошибкой
03
Попытка читать Документ поля HTML на тонком или веб-клиенте — свойство недоступно, код падает
04
Выполнение JS на сервере через ПолеHTMLДокумента — серверный контекст не имеет интерфейсных объектов
05
eval произвольного кода из внешних источников в Node.js без изоляции — риск компрометации сервера

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

Итог

Что важно запомнить

Напрямую JavaScript в языке 1С не исполняется. Для форм используйте ПолеHTMLДокумента с учётом движка и типа клиента, для серверных и фоновых задач — внешний сервис на Node.js по HTTP, для тесной интеграции — компоненту Native API. Всегда проверяйте возврат результата и защищайте каналы исполнения кода.

Частые вопросы

Можно ли выполнить JavaScript на сервере 1С?

Штатных средств нет: ПолеHTMLДокумента — клиентский объект. На сервере JS запускают через внешнюю компоненту со встроенным движком или вызов внешнего процесса, например Node.js по HTTP либо через команду системы с чтением результата из файла.

Почему скрипт в ПолеHTMLДокумента не выполняется и страница пустая?

Чаще всего причина в синтаксической ошибке или использовании конструкций, которые не поддерживает движок (стрелочные функции, let/const на старых платформах). Проверьте страницу в обычном браузере, оберните код в try/catch с выводом ошибки на страницу и убедитесь, что кавычки корректно экранированы при сборке HTML строкой 1С.

Как передать данные из JavaScript обратно в 1С на тонком клиенте?

Используйте переход по специально сформированной ссылке: скрипт кодирует данные в URL, а в обработчике события ПриНажатии поля HTML отменяется стандартная навигация и разбирается строка ссылки. Данные лучше кодировать в Base64 или URL-кодировании, чтобы не сломать разбор.

Безопасно ли выполнять JS-код, полученный извне?

Нет. Выполнение произвольного кода — всегда риск: в браузерном движке это угроза XSS и кражи данных формы, в Node.js — полный доступ к серверу. Исполняйте только доверенный код, а внешние данные передавайте как параметры, а не как часть скрипта.

Работает ли ПолеHTMLДокумента в веб-клиенте?

Да, но в изолированном фрейме: прямой доступ к DOM из кода 1С невозможен, обмен данными идёт только через события навигации. Дополнительно учитывайте политики браузера пользователя — блокировка скриптов или строгие настройки безопасности могут нарушить работу.

Что выбрать для разового вычисления без изменения конфигурации?

Если конфигурацию менять нельзя, проще всего вынести вычисление во внешний инструмент: локальный скрипт Node.js, вызываемый через команду системы с передачей данных файлом, либо выполнить расчёт вне 1С и загрузить результат обработкой.