В современной разработке на платформе 1С задача интеграции с внешними веб-сервисами через REST API встречается повсеместно. Будь то получение данных о продажах, интеграция с платежными системами или мониторинг оборудования, как в рассматриваемом случае с сервисом «3voda.money». В данной статье мы подробно разберем процесс реализации взаимодействия 1С с внешним сайтом: от настройки защищенного соединения до парсинга полученных JSON-данных. Подобные алгоритмы используются для связи с маркетплейсами, например чтобы реализовать загрузку через API сведений о продажах комиссионеров Wildberries.
Большинство современных веб-ресурсов работают по протоколу HTTPS, который требует использования SSL-сертификатов. В 1С для этого предназначен объект ЗащищенноеСоединениеOpenSSL. Если проигнорировать этот шаг, попытка подключения к ресурсу через порт 443 завершится ошибкой.
Рассмотрим, как правильно инициализировать HTTPСоединение. Обратите внимание, что логин и пароль в самом объекте соединения указывать не обязательно, если авторизация на сайте реализована через передачу токена или специальных параметров в теле запроса.
// Создаем объект защищенного соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Инициализируем HTTPСоединение
// Сервис - это домен сайта без протокола (например, "3voda.money")
Сервис = "3voda.money";
Порт = 443;
HTTPСоединение = Новый HTTPСоединение(Сервис, Порт, , , , , ЗащищенноеСоединение);
Важный нюанс: использование параметра Ложь в конструкторе ЗащищенноеСоединениеOpenSSL (проверка сертификатов) может помочь на этапе разработки, если у сервера самоподписанный сертификат, но для рабочих систем рекомендуется использовать стандартные настройки безопасности.
Многие современные системы (включая те, что построены на фреймворке 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
Иначе
Сообщить("Ошибка авторизации! Код: " + Ответ.КодСостояния);
КонецЕсли;
После получения токена (например, 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 Тогда
Сообщить("Токен истек или не верен. Требуется повторная авторизация.");
Иначе
Сообщить("Произошла ошибка запроса. Код: " + ОтветДанные.КодСостояния);
КонецЕсли;
Полученную строку JSON необходимо преобразовать в объекты 1С (Массивы и Структуры) для дальнейшей обработки. Проанализируем, как это сделать наиболее эффективно с помощью встроенных средств платформы 8.3. Для анализа структуры ответа и автоматического создания скриптов обхода подойдет инструмент для инспекции JSON и генерации кода 1С.
// Функция для преобразования JSON в структуры 1С
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаРезультат);
// Второй параметр "Истина" позволяет получить структуры и массивы
Данные = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();
// Теперь мы можем обходить данные в цикле
Для Каждого Устройство Из Данные Цикл
// Пример обращения к свойствам (имена соответствуют полям в JSON)
Сообщить("ID устройства: " + Устройство.deviceId + ", Адрес: " + Устройство.address);
// Если есть вложенные данные (например, статус)
Если Устройство.Свойство("lastStatus") И Устройство.lastStatus <> Неопределено Тогда
Сообщить("Последний статус: " + Устройство.lastStatus.statusName);
КонецЕсли;
КонецЦикла;
При работе с внешними API разработчики часто сталкиваются с неочевидными проблемами. Разберем основные из них:
Authorization. Убедитесь, что токен не содержит лишних пробелов или кавычек. Помните, что JWT-токен имеет ограниченный срок жизни. Рекомендуется реализовать механизм автоматического обновления токена при получении 401 ошибки.ПолучитьТелоКакСтроку() возвращает пустую строку при коде 200, изучите заголовки ответа (Ответ.Заголовки). Возможно, данные передаются через заголовки или в другой кодировке.Запрос.УстановитьТелоИзСтроки(Текст, КодировкаТекста.UTF8) и Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8).?param1=val1¶m2=val2). Попытка установить тело запроса для метода Получить() будет проигнорирована большинством веб-серверов.Используя приведенные выше примеры и приемы, вы сможете построить надежную систему интеграции вашей базы 1С с любыми современными веб-сервисами, поддерживающими работу через HTTP и JSON.