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

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

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

Постановка задачи: взаимодействие с веб-сервером

Когда перед нами стоит задача отправить данные на сайт или получить информацию из внешней системы (курсы валют, заказы с сайта, данные контрагента), мы работаем с объектами встроенного языка, отвечающими за HTTP-протокол. Основная сложность, с которой сталкиваются разработчики, — это правильная настройка защищенного соединения (SSL), корректная передача заголовков (Headers) и формирование тела запроса.

Давайте проанализируем процесс по шагам и посмотрим, как избежать распространенных ошибок.

Шаг 1. Создание подключения к серверу

Любой обмен данными начинается с инициализации соединения. В 1С для этого используется объект HTTPСоединение. На этом этапе мы определяем адрес сервера (хост) и параметры безопасности.

Важный момент: если целевой ресурс работает по протоколу HTTPS (что является стандартом для 99% современных API), нам необходимо явно указать использование защищенного соединения. Для этого используется объект ЗащищенноеСоединениеOpenSSL.

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


// Определяем параметры подключения
Сервер = "api.example.com";
Порт = 443; // Стандартный порт для HTTPS
Пользователь = "admin";
Пароль = "secret123";

// Настраиваем SSL (обычно достаточно клиента без сертификата, если сервер имеет валидный сертификат)
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(неопределено, неопределено);

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

Здесь мы видим использование ЗащищенноеСоединениеOpenSSL. Если вы попытаетесь обратиться к ресурсу https://... без этого параметра, платформа выдаст ошибку или попытается подключиться по незащищенному порту, что приведет к сбою.

Шаг 2. Подготовка запроса и заголовков

После установки соединения нам необходимо сформировать сам запрос. Для этого служит объект HTTPЗапрос. В конструктор этого объекта мы передаем адрес ресурса (URL path), который идет после основного домена.

Критически важным аспектом является установка Заголовков (Headers). Именно заголовки сообщают серверу, в каком формате мы отправляем данные и какой формат ожидаем в ответ. Для работы с JSON обычно требуются следующие заголовки:

  1. Content-Type — указывает тип данных в теле нашего запроса.
  2. Accept — указывает, что мы хотим получить JSON в ответ.
  3. Authorization — часто используется для передачи токенов доступа (Bearer token).

Рассмотрим, как правильно создать запрос и заполнить заголовки:


// Адрес ресурса (например, создание заказа)
АдресРесурса = "/v1/orders/create";

// Создаем объект запроса
ЗапросHTTP = Новый HTTPЗапрос(АдресРесурса);

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

// Пример добавления токена авторизации (если требуется)
Токен = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...";
ЗапросHTTP.Заголовки.Вставить("Authorization", "Bearer " + Токен);

Обратите внимание на кодировку в Content-Type. Указание charset=utf-8 помогает избежать проблем с отображением кириллицы на стороне сервера-приемника.

Шаг 3. Отправка GET-запроса

Запросы типа GET используются для получения данных. У них обычно нет "тела" запроса, а все параметры передаются непосредственно в строке адреса. Разберем выполнение такого запроса.


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

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

Метод Соединение.Получить() выполняет запрос и возвращает объект HTTPОтвет. Всегда проверяйте КодСостояния. Код 200 означает успех. Коды 4xx (например, 401, 403, 404) говорят об ошибках клиента (неверный адрес, нет доступа), а 5xx — об ошибках на стороне сервера.

Шаг 4. Отправка POST-запроса с JSON

Запросы типа POST используются для создания объектов или отправки сложных данных. Здесь нам необходимо заполнить тело запроса. Чаще всего мы формируем JSON-строку из структуры или массива 1С.

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


// 1. Подготовим данные
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("Number", "00001");
ДанныеЗаказа.Вставить("Date", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));
ДанныеЗаказа.Вставить("Amount", 5000);
    
МассивТоваров = Новый Массив;
СтрокаТовара = Новый Структура("Product, Quantity", "PC Mouse", 2);
МассивТоваров.Добавить(СтрокаТовара);
    
ДанныеЗаказа.Вставить("Items", МассивТоваров);

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

// 3. Помещаем JSON в тело запроса
ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаJSON, "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);

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

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

В данном примере мы использовали метод ОтправитьДляОбработки, который соответствует HTTP-методу POST. Также важно обратить внимание на третий параметр в методе УстановитьТелоИзСтроки — использование BOM (Byte Order Mark). Многие веб-серверы (особенно написанные на PHP или Python) могут некорректно обрабатывать JSON, если в начале строки присутствует маркер BOM, поэтому мы явно указываем ИспользованиеByteOrderMark.НеИспользовать.

Особенности работы с прокси и сертификатами

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

Объект ИнтернетПрокси позволяет задать настройки шлюза:


Прокси = Новый ИнтернетПрокси;
// Если нужно использовать системные настройки Windows
Прокси.Установить("https", "192.168.1.1", 8080); 
// Передаем прокси в конструктор соединения
Соединение = Новый HTTPСоединение(Сервер,,,, Прокси,, ЗащищенноеСоединение);

Также, если вы работаете с самоподписанными сертификатами (например, на тестовом контуре сервера), параметр создания ЗащищенноеСоединениеOpenSSL может потребовать указания файла сертификата клиента, либо можно использовать сертификаты операционной системы.

Разбор ответа от сервера

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


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

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

// Теперь можно обращаться к полям
Идентификатор = РезультатСтруктура["id"];
Сообщить("Создан объект с ID: " + Идентификатор);

Флаг Истина во втором параметре ПрочитатьJSON указывает системе, что нужно ожидать имена свойств в соответствии с JSON, и автоматически преобразовывать их в ключи Соответствия (или Структуры, если имена соответствуют требованиям идентификаторов 1С).

Резюме и рекомендации

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

  1. Всегда используйте ЗащищенноеСоединениеOpenSSL для адресов с HTTPS.
  2. Внимательно следите за заголовком Content-Type. Для JSON он обязателен.
  3. При формировании тела запроса отключайте BOM (Byte Order Mark), чтобы избежать проблем с парсингом на стороне получателя.
  4. Всегда проверяйте КодСостояния ответа перед тем, как пытаться читать данные. Ошибка 500 вернет вам HTML-страницу с ошибкой, а не ожидаемый JSON, что вызовет падение кода при парсинге.
  5. Оборачивайте вызовы HTTP-методов в конструкцию Попытка ... Исключение, так как сетевые ошибки (обрыв связи, недоступность DNS) неизбежны.

Используя эти методы, вы сможете настроить надежный обмен данными с любыми современными API, будь то CRM-системы, интернет-магазины или государственные сервисы.

← На главную