Как реализовать отправку и обработку HTTP-запросов в 1С 8.3?

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

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

Основные объекты для работы с HTTP в 1С

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

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

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


// Определяем параметры сервера
Сервер = "api.service.ru";
Порт = 443; // Стандартный порт для HTTPS
ИспользоватьSSL = Новый ЗащищенноеСоединениеOpenSSL();

// Создаем соединение
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , , ИспользоватьSSL);

Реализация GET-запроса для получения данных

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


// Формируем адрес ресурса с параметрами
Ресурс = "/v1/products?article=12345&sklad=main";
Запрос = Новый HTTPЗапрос(Ресурс);

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

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

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

В данном примере мы использовали метод ПолучитьТелоКакСтроку(). Это удобный способ быстро извлечь данные, если сервер возвращает текстовый формат (JSON или XML). Обратите внимание на важность проверки КодСостояния. Код 200 означает успех, тогда как коды 4xx и 5xx сигнализируют об ошибках на стороне клиента или сервера соответственно.

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

Метод POST применяется для создания новых объектов или передачи больших объемов данных в теле запроса. Рассмотрим подробнее, как отправить структуру 1С, преобразованную в JSON, на внешний сервер. Выясним причину, по которой важно правильно устанавливать заголовок Content-Type: без него сервер может не понять, как интерпретировать входящий поток байтов.

Проанализируем процесс подготовки и отправки данных:


// 1. Подготовка данных (Структура 1С)
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("name", "Новый товар");
ДанныеЗапроса.Вставить("price", 1500);
ДанныеЗапроса.Вставить("stock", 10);

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

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

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

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

При использовании метода УстановитьТелоИзСтроки мы явно указываем кодировку UTF8. Это критически важно для корректной передачи кириллических символов. Также использование ИспользованиеByteOrderMark.НеИспользовать предотвращает добавление лишних символов в начало строки, что часто вызывает ошибки при парсинге на стороне веб-серверов (особенно на базе PHP или Go).

Обработка сложных ответов и чтение JSON

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


// Получаем строку из ответа
РезультатСтрокой = Ответ.ПолучитьТелоКакСтроку();

// Инициализируем чтение
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(РезультатСтрокой);

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

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

Работа с таймаутами и ошибками сети

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

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


Попытка
    // Устанавливаем соединение с таймаутом 10 секунд
    Соединение = Новый HTTPСоединение(Сервер, 443, , , , 10, ИспользоватьSSL);
    Ответ = Соединение.Получить(Запрос);
Исключение
    Инфо = ИнформацияОбОшибке();
    ЗаписьЖурналаРегистрации("Обмен.HTTP", УровеньЖурналаРегистрации.Ошибка, , , 
        "Ошибка при выполнении запроса: " + ПодробноеПредставлениеОшибки(Инфо));
    ВызватьИсключение "Не удалось связаться с сервером. Проверьте настройки сети.";
КонецПопытки;

Рекомендации по оптимизации HTTP-обмена

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

Разберем еще один нюанс: использование Cookie. Если API требует сохранения состояния сессии, вы можете использовать объект HTTPЗапрос для ручной передачи куков через заголовки, либо анализировать заголовок Set-Cookie в объекте HTTPОтвет и передавать его обратно в последующих запросах.

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


Для Каждого Заголовок Из Ответ.Заголовки Цикл
    Если ВРег(Заголовок.Ключ) = "SET-COOKIE" Тогда
        Сообщить("Получена кука: " + Заголовок.Значение);
    КонецЕсли;
КонецЦикла;

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

← На главную