Работа с внешними веб-сервисами — одна из наиболее часто встречающихся задач при интеграции 1С с государственными порталами, логистическими компаниями или интернет-магазинами. В данной статье мы подробно разберем, как реализовать подключение к внешнему API (на примере сервиса rs.ge), используя протокол HTTPS и формат обмена данными JSON, особенно в условиях ограничений платформы 1С 8.2, где отсутствуют встроенные средства работы с JSON.
Прежде чем приступать к написанию кода, проанализируем требования внешнего сервиса. Обычно документация API содержит следующие ключевые параметры:
eapi.rs.ge./Users/Authenticate с передачей логина и пароля.Content-Type: application/json)./Org/GetVatPayerStatus для проверки статуса плательщика НДС.Поскольку современные сервисы работают через протокол HTTPS, нам необходимо создать защищенное соединение. В 1С для этого используется объект ЗащищенноеСоединениеOpenSSL. Рассмотрим, как правильно инициализировать подключение:
// Определяем параметры сервера
Сервер = "eapi.rs.ge";
Порт = 443; // Стандартный порт для HTTPS
// Создаем защищенное соединение, используя системные сертификаты
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
// Устанавливаем соединение
HTTPСоединение = Новый HTTPСоединение(Сервер, Порт, , , , , ЗащищенноеСоединение);
Важный момент: в старых версиях платформы 8.2 могут возникнуть проблемы с протоколами TLS 1.2. Если сервер возвращает ошибку соединения, убедитесь, что операционная система и релиз платформы поддерживают актуальные протоколы шифрования.
Для выполнения большинства операций сервис требует предварительной авторизации. Разберем, как отправить учетные данные и получить идентификатор сессии (токен). Поскольку в 1С 8.2 нет объекта ЗаписьJSON, строку запроса нам придется формировать вручную.
// Формируем путь к ресурсу аутентификации
РесурсАут = "/Users/Authenticate";
// Формируем тело запроса в формате JSON вручную
// Внимание: соблюдайте регистр ключей (USERNAME, PASSWORD), если это требует API
ТекстЗапроса = "{
| ""USERNAME"" : ""satesto2"",
| ""PASSWORD"" : ""123456"",
| ""AUTH_TYPE"" : 0,
| ""DEVICE_CODE"" : null
|}";
// Создаем HTTP-запрос
HTTPЗапрос = Новый HTTPЗапрос(РесурсАут);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
HTTPЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
// Отправляем POST-запрос методом ОтправитьДляОбработки
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
// Проверяем результат
Если HTTPОтвет.КодСостояния = 200 Тогда
ТекстОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
// Здесь необходимо извлечь ID из JSON-ответа для дальнейшего использования в качестве Bearer токена
Иначе
Сообщить("Ошибка аутентификации: " + HTTPОтвет.КодСостояния);
КонецЕсли;
Обратите внимание на использование ИспользованиеByteOrderMark.НеИспользовать. Многие веб-серверы не воспринимают JSON, если в начале строки передается невидимый символ BOM, характерный для кодировки UTF-8 в Windows.
Частой ошибкой начинающих разработчиков является неправильное разделение адреса сервера и ресурса. Выясним причину возникновения ошибки 404. Если вы укажете в объекте HTTPЗапрос полный адрес (например, eapi.rs.ge/Users/Authenticate), система будет искать ресурс с таким именем внутри корня сайта, что приведет к ошибке.
Правило распределения адресов:
HTTPСоединение указывается только доменное имя: eapi.rs.ge.HTTPЗапрос указывается путь, начинающийся от корня сайта: /Users/Authenticate.После успешной аутентификации сервер возвращает токен. Его нужно добавлять в заголовки всех последующих запросов. Проанализируем ситуацию на примере проверки статуса плательщика НДС (метод GetVatPayerStatus).
// Полученный ранее токен (условно)
Токен = "ff68b0d6-7733-413f-a9d3-f2b3bed05d59-10042019052459";
РесурсДанных = "/Org/GetVatPayerStatus";
// Создаем запрос
ЗапросКДанным = Новый HTTPЗапрос(РесурсДанных);
// Устанавливаем заголовки
ЗапросКДанным.Заголовки.Вставить("Authorization", "bearer " + Токен);
ЗапросКДанным.Заголовки.Вставить("Content-Type", "application/json");
// Тело запроса с параметрами (ИНН и дата)
СтрокаТела = "{
| ""Tin"": ""206322102"",
| ""VatDate"": ""15-04-2019 13:16:05""
|}";
ЗапросКДанным.УстановитьТелоИзСтроки(СтрокаТела, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
// Выполняем запрос
РезультатЗапроса = HTTPСоединение.ОтправитьДляОбработки(ЗапросКДанным);
Если РезультатЗапроса.КодСостояния = 200 Тогда
Сообщить("Данные получены успешно!");
ТекстРезультата = РезультатЗапроса.ПолучитьТелоКакСтроку();
// Обработка JSON-ответа
Иначе
Сообщить("Ошибка выполнения запроса: " + РезультатЗапроса.КодСостояния);
КонецЕсли;
Разберем, как прочитать ответ сервера, если стандартного ЧтениеJSON нет. У нас есть три основных пути:
Найти() и Сред(). Подходит для простых ответов, где нужно вытащить одно-два значения.VBScript.RegExp.Рассмотрим пример использования ScriptControl для парсинга:
// Предположим, ТекстОтвета содержит {"ID":"12345","Name":"Test"}
Script = Новый COMОбъект("MSScriptControl.ScriptControl");
Script.Language = "JScript";
Script.AddCode("function getID(jsonString) { var obj = eval('(' + jsonString + ')'); return obj.ID; }");
Попытка
ИдентификаторСессии = Script.Run("getID", ТекстОтвета);
Сообщить("ID сессии: " + ИдентификаторСессии);
Исключение
Сообщить("Ошибка парсинга JSON: " + ОписаниеОшибки());
КонецПопытки;
В процессе разработки интеграции важно учитывать следующие моменты:
КодировкаТекста.UTF8, так как JSON по стандарту должен быть именно в этой кодировке.ПолучитьТелоКакСтроку() удобен, при работе с очень большими объемами данных (мегабайты) лучше использовать сохранение ответа в файл через HTTPСоединение.Получить(Запрос, ИмяФайла), чтобы не перегружать оперативную память.КодСостояния. Коды 4xx означают ошибки в вашем запросе (неверный путь, отсутствие заголовков), коды 5xx — проблемы на стороне сервера.HTTPСоединение (например, 30 или 60 секунд), чтобы сеанс пользователя не зависал при нестабильном интернете.Подводя итог, можно сказать, что даже на старых версиях платформы 1С интеграция через JSON вполне реализуема. Главное — четко следовать документации API, правильно разделять компоненты адреса и корректно управлять заголовками HTTP-запроса.