При интеграции 1С с внешними веб-сервисами по протоколу HTTPS разработчики часто сталкиваются с ошибками сетевого взаимодействия. Одной из самых коварных является ошибка "Couldn't resolve host name". На первый взгляд кажется, что проблема в доступности сайта или настройках DNS, но в контексте 1С причина зачастую кроется в неправильном заполнении параметров объектов HTTPСоединение и ЗащищенноеСоединениеOpenSSL. Разберем детально, как правильно организовать загрузку файлов по защищенному каналу и каких ошибок следует избегать.
Рассмотрим ситуацию: разработчик пытается получить XML-файл с адреса, используя полный URL (например, https://example.com/api/data) прямо в конструкторе соединения. В результате платформа выдает ошибку, сообщая, что имя хоста не может быть разрешено. Выясним причину этого поведения.
Объект HTTPСоединение в 1С спроектирован так, что он ожидает в первом параметре только имя домена или IP-адрес. Если передать туда строку, начинающуюся с https:// или содержащую пути после слеша, встроенный механизм (использующий библиотеку curl) попытается найти DNS-запись для всей этой длинной строки. Естественно, такой записи не существует, и система сообщает, что не может «разрешить» (resolve) имя хоста.
Важное правило: протокол (http/https) и путь к конкретному файлу никогда не указываются в первом параметре конструктора HTTPСоединение.
Проанализируем структуру конструктора. Для работы с защищенным соединением нам необходимо передать объект ЗащищенноеСоединениеOpenSSL. Посмотрим на правильный алгоритм действий:
https://afk.ua/ua/price/api/file.xml рабочим доменом будет только afk.ua./ua/price/api/file.xml.Рассмотрим пример кода, который решает задачу корректно:
// 1. Подготовка SSL
СертификатыWindows = Новый СертификатыУдостоверяющихЦентровWindows();
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, СертификатыWindows);
// 2. Настройка параметров соединения
Сервер = "afk.ua"; // Только домен!
Порт = 443; // Стандартный порт для HTTPS
// 3. Создание соединения
HTTPСоединение = Новый HTTPСоединение(Сервер, Порт, , , , , ЗащищенноеСоединение);
// 4. Запрос конкретного ресурса
ПутьКФайлуНаСервере = "ua/price/api/kidway.ua@gmail.com/uts209rz";
ИмяВходящегоФайла = КаталогВременныхФайлов() + "data.xml";
Попытка
HTTPСоединение.Получить(ПутьКФайлуНаСервере, ИмяВходящегоФайла);
Сообщить("Файл успешно загружен в: " + ИмяВходящегоФайла);
Исключение
Сообщить("Ошибка при загрузке: " + ОписаниеОшибки());
КонецПопытки;
Использование объекта ЗащищенноеСоединениеOpenSSL является обязательным для работы с https. Разберем подробнее параметры этого объекта, так как от них зависит стабильность подключения.
В большинстве случаев достаточно использовать СертификатыУдостоверяющихЦентровWindows. Это позволяет 1С доверять тем же центрам сертификации, которым доверяет ваша операционная система. Однако существуют специфические ситуации:
ЗащищенноеСоединениеOpenSSL параметры проверки имени сервера и цепочки сертификатов в значении Ложь (хотя в промышленной эксплуатации это небезопасно).cacert.pem, содержащий цепочки доверенных сертификатов.Существует более простой способ загрузки данных, который часто игнорируют — метод КопироватьФайл. Разберем его особенности. В отличие от HTTPСоединение, этот метод принимает полный URL.
ПутьИсточник = "https://afk.ua/ua/price/api/kidway.ua@gmail.com/uts209rz";
ПутьПриемник = "D:\price_files\data.xml";
Попытка
КопироватьФайл(ПутьИсточник, ПутьПриемник);
Сообщить("Файл скопирован успешно.");
Исключение
Сообщить("Не удалось скопировать файл: " + ОписаниеОшибки());
КонецПопытки;
Преимущества метода: Минимум кода, автоматическая обработка протокола.
Недостатки и ограничения:
User-Agent или Authorization).Если после исправления кода ошибка "Couldn't resolve host name" сохраняется, проанализируем сетевое окружение:
1. Контекст выполнения. Помните, что код, выполняющийся «НаКлиенте», использует настройки сети вашего компьютера, а код «НаСервере» — настройки сервера 1С. Часто доступ к внешним сайтам на серверах ограничен политиками безопасности или требует настройки прокси-сервера.
2. Использование прокси. Если ваша организация использует прокси-сервер, объект HTTPСоединение не сможет выйти в интернет без его указания. Используйте объект ИнтернетПрокси:
Прокси = Новый ИнтернетПрокси(Ложь); // Использовать системные настройки или задать вручную
// Прокси.Установить("http", "192.168.1.1", 8080);
HTTPСоединение = Новый HTTPСоединение(Сервер, Порт, , , Прокси, , ЗащищенноеСоединение);
3. Проверка через утилиты ОС. Чтобы окончательно убедиться, что проблема не в 1С, попробуйте выполнить команду ping afk.ua или использовать curl -v https://afk.ua/... из командной строки сервера. Если curl возвращает данные, а 1С — нет, значит, проблема в параметрах SSL или версии TLS. Современные сайты требуют TLS 1.2 или 1.3, поддержка которых в старых версиях платформы 1С или старых ОС (например, Windows Server 2008) может быть ограничена.
Подводя итог, отметим, что для стабильной работы с SSL в 1С необходимо четко разделять адрес сервера и путь к ресурсу, правильно инициализировать защищенное соединение и учитывать контекст выполнения кода (клиент или сервер).