Часто в корпоративной разработке возникает задача автоматической проверки контрагентов или получения их реквизитов через сторонние сервисы по ИНН. Рассмотрим подробнее, как в 1С организовать взаимодействие с современными веб-сервисами, требующими передачи JWT-токенов авторизации и работающими с форматом обмена JSON.
Разберем по шагам весь процесс от установки защищенного соединения до парсинга ответа. Проанализируем ситуацию, когда API сервиса использует архитектуру, близкую к GraphQL, что требует передачи специальной структуры variables.
Для начала выясним причину, почему базовое создание объекта HTTPСоединение из примеров прошлых лет может не работать. Современные API всегда работают через защищенный протокол HTTPS (порт 443). Если мы просто напишем создание соединения с указанием адреса сервера, платформа попытается использовать обычный HTTP, что приведет к ошибке.
Чтобы соединение установилось корректно, мы обязательно должны использовать защищенный канал, передав в конструктор параметр ЗащищенноеСоединениеOpenSSL. Посмотрим на правильный пример инициализации соединения:
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Указываем адрес сервера, порт 443 и передаем объект защищенного соединения
Соединение = Новый HTTPСоединение("api.example.com", 443, , , , , ЗащищенноеСоединение);
Специфика современных сервисов заключается в том, что логин и пароль обычно не передаются в каждом запросе. Как мы выяснили из обсуждения, сначала мы (разово или периодически) обращаемся к сервису за токеном, а затем при каждом запросе передаем полученный JWT-токен.
Рассмотрим два способа передачи такого токена в 1С, зависящих от версии вашей платформы:
Authorization с типом Bearer.ТокенДоступа.Посмотрим на пример кода, реализующий оба подхода:
HTTPЗапрос = Новый HTTPЗапрос("/api/v1/counterparty");
// 1. Традиционный способ (работает на всех версиях)
HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + СтрокаТокена);
// 2. Современный способ (8.3.21+)
// Токен = Новый ТокенДоступа(СтрокаТокена);
// HTTPЗапрос.ДобавитьТокенДоступа(Токен);
Многие современные сервисы используют архитектуру GraphQL, которая требует специфичной структуры тела POST-запроса. Нам нужно передать JSON, содержащий узлы query (сам запрос) и variables (параметры запроса, такие как ИНН и иногда сам токен авторизации).
Чтобы сформировать правильный JSON, создадим в 1С объект Структура, заполним его необходимыми ключами и сериализуем в строку с помощью объекта ЗаписьJSON.
// Формируем структуру переменных (ИНН)
СтруктураПеременных = Новый Структура;
СтруктураПеременных.Вставить("inn", "7707083893");
// Формируем общую структуру запроса
ТелоЗапроса = Новый Структура;
ТелоЗапроса.Вставить("query", "query GetCounterparty($inn: String!) { ... }");
ТелоЗапроса.Вставить("variables", СтруктураПеременных);
// Сериализуем структуру в строку JSON
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, ТелоЗапроса);
СтрокаJSON = Запись.Закрыть();
// Устанавливаем сформированную строку в качестве тела HTTP-запроса
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Теперь, когда у нас есть готовое защищенное соединение и сформированный HTTPЗапрос с нужными заголовками и телом, мы можем отправить его на сервер методом POST и получить ответ.
Разберем, как получить и прочитать данные ответа. Ответ от сервера также приходит в формате JSON, поэтому для извлечения полезных данных (например, адреса страницы контрагента) мы воспользуемся объектом ЧтениеJSON.
Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
Если Ответ.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
// Десериализуем JSON-ответ в структуру 1С
ДанныеОтвета = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Получаем нужные данные из структуры
// Например: СсылкаНаСтраницу = ДанныеОтвета.data.url;
Иначе
// Обработка ошибки
Сообщить("Ошибка при обращении к API. Код статуса: " + Ответ.КодСостояния);
КонецЕсли;
Таким образом, мы построили полноценную цепочку интеграции. Мы проанализировали важность использования ЗащищенноеСоединениеOpenSSL, рассмотрели способы работы с JWT-токенами через объект ТокенДоступа и научились упаковывать параметры (такие как ИНН) в узел variables для запросов в формате GraphQL.