Как программно отправить HTTP-запрос с JSON-телом в 1С 8.3?

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

В современной разработке на платформе 1С:Предприятие 8.3 интеграция с внешними веб-сервисами стала повседневной задачей. Чаще всего нам требуется передать данные во внешнюю систему или получить их, используя протокол HTTP и формат данных JSON. В рамках данной статьи мы подробно разберем, как реализовать механизм обмена данными, настроить параметры соединения и правильно сформировать структуру запроса.

Разбираем основные объекты для работы с HTTP

Для реализации обмена данными в 1С используются специализированные объекты. Давайте проанализируем, за что отвечает каждый из них:

  1. HTTPСоединение — основной объект, устанавливающий сессию с сервером. Здесь указываются адрес сервера, порт, данные для авторизации и настройки прокси.
  2. HTTPЗапрос — объект, описывающий конкретный запрос к ресурсу. В нем мы задаем относительный путь (URL), заголовки (Headers) и тело запроса.
  3. HTTPОтвет — объект, который мы получаем от сервера после выполнения запроса. Он содержит код состояния (например, 200 или 404) и само тело ответа.

Шаг 1. Настройка защищенного соединения (SSL)

Большинство современных API работают по протоколу HTTPS. Проанализируем ситуацию: если мы попытаемся подключиться к такому серверу без использования сертификатов, система выдаст ошибку. Рассмотрим, как создать объект защищенного соединения:


// Инициализируем защищенное соединение
// Для использования системных сертификатов оставляем параметры пустыми
Защита = Новый ЗащищенноеСоединениеOpenSSL();

Важно помнить, что в некоторых случаях может потребоваться указание конкретных сертификатов, если сервер требует клиентской аутентификации. Однако для большинства публичных API стандартного конструктора ЗащищенноеСоединениеOpenSSL вполне достаточно.

Шаг 2. Формирование тела запроса в формате JSON

Прежде чем отправить данные, их необходимо сериализовать в формат JSON. Разберем по шагам, как это сделать с помощью встроенных средств 1С. Мы будем использовать объект ЗаписьJSON и структуру данных.


// Подготовим данные для отправки
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("id", 101);
ДанныеЗапроса.Вставить("наименование", "Товар тестовый");
ДанныеЗапроса.Вставить("количество", 10);

// Сериализуем в строку JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();

Использование объекта ЗаписьJSON позволяет гарантировать корректность формата и правильную обработку спецсимволов и кодировок (по умолчанию используется UTF-8 без BOM).

Шаг 3. Подготовка и отправка HTTP-запроса

Теперь рассмотрим процесс создания самого запроса. Нам нужно указать заголовки, чтобы сервер понял, что мы отправляем именно JSON-данные. Основным заголовком здесь является Content-Type.


// Создаем объект запроса, указывая относительный путь к API
АдресРесурса = "/api/v1/products/create";
Запрос = Новый HTTPЗапрос(АдресРесурса);

// Устанавливаем заголовки
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Если требуется базовая авторизация, она добавляется в заголовок Authorization
// Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);

// Помещаем сформированную строку JSON в тело запроса
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Шаг 4. Установка соединения и обработка результата

Выясним, как правильно выполнить отправку и проанализировать ответ сервера. Мы воспользуемся методом ОтправитьДляОбъекта или ВызватьHTTPМетод. Проанализируем пример отправки методом POST.


// Параметры сервера
Сервер = "api.example.com";
Порт = 443;

Попытка
    // Создаем соединение
    Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 30, Защита);
    
    // Выполняем запрос
    Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
    
    // Проверяем код состояния
    Если Ответ.КодСостояния = 200 Или Ответ.КодСостояния = 201 Тогда
        Сообщить("Запрос успешно выполнен!");
        СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        
        // Разберем ответ сервера (десериализация)
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
        РезультатСтруктура = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        
        // Теперь мы можем работать с РезультатСтруктура как с обычной структурой 1С
    Иначе
        Сообщить("Ошибка при выполнении запроса. Код: " + Ответ.КодСостояния);
    КонецЕсли;
    
Исключение
    // Обработка сетевых ошибок или проблем с доступностью сервера
    Инфо = ИнформацияОбОшибке();
    Сообщить("Произошла критическая ошибка: " + КраткоеПредставлениеОшибки(Инфо));
КонецПопытки;

Полезные советы и тонкости работы

Проанализируем несколько важных моментов, которые помогут избежать типовых ошибок при разработке интеграций:

  1. Таймауты: При создании объекта HTTPСоединение всегда указывайте таймаут (в примере выше — 30 секунд). Это предотвратит "зависание" сеанса пользователя при нестабильной работе внешнего сервиса.
  2. Кодировки: Всегда явно указывайте КодировкаТекста.UTF8 и ИспользованиеByteOrderMark.НеИспользовать. Веб-сервисы крайне чувствительны к лишним символам в начале строки (BOM).
  3. Методы: Для получения данных используйте метод GET, для создания — POST, для обновления — PUT или PATCH, для удаления — DELETE. В 1С это реализуется через Соединение.ВызватьHTTPМетод("НАЗВАНИЕ_МЕТОДА", Запрос).
  4. Прокси: Если сервер 1С находится за корпоративным прокси-сервером, необходимо создать объект ИнтернетПрокси и передать его в конструктор HTTPСоединение.

Рассмотрим подробнее ситуацию, когда сервер возвращает ошибку 401 (Unauthorized). Это означает, что ваши учетные данные неверны или срок действия токена истек. В таких случаях мы рекомендуем реализовать механизм автоматического обновления токена перед повторной отправкой основного запроса.

В завершение подчеркнем, что работа с HTTPСоединение требует аккуратной обработки исключений через блок Попытка...Исключение, так как сетевые ошибки (обрыв связи, DNS-проблемы) не зависят от логики вашего кода в 1С.

← На главную