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

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

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

Основы работы с HTTP-соединением в 1С

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

Рассмотрим пример создания базового соединения:


Сервер = "api.service.com";
Порт = 443; // Стандартный порт для HTTPS
Пользователь = "admin";
Пароль = "password123";
Прокси = Неопределено; // Если требуется работа через прокси, создается объект HTTPПрокси
Таймаут = 30; // Время ожидания ответа в секундах

// Для защищенного соединения HTTPS используем объект ЗащищенноеСоединениеOpenSSL
Защита = Новый ЗащищенноеСоединениеOpenSSL();

Соединение = Новый HTTPСоединение(Сервер, Порт, Пользователь, Пароль, Прокси, Таймаут, Защита);

Обратим внимание на объект ЗащищенноеСоединениеOpenSSL. Без его использования попытка подключиться к ресурсу по протоколу HTTPS (порт 443) завершится ошибкой. В большинстве современных сервисов это обязательное требование.

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

Теперь, когда соединение установлено, разберем по шагам создание простого GET-запроса для получения данных. Нам нужно создать объект HTTPЗапрос и указать относительный путь к ресурсу (URL-path).

Выясним, как передать параметры в строке запроса и получить результат:


// Указываем путь к методу API и параметры
АдресРесурса = "/v1/products?category=electronics&status=available";
Запрос = Новый HTTPЗапрос(АдресРесурса);

// Добавляем необходимые заголовки, если API требует авторизацию по токену
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
Запрос.Заголовки.Вставить("Accept", "application/json");

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

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

Подготовка и отправка POST-запроса с JSON-данными

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

Проанализируем ситуацию, когда нам нужно отправить информацию о новом заказе:


// Подготовим данные в виде структуры 1С
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("id", "ORD-2023-001");
ДанныеЗаказа.Вставить("date", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));
Товары = Новый Массив;
Товары.Добавить(Новый Структура("sku, qty", "ITEM-01", 10));
ДанныеЗаказа.Вставить("items", Товары);

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

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

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

При использовании УстановитьТелоИзСтроки обязательно указывайте ИспользованиеByteOrderMark.НеИспользовать, так как многие веб-серверы некорректно воспринимают наличие BOM-символа в начале JSON-пакета.

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

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

Разберем алгоритм десериализации:


// Предположим, ТелоОтвета содержит строку JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);

// Преобразуем JSON в структуру 1С
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

// Теперь мы можем обращаться к данным через точку или по индексу
Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("status") Тогда
    Если Результат.status = "success" Тогда
        Сообщить("Данные успешно обработаны на сервере");
    КонецЕсли;
КонецЕсли;

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

Обработка типичных ошибок и рекомендации

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

  1. Всегда используйте блоки Попытка...Исключение. Сетевые ошибки (таймауты, отсутствие DNS) невозможно предсказать, и они не должны приводить к аварийному завершению работы пользователя.
  2. Проверяйте КодСостояния. Код 200 или 201 означает успех. Коды 4xx говорят об ошибках в вашем запросе (например, 401 — неверный токен, 404 — ресурс не найден), а коды 5xx — о проблемах на стороне сервера.
  3. Логируйте запросы и ответы. При отладке интеграции критически важно видеть "сырые" данные, которые уходят и приходят. Создайте в конфигурации регистр сведений для хранения логов обмена.
  4. Настройка прокси-сервера. Если сервер 1С находится за корпоративным файерволом, обязательно используйте объект HTTPПрокси, иначе соединения будут блокироваться.

Рассмотрим пример настройки прокси:


ПроксиСервер = Новый HTTPПрокси;
ПроксиСервер.ИспользоватьПроксиНаЛокальныхАдресах = Ложь;
ПроксиСервер.Сервер = "192.168.1.10";
ПроксиСервер.Порт = 8080;
ПроксиСервер.Пользователь = "proxy_user";
ПроксиСервер.Пароль = "proxy_pass";

// Далее передаем этот объект в конструктор HTTPСоединение

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

← На главную