В современной разработке на платформе 1С:Предприятие часто возникает задача взаимодействия со сторонними веб-сервисами, которые используют JavaScript для формирования данных или выполнения расчетов. Если на клиентской стороне мы можем легко использовать объект ПолеHTMLДокумента, то на стороне сервера (например, в регламентном задании) мы сталкиваемся с серьезным ограничением: стандартные средства 1С, такие как HTTPСоединение, получают только «сырой» исходный код страницы, не исполняя скрипты. В этой статье мы подробно разберем, как обойти это ограничение и запустить JS-код в серверном контексте.
Проанализируем ситуацию: когда 1С обращается к сайту через HTTPСоединение, она выступает в роли простейшего загрузчика файлов. Она скачивает HTML-код, но у нее нет встроенного «движка» (рендерера), который мог бы построить дерево DOM и выполнить встроенные или внешние скрипты .js. Если данные на странице появляются динамически после загрузки или рассчитываются функцией на стороне браузера, 1С их просто не «увидит». Именно поэтому нам требуются дополнительные инструменты, способные эмулировать поведение полноценного браузера на сервере.
Рассмотрим наиболее надежный способ, к которому пришел автор обсуждаемой темы. Суть заключается в создании небольшого внешнего приложения-посредника. Это приложение принимает от 1С параметры (например, URL или входные данные для расчета), запускает полноценный браузер в скрытом режиме, дожидается выполнения всех скриптов и возвращает результат обратно в 1С.
Для реализации такого подхода часто используется связка C# и библиотеки Selenium. Разберем по шагам, как это работает:
ЗапуститьПриложение 1С вызывает внешнюю утилиту.--headless (без графического окна).Пример вызова такой прослойки из кода 1С:
ПутьКПрограмме = "C:\Services\JSParser.exe";
ПараметрыЗапуска = "--url ""https://example.com/calc"" --data ""12345""";
РезультатФайл = "C:\Temp\result.txt";
// Запускаем внешнее приложение и ждем завершения
ЗапуститьПриложение(ПутьКПрограмме + " " + ПараметрыЗапуска, , Истина);
// Читаем результат работы JavaScript
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(РезультатФайл);
ИтоговыйРезультат = ТекстовыйДокумент.ПолучитьТекст();
Выясним причину, по которой многие разработчики предпочитают Node.js для подобных задач. Node.js изначально основан на движке V8 (том самом, что стоит в Chrome), поэтому работа с JS для него является «родной». Библиотека Puppeteer (или ее современный аналог Playwright) позволяет управлять браузером Chromium на очень высоком уровне.
Посмотрим на пример архитектуры такого решения: на сервере поднимается микросервис, который слушает определенный порт. 1С отправляет ему обычный HTTPЗапрос, а микросервис внутри себя выполняет всю «грязную» работу по рендерингу страницы.
Это гораздо эффективнее постоянного запуска процесса браузера, так как один экземпляр сервиса может обрабатывать множество запросов последовательно или параллельно, не тратя время на инициализацию окружения при каждом вызове ЗапуститьПриложение.
В старых ветках обсуждений часто встречается совет использовать InternetExplorer.Application. Теоретически, это позволяет запустить браузер как COMОбъект даже на сервере. Однако проанализируем ситуацию сегодня: движок IE11 (Trident) безнадежно устарел. Он не поддерживает современные стандарты ES6+, такие как const, let, стрелочные функции или async/await.
Если скрипт на целевом сайте написан с использованием современных стандартов, попытка запустить его через COM-объект IE приведет к ошибке выполнения JS, что и подтвердил автор темы. Поэтому данный метод стоит рассматривать только для очень старых внутренних ресурсов предприятия.
Вместо устаревшего IE сейчас рекомендуется использовать компонент WebView2, основанный на движке Chromium. Его также можно внедрить в серверную логику через COM-обертку или небольшое приложение на .NET. Это обеспечит 100% совместимость с любыми современными сайтами, так как рендеринг будет идентичен браузеру Google Chrome или Microsoft Edge.
При реализации любого из перечисленных решений на сервере 1С необходимо учитывать специфику работы под учетной записью службы (обычно USR1CV8). Разберем основные моменты:
--user-data-dir).--headless в настройках браузера, иначе процесс «зависнет» при попытке отрисовать окно.Подводя итог, можно составить следующий алгоритм выбора:
Использование внешних инструментов — это не «костыль», а грамотное архитектурное решение (микросервисный подход), позволяющее расширить возможности 1С там, где штатных механизмов платформы недостаточно.