Как настроить запрос к API, авторизацию и получение данных в формате JSON в 1С 8.3

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

В современной разработке на платформе 1С задача интеграции с внешними веб-сервисами через REST API встречается повсеместно. Будь то получение данных о продажах, интеграция с платежными системами или мониторинг оборудования, как в рассматриваемом случае с сервисом «3voda.money». В данной статье мы подробно разберем процесс реализации взаимодействия 1С с внешним сайтом: от настройки защищенного соединения до парсинга полученных JSON-данных. Подобные алгоритмы используются для связи с маркетплейсами, например чтобы реализовать загрузку через API сведений о продажах комиссионеров Wildberries.

Шаг 1. Настройка защищенного соединения (HTTPS)

Большинство современных веб-ресурсов работают по протоколу HTTPS, который требует использования SSL-сертификатов. В 1С для этого предназначен объект ЗащищенноеСоединениеOpenSSL. Если проигнорировать этот шаг, попытка подключения к ресурсу через порт 443 завершится ошибкой.

Рассмотрим, как правильно инициализировать HTTPСоединение. Обратите внимание, что логин и пароль в самом объекте соединения указывать не обязательно, если авторизация на сайте реализована через передачу токена или специальных параметров в теле запроса.


// Создаем объект защищенного соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

// Инициализируем HTTPСоединение
// Сервис - это домен сайта без протокола (например, "3voda.money")
Сервис = "3voda.money"; 
Порт = 443;
HTTPСоединение = Новый HTTPСоединение(Сервис, Порт, , , , , ЗащищенноеСоединение);

Важный нюанс: использование параметра Ложь в конструкторе ЗащищенноеСоединениеOpenSSL (проверка сертификатов) может помочь на этапе разработки, если у сервера самоподписанный сертификат, но для рабочих систем рекомендуется использовать стандартные настройки безопасности.

Шаг 2. Авторизация и получение JWT-токена

Многие современные системы (включая те, что построены на фреймворке JHipster, как в нашем примере) используют механизм авторизации на базе JWT (JSON Web Token). Процесс выглядит так: мы отправляем POST-запрос с логином и паролем, а в ответ получаем строковый токен, который будем использовать во всех последующих запросах. Для предварительного тестирования таких запросов без написания кода можно использовать внешнюю обработку для отладки REST API прямо в 1С.

Проанализируем ситуацию: передача логина и пароля в строке адреса (через параметры GET) часто является небезопасной и может не поддерживаться сервером. Правильный путь — передача данных в теле POST-запроса в формате JSON.


// Подготовка заголовков запроса
ЗаголовкиЗапроса = Новый Соответствие;
ЗаголовкиЗапроса.Вставить("Content-Type", "application/json;charset=utf-8");

// Формируем тело запроса в формате JSON
// Можно использовать ЗаписьJSON, но для простых структур допустимо собрать строку вручную
Логин = "your_email@yandex.ru";
Пароль = "your_password";
ТелоЗапроса = "{""username"":""" + Логин + """,""password"":""" + Пароль + """}";

// Создаем HTTPЗапрос к эндпоинту авторизации
ЗапросТокена = Новый HTTPЗапрос("/api/authenticate", ЗаголовкиЗапроса);
ЗапросТокена.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);

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

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

Шаг 3. Выполнение запросов к данным с использованием токена

После получения токена (например, id_token), его необходимо передавать в каждом последующем запросе. Стандартом является использование заголовка Authorization с типом Bearer. Выясним причину частой ошибки: многие начинающие разработчики забывают добавить префикс "Bearer " перед самим токеном или, наоборот, дублируют его.

Рассмотрим пример получения списка устройств через GET-запрос:


// Формируем заголовки для основного запроса
ЗаголовкиДанных = Новый Соответствие;
ЗаголовкиДанных.Вставить("Content-Type", "application/json");

// Ключевой момент: передача токена авторизации
// Обратите внимание на пробел после слова Bearer
ЗаголовкиДанных.Вставить("Authorization", "Bearer " + id_token);

// Эндпоинт для получения списка устройств
АдресРесурса = "/api/devices";

// Если нужно добавить параметры (например, пагинацию), они добавляются в URL
// Важно: в JHipster и многих Java-системах нумерация страниц начинается с 0
АдресРесурса = АдресРесурса + "?page=0&size=20";

ЗапросДанных = Новый HTTPЗапрос(АдресРесурса, ЗаголовкиДанных);

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

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

Шаг 4. Обработка полученных данных (JSON в 1С)

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


// Функция для преобразования JSON в структуры 1С
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаРезультат);

// Второй параметр "Истина" позволяет получить структуры и массивы
Данные = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();

// Теперь мы можем обходить данные в цикле
Для Каждого Устройство Из Данные Цикл
    // Пример обращения к свойствам (имена соответствуют полям в JSON)
    Сообщить("ID устройства: " + Устройство.deviceId + ", Адрес: " + Устройство.address);
    
    // Если есть вложенные данные (например, статус)
    Если Устройство.Свойство("lastStatus") И Устройство.lastStatus <> Неопределено Тогда
        Сообщить("Последний статус: " + Устройство.lastStatus.statusName);
    КонецЕсли;
КонецЦикла;

Типичные ошибки и рекомендации

При работе с внешними API разработчики часто сталкиваются с неочевидными проблемами. Разберем основные из них:

  1. Ошибка 401 (Unauthorized): Проверьте формат заголовка Authorization. Убедитесь, что токен не содержит лишних пробелов или кавычек. Помните, что JWT-токен имеет ограниченный срок жизни. Рекомендуется реализовать механизм автоматического обновления токена при получении 401 ошибки.
  2. Ошибка 400 (Bad Request): Чаще всего возникает при неправильном формате тела POST-запроса. Проверьте соответствие типов данных (например, число должно быть числом, а не строкой в кавычках) и корректность JSON-структуры.
  3. Пустое тело ответа: Если метод ПолучитьТелоКакСтроку() возвращает пустую строку при коде 200, изучите заголовки ответа (Ответ.Заголовки). Возможно, данные передаются через заголовки или в другой кодировке.
  4. Кодировка текста: Всегда явно указывайте кодировку UTF-8 при отправке и получении данных: Запрос.УстановитьТелоИзСтроки(Текст, КодировкаТекста.UTF8) и Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8).
  5. Параметры в GET-запросах: Помните, что параметры в GET-запросах передаются в строке URL после знака вопроса (?param1=val1¶m2=val2). Попытка установить тело запроса для метода Получить() будет проигнорирована большинством веб-серверов.

Используя приведенные выше примеры и приемы, вы сможете построить надежную систему интеграции вашей базы 1С с любыми современными веб-сервисами, поддерживающими работу через HTTP и JSON.

← На главную