Как организовать интеграцию 1С с внешним REST API через HTTP-запросы?

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

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

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

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

Шаг 1: Подготовка данных и формирование JSON

Большинство современных REST API используют формат JSON для передачи данных. Рассмотрим, как подготовить данные в 1С. Разберем по шагам создание структуры и её сериализацию. Проанализируем ситуацию, когда нам нужно передать информацию о товаре.

Для этого мы используем объекты ЗаписьJSON и СериализаторXDTO или ручное формирование структуры. Рассмотрим пример создания JSON-пакета:


ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("id", "12345");
ДанныеДляОтправки.Вставить("Наименование", "Тестовый товар");
ДанныеДляОтправки.Вставить("Цена", 1500);

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

Важный момент: при формировании СтрокаJSON следите за тем, чтобы типы данных в 1С соответствовали ожиданиям внешнего API (например, числа не должны превращаться в строки, если сервис ожидает числовой тип).

Шаг 2: Настройка HTTP-соединения

Теперь выясним причину, по которой соединение может не устанавливаться. Чаще всего это неправильно указанный порт или параметры прокси-сервера. Создадим объект HTTPСоединение. Обратите внимание на использование защищенного соединения (HTTPS), которое требует создания объекта ЗащищенноеСоединениеOpenSSL.

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


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

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

Шаг 3: Формирование и отправка HTTP-запроса

После того как канал связи установлен, нам необходимо подготовить сам запрос. Разберем подробнее настройку заголовков. Для REST API критически важно указать Content-Type, чтобы сервер понимал, в каком формате пришел контент. Также часто требуется заголовок Authorization для передачи токена доступа.

Проанализируем пример настройки объекта HTTPЗапрос:


АдресРесурса = "/v1/products/update";
Запрос = Новый HTTPЗапрос(АдресРесурса);

// Установка необходимых заголовков
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);

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

Теперь отправим запрос. Мы можем использовать методы ВызватьHTTPМетод, ОтправитьДляОбработки (POST) или Получить (GET). В нашем примере воспользуемся методом POST.


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

Шаг 4: Обработка ответа сервера

Получив HTTPОтвет, мы должны первым делом проверить КодСостояния. Код 200 или 201 обычно означает успех, тогда как коды 4xx и 5xx свидетельствуют об ошибках клиента или сервера соответственно. Посмотрим на пример логики обработки:


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

Особенности работы с кодировками и BOM

Разберем ситуацию, когда внешний сервис не может прочитать ваш JSON. Часто это связано с меткой ByteOrderMark (BOM). В 1С при вызове метода УстановитьТелоИзСтроки по умолчанию может добавляться BOM, что приводит к ошибке "Invalid character" на стороне некоторых веб-серверов (например, на базе Node.js или Go). Чтобы избежать этой проблемы, всегда явно указывайте ИспользованиеByteOrderMark.НеИспользовать.

Работа через прокси-сервер

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


Прокси = Новый ИнтернетПрокси(Ложь); // Использовать настройки ОС или задать вручную
Прокси.Установить("https", "192.168.1.1", 8080, "proxy_user", "password");
Соединение = Новый HTTPСоединение(Сервер, Порт, , , Прокси, Таймаут, ИспользоватьSSL);

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

← На главную