Как настроить обмен данными с внешним API через HTTP-запросы и JSON в 1С?

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

Интеграция 1С с внешними системами (интернет-магазины, маркетплейсы, CRM-системы, сервисы доставки) — одна из самых частых задач, встающих перед разработчиком. Современным стандартом обмена данными является использование протокола HTTP (REST API) и формата JSON. Несмотря на кажущуюся простоту, при реализации возникают нюансы: настройка защищенного соединения (SSL), правильное формирование заголовков и корректная обработка ответов сервера.

Разберем детально, как реализовать полный цикл обмена данными: от создания соединения до парсинга ответа, используя штатные механизмы платформы 1С:Предприятие 8.3. Мы проанализируем различные методы отправки данных (GET и POST) и рассмотрим работу с сериализацией JSON.

1. Подготовка к установке соединения: Объект HTTPСоединение

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

Рассмотрим базовый конструктор. Нам понадобятся адрес сервера (хост) и, возможно, порт. Обратите внимание, что хост указывается без протокола (без "https://").

Критический момент, на котором часто спотыкаются разработчики, — это работа по защищенному протоколу HTTPS. Если целевой ресурс работает через HTTPS (что сейчас является стандартом), нам необходимо использовать защищенное соединение. В 1С за это отвечает объект ЗащищенноеСоединениеOpenSSL.

Посмотрим на пример инициализации соединения:


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

// Настраиваем защищенное соединение
// Если сертификат сервера валидный и от доверенного центра, параметры можно не указывать
// В тестовых средах иногда требуется игнорировать ошибки сертификатов (не рекомендуется для продакшена)
Ссл = Новый ЗащищенноеСоединениеOpenSSL(неопределено, неопределено);

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

Важные нюансы при создании соединения:

  1. Если API требует Basic Authentication (логин/пароль в заголовке), их можно передать прямо в конструктор HTTPСоединение, как показано в примере выше. Платформа сама закодирует их в Base64 и добавит заголовок Authorization.
  2. Если используется аутентификация по токену (Bearer Token), параметры пользователя и пароля в соединении оставляем пустыми, а токен будем добавлять в заголовки конкретного запроса.
  3. Таймаут (в примере 50 секунд) важен, чтобы процесс 1С не завис навсегда, если удаленный сервер перестал отвечать.

2. Формирование тела запроса и заголовков

После создания соединения нам нужно подготовить сам запрос. В 1С это делается через объект HTTPЗапрос. В конструкторе мы указываем адрес ресурса (путь относительно домена).

Одна из распространенных ошибок — отсутствие правильных заголовков. Веб-сервер должен понимать, в каком формате мы присылаем данные и в каком формате ждем ответ. Для JSON-обмена стандартом является заголовок Content-Type: application/json.

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


// Указываем ресурс (endpoint)
АдресРесурса = "/v1/orders/create";

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

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

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

3. Подготовка данных: Сериализация в JSON

Перед отправкой данных (например, при создании заказа через POST-запрос) нам нужно преобразовать данные 1С (структуры, массивы) в строку формата JSON.

В платформе 8.3 для этого предусмотрен мощный объект ЗаписьJSON. Проанализируем, как правильно сформировать сложную структуру и превратить ее в строку.


// Подготовим данные 1С. Обычно это Структура или Соответствие.
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("number", "00001");
ДанныеЗаказа.Вставить("date", Формат(ТекущаяДата(), "ДФ=yyyy-MM-ddTHH:mm:ss"));
ДанныеЗаказа.Вставить("customer", "Иванов И.И.");

МассивТоваров = Новый Массив;
СтрокаТовара = Новый Структура("product_id, quantity, price", "sku-123", 2, 1500);
МассивТоваров.Добавить(СтрокаТовара);

ДанныеЗаказа.Вставить("items", МассивТоваров);

// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина); // Компактный вид, экранирование
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);

// Используем глобальный метод ЗаписатьJSON
ЗаписатьJSON(ЗаписьJSON, ДанныеЗаказа);

// Получаем итоговую строку
ТекстJSON = ЗаписьJSON.Закрыть();

После того как строка JSON получена, ее необходимо поместить в тело нашего HTTP-запроса. Обратите внимание на кодировку: стандарт для JSON — UTF-8.


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

4. Отправка запроса и получение ответа

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

Рассмотрим выполнение POST-запроса и обработку кода состояния:


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

// Проверяем HTTP статус ответа
КодСостояния = ОтветHTTP.КодСостояния;

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

5. Чтение ответа сервера (Десериализация JSON)

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

Для этого используем объект ЧтениеJSON. Давайте посмотрим, как безопасно прочитать ответ:


Процедура ОбработатьУспешныйОтвет(ОтветHTTP)
    
    // Получаем строку из ответа
    СтрокаОтвета = ОтветHTTP.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    Если ПустаяСтрока(СтрокаОтвета) Тогда
        Возврат;
    КонецЕсли;

    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
    
    // Десериализация
    // Второй параметр Истина позволяет читать дату как дату 1С, если формат совпадает,
    // но надежнее читать как строку и преобразовывать вручную при необходимости.
    Попытка
        ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON, Ложь); 
        // ДанныеОтвета теперь содержат Структуру или Массив
    Исключение
        Сообщить("Некорректный JSON в ответе сервера");
    КонецПопытки;
    
    ЧтениеJSON.Закрыть();
    
    // Пример работы с полученными данными
    Если ТипЗнч(ДанныеОтвета) = Тип("Структура") И ДанныеОтвета.Свойство("id") Тогда
        Сообщить("Создан заказ с ID: " + ДанныеОтвета.id);
    КонецЕсли;

КонецПроцедуры

6. Распространенные проблемы и методы их решения

При реализации интеграций мы часто сталкиваемся с типовыми проблемами. Рассмотрим способы их диагностики и устранения.

Проблема: Ошибка работы с криптографией или SSL.
Часто возникает, если сертификат сервера устарел, самоподписанный или корневой сертификат отсутствует в хранилище сертификатов сервера, где установлен сервер 1С.
Решение: В тестовой среде можно обновить платформу до актуальной версии (где обновлены корневые сертификаты) или экспортировать сертификат сайта через браузер и добавить его в файл cacert.pem платформы 1С.

Проблема: Ответ приходит в виде "крякозябр".
Решение: Всегда явно указывайте кодировку при чтении тела ответа: ОтветHTTP.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8). Если сервер использует специфическую кодировку (например, windows-1251), укажите её соответственно.

Проблема: Метод ПрочитатьJSON не может разобрать дату.
Стандарт JSON не имеет типа "Дата", это всегда строка. Форматы бывают разными (ISO 8601, Microsoft format и др.).
Решение: Используйте функцию восстановления (третий параметр в ПрочитатьJSON) или читайте все как строки, а затем преобразуйте функцией XMLЗначение(Тип("Дата"), СтрокаДаты), если формат соответствует ISO.

7. Продвинутые техники: Параметры URL и заголовки

Часто в GET-запросах необходимо передавать параметры фильтрации в самой строке адреса (Query String). Не рекомендуется формировать строку вручную склеиванием, так как можно нарушить структуру URL спецсимволами (пробелы, амперсанды).

Для корректного формирования используйте кодирование строк:


БазовыйУРЛ = "/v1/products/search";
ПараметрПоиска = "Молоко & Хлеб"; // Содержит спецсимволы
ЗакодированныйПараметр = КодироватьСтроку(ПараметрПоиска, СпособКодированияСтроки.КодировкаURL);

ПолныйПуть = БазовыйУРЛ + "?query=" + ЗакодированныйПараметр + "&limit=10";
ЗапросHTTP = Новый HTTPЗапрос(ПолныйПуть);

Используя эти методы, мы можем построить надежную и отказоустойчивую систему обмена данными с любым современным API. Главное — внимательно следить за документацией API, с которым вы интегрируетесь, корректно обрабатывать коды ошибок HTTP (400, 401, 403, 500) и логировать все этапы обмена для быстрой отладки.

← На главную