При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией: в обычном браузере страница отображает готовые данные (например, результат расчета площади или координаты), а при использовании объекта HTTPСоединение в 1С возвращается «сырой» HTML-код с текстом скриптов. Рассмотрим подробнее, почему так происходит, проанализируем внутренние механизмы работы браузеров и 1С, а также разберем по шагам методы решения этой задачи.
Проанализируем ситуацию, описанную автором. При обращении через браузер к localhost:3000 пользователь видит итоговое число. При выполнении кода в 1С:
Соединение = Новый HTTPСоединение("localhost",3000);
Запрос = Новый HTTPЗапрос("/");
Результат = Соединение.Получить(Запрос);
Сообщить(Результат.ПолучитьТелоКакСтроку());
В консоль выводится полный текст страницы с тегами script. Причина заключается в том, что объект HTTPСоединение — это низкоуровневый инструмент. Он реализует только протокол передачи данных (HTTP). Когда вы вызываете метод Получить(), 1С отправляет запрос на сервер, получает в ответ текстовый поток и сохраняет его «как есть».
Браузер же — это сложный программный комплекс, который после получения текста страницы выполняет следующие действия:
ymaps.ready().document.write).В 1С встроенного движка для исполнения JavaScript внутри объекта HTTPСоединение нет. Поэтому вы получаете заготовку страницы, а не результат ее «оживления».
Если расчет площади или других данных жестко завязан на сложную библиотеку (как API Яндекс.Карт), которую невозможно перенести на чистый язык 1С, необходимо использовать «безголовый» (Headless) браузер. Это полноценный браузер, работающий без графического интерфейса, которым можно управлять из командной строки.
Рассмотрим использование Puppeteer (библиотека для Node.js). Это позволит вам создать микросервис, который будет рендерить страницу и отдавать 1С уже готовый результат. Алгоритм действий будет следующим:
Пример логики на стороне Node.js:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('http://localhost:3000');
// Ждем, пока на странице появится результат или выполнится скрипт
await page.waitForFunction(() => typeof area !== 'undefined' && area > 0);
const result = await page.evaluate(() => document.body.innerText);
console.log(result);
await browser.close();
})();
В 1С вы вызываете этот скрипт через ЗапуститьПриложение или через тот же HTTPСоединение, если оформите это как API-метод.
Как отметил автор темы, библиотека Яндекса в Node.js «не грузится», так как она требует наличия объектов window и document. Однако для расчета площади многоугольника не обязательно использовать тяжелое API карт. Разберем альтернативу — использование специализированной математической библиотеки Turf.js.
Это чисто математическая библиотека, которая отлично работает на сервере в среде Node.js. Если ваша задача — только расчет площади по координатам, вы можете изменить логику своего сервера на Node.js:
const turf = require('@turf/turf');
// Ваши координаты из 1С
const polygon = turf.polygon([[
[37.8, 55.9],
[37.9, 55.9],
[37.9, 55.8],
[37.8, 55.8],
[37.8, 55.9]
]]);
const area = turf.area(polygon);
// Теперь этот результат можно сразу вернуть в 1С
В этом случае 1С будет отправлять POST-запрос с координатами, а сервер Node.js мгновенно возвращать число без всякого HTML-кода.
Проанализируем ситуацию: стоит ли вообще выходить за пределы 1С? Расчет площади многоугольника на сфере — это известная математическая задача. Для небольших площадей можно использовать формулу Гаусса (площадь многоугольника на плоскости), предварительно переведя координаты из градусов в метры.
Для реализации в 1С используем алгоритм:
Функция РассчитатьПлощадь(МассивТочек) Экспорт
Площадь = 0;
КоличествоТочек = МассивТочек.Количество();
Для и = 0 По КоличествоТочек - 1 Цикл
Точка1 = МассивТочек[и];
Точка2 = МассивТочек[(и + 1) % КоличествоТочек];
Площадь = Площадь + (Точка1.X * Точка2.Y) - (Точка2.X * Точка1.Y);
КонецЦикла;
Возврат Abs(Площадь / 2);
КонецФункции
Этот метод самый быстрый и надежный, так как он работает на стороне сервера 1С без привлечения внешних зависимостей, интернета и сторонних API.
Если код должен исполняться именно в контексте браузера, а сторонние библиотеки ставить нельзя, можно рассмотреть использование COM-объекта InternetExplorer.Application. Рассмотрим этот пример, хотя он считается устаревшим:
IE = Новый COMОбъект("InternetExplorer.Application");
IE.Visible = Ложь;
IE.Navigate("http://localhost:3000");
Пока IE.ReadyState < 4 Цикл
// Ждем загрузки
КонецЦикла;
Результат = IE.Document.body.innerHTML;
IE.Quit();
Важное ограничение: данный метод будет работать только на Windows-сервере и может столкнуться с проблемами прав доступа, если сервер 1С запущен от имени системной службы без доступа к интерактивному рабочему столу.
Выяснив причину проблемы, мы понимаем, что 1С делает свою работу правильно — она честно скачивает файл. Ошибка в архитектурном подходе. Чтобы получить результат работы JavaScript в 1С, выберите один из путей:
Turf.js на Node.js или реализуйте математический алгоритм прямо в 1С.ПолеHTMLДокумента на клиенте, но помните, что на сервере этот объект недоступен.Наиболее современным и масштабируемым решением для серверных задач является создание микросервиса на Node.js, который принимает координаты и возвращает готовые расчеты, избавляя 1С от необходимости парсить HTML-страницы.