Как реализовать GET и POST запросы к API транспортной компании в 1С:Предприятии 8.3

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

Интеграция 1С с внешними сервисами через HTTP-запросы — это одна из наиболее часто встречающихся задач современного разработчика. В данной статье мы подробно разберем, как правильно организовать обмен данными с API на примере транспортной компании, проанализируем типичные ошибки новичков и рассмотрим готовые шаблоны кода для GET и POST методов.

Разбираем основы: отличия GET от POST в контексте 1С

Первое, с чем сталкивается разработчик при работе с API — это выбор правильного метода передачи данных. Рассмотрим ситуацию: нам нужно получить статус заказа или отправить заявку на доставку. Проанализируем, какие инструменты предоставляет платформа 1С:Предприятие.

Для выполнения GET-запроса (получение данных) используется метод Получить() объекта HTTPСоединение. Важно помнить, что в GET-запросах параметры передаются непосредственно в строке адреса (URL) после вопросительного знака. Попытка установить тело запроса через УстановитьТелоИзСтроки() для GET-метода является ошибкой, так как большинство серверов просто проигнорируют это тело.

Для выполнения POST-запроса (отправка или изменение данных) в 1С чаще всего используется метод ОтправитьДляОбработки(). Здесь параметры могут передаваться как в URL, так и в теле запроса (Body), что более безопасно и позволяет передавать большие объемы данных, например, структуры JSON.

Реализация GET-запроса: получаем статус заказа

Рассмотрим пример, когда нам нужно получить данные от сервера api.e-bulky.ru. Одной из частых ошибок является неверное указание базового адреса или версии API. Выясним причину ошибки 404: часто она возникает, если в HTTPСоединение указан только домен, а в HTTPЗапрос — неполный путь. Рекомендуется всегда использовать актуальные версии ресурсов, например, /apiv2/.

Проанализируем правильный код для GET-запроса:


// Создаем защищенное соединение (SSL)
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.e-bulky.ru", 443, , , , , Защита);

// Параметры передаем прямо в строке ресурса
КлючAPI = "ваш_ключ";
АдресРесурса = "/apiv2/getstatus?key=" + КлючAPI + "&order_id=12345";

Заголовки = Новый Соответствие;
Заголовки.Вставить("accept", "application/json");

HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);

// Используем метод Получить()
Ответ = Соединение.Получить(HTTPЗапрос);

Если Ответ.КодСостояния = 200 Тогда
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
    Данные = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
КонецЕсли;

Важный момент: если в параметрах запроса передаются строковые значения (например, ФИО или адрес), их обязательно нужно кодировать. Для этого используем функцию КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL). Без этого спецсимволы и кириллица могут привести к ошибке сервера.

Реализация POST-запроса: подтверждение заказа

Теперь разберем более сложную задачу — отправку подтверждения заказа. Здесь нам потребуется метод ОтправитьДляОбработки(). В данном примере параметры также могут передаваться в строке запроса, но заголовки должны четко указывать тип контента application/x-www-form-urlencoded или application/json.

Посмотрим на пример функции, которая выполняет POST-запрос и обрабатывает результат во временный файл:


Функция ОтправитьПодтверждениеЗаказа(КлючAPI, НомерЗаявки)
    Ресурс = "/apiv2/confirmorder";
    // Формируем строку параметров
    ПараметрыСтрокой = "?key=" + КлючAPI + "&inner_n=" + СокрЛП(НомерЗаявки);
    
    Соединение = Новый HTTPСоединение("api.e-bulky.ru", , , , , , Новый ЗащищенноеСоединениеOpenSSL());
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("accept", "application/json");
    Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
    
    ИмяФайлаРезультата = ПолучитьИмяВременногоФайла();
    
    Попытка
        HTTPЗапрос = Новый HTTPЗапрос(Ресурс + ПараметрыСтрокой, Заголовки);
        // Отправляем POST запрос
        Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос, ИмяФайлаРезультата);
        
        Если Ответ.КодСостояния = 200 Тогда
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.ОткрытьФайл(ИмяФайлаРезультата);
            ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
            ЧтениеJSON.Закрыть();
            
            Если ДанныеОтвета.status = "200" Тогда
                Возврат ДанныеОтвета.response;
            КонецЕсли;
        КонецЕсли;
    Исключение
        ЗаписьЖурналаРегистрации("API.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
    КонецПопытки;
КонецФункции

Как передавать массивы в параметрах (интервалы времени)

Часто возникает вопрос: как передать массив данных (например, несколько временных интервалов interval) через URL? В API многих транспортных компаний, включая Bulky, используется стандарт дублирования ключей с квадратными скобками.

Разберем, как это реализовать в 1С. Если нам нужно передать два интервала, строка запроса должна выглядеть так: ?interval[]=10:00&interval[]=14:00. Поскольку в 1С объект HTTPЗапрос не умеет автоматически преобразовывать массивы в такую строку, мы собираем ее вручную циклом:


МассивИнтервалов = Новый Массив;
МассивИнтервалов.Добавить("10:00");
МассивИнтервалов.Добавить("18:00");

СтрокаПараметров = "";
Для Каждого Интервал Из МассивИнтервалов Цикл
    Разделитель = ?(ПустаяСтрока(СтрокаПараметров), "?", "&");
    СтрокаПараметров = СтрокаПараметров + Разделитель + "interval[]=" + КодироватьСтроку(Интервал, СпособКодированияСтроки.КодировкаURL);
КонецЦикла;

Рекомендации по надежной работе с API

Чтобы ваша интеграция работала стабильно, придерживайтесь следующих правил:

  1. Проверка HTTP-статусов: Всегда проверяйте КодСостояния ответа. Код 200 означает успех, 401 — проблемы с авторизацией (ключом), 404 — неверный адрес ресурса, а 500 — ошибку на стороне сервера ТК.
  2. Таймауты: Устанавливайте таймаут в конструкторе HTTPСоединение (например, 30 или 60 секунд). Запросы к транспортным компаниям могут выполняться долго, так как серверу нужно рассчитать стоимость или маршрут.
  3. Логирование: Обязательно записывайте тело ответа сервера в журнал регистрации при возникновении ошибок. Часто API возвращает описание ошибки в формате JSON внутри тела ответа, даже если HTTP-код отличается от 200.
  4. Обработка дат: Помните, что большинство API ожидают даты в формате ISO (ГГГГ-ММ-ДД). Используйте Формат(ТвояДата, "ДФ=yyyy-MM-dd") для корректной передачи дат.

Используя предложенные примеры и методику работы с HTTPСоединение, вы сможете построить надежный мост между 1С:Предприятием и любой логистической системой.

← На главную