Работа с внешними API — одна из самых частых задач для разработчика 1С в современных условиях. Интеграция с маркетплейсами, CRM-системами или мессенджерами часто требует отправки данных методом POST в формате JSON. Несмотря на кажущуюся простоту, здесь есть множество нюансов: от правильной установки заголовков до корректной кодировки тела запроса.
В этой статье мы подробно разберем ситуацию, когда сервер возвращает ошибку (например, 400 Bad Request) при попытке отправки данных, и рассмотрим правильный алгоритм реализации HTTP-обмена.
Проанализируем основные ошибки, с которыми сталкиваются разработчики при написании кода обмена:
Content-Type.Разберем процесс подготовки данных. Крайне не рекомендуется собирать JSON-строку вручную, склеивая строки. Для этого в платформе 1С существует объект ЗаписьJSON. Он гарантирует валидность структуры.
Посмотрим на правильный алгоритм формирования тела запроса:
// Создаем структуру с данными, которые хотим отправить
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("order_id", "12345");
ДанныеЗапроса.Вставить("amount", 5000);
ДанныеЗапроса.Вставить("customer", "ООО Ромашка");
// Настраиваем параметры записи JSON
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина);
// Записываем данные в строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
СтрокаТелаЗапроса = ЗаписьJSON.Закрыть();
Обратите внимание на использование ПараметрыЗаписиJSON. Мы явно указываем, что хотим экранировать символы, если это необходимо. Теперь переменная СтрокаТелаЗапроса содержит валидный JSON.
Теперь перейдем к созданию самого соединения. Рассмотрим работу с объектом HTTPСоединение.
Важный момент: Если вы подключаетесь к ресурсу по протоколу HTTPS (защищенное соединение), необходимо использовать OpenSSLSecureConnection (в английском варианте или русскоязычный аналог — ЗащищенноеСоединениеOpenSSL). В простых случаях достаточно создать новый экземпляр этого объекта без параметров, чтобы использовать системные сертификаты.
// Определяем параметры подключения
Сервер = "api.example.com";
Ресурс = "/v1/orders/create";
Пользователь = "admin";
Пароль = "secret123";
// Настраиваем защищенное соединение (для HTTPS)
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Инициализируем соединение
Соединение = Новый HTTPСоединение(
Сервер,
443, // Порт для HTTPS
Пользователь,
Пароль,
,
10, // Таймаут
ЗащищенноеСоединение
);
Создадим объект 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 работали корректно, убедитесь, что вы выполняете следующие шаги:
ЗаписьJSON для формирования тела, а не склеиваете строки.ЗащищенноеСоединениеOpenSSL для адресов, начинающихся с https://.Content-Type: application/json.UTF-8 при установке тела запроса.Следуя этому шаблону, вы избежите большинства типовых ошибок интеграции (ошибки парсинга на сервере, проблемы с кодировкой, ошибки безопасности).