Как настроить интеграцию с API курьерской службы через HTTP POST в 1С

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

При интеграции 1С с внешними сервисами, такими как курьерские службы (на примере платформы Measoft/CourierExe), разработчики часто сталкиваются со стандартными сетевыми ошибками: 400 Bad Request и 301 Moved Permanently. Эти ошибки обычно сигнализируют не о проблемах в логике программы, а о неверной настройке параметров HTTP-соединения или структуры URI. В этой статье мы подробно разберем, как правильно сконфигурировать обмен данными, настроить защищенное соединение и избежать типичных ловушек при работе с веб-серверами под управлением nginx.

Причина ошибки 400: Plain HTTP request sent to HTTPS port

Первая проблема, с которой мы сталкиваемся, — это попытка отправить обычный HTTP-запрос на порт, ожидающий зашифрованный трафик (HTTPS). Рассмотрим исходный некорректный код:


HTTP = Новый HTTPСоединение("home.courierexe.ru", логин, пароль);
Запрос = Новый HTTPЗапрос("/api");
HTTP.ОтправитьДляОбработки(Запрос, "D:\Денис\otvet.xml");

В данном случае объект HTTPСоединение по умолчанию пытается инициализировать соединение по протоколу HTTP (порт 80). Однако современные API практически всегда работают через HTTPS (порт 443). Когда сервер получает незашифрованные данные на защищенный порт, он возвращает ошибку 400. Выясним, как это исправить.

Для активации защищенного протокола нам необходимо использовать объект ЗащищенноеСоединениеOpenSSL. Давайте модифицируем конструктор соединения:


СоединениеSSL = Новый ЗащищенноеСоединениеOpenSSL();
HTTP = Новый HTTPСоединение("home.courierexe.ru", , , , , , СоединениеSSL);

Важный нюанс: Обратите внимание, что логин и пароль в параметрах HTTPСоединение используются для базовой (Basic) авторизации на уровне HTTP-заголовков. Однако спецификации многих курьерских служб требуют передавать учетные данные непосредственно внутри XML-пакета. Перед реализацией проверьте документацию вашего API.

Разбор ошибки 301: Moved Permanently и важность завершающего слеша

После включения SSL разработчики часто натыкаются на следующую проблему — статус 301 Moved Permanently. Проанализируем ситуацию: сервер сообщает, что ресурс перемещен. Чаще всего это происходит из-за конфигурации сервера nginx, который настроен на перенаправление запросов с адресов без завершающего слеша на адреса со слешем.

В нашем примере запрос к ресурсу "/api" сервер воспринимает как обращение к директории и пытается "дописать" слеш в конце. Чтобы избежать лишнего перенаправления (которое при методе POST может привести к потере тела запроса), мы должны сразу указывать верный путь.

Правильное формирование объекта HTTPЗапрос:


// Вместо "/api" используем "/api/"
Запрос = Новый HTTPЗапрос("/api/"); 

Формирование тела запроса и установка заголовков

Для успешного взаимодействия с API недостаточно просто установить соединение. Мы должны подготовить данные в формате XML и правильно сообщить серверу о типе передаваемого контента. Разберем по шагам, как это сделать в 1С.

Во-первых, установим заголовок Content-Type. Это критически важно, так как без него сервер может не понять, как интерпретировать входящий поток байтов. Проанализируем пример кода:


Запрос = Новый HTTPЗапрос("/api/");
Запрос.Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");

Во-вторых, передадим само тело запроса. Если у вас уже сформирован файл с XML-данными (например, заказ), мы используем метод УстановитьИмяФайлаТела. Если данные находятся в строковой переменной, используем УстановитьТелоИзСтроки.


// Вариант 1: Из файла
Запрос.УстановитьИмяФайлаТела("C:\Temp\request.xml");

// Вариант 2: Из строки (предпочтительнее для динамических запросов)
ТекстXML = "<request>...</request>";
Запрос.УстановитьТелоИзСтроки(ТекстXML, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Структура XML для курьерской службы Measoft

Рассмотрим подробнее, что должно содержаться в XML-файле для корректной авторизации. Система CourierExe требует наличия блока <auth> внутри корневого тега. Посмотрим на пример структуры:


<request>
    <auth login="ваш_логин" password="ваш_пароль" extra="код_клиента" />
    <method_name>
        <!-- Параметры метода -->
    </method_name>
</request>

Если вы не укажете этот блок в теле запроса, сервер может вернуть успешный HTTP-статус 200, но в теле ответа будет содержаться сообщение об ошибке бизнес-логики.

Итоговый пример надежного кода для отправки запроса

Теперь объединим все полученные знания в единую процедуру, которую можно использовать в реальной разработке. Мы предусмотрим создание защищенного соединения, правильные пути и обработку результата.


Процедура ОтправитьЗаказВКурьерскуюСлужбу()
    
    Сервер = "home.courierexe.ru";
    Ресурс = "/api/"; // Обязательно со слешем в конце
    
    // Инициализируем защищенное соединение
    SSL = Новый ЗащищенноеСоединениеOpenSSL();
    
    Попытка
        HTTP = Новый HTTPСоединение(Сервер, , , , , 30, SSL);
        
        Запрос = Новый HTTPЗапрос(Ресурс);
        Запрос.Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
        
        // Указываем файл с подготовленным XML-заказом
        ПутьКФайлуЗапроса = "D:\Обмен\zakaz.xml";
        Запрос.УстановитьИмяФайлаТела(ПутьКФайлуЗапроса);
        
        // Отправляем запрос и получаем ответ в файл
        ПутьКФайлуОтвета = "D:\Обмен\otvet.xml";
        Результат = HTTP.ОтправитьДляОбработки(Запрос, ПутьКФайлуОтвета);
        
        Если Результат.КодСостояния = 200 Тогда
            Сообщить("Запрос успешно обработан сервером.");
            // Здесь можно прочитать файл ответа и обработать XML
        Иначе
            Сообщить("Ошибка сервера! Код состояния: " + Результат.КодСостояния);
            // В случае ошибки 301/400/500 анализируем текст ответа
        КонецЕсли;
        
    Исключение
        Сообщить("Ошибка связи с сервером: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Полезные советы для отладки

  1. Использование внешних инструментов: Если 1С выдает неясную ошибку, воспользуйтесь утилитой Postman или cURL. Если запрос проходит там, значит, проблема в настройках объекта HTTPСоединение (заголовки, SSL или параметры конструктора).
  2. Анализ заголовков ответа: При получении ошибки 301, посмотрите на заголовок Location в ответе сервера. Он точно укажет, какой именно URL ожидает система.
  3. Тайм-ауты: При работе с внешними API всегда устанавливайте тайм-аут (в примере выше — 30 секунд). Курьерские сервисы могут долго обрабатывать запросы в периоды высокой нагрузки, и стандартное бесконечное ожидание может привести к "зависанию" сеанса пользователя в 1С.
  4. Логирование: В промышленной эксплуатации всегда сохраняйте текст отправленного XML и полученного ответа. Это позволит быстро разобраться в причинах отказов без необходимости повторного воспроизведения ситуации.

Соблюдение этих правил позволит вам создать стабильную интеграцию с любой курьерской службой, использующей протокол HTTP POST и формат XML для обмена данными.

← На главную