Как правильно отправить данные через протокол HTTPS в 1С: решение проблем с именами хостов и защищенным соединением

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

При интеграции 1С с внешними веб-сервисами программисты часто сталкиваются с ошибками сетевого взаимодействия. Одной из самых распространенных является Ошибка работы с Интернет: Couldn't resolve host name, которая ставит в тупик начинающих разработчиков. В этой статье мы подробно разберем, как правильно настроить обмен данными по протоколу HTTPS, почему возникают ошибки резолва имен и как оптимизировать код для работы с JSON и XML.

Разбор типичной ошибки: Хост против URL

Проанализируем ситуацию: при создании объекта HTTPСоединение разработчики часто совершают ошибку, передавая в качестве адреса сервера полную ссылку, например, https://services.test.ru/test. Это в корне неверно. Рассмотрим, как работает конструктор объекта HTTPСоединение. Он ожидает именно имя сервера (хост), а не полный путь к ресурсу.

Выясним причину ошибки Couldn't resolve host name. Система пытается найти в сети сервер с именем, которое включает в себя протокол (https://) и путь (/test). Естественно, DNS-сервер не может найти такой узел. Для исправления ситуации необходимо разделять адрес на две составляющие:

  1. Сервер (Хост): только доменное имя, например, services.test.ru.
  2. Ресурс: путь на сервере, например, /test/addPost.php.

Рассмотрим по шагам, как должен выглядеть правильный вызов:


// Неправильно:
// Соединение = Новый HTTPСоединение("https://services.test.ru/test");

// Правильно:
Сервер = "services.test.ru";
Соединение = Новый HTTPСоединение(Сервер);

Настройка защищенного соединения (SSL/TLS)

Когда мы работаем с протоколом HTTPS, недостаточно просто указать корректное имя хоста. По умолчанию 1С пытается установить обычное незащищенное соединение по порту 80. Для работы с HTTPS нам необходимо использовать объект ЗащищенноеСоединениеOpenSSL. Без этого параметра вы, скорее всего, получите ошибку тайм-аута или принудительного разрыва соединения сервером.

Проанализируем параметры конструктора. Для большинства задач достаточно создать стандартный объект защиты. Посмотрим на пример:


Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("services.test.ru", 443, Логин, Пароль, , , Защита);

Здесь 443 — это стандартный порт для HTTPS. Использование ЗащищенноеСоединениеOpenSSL позволяет 1С автоматически обрабатывать SSL-сертификаты. Если веб-сервис использует самоподписанный сертификат, может потребоваться дополнительная настройка параметров сертификатов удостоверяющих центров, но для публичных сервисов стандартного конструктора обычно достаточно.

Отказ от временных файлов в пользу объекта HTTPЗапрос

В старых примерах часто встречается методика с использованием временных файлов на диске через ЗаписьТекста и метод ОтправитьДляОбработки. Это не самый эффективный путь. Современная платформа 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:

  1. Разделяем адрес: хост отдельно, путь к скрипту отдельно.
  2. Используем SSL: обязательно передаем объект ЗащищенноеСоединениеOpenSSL.
  3. Работаем в памяти: используем HTTPЗапрос и метод УстановитьТелоИзСтроки вместо временных файлов.
  4. Следим за кодировкой: UTF-8 без BOM — наиболее универсальный стандарт для JSON-запросов.
  5. Проверяем результат: всегда анализируем КодСостояния ответа.

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

← На главную