Как правильно реализовать HTTP-запросы GET и POST в 1С 8.3 для интеграции с внешними сервисами?

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

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

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

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

  1. HTTPСоединение — этот объект отвечает за установку сессии с сервером. Здесь мы указываем адрес сервера, порт, параметры прокси-сервера и данные для авторизации.
  2. HTTPЗапрос — здесь мы формируем структуру нашего обращения: указываем ресурс (путь к конкретному методу API), добавляем заголовки (например, Content-Type) и наполняем тело запроса данными.
  3. HTTPОтвет — этот объект мы получаем в результате выполнения запроса. Он содержит код состояния (200, 404, 500 и т.д.) и само тело ответа, которое нам предстоит распарсить.

Реализация простого GET-запроса

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


// Создаем соединение с сервером
Сервер = "api.externalservice.com";
Соединение = Новый HTTPСоединение(Сервер, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());

// Формируем запрос
Ресурс = "/v1/data/get_info?id=123";
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Accept", "application/json");

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

В данном примере мы используем ЗащищенноеСоединениеOpenSSL, так как большинство современных сервисов работают по протоколу HTTPS. Обратите внимание, что мы проверяем КодСостояния. Это критически важно для корректной работы алгоритма: код 200 означает успех, тогда как коды 4xx и 5xx сигнализируют о проблемах на стороне клиента или сервера.

Отправка данных методом POST с телом в формате JSON

Теперь разберем более сложную задачу: нам нужно отправить данные из 1С во внешнюю систему. Чаще всего для этого используется метод POST, а данные передаются в теле запроса в формате JSON. Проанализируем этот процесс по шагам.

Для начала нам нужно подготовить данные. Мы будем использовать объект ЗаписьJSON для сериализации структуры 1С в строку.


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

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

// Настройка соединения и запроса
Сервер = "api.externalservice.com";
Соединение = Новый HTTPСоединение(Сервер, , , , , , Новый ЗащищенноеСоединениеOpenSSL());

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

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

Если Ответ.КодСостояния = 201 Тогда
    Сообщить("Объект успешно создан в сторонней системе.");
КонецЕсли;

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

Обработка полученного ответа (Парсинг JSON)

После того как мы получили HTTPОтвет, нам необходимо преобразовать текстовые данные обратно в объекты 1С (Структуры и Массивы). Посмотрим на пример, как это сделать эффективно с помощью функции ПрочитатьJSON.


ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());

Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

// Теперь мы можем обращаться к данным как к полям структуры
Для Каждого Элемент Из Результат.items Цикл
    Сообщить("Получен ID: " + Элемент.id);
КонецЦикла;

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

Типичные ошибки и способы их решения

В процессе реализации взаимодействия часто возникают типовые проблемы. Разберем наиболее частые из них:

  1. Таймауты соединения. Если сервер отвечает долго, 1С может прервать операцию по истечении времени ожидания. Рекомендуется устанавливать время ожидания в конструкторе HTTPСоединение (параметр Таймаут).
  2. Проблемы с сертификатами. При использовании HTTPS на серверах с самоподписанными сертификатами 1С может выдавать ошибку. В таких случаях необходимо добавить сертификат в хранилище доверенных сертификатов ОС или платформы.
  3. Неверные заголовки. Ошибка "415 Unsupported Media Type" часто возникает, если вы забыли указать Content-Type: application/json при отправке данных.
  4. Авторизация. Многие сервисы требуют Bearer Token. В этом случае в заголовки нужно добавить поле Authorization со значением "Bearer " + Токен.

Посмотрим на пример добавления авторизации:


Токен = "your_secret_token_here";
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);

Заключение

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

← На главную