При интеграции 1С с внешними веб-сервисами программисты часто сталкиваются с ошибками сетевого взаимодействия. Одной из самых распространенных является Ошибка работы с Интернет: Couldn't resolve host name, которая ставит в тупик начинающих разработчиков. В этой статье мы подробно разберем, как правильно настроить обмен данными по протоколу HTTPS, почему возникают ошибки резолва имен и как оптимизировать код для работы с JSON и XML.
Проанализируем ситуацию: при создании объекта HTTPСоединение разработчики часто совершают ошибку, передавая в качестве адреса сервера полную ссылку, например, https://services.test.ru/test. Это в корне неверно. Рассмотрим, как работает конструктор объекта HTTPСоединение. Он ожидает именно имя сервера (хост), а не полный путь к ресурсу.
Выясним причину ошибки Couldn't resolve host name. Система пытается найти в сети сервер с именем, которое включает в себя протокол (https://) и путь (/test). Естественно, DNS-сервер не может найти такой узел. Для исправления ситуации необходимо разделять адрес на две составляющие:
services.test.ru./test/addPost.php.Рассмотрим по шагам, как должен выглядеть правильный вызов:
// Неправильно:
// Соединение = Новый HTTPСоединение("https://services.test.ru/test");
// Правильно:
Сервер = "services.test.ru";
Соединение = Новый HTTPСоединение(Сервер);
Когда мы работаем с протоколом HTTPS, недостаточно просто указать корректное имя хоста. По умолчанию 1С пытается установить обычное незащищенное соединение по порту 80. Для работы с HTTPS нам необходимо использовать объект ЗащищенноеСоединениеOpenSSL. Без этого параметра вы, скорее всего, получите ошибку тайм-аута или принудительного разрыва соединения сервером.
Проанализируем параметры конструктора. Для большинства задач достаточно создать стандартный объект защиты. Посмотрим на пример:
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("services.test.ru", 443, Логин, Пароль, , , Защита);
Здесь 443 — это стандартный порт для HTTPS. Использование ЗащищенноеСоединениеOpenSSL позволяет 1С автоматически обрабатывать SSL-сертификаты. Если веб-сервис использует самоподписанный сертификат, может потребоваться дополнительная настройка параметров сертификатов удостоверяющих центров, но для публичных сервисов стандартного конструктора обычно достаточно.
В старых примерах часто встречается методика с использованием временных файлов на диске через ЗаписьТекста и метод ОтправитьДляОбработки. Это не самый эффективный путь. Современная платформа 1С позволяет работать напрямую с телом запроса в памяти, что значительно быстрее и безопаснее (особенно при работе в кластере серверов, где доступ к файловой системе может быть ограничен).
Разберем использование объекта HTTPЗапрос. Вместо того чтобы сохранять JSON в файл, мы передадим его напрямую как строку. Посмотрим на этот процесс подробнее:
// 1. Формируем JSON в строку
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
// ... логика записи JSON объектов ...
СтрокаJSON = ЗаписьJSON.Закрыть();
// 2. Настраиваем заголовки
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// 3. Создаем запрос
// Путь к ресурсу должен начинаться с "/"
ПутьКРесурсу = "/test/addPost.php";
Запрос = Новый HTTPЗапрос(ПутьКРесурсу, Заголовки);
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
// 4. Отправляем и получаем ответ
Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
Важный момент, который мы проанализировали: использование ИспользованиеByteOrderMark.НеИспользовать. Некоторые веб-сервисы (особенно на базе PHP или Node.js) некорректно обрабатывают символ BOM в начале строки, что приводит к ошибке 400 Bad Request. Всегда проверяйте это при отправке данных.
После вызова метода ВызватьHTTPМетод мы получаем объект HTTPОтвет. Крайне важно проверять код состояния, прежде чем пытаться обработать данные. Рассмотрим пример надежной обработки:
Если Ответ.КодСостояния = 200 Тогда
// Успех, читаем тело
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
// Если сервис возвращает XML, используем ЧтениеXML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстОтвета);
// Обработка данных через XDTO или обход узлов
// ...
Иначе
Сообщить("Ошибка сервиса! Код состояния: " + Ответ.КодСостояния);
Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
При работе с внешними ресурсами нельзя полагаться на мгновенный ответ. Если сеть нестабильна или сервис перегружен, 1С может "зависнуть" в ожидании ответа. Чтобы этого избежать, всегда указывайте таймаут в конструкторе HTTPСоединение.
Разберем параметры: шестой параметр конструктора — это таймаут в секундах. Рекомендуется устанавливать значение от 30 до 60 секунд в зависимости от сложности запроса.
Таймаут = 30; // 30 секунд
Соединение = Новый HTTPСоединение(Сервер, 443, Логин, Пароль, , Таймаут, Защита);
Подведем итог и соберем идеальный шаблон для отправки данных по HTTPS:
ЗащищенноеСоединениеOpenSSL.HTTPЗапрос и метод УстановитьТелоИзСтроки вместо временных файлов.КодСостояния ответа.Используя эти принципы, вы создадите надежный механизм интеграции, который будет устойчив к сетевым сбоям и корректно воспринят внешними веб-сервисами.