Как исправить ошибки Couldn't resolve host name и Не могу установить соединение при HTTP-запросе в 1С

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

Интеграция систем через HTTP-сервисы — стандартная задача разработчика 1С. Однако на этапе отладки и запуска первых запросов часто возникают сетевые исключения: Ошибка работы с Интернет: Couldn't resolve host name, Не могу установить соединение или ответ Обработчик запроса не найден. Разберем по шагам причины этих сбоев и посмотрим, как правильно построить код взаимодействия и сетевую инфраструктуру.

Шаг 1. Разделение адреса между HTTPСоединение и HTTPЗапрос

Самая распространенная ошибка новичков — передача полного URL веб-сервиса в конструктор объекта HTTPСоединение. Посмотрим на ошибочный фрагмент кода:


// Ошибочный вариант: передан путь публикации и префикс протокола
Соединение = Новый HTTPСоединение("//localhost/jsut11_dev2/hs/", 80, "admin3", "aspLong3com");
Запрос = Новый HTTPЗапрос("Ostatok");
Ответ = Соединение.Получить(Запрос);

Проанализируем ситуацию: первым параметром в конструкторе HTTPСоединение выступает СерверИсточник. В него допускается передавать исключительно имя хоста или IP-адрес без протоколов (http://, //) и без путей каталогов. Когда платформа встречает строку вида //localhost/jsut11_dev2/hs/, внутренняя сетевая библиотека пытается отправить DNS-запрос на разрешение всего этого выражения как единого доменного имени. В результате генерируется ошибка Couldn't resolve host name.

Весь путь к конкретному ресурсу веб-сервиса должен передаваться во второй объект — HTTPЗапрос. Исправим синтаксис вызова:


// Корректный вариант разделения хоста и относительного URL
СерверХост = "localhost";
ПортПодключения = 80;
Пользователь = "admin3";
Пароль = "aspLong3com";

Соединение = Новый HTTPСоединение(СерверХост, ПортПодключения, Пользователь, Пароль);
Запрос = Новый HTTPЗапрос("/jsut11_dev2/hs/Ostatok");
Ответ = Соединение.Получить(Запрос);

Шаг 2. Учет контекста выполнения кода и сетевого имени хоста

Даже при корректном синтаксисе обращение по имени localhost или 127.0.0.1 может завершиться неудачей. Выясним причину такого поведения.

Когда мы тестируем сервис через веб-браузер на рабочей станции, запрос выполняется локально на этом же компьютере. Но если код 1С выполняется в клиент-серверной базе на стороне сервера (в модуле с директивой &НаСервере или в общем серверном модуле), физическим исполнителем запроса становится сервер приложений 1С (процесс rphost). Для сервера приложений адрес localhost — это он сам, а не рабочая станция разработчика, где запущен локальный веб-сервер (например, Apache или IIS).

Чтобы связать сервер 1С с локальным веб-сервером, выполним следующие действия:

  1. Заменим localhost на реальный статический IP-адрес рабочего компьютера в локальной сети (например, 192.168.1.55) либо на его полное сетевое имя (FQDN).
  2. Если обращение происходит по сетевому имени, убедимся, что DNS-сервер или локальный файл hosts на сервере приложений корректно преобразует данное имя в IP-адрес.
  3. Если сервис должен тестироваться именно локально с компьютера разработчика, перенесем код вызова в клиентский контекст с директивой &НаКлиенте. В тонком и толстом клиентах объект HTTPСоединение доступен и будет обращаться к локальному стеку машины пользователя. Стоит помнить, что в веб-клиенте объект HTTPСоединение не поддерживается.

Шаг 3. Устранение ошибки «Не могу установить соединение» и настройка сети

Когда сетевое имя успешно разрешено в IP-адрес, но целевой узел не отвечает, платформа возвращает исключение Не могу установить соединение. Разберем основные причины блокировки:

  1. Брандмауэр (Firewall): стандартные правила операционной системы блокируют входящие подключения к портам 80 (HTTP) и 443 (HTTPS). Необходимо открыть входящий трафик для используемого порта в брандмауэре компьютера, на котором развернут веб-сервер.
  2. Привязка веб-сервера (Listen / Bind): в конфигурационном файле веб-сервера (например, httpd.conf для Apache) директива прослушивания портов может быть настроена только на локальный интерфейс Listen 127.0.0.1:80. В таком случае сервер не принимает пакеты от внешних сетевых интерфейсов. Необходимо изменить параметр на Listen 80 или явно указать сетевой IP-адрес.
  3. Прокси-сервер: 1С автоматически подтягивает системные параметры прокси. Если в сети используется прокси-сервер, запросы к локальным адресам могут уходить во внешнюю сеть и там теряться. В конструктор HTTPСоединение можно передать настроенный объект ИнтернетПрокси, указав адреса локальной сети в списке исключений НеИспользоватьПроксиДляАдресов.

Шаг 4. Обработка ответа «Обработчик запроса не найден» (HTTP 404)

Если сетевое соединение установлено успешно, но в теле ответа возвращается текст Обработчик запроса не найден, проблема кроется в настройках опубликованного HTTP-сервиса в конфигураторе или веб-сервере. Проверим следующие параметры:

  1. Соответствие HTTP-метода: метод Соединение.Получить(Запрос) отправляет запрос с HTTP-глаголом GET. Если в шаблоне URL HTTP-сервиса в конфигураторе настроен только метод POST или имя метода не связано с глаголом GET, платформа не найдет нужный обработчик.
  2. Точность шаблона URL и чувствительность к регистру: шаблоны HTTP-сервисов в платформе 1С чувствительны к регистру символов. Если в конфигураторе шаблон задан как /ostatok, а запрос отправляется к /Ostatok, сопоставление не произойдет. Также необходимо точно учитывать ведущие и закрывающие слэши.
  3. Файл публикации (default.vrd): при публикации базы на веб-сервере создается дескриптор default.vrd. Если в параметрах публикации отключена автопубликация сервисов (publishByDefault="false"), а созданный HTTP-сервис не был добавлен в список публикуемых явно, веб-сервер вернет ошибку отсутствия обработчика.

Пример надежной отправки HTTP-запроса

Объединим рассмотренные правила в готовый шаблон процедуры с безопасной обработкой исключений и проверкой кода состояния:


&НаКлиенте
Процедура ВыполнитьЗапросКСервису()
    
    ХостСервера = "192.168.1.55";
    ПортСервера = 80;
    Пользователь = "admin3";
    Пароль = "aspLong3com";
    
    Попытка
        Соединение = Новый HTTPСоединение(ХостСервера, ПортСервера, Пользователь, Пароль, , 15);
        Запрос = Новый HTTPЗапрос("/jsut11_dev2/hs/Ostatok");
        Ответ = Соединение.Получить(Запрос);
        
        Если Ответ.КодСостояния = 200 Тогда
            ТелоОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
            Сообщить("Успешный ответ: " + ТелоОтвета);
        Иначе
            Сообщить(СтрШаблон("Ошибка сервера. Код: %1. Ответ: %2", 
                Ответ.КодСостояния, 
                Ответ.ПолучитьТелоКакСтроку("UTF-8")));
        КонецЕсли;
        
    Исключение
        ИнформацияОбОшибке = ИнформацияОбОшибке();
        Сообщить("Сетевая ошибка при выполнении запроса: " + ОписаниеОшибки(ИнформацияОбОшибке));
    КонецПопытки;
    
КонецПроцедуры

Следуя этой структуре, мы исключаем типичные ошибки маршрутизации, разделяем логику адресации между объектами платформы и обеспечиваем стабильную отладку HTTP-сервисов.

← На главную