Как правильно отправить POST-запрос с JSON данными из 1С на внешний API?

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

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

Давайте проанализируем процесс создания HTTP-клиента в 1С шаг за шагом. Мы создадим универсальный механизм, который можно использовать для любых API.

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

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

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


// Создаем структуру с данными
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("number", "00001");
ДанныеЗаказа.Вставить("date", "2023-10-27");
ДанныеЗаказа.Вставить("amount", 5000);

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

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

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

В этом блоке мы используем метод ЗаписатьJSON. Обратите внимание, что для корректной передачи даты может потребоваться настройка параметров сериализации, но для простых типов (строки, числа, булево) стандартных настроек достаточно.

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

Для взаимодействия с сервером используется объект HTTPСоединение. Ключевой момент, который часто вызывает ошибки, — это работа по защищенному протоколу HTTPS. Если целевой ресурс использует HTTPS (а это 99% современных API), нам необходимо создать защищенное соединение.

Разберем создание HTTPСоединение с учетом SSL:


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

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

// Создание соединения
Соединение = Новый HTTPСоединение(
    Сервер, 
    Порт, 
    ,, // Пользователь и пароль (если нужна Basic Auth)
    ,  // Прокси
    ,  // Таймаут
    ЗащищенноеСоединение // Обязательно для HTTPS
);

Важно: Если вы не передадите параметр ЗащищенноеСоединение при обращении к https:// ресурсу, 1С вернет ошибку установления связи. Использование Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено) говорит платформе использовать сертификаты, установленные в операционной системе, что обычно достаточно для валидных "белых" сертификатов.

3. Формирование HTTP-запроса и заголовков

Теперь создадим объект HTTPЗапрос. Самая частая ошибка новичков — отсутствие правильных заголовков. Веб-сервер должен "понимать", что мы отправляем ему именно JSON. За это отвечает заголовок Content-Type.

Посмотрим, как правильно настроить запрос:


Запрос = Новый HTTPЗапрос(Ресурс);

// Устанавливаем заголовки
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");

// Если API требует авторизации по токену
Токен = "Ваш_Токен_Доступа";
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);

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

Мы используем метод УстановитьТелоИзСтроки. Здесь критически важно явно указать кодировку КодировкаТекста.UTF8, так как JSON стандартизирован именно в этой кодировке. Если отправить данные в windows-1251, сервер получатель скорее всего вернет ошибку парсинга или "кракозябры".

4. Отправка запроса и обработка ответа

Финальный этап — вызов метода отправки и анализ ответа сервера. Мы должны предусмотреть обработку не только успешного статуса 200, но и ошибок.


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

5. Разбор типичных проблем

Давайте проанализируем ситуации, когда код написан верно, но обмен не работает:

  1. Ошибка 400 Bad Request. Чаще всего означает ошибку в структуре JSON. Проверьте тело запроса через отладчик или онлайн-валидаторы JSON. Возможно, вы передаете строку там, где ожидается число, или нарушили обязательность полей.
  2. Ошибка сертификата. Если сервер использует самоподписанный сертификат (например, тестовый контур), 1С откажется соединяться. В этом случае нужно импортировать сертификат в хранилище сертификатов сервера 1С (cacert.pem) или временно отключить проверку (что небезопасно для продакшена).
  3. Проблемы с кодировкой. Всегда явно указывайте КодировкаТекста.UTF8 при установке тела запроса и чтении ответа. По умолчанию 1С может использовать системную кодировку ОС.

Рекомендации по оптимизации

Если вам нужно отправлять много запросов подряд, не создавайте HTTPСоединение в цикле. Инициализация соединения (особенно SSL handshake) — дорогая операция. Создайте соединение один раз и используйте его для отправки серии запросов:


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

Для Каждого Заказ Из СписокЗаказов Цикл
    // Подготовка JSON для текущего заказа
    // ...
    // Создание нового запроса (HTTPЗапрос нужно создавать новый для каждого вызова)
    Запрос = Новый HTTPЗапрос(Ресурс);
    // ...
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
КонецЦикла;

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

← На главную