Разработка и Конфигурация · 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-документа доступно на толстом и тонком клиенте, но в веб-клиенте поведение зависит от браузера. Внешняя компонента требует сборки под каждую платформу, а внешний процесс — развёртывания и поддержки отдельного сервиса.
Сравнение вариантов
Подходит для визуализации и несложных вычислений внутри формы. Ограничение: зависимость от браузерного движка, сложности с возвратом данных в веб-клиенте.
Подходит для быстрых вызовов и тесной интеграции с 1С. Ограничение: нужна разработка на C++ и сборка под Windows/Linux, 32/64 бита.
Подходит для тяжёлых JS-библиотек и асинхронной логики. Ограничение: требуется отдельный сервер, мониторинг и защита канала обмена.
Если задача — показать график, карту или отчёт на JS-библиотеке внутри формы, берите ПолеHTMLДокумента. Если нужен синхронный вызов JS-функции с возвратом значения и вы готовы сопровождать компоненту — Native API. Если скрипт тяжёлый, использует npm-пакеты или должен работать на сервере без клиентского сеанса — выносите его в Node.js.
Как выбрать действие
Запуск 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Добавьте в форму реквизит типа Строка и элемент ПолеHTMLДокумента
- 2Сформируйте HTML-текст со встроенным тегом script и присвойте его реквизиту
- 3Для возврата результата добавьте скрытый элемент или специальную ссылку с данными
- 4Обработайте событие ПриНажатии или ДокументСформирован для чтения результата
- 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 — как минимум ограничением по сети и токеном в заголовке, иначе любой в сегменте сможет исполнять код на вашем сервере.
// Минимальный сервис на 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 или неподдерживаемый синтаксис
Событие ПриНажатии срабатывает, параметры ссылки содержат данные
Событие не вызывается — проверьте формирование ссылки и отмену стандартной обработки
Код состояния 200, тело содержит корректный JSON
Таймаут или код 500 — сервис недоступен или скрипт упал с исключением
Типичные ошибки и ограничения
Большинство проблем связано не с самим JavaScript, а с окружением: устаревшим движком, экранированием кавычек при сборке HTML строкой 1С и попытками получить DOM на клиенте, где он недоступен.
Отдельно отметьте ограничение: Поле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С и загрузить результат обработкой.