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

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

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

Мы рассмотрим процесс пошагово, начиная от подготовки данных и заканчивая получением результата. Будем использовать стандартные методы платформы, доступные в современных версиях 1С.

Шаг 1. Подготовка данных и сериализация в JSON

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

Рассмотрим пример, где нам нужно отправить информацию о заказе. Создадим структуру с данными:


// Подготовим данные для отправки
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("order_id", "12345");
ДанныеЗаказа.Вставить("date", Строка(ТекущаяДата()));
ДанныеЗаказа.Вставить("amount", 5000);

МассивТоваров = Новый Массив;
МассивТоваров.Добавить(Новый Структура("product", "Товар 1"));
МассивТоваров.Добавить(Новый Структура("product", "Товар 2"));

ДанныеЗаказа.Вставить("items", МассивТоваров);

Теперь нам нужно превратить эту структуру в строку. Обратите внимание: при записи JSON важно явно указывать параметры записи, чтобы формат соответствовал ожиданиям сервера (например, экранирование символов). Рассмотрим код сериализации:


// Настройки записи JSON
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина); 

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

ЗаписатьJSON(ЗаписьJSON, ДанныеЗаказа);

СтрокаJSON = ЗаписьJSON.Закрыть();

В переменной СтрокаJSON теперь содержится готовый текст, который мы будем передавать в теле запроса.

Шаг 2. Настройка HTTP-соединения и SSL

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

Разберем создание объекта HTTPСоединение:

  1. Укажем адрес сервера (хост) без протокола (например, "api.example.com").
  2. Укажем порт (для HTTPS это обычно 443).
  3. Создадим объект ЗащищенноеСоединениеOpenSSL для работы по HTTPS.

Сервер = "api.example.com";
Порт = 443; // Стандартный порт для HTTPS
Ресурс = "/v1/orders/create"; // Адрес метода API

// Настройка SSL (для HTTPS)
// В большинстве случаев достаточно пустого конструктора,
// но иногда требуются сертификаты клиента
SSL = Новый ЗащищенноеСоединениеOpenSSL(неопределено, неопределено);

// Создание соединения
Соединение = Новый HTTPСоединение(
    Сервер, 
    Порт, 
    ,, // Пользователь и пароль (если нужна Basic Auth)
    ,  // Прокси
    60, // Таймаут в секундах
    SSL // Наш объект SSL
);

Важно: Если вы работаете с самоподписанными сертификатами или тестовыми серверами, настройки ЗащищенноеСоединениеOpenSSL могут потребовать указания файла сертификата.

Шаг 3. Формирование заголовков и объекта запроса

Сервер должен понимать, в каком формате мы присылаем данные. Для этого критически важно установить заголовок Content-Type. Также часто требуются заголовки для авторизации (например, токен).

Создадим объект HTTPЗапрос и заполним заголовки:


// Заголовки запроса
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Заголовки.Вставить("Authorization", "Bearer Ваш_Токен_Доступа");

// Создание запроса к конкретному ресурсу
ЗапросHTTP = Новый HTTPЗапрос(Ресурс, Заголовки);

Теперь необходимо поместить наше JSON-тело внутрь запроса. Для этого используем метод УстановитьТелоИзСтроки. Обязательно указываем кодировку КодировкаТекста.UTF8, так как это стандарт де-факто для веб-обмена.


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

Обратите внимание на параметр ИспользованиеByteOrderMark.НеИспользовать (BOM). Многие веб-серверы (особенно написанные на PHP или Python) могут некорректно обрабатывать JSON, если в начале строки присутствует маркер последовательности байтов (BOM), который 1С может добавить по умолчанию.

Шаг 4. Отправка запроса и получение ответа

Все готово для отправки. Используем метод ОтправитьДляОбработки или ВызватьHTTPМетод. Для POST-запросов чаще всего используется второй вариант или специализированный метод.

Проанализируем код отправки:


Попытка
    // Выполнение POST запроса
    ОтветHTTP = Соединение.ВызватьHTTPМетод("POST", ЗапросHTTP);
    
    // Также можно использовать:
    // ОтветHTTP = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
Исключение
    Сообщить("Ошибка соединения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Шаг 5. Обработка результатов

После выполнения запроса мы получаем объект HTTPОтвет. Нам нужно проверить два свойства:

  1. КодСостояния — числовой код HTTP (200, 201 — успех, 4xx, 5xx — ошибки).
  2. ПолучитьТелоКакСтроку() — текст ответа от сервера (обычно тоже JSON).

Давайте посмотрим, как правильно обработать ответ:


КодОтвета = ОтветHTTP.КодСостояния;
ТекстОтвета = ОтветHTTP.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);

Если КодОтвета = 200 Или КодОтвета = 201 Тогда
    Сообщить("Успешная отправка!");
    // Читаем ответ сервера (например, ID созданного заказа)
    Попытка
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
        ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        
        Сообщить("ID заказа: " + ДанныеОтвета.id);
    Исключение
        Сообщить("Не удалось прочитать JSON ответа: " + ТекстОтвета);
    КонецПопытки;
Иначе
    Сообщить("Ошибка API. Код: " + КодОтвета);
    Сообщить("Тело ошибки: " + ТекстОтвета);
КонецЕсли;

Частые ошибки и рекомендации

При реализации интеграции обратите внимание на следующие нюансы:

Используя этот подход, вы сможете организовать надежный обмен данными с любыми REST API сервисами.

← На главную