Как правильно настроить интеграцию с API Сбера в 1С с использованием OAuth2?

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

Интеграция с банковскими сервисами через API — это стандартная задача для современного разработчика 1С. Однако при работе с Sber API (Сбербанк) часто возникают сложности, связанные не только с программным кодом, но и со специфическими требованиями безопасности, форматами передачи данных и особенностями авторизации по протоколу OAuth 2.0. В этой статье мы подробно разберем, как избежать типичных ошибок при формировании запросов и правильно настроить взаимодействие с сервисами Сбера.

Анализ исходной проблемы: почему запрос не работает?

Типичная ситуация при начале работы с API Сбера заключается в неправильном выборе HTTP-метода. Часто разработчики по привычке используют метод POST для передачи данных, упаковывая параметры в JSON. Однако многие методы Сбера (например, получение рейтинга партнера или проверка контрагента) требуют использования метода GET, где все параметры передаются непосредственно в строке адреса (URI). Для быстрой отладки и проверки таких GET- и POST-запросов непосредственно из информационной базы можно применить инструмент для тестирования REST API внутри 1С.

Рассмотрим основные ошибки, которые совершают разработчики на начальном этапе:

  1. Использование POST вместо GET: При попытке отправить POST-запрос на ресурс, ожидающий GET, сервер вернет ошибку (часто 405 Method Not Allowed или 404).
  2. Передача параметров в теле запроса для GET: В платформе 1С при выполнении метода Получить() тело запроса игнорируется. Параметры должны быть закодированы и добавлены после знака вопроса в URL.
  3. Неправильная обработка токена: Токен OAuth2 должен передаваться в строго определенном заголовке с префиксом Bearer.

Шаг 1. Получение токена доступа OAuth 2.0

Перед тем как обращаться к бизнес-методам API, нам необходимо получить временный ключ доступа — Access Token. Проанализируем процесс его получения. Обычно это POST-запрос на специальный адрес (например, /ru/prod/tokens/v2/oauth).

Разберем пример кода для получения токена. Обратите внимание на обязательные заголовки:


// Подготовка параметров для получения токена
АдресСервераТокенов = "api.sberbank.ru";
РесурсТокена = "/ru/prod/tokens/v2/oauth";

Соединение = Новый HTTPСоединение(АдресСервераТокенов, 443, , , , 60, Новый ЗащищенноеСоединениеOpenSSL());

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
// RqUID - уникальный идентификатор запроса, 32 символа (GUID без дефисов)
Заголовки.Вставить("x-ibm-client-id", МойClientID);
Заголовки.Вставить("rquid", СгенерироватьУникальныйИдентификатор()); 

ТелоЗапроса = "grant_type=client_credentials&scope=YOUR_SCOPE";

Запрос = Новый HTTPЗапрос(РесурсТокена, Заголовки);
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    // Парсим ответ и извлекаем access_token
КонецЕсли;

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

Выясним, как правильно передать параметры legal_inn и model_id. Поскольку нам нужен метод GET, мы должны сконструировать строку ресурса. Проанализируем ситуацию: если мы передаем данные в строке, важно помнить про URL-кодирование (хотя для цифр это не критично, для строк с пробелами или кириллицей — обязательно).

Рассмотрим пример формирования запроса на получение рейтинга:


АдресСервера = "dev.api.sberbank.ru"; // Используем dev-стенд для тестов
ИНН = "7707083893";
IDМодели = 1;

// Формируем ресурс с параметрами в строке
АдресРесурса = "ru/prod/ratings/partner/legal/v1/rating/partner?legal_inn=" + ИНН + "&model_id=" + Формат(IDМодели, "ЧГ=0");

Заголовки = Новый Соответствие;
Заголовки.Вставить("Accept", "application/json");
// Вставляем полученный ранее токен
Заголовки.Вставить("Authorization", "Bearer " + ПолученныйТокен);
Заголовки.Вставить("x-ibm-client-id", МойClientID);

// Дополнительный технический заголовок, если требуется документацией
Заголовки.Вставить("x-introspect-rquid", СгенерироватьУникальныйИдентификатор());

Соединение = Новый HTTPСоединение(АдресСервера, 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);

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

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

Шаг 3. Работа с сертификатами безопасности (mTLS)

Сбербанк уделяет огромное внимание безопасности. Проанализируем критический момент: Сбер перешел на использование национальных сертификатов (Минцифры). Это означает, что стандартное Новый ЗащищенноеСоединениеOpenSSL() без параметров может выдать ошибку «Удаленный узел не прошел проверку».

Для решения этой проблемы мы должны:

  1. Установить корневые сертификаты Минцифры в хранилище операционной системы на сервере 1С.
  2. Если используется двухсторонний TLS (mTLS), необходимо передать в объект ЗащищенноеСоединениеOpenSSL клиентский сертификат, выданный банком.

Пример инициализации защищенного соединения с сертификатом:


СертификатКриптографии = Новый СертификатКриптографии(ПутьКФайлуСертификата, Пароль);
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
    Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Выбирать), 
    Новый СертификатыУдостоверяющихЦентровWindows()
);
// Или явно указать файл сертификата
Соединение = Новый HTTPСоединение(АдресСервера, 443, , , , 30, ЗащищенноеСоединение);

Шаг 4. Важные нюансы заголовков

Посмотрим на заголовок x-ibm-client-id. Это уникальный ключ вашего приложения, который вы получаете в личном кабинете разработчика Сбера. Без него сервер даже не начнет проверять ваш токен. Также обратим внимание на заголовок Accept-Language. Рекомендуется указывать ru-RU, чтобы получать описания ошибок на русском языке.

Выделим ключевые заголовки для успешного вызова:

Обработка результатов и типичные ошибки

Проанализируем ситуацию, когда запрос возвращает код, отличный от 200. В 1С важно всегда читать тело ответа через HTTPОтвет.ПолучитьТелоКакСтроку(). Сбер часто возвращает JSON с подробным описанием того, что пошло не так.

Возможные коды ошибок:

Таким образом, мы выяснили, что успешная интеграция с API Сбера в 1С строится на трех столпах: правильный HTTP-метод (GET/POST), корректно сформированные заголовки с OAuth-токеном и настроенное доверенное соединение через SSL. Следуя этим шагам, вы сможете настроить стабильный обмен данными с банковской системой. В качестве практического примера работы с сервисами экосистемы банка можно использовать готовый модуль интеграции с сервисом SberScan.

← На главную