Как в 1С получить данные с сайта через REST API с авторизацией по токену (Bearer)?

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

При интеграции 1С со сторонними веб-сервисами и сайтами разработчики часто сталкиваются с задачей взаимодействия через REST API. Классический сценарий работы с защищенным API состоит из двух ключевых этапов: сначала выполняется запрос на аутентификацию для получения временного ключа доступа (токена), а затем выполняется рабочий запрос за данными с передачей этого токена в HTTP-заголовках. Разберем по шагам, как правильно реализовать этот процесс в 1С:Предприятии 8.3.

Принцип работы аутентификации Bearer Token в HTTP-запросах

Рассмотрим общую схему взаимодействия с веб-сервисом:

  1. Запрос авторизации: 1С отправляет логин и пароль (или API-ключ) на специальный эндпоинт сервиса (например, /api/v1/login).
  2. Получение токена: Сервер возвращает ответ (обычно в формате JSON или XML), содержащий строку токена — например, в поле accessToken.
  3. Запрос данных: 1С формирует рабочий GET-запрос к нужному ресурсу, добавляя в заголовки параметр Authorization: Bearer <Токен>.
  4. Обработка ответа: Сервер проверяет переданный токен и возвращает запрошенные данные.

Шаг 1. Создание безопасного HTTP-соединения

Проанализируем создание объекта HTTPСоединение. В современных веб-сервисах практически всегда используется защищенный протокол HTTPS. Для корректной работы важно передавать имя сервера без префиксов протокола (https://) и завершающих слэшей, а для шифрования указывать порт 443 и защищенное соединение OpenSSL.

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


ИмяСервера = "devis7sur7.com";
Таймаут = 30;
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

Соединение = Новый HTTPСоединение(
    ИмяСервера, 
    443, 
    ,,, 
    Таймаут, 
    ЗащищенноеСоединение
);

Шаг 2. Выполнение запроса аутентификации и получение токена

Выясним, как передать учетные данные и получить ответ сервера. В зависимости от реализации API логин и пароль могут передаваться как в пути URL, так и в теле POST-запроса. Если параметры передаются в строке запроса, спецсимволы и пробелы следует предварительно экранировать с помощью функции КодироватьСтроку со способом кодирования СпособКодированияСтроки.КодировкаURL.

Рассмотрим пример отправки запроса на получение токена и обработку JSON-ответа:


Логин = "1c@devis7sur7.com";
Пароль = "SecretPassword123";

// Кодируем параметры для безопасной передачи в URL
ЛогинКодированный = КодироватьСтроку(Логин, СпособКодированияСтроки.КодировкаURL);
ПарольКодированный = КодироватьСтроку(Пароль, СпособКодированияСтроки.КодировкаURL);

АдресРесурсаАвторизации = "/api/v1/default/login/" + ЛогинКодированный + "/" + ПарольКодированный;

Заголовки = Новый Соответствие;
Заголовки.Вставить("Accept", "application/json");

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

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

Если HTTPОтвет.КодСостояния <> 200 Тогда
    ВызватьИсключение "Ошибка авторизации. Код состояния: " + HTTPОтвет.КодСостояния;
КонецЕсли;

СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();

// Извлекаем токен с помощью встроенных средств JSON
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
СтруктураОтвета = ПрочитатьJSON(Чтение);
Чтение.Закрыть();

ТокенДоступа = СтруктураОтвета.accessToken;

Если сервер возвращает данные в формате XML, разбор тела выполняется с помощью объекта ЧтениеXML или ПостроительDOM.

Шаг 3. Запрос целевых данных с Bearer-токеном

Теперь, имея полученный accessToken, мы можем обращаться к закрытым ресурсам API. Для этого в заголовки запроса добавляется заголовок Authorization со значением "Bearer " + ТокенДоступа.

Разберем пример запроса рабочей информации:


АдресДанных = "/api/v1/form/1";

ЗаголовкиДанных = Новый Соответствие;
ЗаголовкиДанных.Вставить("Authorization", "Bearer " + ТокенДоступа);
ЗаголовкиДанных.Вставить("Accept", "application/json");

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

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

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

Рекомендации по оптимизации работы с токенами

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

  1. Кэширование токена: Получение нового токена перед каждым отдельным запросом существенно замедляет работу и перегружает веб-сервер. Рекомендуется сохранять полученный токен в параметрах сеанса или в регистре сведений и обновлять его только при получении ответа с кодом 401 (Unauthorized).
  2. Контроль кодов состояния: Всегда проверяйте свойство КодСостояния перед чтением тела ответа, чтобы избежать ошибок парсинга некорректных ответов (например, HTML-страниц с ошибками веб-сервера 404 или 500).
  3. Безопасная обработка исключений: Все вызовы методов Получить(), ОтправитьДляОбработки() и других сетевых операций обязательно заключайте в конструкцию Попытка ... Исключение для перехвата сетевых сбоев, таймаутов и проблем с DNS.
← На главную