Как программно выполнить HTTP-запрос и обработать JSON в 1С 8.3?

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

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

Разбор основных объектов для работы с HTTP

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

  1. HTTPСоединение — основной объект, отвечающий за установку сессии с сервером.
  2. HTTPЗапрос — объект, в котором формируются заголовки, адрес ресурса и тело передаваемого сообщения.
  3. HTTPОтвет — объект, в который платформа помещает результат выполнения запроса от сервера.

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

Рассмотрим процесс создания объекта HTTPСоединение. Важно помнить, что параметры соединения зависят от того, используется ли защищенный протокол HTTPS. Разберем пример создания соединения с использованием защищенного протокола SSL. Для этого нам потребуется объект ЗащищенноеСоединениеOpenSSL.

Проанализируем пример кода для инициализации соединения:


Сервер = "api.service.com";
Порт = 443; // Стандартный порт для HTTPS
Защита = Новый ЗащищенноеСоединениеOpenSSL();

Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 30, Защита);

В данном примере мы установили таймаут 30 секунд. Это критически важно, чтобы сеанс пользователя не "подвис" при ожидании ответа от медленного внешнего ресурса.

Шаг 2. Формирование и отправка GET-запроса

Метод GET обычно используется для получения данных. Давайте выясним, как правильно передать параметры в строке запроса и установить необходимые заголовки, такие как Content-Type и ключи авторизации.

Посмотрим на пример формирования GET-запроса:


АдресРесурса = "/v1/data?type=status&id=123";
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);

Ответ = Соединение.Получить(Запрос);

Обратите внимание, что метод Получить() объекта HTTPСоединение возвращает объект HTTPОтвет. Нам необходимо обязательно проверить код состояния ответа (статус), чтобы убедиться в успешности операции.

Шаг 3. Отправка POST-запроса с телом в формате JSON

Для передачи данных на сервер (например, создания нового заказа в сторонней системе) используется метод POST. В этом случае данные передаются не в строке адреса, а в теле запроса. Для формирования JSON мы воспользуемся встроенными средствами 1С: ЗаписьJSON.

Рассмотрим детально процесс подготовки тела запроса:


// Подготовим данные для отправки в виде структуры
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("Наименование", "Новый товар");
ДанныеДляОтправки.Вставить("Цена", 1500);

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

// Формируем запрос
АдресРесурса = "/v1/create";
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Важный момент: при использовании метода УстановитьТелоИзСтроки() крайне рекомендуется отключать ByteOrderMark (BOM), так как многие веб-серверы некорректно обрабатывают эти символы в начале JSON-строки.

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

После выполнения запроса нам необходимо проанализировать КодСостояния. Код 200 или 201 означает успех, коды группы 400 говорят об ошибках в запросе, а 500 — о проблемах на стороне сервера.

Разберем, как прочитать тело ответа и преобразовать его обратно в структуру 1С:


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

Особенности работы с большими файлами

Если в ответе от сервера приходит большой файл (например, PDF или картинка), не стоит считывать его в строку методом ПолучитьТелоКакСтроку(). Это может привести к значительному потреблению оперативной памяти. Вместо этого проанализируем метод Получить() с параметром записи в файл.


ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
Ответ = Соединение.Получить(Запрос, ИмяВременногоФайла);

Если Ответ.КодСостояния = 200 Тогда
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяВременногоФайла);
    // Дальнейшая работа с файлом
КонецЕсли;

Рекомендации по безопасности и стабильности

При работе с внешними API всегда следуйте правилам "хорошего тона" программирования в 1С:

Мы проанализировали полный цикл работы с HTTP в 1С. Использование встроенных объектов HTTPСоединение и ЗаписьJSON позволяет создавать производительные и надежные механизмы обмена данными, которые легко поддерживать и масштабировать.

← На главную