При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ошибкой «HTTPСоединение - Ошибка работы с Интернет: Couldn't resolve host name». Эта ошибка означает, что платформа не смогла преобразовать указанное доменное имя сервера в IP-адрес. Несмотря на то, что текст ошибки намекает на проблемы с сетевым подключением, в подавляющем большинстве случаев причина кроется в некорректном написании кода в конфигурации 1С.
В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем типичные ошибки начинающих разработчиков и рассмотрим правильные способы настройки объектов HTTPСоединение и HTTPЗапрос. Для более глубокого изучения темы начинающим программистам пригодится интерактивный обучающий курс по HTTP-запросам.
Рассмотрим ситуацию, с которой столкнулся автор темы. В коде была предпринята попытка создать соединение следующим образом:
HTTPСоединение = Новый HTTPСоединение("https://sait.ru", 443, "login", "pass", , , Новый ЗащищенноеСоединениеOpenSSL(), Ложь);
Проанализируем этот фрагмент. Главная ошибка здесь заключается в параметре Сервер. В 1С конструктор объекта HTTPСоединение ожидает получить только чистое имя хоста или его IP-адрес. Указание протокола (в данном случае https://) внутри строки адреса недопустимо. Платформа пытается найти в сети сервер, имя которого буквально начинается с символов "https://", что, естественно, завершается неудачей и ошибкой разрешения имени (DNS).
Выясним, как правильно указывать адрес. Для системы 1С протокол определяется не строкой адреса, а использованием объекта ЗащищенноеСоединениеOpenSSL. Если этот объект передан в параметрах, 1С понимает, что нужно использовать защищенный протокол HTTPS.
Еще одна частая ошибка — попытка указать полный путь к методу API (например, sait.ru/api/orders) непосредственно в конструкторе соединения. Разберем по шагам, как правильно структурировать параметры:
"sait.ru")."/api/orders").Посмотрим на исправленный вариант кода, который является рабочим:
// 1. Создаем защищенное соединение
Защита = Новый ЗащищенноеСоединениеOpenSSL();
// 2. Инициализируем соединение БЕЗ протокола https:// в строке адреса
// Порт 443 для HTTPS можно не указывать, если он стандартный
Сервер = "sait.ru";
HTTPСоединение = Новый HTTPСоединение(Сервер, , "login", "pass", , , Защита);
// 3. Создаем запрос, указывая путь к методу
ПутьКМетоду = "/api/orders";
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");
HTTPЗапрос = Новый HTTPЗапрос(ПутьКМетоду, Заголовки);
Если после исправления синтаксиса ошибка Couldn't resolve host name сохраняется, нам необходимо проанализировать, где именно исполняется код. В 1С разрешение имен DNS происходит на той машине, где запущен соответствующий процесс.
Если код выполняется в контексте НаСервере, то запрос во внешний мир отправляет сервер приложений 1С (rphost). Часто серверы 1С находятся в закрытых корпоративных сетях и не имеют прямого доступа к внешним DNS-серверам или интернету. В то же время, на клиентском компьютере (в браузере) сайт может открываться без проблем.
Для диагностики этой ситуации попробуйте выполнить следующие действия на сервере 1С:
hosts на сервере (находится в C:\Windows\System32\drivers\etc\hosts). Иногда в него требуется вручную добавить соответствие IP-адреса и домена.rphost.exe.В корпоративных средах доступ к внешним ресурсам часто осуществляется через прокси-сервер. Если прокси не настроен в 1С, попытка прямого обращения к DNS также вызовет ошибку разрешения имени. Рассмотрим, как передать настройки прокси в HTTPСоединение:
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("https", "proxy.company.ru", 8080, "proxy_user", "proxy_pass");
// Прокси передается 5-м параметром в конструктор
HTTPСоединение = Новый HTTPСоединение("sait.ru", , , , Прокси, , Новый ЗащищенноеСоединениеOpenSSL());
Проанализируем еще один важный технический момент из примера. Автор передает логин и пароль одновременно двумя способами: в параметрах HTTPСоединение и вручную в заголовке Authorization (Basic auth).
Это является избыточным. Если вы указываете логин и пароль в конструкторе HTTPСоединение, платформа 1С сама сформирует нужные заголовки авторизации при отправке запроса. Если же сервис требует специфического формата авторизации, лучше передавать учетные данные только через заголовки HTTPЗапрос, оставив параметры логина и пароля в соединении пустыми. Смешивание этих способов иногда приводит к тому, что веб-сервер отклоняет запрос с ошибками 401 или 403, которые могут путать разработчика при отладке.
Иногда ошибка «работы с Интернет» может возникать из-за проблем с сертификатами, хотя сообщение Couldn't resolve host name специфично именно для DNS. Тем не менее, при работе с ЗащищенноеСоединениеOpenSSL полезно знать, как исключить влияние проверки сертификатов при диагностике:
// Создание объекта без проверки сертификатов (только для целей отладки!)
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
HTTPСоединение = Новый HTTPСоединение("sait.ru", , , , , , Защита);
Если после этого ошибка сменится на другую (например, 404), значит, проблема с доступностью хоста решена, и следует переходить к отладке структуры самого запроса. Для быстрой проверки и формирования кода взаимодействия можно использовать инструмент для тестирования REST API в 1С.
Резюме: Чтобы победить ошибку разрешения имени, всегда проверяйте параметр «Сервер» на наличие лишних символов (http://, /, пробелы) и четко разделяйте адрес хоста и путь к ресурсу между объектами соединения и запроса.