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

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

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

Настройка защищенного соединения

Прежде чем приступать к отправке данных, проанализируем инфраструктуру подключения. Большинство современных API работают по защищенному протоколу HTTPS. Для корректной работы 1С с такими ресурсами нам необходимо инициализировать объект ЗащищенноеСоединениеOpenSSL. Если мы проигнорируем этот шаг, система выдаст ошибку при попытке установить связь с сервером по 443 порту.

Рассмотрим пример инициализации соединения с использованием стандартных настроек операционной системы:


// Создаем настройки защищенного соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
    Новый СертификатКриптографии(), 
    Новый СертификатыУдостоверяющихЦентровWindows()
);

// Указываем адрес сервера без протокола (без https://)
Сервер = "api.example.com";
Порт = 443;

// Создаем объект соединения
Соединение = Новый HTTPСоединение(
    Сервер, 
    Порт, 
    , // Имя пользователя
    , // Пароль
    , // Прокси
    60, // Таймаут в секундах
    ЗащищенноеСоединение
);

Выясним причину использования таймаута: установка значения в 60 секунд позволяет избежать зависания сеанса пользователя при нестабильной работе внешнего сервиса. Проанализируем также конструктор HTTPСоединение: важно помнить, что адрес сервера передается как строка, не содержащая префиксов http:// или https://.

Формирование тела запроса в формате JSON

Разберем по шагам процесс подготовки данных. Чаще всего внешние сервисы ожидают структуру данных в формате JSON. Для этого в 1С предусмотрены специализированные объекты ЗаписьJSON и СериализаторXDTO (или простая запись структур).

Посмотрим на пример создания структуры и её преобразования в строку JSON:


// Подготовим данные для отправки
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("id", "12345");
ДанныеЗапроса.Вставить("status", "active");
ДанныеЗапроса.Вставить("date", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));

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

ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();

Здесь мы использовали объект ЗаписьJSON. Метод УстановитьСтроку позволяет подготовить объект к записи данных в переменную, а функция ЗаписатьJSON автоматически обходит структуру и преобразует её типы в соответствующие типы JSON (строки, числа, булево).

Создание и отправка HTTP-запроса

Теперь проанализируем процесс отправки. Нам необходимо создать объект HTTPЗапрос, указать в нем ресурс (путь к методу API) и установить заголовки. Самым важным заголовком при работе с JSON является Content-Type.

  1. Создаем объект HTTPЗапрос, указывая относительный путь.
  2. Устанавливаем заголовок Content-Type со значением application/json.
  3. Помещаем подготовленную строку JSON в тело запроса.
  4. Выполняем метод ОтправитьДляОбъекта или ВызватьHTTPМетод.

// Указываем путь к ресурсу
Ресурс = "/v1/update-status";
Запрос = Новый HTTPЗапрос(Ресурс);

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

// Устанавливаем тело запроса
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеМаркераПоследовательностиБайтов.НеИспользовать);

// Выполняем POST запрос
Попытка
    ОтветСервера = Соединение.ВызватьHTTPМетод("POST", Запрос);
Исключение
    Сообщить("Ошибка при выполнении запроса: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Обратите внимание на параметр ИспользованиеМаркераПоследовательностиБайтов.НеИспользовать. Это критически важный момент: многие веб-серверы не понимают BOM (Byte Order Mark) и выдают ошибку 400 (Bad Request), если 1С добавит его в начало строки запроса.

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

После выполнения запроса мы получаем объект HTTPОтвет. Нам необходимо проверить код состояния. Если код равен 200 (или другой в диапазоне 200-299), значит запрос выполнен успешно. В противном случае нужно проанализировать тело ответа на предмет ошибок.

Рассмотрим подробнее парсинг полученного JSON-ответа:


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

Использование метода ПрочитатьJSON позволяет мгновенно превратить текстовый ответ сервера в коллекцию 1С (Структура или Соответствие), что значительно упрощает дальнейший доступ к данным. Мы можем обращаться к полям ответа через точку, например: Результат.data.items.

Практические советы и рекомендации

Рассмотрим несколько нюансов, которые помогут сделать ваш код более надежным:

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

← На главную