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

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

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

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

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


Протокол = "https";
Сервер = "api.example.com";
Порт = 443; // Стандартный порт для HTTPS

// Если требуется авторизация, можно указать логин и пароль
Логин = "admin";
Пароль = "secret_key";

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

Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , 30, ЗащищенноеСоединение);

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

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

После установки соединения нам нужно подготовить сам запрос. Для этого используется объект HTTPЗапрос. В нем мы указываем ресурс (путь к методу API) и заголовки, которые сообщают серверу формат передаваемых данных. Рассмотрим, как сформировать POST-запрос с данными в формате JSON.

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


// Путь к конкретному методу API
Ресурс = "/v1/orders/create";

Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);

// Подготовим тело запроса (JSON)
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("НомерЗаказа", "М-123");
ДанныеЗапроса.Вставить("Дата", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));

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

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

Разберем подробнее метод УстановитьТелоИзСтроки. Важно использовать ИспользованиеByteOrderMark.НеИспользовать, так как многие веб-сервисы некорректно воспринимают BOM-символы в начале JSON-строки, что приводит к ошибкам парсинга на стороне сервера.

Выполнение запроса и получение ответа

Теперь выполним отправку данных. Мы будем использовать метод ОтправитьДляОбъекта или просто ВызватьHTTPМетод. Посмотрим на пример получения результата:


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

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

Парсинг ответа в формате JSON

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


// Предположим, сервер вернул JSON со списком товаров
// СтрокаОтвета = "{"products": [{"id": 1, "name": "Товар 1"}, {"id": 2, "name": "Товар 2"}]}"

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

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

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

Использование метода ПрочитатьJSON позволяет автоматически рекурсивно преобразовать всю иерархию JSON в соответствующие объекты 1С. Это значительно упрощает код по сравнению с ручным разбором строки.

Практические советы и оптимизация

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

  1. Логирование: Всегда записывайте тело запроса и полный текст ответа сервера в специальный регистр сведений или текстовый лог. Это поможет локализовать проблему, если данные "не доходят" или обрабатываются неверно.
  2. Работа с сертификатами: Если сервер требует клиентский сертификат, его необходимо добавить в объект ЗащищенноеСоединениеOpenSSL, указав путь к файлу сертификата или выбрав его из хранилища сертификатов Windows.
  3. Использование потоков: При передаче файлов большого объема (например, выгрузка картинок товаров) используйте метод УстановитьТелоИзФайла вместо загрузки всего файла в память в виде строки. Это существенно снизит нагрузку на оперативную память сервера 1С.
  4. Проверка кодов состояния: Не ограничивайтесь проверкой только кода 200. Коды 4xx (ошибки клиента) и 5xx (ошибки сервера) требуют разной логики обработки: в одном случае нужно исправить данные, в другом — повторить запрос позже.

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

← На главную