Как организовать выполнение JavaScript на стороне сервера 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В современной разработке на платформе 1С:Предприятие часто возникает задача взаимодействия со сторонними веб-сервисами, которые используют JavaScript для формирования данных или выполнения расчетов. Если на клиентской стороне мы можем легко использовать объект ПолеHTMLДокумента, то на стороне сервера (например, в регламентном задании) мы сталкиваемся с серьезным ограничением: стандартные средства 1С, такие как HTTPСоединение, получают только «сырой» исходный код страницы, не исполняя скрипты. В этой статье мы подробно разберем, как обойти это ограничение и запустить JS-код в серверном контексте.

Почему стандартное HTTPСоединение не решает задачу?

Проанализируем ситуацию: когда 1С обращается к сайту через HTTPСоединение, она выступает в роли простейшего загрузчика файлов. Она скачивает HTML-код, но у нее нет встроенного «движка» (рендерера), который мог бы построить дерево DOM и выполнить встроенные или внешние скрипты .js. Если данные на странице появляются динамически после загрузки или рассчитываются функцией на стороне браузера, 1С их просто не «увидит». Именно поэтому нам требуются дополнительные инструменты, способные эмулировать поведение полноценного браузера на сервере.

Вариант 1: Создание внешней прослойки (C# / Selenium)

Рассмотрим наиболее надежный способ, к которому пришел автор обсуждаемой темы. Суть заключается в создании небольшого внешнего приложения-посредника. Это приложение принимает от 1С параметры (например, URL или входные данные для расчета), запускает полноценный браузер в скрытом режиме, дожидается выполнения всех скриптов и возвращает результат обратно в 1С.

Для реализации такого подхода часто используется связка C# и библиотеки Selenium. Разберем по шагам, как это работает:

  1. 1С формирует текстовый файл с исходными данными или передает параметры через командную строку.
  2. С помощью метода ЗапуститьПриложение 1С вызывает внешнюю утилиту.
  3. Внешняя утилита инициализирует драйвер браузера (например, ChromeDriver) с флагом --headless (без графического окна).
  4. Браузер загружает страницу, исполняет JavaScript, и утилита считывает итоговое значение из DOM-дерева.
  5. Результат записывается в файл или возвращается в поток вывода, который 1С считывает.

Пример вызова такой прослойки из кода 1С:


ПутьКПрограмме = "C:\Services\JSParser.exe";
ПараметрыЗапуска = "--url ""https://example.com/calc"" --data ""12345""";
РезультатФайл = "C:\Temp\result.txt";

// Запускаем внешнее приложение и ждем завершения
ЗапуститьПриложение(ПутьКПрограмме + " " + ПараметрыЗапуска, , Истина);

// Читаем результат работы JavaScript
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(РезультатФайл);
ИтоговыйРезультат = ТекстовыйДокумент.ПолучитьТекст();

Вариант 2: Использование Node.js и Puppeteer

Выясним причину, по которой многие разработчики предпочитают Node.js для подобных задач. Node.js изначально основан на движке V8 (том самом, что стоит в Chrome), поэтому работа с JS для него является «родной». Библиотека Puppeteer (или ее современный аналог Playwright) позволяет управлять браузером Chromium на очень высоком уровне.

Посмотрим на пример архитектуры такого решения: на сервере поднимается микросервис, который слушает определенный порт. 1С отправляет ему обычный HTTPЗапрос, а микросервис внутри себя выполняет всю «грязную» работу по рендерингу страницы.

Это гораздо эффективнее постоянного запуска процесса браузера, так как один экземпляр сервиса может обрабатывать множество запросов последовательно или параллельно, не тратя время на инициализацию окружения при каждом вызове ЗапуститьПриложение.

Вариант 3: Использование COM-объекта Internet Explorer (Устарело)

В старых ветках обсуждений часто встречается совет использовать InternetExplorer.Application. Теоретически, это позволяет запустить браузер как COMОбъект даже на сервере. Однако проанализируем ситуацию сегодня: движок IE11 (Trident) безнадежно устарел. Он не поддерживает современные стандарты ES6+, такие как const, let, стрелочные функции или async/await.

Если скрипт на целевом сайте написан с использованием современных стандартов, попытка запустить его через COM-объект IE приведет к ошибке выполнения JS, что и подтвердил автор темы. Поэтому данный метод стоит рассматривать только для очень старых внутренних ресурсов предприятия.

Современная альтернатива: Microsoft Edge WebView2

Вместо устаревшего IE сейчас рекомендуется использовать компонент WebView2, основанный на движке Chromium. Его также можно внедрить в серверную логику через COM-обертку или небольшое приложение на .NET. Это обеспечит 100% совместимость с любыми современными сайтами, так как рендеринг будет идентичен браузеру Google Chrome или Microsoft Edge.

Важные нюансы работы в фоновом режиме

При реализации любого из перечисленных решений на сервере 1С необходимо учитывать специфику работы под учетной записью службы (обычно USR1CV8). Разберем основные моменты:

  1. Отсутствие профиля пользователя: Многие браузеры по умолчанию пытаются создать папку профиля в каталоге пользователя. У службы 1С может не быть туда прав. Всегда указывайте путь к профилю явно (флаг --user-data-dir).
  2. Headless режим: На сервере нет рабочего стола и графической оболочки. Обязательно используйте флаг --headless в настройках браузера, иначе процесс «зависнет» при попытке отрисовать окно.
  3. Права доступа: Убедитесь, что у пользователя, под которым запущена служба 1С, есть права «Чтение и выполнение» на исполняемые файлы браузера и вашей «прослойки».

Рекомендация по выбору решения

Подводя итог, можно составить следующий алгоритм выбора:

Использование внешних инструментов — это не «костыль», а грамотное архитектурное решение (микросервисный подход), позволяющее расширить возможности 1С там, где штатных механизмов платформы недостаточно.

← На главную