Почему HTTP-запросы к localhost не работают в веб-клиенте 1С, но работают в тонком клиенте?

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

При разработке интеграционных решений на платформе 1С мы часто сталкиваемся с необходимостью взаимодействия с локальными сервисами или устройствами, работающими на localhost. В тонком клиенте 1С такие задачи решаются тривиально, однако при переходе на веб-клиент разработчики внезапно обнаруживают, что код перестает работать. Давайте разберем, почему так происходит и какие существуют пути решения данной проблемы.

Разберем причину: архитектурные ограничения

Основное различие заключается в исполняющей среде вашего кода. Тонкий клиент — это полноценное приложение, установленное в операционной системе, которое имеет прямой доступ к сетевым протоколам и ресурсам компьютера. Оно не ограничено правилами безопасности браузеров, поэтому спокойно отправляет запросы на любые порты.

Веб-клиент работает внутри окна браузера. Браузеры — это «песочницы» с очень жесткими правилами безопасности. Одно из них — Same Origin Policy (политика одинакового источника) и механизмы CORS (Cross-Origin Resource Sharing). Когда 1С в браузере пытается отправить HTTPЗапрос на localhost, браузер видит, что текущая страница (например, сервер 1С) пытается «стучаться» на другой домен или порт. С точки зрения безопасности браузера, это подозрительная активность, и он блокирует такой запрос, если целевой сервер не подтвердил свое согласие на прием запросов с этого источника.

Рассмотрим способы решения проблемы

Поскольку прямое выполнение запросов из браузера ограничено политиками безопасности, нам нужно изменить архитектуру взаимодействия.

Решение 1: Вынос логики на сервер 1С

Самый надежный и правильный способ с точки зрения архитектуры — выполнять HTTPЗапрос не на клиенте, а на стороне сервера 1С. Когда код выполняется в серверном контексте, он отправляется от имени сервера 1С, а не браузера пользователя. В этом случае никаких ограничений CORS не существует.

Для реализации этого метода используйте серверные процедуры или функции, а для отладки запросов подойдет обработка тестирование http сервисов (GET и POST):


// В модуле формы или объекта
&НаСервере
Процедура ВыполнитьЗапросНаСервере()
    Заголовки = Новый Соответствие;
    // ... настройка заголовков ...
    Соединение = Новый HTTPСоединение("localhost", 8080);
    Запрос = Новый HTTPЗапрос("/api/resource", Заголовки);
    Ответ = Соединение.Получить(Запрос);
КонецПроцедуры

Важный момент: помните, что в данном сценарии localhost будет означать компьютер, на котором физически установлен сервер 1С, а не компьютер пользователя, работающего в браузере. Учитывайте это при построении сетевой инфраструктуры.

Решение 2: Настройка CORS на целевом сервисе

Если вы имеете доступ к исходному коду или настройкам сервера, который вы опрашиваете на порту XXXXX, вы можете разрешить кросс-доменные запросы. Для этого целевой сервис должен отвечать на специальные запросы типа OPTIONS и возвращать соответствующие заголовки ответа.

Чтобы разрешить браузеру обмениваться данными, сервис должен отправить в ответ следующие заголовки:

  1. Access-Control-Allow-Origin: * (или указать конкретный домен вашего портала 1С).
  2. Access-Control-Allow-Methods: GET, POST, OPTIONS.
  3. Access-Control-Allow-Headers: Content-Type.

После такой настройки браузер перестанет блокировать запросы, так как целевой сервер сам «разрешит» входящее соединение.

Решение 3: Использование внешних компонентов

Если задача требует взаимодействия именно с локальными устройствами пользователя (например, сканер штрихкодов или принтер этикеток), стандартные HTTPЗапрос часто оказываются недостаточно гибкими для веб-клиента. В таких случаях мы используем внешние компоненты 1С.

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

Подведем итоги

Проанализируем ситуацию: если ваш код работает в тонком клиенте, но «замирает» в веб-клиенте, значит, вы столкнулись с защитой браузера. Мы выяснили, что:

Попробуйте перенести выполнение кода на сервер, используя возможности расширения Алгоритмы, команды, http, и вы увидите, что обмен данными станет стабильным и предсказуемым в любой среде исполнения.

← На главную