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

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

Работа с внешними API — одна из самых частых задач для разработчика 1С в современных условиях. Интеграция с маркетплейсами, CRM-системами или мессенджерами часто требует отправки данных методом POST в формате JSON. Несмотря на кажущуюся простоту, здесь есть множество нюансов: от правильной установки заголовков до корректной кодировки тела запроса.

В этой статье мы подробно разберем ситуацию, когда сервер возвращает ошибку (например, 400 Bad Request) при попытке отправки данных, и рассмотрим правильный алгоритм реализации HTTP-обмена.

Основные причины проблем при отправке запросов

Проанализируем основные ошибки, с которыми сталкиваются разработчики при написании кода обмена:

  1. Отсутствие заголовков. Сервер не понимает, в каком формате пришли данные, если не указан Content-Type.
  2. Неверная сериализация JSON. Ручное формирование строки JSON часто приводит к ошибкам экранирования кавычек или спецсимволов.
  3. Проблемы с SSL. При работе через HTTPS необходимо корректно настраивать защищенное соединение.
  4. Кодировка текста. Отправка данных не в UTF-8 может привести к "кракозябрам" на принимающей стороне.

Подготовка данных: Сериализация в JSON

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

Посмотрим на правильный алгоритм формирования тела запроса:


// Создаем структуру с данными, которые хотим отправить
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("order_id", "12345");
ДанныеЗапроса.Вставить("amount", 5000);
ДанныеЗапроса.Вставить("customer", "ООО Ромашка");

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

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

Обратите внимание на использование ПараметрыЗаписиJSON. Мы явно указываем, что хотим экранировать символы, если это необходимо. Теперь переменная СтрокаТелаЗапроса содержит валидный JSON.

Настройка HTTP-соединения и Заголовков

Теперь перейдем к созданию самого соединения. Рассмотрим работу с объектом HTTPСоединение.

Важный момент: Если вы подключаетесь к ресурсу по протоколу HTTPS (защищенное соединение), необходимо использовать OpenSSLSecureConnection (в английском варианте или русскоязычный аналог — ЗащищенноеСоединениеOpenSSL). В простых случаях достаточно создать новый экземпляр этого объекта без параметров, чтобы использовать системные сертификаты.


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

// Настраиваем защищенное соединение (для HTTPS)
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

// Инициализируем соединение
Соединение = Новый HTTPСоединение(
    Сервер, 
    443, // Порт для HTTPS
    Пользователь, 
    Пароль, 
    , 
    10, // Таймаут
    ЗащищенноеСоединение
);

Формирование HTTP-запроса

Создадим объект HTTPЗапрос. Именно здесь мы должны установить критически важные заголовки. Если мы отправляем JSON, мы обязаны сообщить об этом серверу через заголовок Content-Type.


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

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

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

// Устанавливаем тело запроса. Важно указать кодировку UTF-8!
Запрос.УстановитьТелоИзСтроки(СтрокаТелаЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Обратите внимание на метод УстановитьТелоИзСтроки. Мы явно указываем КодировкаТекста.UTF8. Это решает проблему с кодировкой кириллицы, которая часто возникает при интеграции.

Отправка и обработка ответа

Теперь выполним метод ОтправитьДляОбработки (POST) и проанализируем ответ сервера.


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

Разберем нюансы работы с прокси

Иногда соединения не проходят из-за настроек сети предприятия. Если сервер 1С находится за прокси-сервером, необходимо настроить объект ИнтернетПрокси.


Прокси = Новый ИнтернетПрокси;
// Автоматическое определение настроек (берется из Internet Explorer / настроек системы)
Прокси.Установить("https", "192.168.0.1", 8080); 

// Передаем прокси в соединение (последний параметр конструктора HTTPСоединение)
Соединение = Новый HTTPСоединение(Сервер, 443,,,, 30, ЗащищенноеСоединение, Прокси);

Резюме по решению проблемы

Подведем итог. Чтобы ваши POST-запросы с JSON работали корректно, убедитесь, что вы выполняете следующие шаги:

  1. Используете ЗаписьJSON для формирования тела, а не склеиваете строки.
  2. Используете ЗащищенноеСоединениеOpenSSL для адресов, начинающихся с https://.
  3. Обязательно добавляете заголовок Content-Type: application/json.
  4. Явно указываете кодировку UTF-8 при установке тела запроса.

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

← На главную