В современных задачах автоматизации мы все чаще сталкиваемся с необходимостью интеграции 1С с внешними веб-сервисами: маркетплейсами, мессенджерами (например, Telegram), службами доставки или банковскими API. Основным стандартом обмена данными сегодня является формат JSON, передаваемый через HTTP-протокол. В этой статье мы подробно разберем, как реализовать отправку POST-запроса с вложениями в формате JSON, используя встроенные средства платформы 1С:Предприятие 8.3.
Разберем ситуацию, когда нам необходимо передать структурированные данные на внешний сервер. Рассмотрим этот процесс поэтапно: от формирования "тела" запроса до обработки ответа от сервера.
Прежде чем отправлять данные, нам необходимо сформировать строку в формате JSON. Хотя можно формировать строку вручную (конкатенацией), мы настоятельно рекомендуем использовать штатный объект ЗаписьJSON. Это убережет нас от ошибок в синтаксисе (например, экранирование кавычек) и обеспечит правильную структуру.
Рассмотрим пример создания JSON-строки из структуры данных 1С. Допустим, нам нужно отправить данные о заказе.
// Создаем структуру с данными
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("OrderNumber", "0000123");
ДанныеЗаказа.Вставить("Date", ТекущаяДата());
ДанныеЗаказа.Вставить("Amount", 5000);
ДанныеЗаказа.Вставить("Items", Новый Массив); // Вложенный массив
// Настраиваем запись JSON
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
// Записываем данные
ЗаписатьJSON(ЗаписьJSON, ДанныеЗаказа);
// Получаем итоговую строку
СтрокаJSON = ЗаписьJSON.Закрыть();
Обратим внимание на объект ПараметрыЗаписиJSON. Если мы не укажем параметры явно, платформа может добавить лишние переносы строк, что иногда критично для некоторых строгих API. Теперь у нас есть переменная СтрокаJSON, готовая к отправке.
Большинство современных сервисов работают по протоколу HTTPS. Для работы с защищенным каналом в 1С используется объект ЗащищенноеСоединениеOpenSSL. Если мы попытаемся подключиться к адресу, начинающемуся с "https", без указания этого параметра, платформа выдаст ошибку соединения.
Создадим соединение с сервером. Разберем параметры конструктора HTTPСоединение.
// Определяем адрес сервера и порт
Сервер = "api.example.com";
Порт = 443; // Стандартный порт для HTTPS
// Создаем защищенное соединение
// Часто сертификаты не требуются, если они валидные, но объект создать нужно
Защита = Новый ЗащищенноеСоединениеOpenSSL;
// Инициализируем соединение
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 15, Защита);
Мы указали таймаут в 15 секунд (шестой параметр). Это важно, чтобы пользовательский интерфейс или фоновое задание не зависало надолго, если внешний сервис недоступен.
Самая распространенная ошибка при работе с API — отсутствие правильных заголовков. Сервер должен понимать, в каком формате мы присылаем ему данные. Для JSON критически важен заголовок Content-Type.
Посмотрим, как правильно создать объект запроса и наполнить его данными.
// Указываем путь к ресурсу (endpoint)
АдресРесурса = "/v1/orders/create";
// Создаем объект запроса
ЗапросHTTP = Новый HTTPЗапрос(АдресРесурса);
// ВАЖНО: Устанавливаем заголовки
ЗапросHTTP.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Если требуется авторизация по токену
ЗапросHTTP.Заголовки.Вставить("Authorization", "Bearer Ваш_Токен_Доступа");
// Помещаем наш JSON в тело запроса
// Обязательно указываем кодировку, так как по умолчанию может использоваться системная
ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Проанализируем этот код. Метод УстановитьТелоИзСтроки помещает нашу подготовленную JSON-строку внутрь пакета, который уйдет на сервер. Указание кодировки КодировкаТекста.UTF8 гарантирует, что кириллические символы дойдут до получателя в читаемом виде.
Теперь, когда соединение настроено и запрос сформирован, выполним метод ОтправитьДляОбработки (для POST). Обратите внимание: все внешние вызовы лучше оборачивать в блок Попытка...Исключение, так как разрывы связи — обычное дело.
Попытка
// Выполняем POST запрос
ОтветHTTP = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
// Проверяем код состояния
// Код 200 (и иногда 201) означает успех
Если ОтветHTTP.КодСостояния = 200 Тогда
// Читаем ответ сервера
ОтветСтрокой = ОтветHTTP.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
// Разбираем ответ (обычно тоже JSON)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ОтветСтрокой);
РезультатСтруктура = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Далее работаем с РезультатСтруктура
Иначе
// Логируем ошибку, если сервер вернул не 200
Сообщить("Ошибка API. Код: " + ОтветHTTP.КодСостояния);
Сообщить("Тело ответа: " + ОтветHTTP.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Не удалось выполнить подключение: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем полученный результат. Объект HTTPОтвет содержит код состояния (Status Code). Всегда проверяйте его. Даже если соединение прошло успешно (нет исключения), сервер может вернуть ошибку логики (например, 400 Bad Request или 401 Unauthorized), и текст ошибки будет находиться в теле ответа.
При реализации сложных обменов учтите следующие моменты:
HTTPСоединение (3-й и 4-й параметры).Используя приведенную выше структуру, мы можем реализовать надежный обмен данными с любым современным веб-сервисом, поддерживающим REST API.