Почему 1С при HTTP-запросе получает текст скрипта вместо результата расчета и как это исправить

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

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

Выясняем причину: HTTP-клиент против браузера

Проанализируем ситуацию, описанную автором. При обращении через браузер к localhost:3000 пользователь видит итоговое число. При выполнении кода в 1С:


Соединение = Новый HTTPСоединение("localhost",3000);
Запрос = Новый HTTPЗапрос("/");
Результат = Соединение.Получить(Запрос);
Сообщить(Результат.ПолучитьТелоКакСтроку());

В консоль выводится полный текст страницы с тегами script. Причина заключается в том, что объект HTTPСоединение — это низкоуровневый инструмент. Он реализует только протокол передачи данных (HTTP). Когда вы вызываете метод Получить(), 1С отправляет запрос на сервер, получает в ответ текстовый поток и сохраняет его «как есть».

Браузер же — это сложный программный комплекс, который после получения текста страницы выполняет следующие действия:

  1. Парсит HTML-код и строит дерево объектов (DOM).
  2. Загружает внешние ресурсы (скрипты Яндекс.Карт, стили).
  3. Инициализирует движок JavaScript (например, V8 в Chrome).
  4. Выполняет скрипты, включая обработчики событий типа ymaps.ready().
  5. В процессе выполнения скрипт может изменить содержимое страницы (как в примере с document.write).

В 1С встроенного движка для исполнения JavaScript внутри объекта HTTPСоединение нет. Поэтому вы получаете заготовку страницы, а не результат ее «оживления».

Способ 1. Использование Headless-браузеров на сервере

Если расчет площади или других данных жестко завязан на сложную библиотеку (как API Яндекс.Карт), которую невозможно перенести на чистый язык 1С, необходимо использовать «безголовый» (Headless) браузер. Это полноценный браузер, работающий без графического интерфейса, которым можно управлять из командной строки.

Рассмотрим использование Puppeteer (библиотека для Node.js). Это позволит вам создать микросервис, который будет рендерить страницу и отдавать 1С уже готовый результат. Алгоритм действий будет следующим:

  1. На сервере устанавливается среда Node.js.
  2. Пишется скрипт, который запускает браузер, переходит на вашу страницу, дожидается выполнения JS и возвращает текст.

Пример логики на стороне 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-метод.

Способ 2. Перенос логики на сторону Node.js с помощью Turf.js

Как отметил автор темы, библиотека Яндекса в 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-кода.

Способ 3. Прямой расчет на языке 1С

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

Для реализации в 1С используем алгоритм:

  1. Принимаем массив координат (широта, долгота).
  2. Переводим их в плоские координаты (например, проекция Меркатора).
  3. Применяем формулу:

Функция РассчитатьПлощадь(МассивТочек) Экспорт
    Площадь = 0;
    КоличествоТочек = МассивТочек.Количество();
    Для и = 0 По КоличествоТочек - 1 Цикл
        Точка1 = МассивТочек[и];
        Точка2 = МассивТочек[(и + 1) % КоличествоТочек];
        Площадь = Площадь + (Точка1.X * Точка2.Y) - (Точка2.X * Точка1.Y);
    КонецЦикла;
    Возврат Abs(Площадь / 2);
КонецФункции

Этот метод самый быстрый и надежный, так как он работает на стороне сервера 1С без привлечения внешних зависимостей, интернета и сторонних API.

Способ 4. Использование COM-объекта (только для Windows-серверов)

Если код должен исполняться именно в контексте браузера, а сторонние библиотеки ставить нельзя, можно рассмотреть использование 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С, выберите один из путей:

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

← На главную