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

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

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

Разберем основы работы с HTTP-соединением

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

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


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

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

Проанализируем ситуацию, когда сервер требует авторизации. Мы можем передать логин и пароль непосредственно в конструктор HTTPСоединение, либо использовать заголовки Authorization в самом запросе. Первый вариант предпочтительнее для базовой (Basic) аутентификации.

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

Метод GET используется для получения данных. Главная особенность заключается в том, что параметры передаются прямо в URL (строке запроса). Разберем, как правильно сконструировать такой запрос, чтобы избежать проблем с кодировкой специальных символов.

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


ПараметрыЗапроса = "id=105&status=active";
АдресРесурса = "/v1/get_data?" + ПараметрыЗапроса;

Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Accept", "application/json");

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

Обратим внимание на метод ПолучитьТелоКакСтроку(). Он автоматически учитывает кодировку, указанную сервером в заголовках. Если же сервер не прислал кодировку, 1С по умолчанию попробует прочитать текст в UTF-8.

Реализация POST-запроса с передачей JSON-данных

Метод POST чаще всего применяется для передачи больших объемов данных или создания новых объектов в базе веб-сервиса. Здесь данные передаются в теле запроса. Рассмотрим подробнее процесс подготовки JSON и его упаковки в запрос.

  1. Сначала подготовим структуру данных в 1С.
  2. Преобразуем структуру в строку JSON с помощью объекта ЗаписьJSON.
  3. Установим тело запроса и обязательный заголовок Content-Type.

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


// 1. Подготовка данных
Данные = Новый Структура;
Данные.Вставить("Наименование", "Товар №1");
Данные.Вставить("Артикул", "SN-990");
Данные.Вставить("Цена", 1500);

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

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

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

Важно помнить: при использовании метода ОтправитьДляОбработки (который соответствует POST) крайне важно указывать Content-Type. Без этого многие серверы (например, на Node.js или Python) просто "не увидят" тело вашего запроса.

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

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

Для надежного парсинга используем следующий подход:


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

Попытка
    Результат = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    // Если результат - это массив структур
    Для Каждого Элемент Из Результат Цикл
        Сообщить("Получен объект: " + Элемент.Наименование);
    КонецЦикла;
Исключение
    Сообщить("Ошибка парсинга JSON: " + ОписаниеОшибки());
КонецПопытки;

Работа с HTTPS и сертификатами

При работе через защищенное соединение мы часто сталкиваемся с тем, что 1С не может проверить сертификат сервера. Чтобы решить эту проблему, мы используем объект ЗащищенноеСоединениеOpenSSL. Если вы работаете в корпоративной сети с самоподписанными сертификатами, их необходимо добавить в хранилище сертификатов ОС или явно указать в параметрах объекта 1С.

Посмотрим на пример инициализации с игнорированием проверки (только для отладки!):

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


// Использование стандартных настроек ОС для проверки
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
    Новый СертификатКлиентаWindows(), 
    Новый ВалидацияСертификатаПеречнемДоверенныхСертификатовОС()
);

Оптимизация и советы по отладке

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

Проанализировав все вышеперечисленные шаги, мы видим, что работа с HTTP в 1С 8.3 — это стройная система объектов, которая при правильной настройке позволяет реализовать обмен любой сложности. Главное — внимательно следить за кодировками, типами передаваемого контента и корректно обрабатывать исключительные ситуации.

← На главную