Как настроить обмен данными с внешним API по протоколу JSON в 1C 8.2

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

Работа с внешними веб-сервисами — одна из наиболее часто встречающихся задач при интеграции 1С с государственными порталами, логистическими компаниями или интернет-магазинами. В данной статье мы подробно разберем, как реализовать подключение к внешнему API (на примере сервиса rs.ge), используя протокол HTTPS и формат обмена данными JSON, особенно в условиях ограничений платформы 1С 8.2, где отсутствуют встроенные средства работы с JSON.

Постановка задачи и анализ протокола

Прежде чем приступать к написанию кода, проанализируем требования внешнего сервиса. Обычно документация API содержит следующие ключевые параметры:

  1. Адрес хоста (Host): Например, eapi.rs.ge.
  2. Метод аутентификации: Обычно это POST-запрос к ресурсу /Users/Authenticate с передачей логина и пароля.
  3. Формат данных: JSON (требует установки заголовка Content-Type: application/json).
  4. Ресурсы (Endpoint): Конкретные пути для выполнения действий, например, /Org/GetVatPayerStatus для проверки статуса плательщика НДС.

Шаг 1. Настройка защищенного соединения

Поскольку современные сервисы работают через протокол HTTPS, нам необходимо создать защищенное соединение. В 1С для этого используется объект ЗащищенноеСоединениеOpenSSL. Рассмотрим, как правильно инициализировать подключение:


// Определяем параметры сервера
Сервер = "eapi.rs.ge";
Порт = 443; // Стандартный порт для HTTPS

// Создаем защищенное соединение, используя системные сертификаты
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);

// Устанавливаем соединение
HTTPСоединение = Новый HTTPСоединение(Сервер, Порт, , , , , ЗащищенноеСоединение);

Важный момент: в старых версиях платформы 8.2 могут возникнуть проблемы с протоколами TLS 1.2. Если сервер возвращает ошибку соединения, убедитесь, что операционная система и релиз платформы поддерживают актуальные протоколы шифрования.

Шаг 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.

Шаг 3. Решение проблемы ошибки 404 (Not Found)

Частой ошибкой начинающих разработчиков является неправильное разделение адреса сервера и ресурса. Выясним причину возникновения ошибки 404. Если вы укажете в объекте HTTPЗапрос полный адрес (например, eapi.rs.ge/Users/Authenticate), система будет искать ресурс с таким именем внутри корня сайта, что приведет к ошибке.

Правило распределения адресов:

Шаг 4. Отправка запроса с авторизацией (Bearer Token)

После успешной аутентификации сервер возвращает токен. Его нужно добавлять в заголовки всех последующих запросов. Проанализируем ситуацию на примере проверки статуса плательщика НДС (метод 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-ответа
Иначе
    Сообщить("Ошибка выполнения запроса: " + РезультатЗапроса.КодСостояния);
КонецЕсли;

Шаг 5. Парсинг JSON в 1С 8.2 без встроенных функций

Разберем, как прочитать ответ сервера, если стандартного ЧтениеJSON нет. У нас есть три основных пути:

  1. Строковые функции: Использование Найти() и Сред(). Подходит для простых ответов, где нужно вытащить одно-два значения.
  2. MSScriptControl: Использование COM-объекта для исполнения JavaScript. Это самый надежный способ для 8.2, позволяющий работать с JSON как с объектом.
  3. Регулярные выражения: Через объект 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: " + ОписаниеОшибки());
КонецПопытки;

Рекомендации по работе с HTTP в 1С 8.2

В процессе разработки интеграции важно учитывать следующие моменты:

Подводя итог, можно сказать, что даже на старых версиях платформы 1С интеграция через JSON вполне реализуема. Главное — четко следовать документации API, правильно разделять компоненты адреса и корректно управлять заголовками HTTP-запроса.

← На главную