Как получить JSON после HTTPS-запроса к сайту в 1С:Предприятии 8.3?

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

В современной разработке интеграция 1С с внешними веб-сервисами, интернет-магазинами и облачными CRM-системами стала стандартом. Чаще всего такое взаимодействие происходит по протоколу HTTPS с использованием API, а данные передаются в формате JSON. Рассмотрим, как правильно настроить подключение, отправить GET-запрос с параметрами, обработать возможные ошибки и корректно распарсить полученный ответ в объекты 1С.

Шаг 1. Создание защищенного соединения (SSL) и настройка HTTP-подключения

Большинство современных сайтов и API работают исключительно по защищенному протоколу HTTPS (порт 443). Если мы попытаемся отправить запрос к такому сайту через обычное соединение, программа вернет ошибку. Для решения этой проблемы в 1С используется объект ЗащищенноеСоединениеOpenSSL.

При создании объекта HTTPСоединение крайне важно явно указывать таймаут ожидания сервера (в секундах). Если этого не сделать, в случае зависания внешнего сайта сеанс пользователя 1С или фоновое задание на сервере может зависнуть на неопределенный срок. Оптимальное время ожидания — 30-60 секунд.

Разберем пример инициализации безопасного соединения:


// Инициализируем защищенное SSL-соединение
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;

// Указываем адрес сервера без протокола (без "https://")
АдресСервера = "hostel.mipt.ru"; 
ПортСоединения = 443; // Стандартный порт для HTTPS
ТаймаутСекунд = 30;   // Время ожидания ответа

// Создаем HTTP-соединение с явным указанием таймаута и SSL
HTTPСоединение = Новый HTTPСоединение(АдресСервера, ПортСоединения, , , , ТаймаутСекунд, ЗащищенноеСоединение);

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

Параметры GET-запроса передаются непосредственно в строке URL-адреса после знака вопроса (например, ?param1=value1¶m2=value2). Если параметры формируются динамически (например, вы передаете дату, поисковый запрос или текстовое имя клиента), они могут содержать спецсимволы, пробелы или кириллицу. Такие данные необходимо обязательно кодировать, иначе сервер вернет ошибку 400 Bad Request.

Для безопасного кодирования параметров используем встроенную функцию платформы КодироватьСтроку со схемой СпособКодированияСтроки.КодированиеURL. Рассмотрим, как правильно собрать строку запроса с API-ключом и параметрами:


// Исходные параметры запроса
КлючAPI = "bEktjzcqcB7YKuroH9ScrQkVUKDdLFCK";
РабочаяДата = "11.07.2018";

// Кодируем параметры на случай наличия спецсимволов или пробелов
ЗакодированнаяДата = КодироватьСтроку(РабочаяДата, СпособКодированияСтроки.КодированиеURL);

// Собираем полный путь к ресурсу (URI) вместе с параметрами
ПутьКРесурсу = "api/" + КлючAPI + "/agreement.listExport/?date_from=" + ЗакодированнаяДата;

// Создаем объект HTTP-запроса
HTTPЗапрос = Новый HTTPЗапрос(ПутьКРесурсу);

Шаг 3. Отправка запроса и обязательная обработка ошибок

Одной из главных ошибок начинающих разработчиков является избыточное доверие конструкции Попытка ... Исключение. Данная конструкция в 1С перехватывает исключительно сетевые ошибки транспортного уровня (например, отсутствие интернета, блокировка порта брандмауэром или неверный SSL-сертификат).

Если запрос физически дошел до веб-сервера, но сервер отклонил его (например, 401 Unauthorized из-за неверного API-ключа или 500 Internal Server Error из-за сбоя на сайте), то исключение в 1С не вызовется. Программа продолжит выполняться, но вместо JSON-данных в ответе будет содержаться HTML-страница с описанием ошибки сервера.

Поэтому мы должны всегда проверять свойство КодСостояния полученного ответа:


Попытка
    // Выполняем GET-запрос к серверу
    РезультатЗапроса = HTTPСоединение.Получить(HTTPЗапрос);
Исключение
    // Сюда мы попадем, только если нет физической связи с сервером
    ЗаписатьЛогОшибки(ОписаниеОшибки());
    ВызватьИсключение "Не удалось установить связь с сервером! Проверьте интернет-соединение.";
КонецПопытки;

// Проверяем код состояния HTTP-ответа
Если РезультатЗапроса.КодСостояния = 200 Тогда
    // Запрос выполнен успешно (ОК)
    ТелоОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
Иначе
    // Обрабатываем ошибки веб-сервера (4xx, 5xx)
    ТекстОшибки = РезультатЗапроса.ПолучитьТелоКакСтроку();
    ВызватьИсключение "Ошибка при обращении к API! Код состояния: " + РезультатЗапроса.КодСостояния + 
                      ". Текст ошибки: " + ТекстОшибки;
КонецЕсли;

Шаг 4. Десериализация (парсинг) полученного JSON-ответа

После успешного получения ответа в переменной ТелоОтвета будет находиться обычная строка. Для того чтобы начать работать с ней как с коллекцией 1С (структурой или массивом), эту строку необходимо распарсить с помощью специализированных объектов ЧтениеJSON и функции ПрочитатьJSON.

Рассмотрим, как преобразовать JSON в структуру 1С:


ЧтениеJSON = Новый ЧтениеJSON;
// Передаем сырую строку во внутренний парсер
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);

// Преобразуем JSON в структуру или массив объектов 1С
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

// Пример обхода полученных данных
Если ТипЗнч(ДанныеОтвета) = Тип("Структура") Тогда
    // Если корень JSON представляет собой объект
    Если ДанныеОтвета.Свойство("Success") И ДанныеОтвета.Success Тогда
        Сообщить("Данные успешно получены!");
        // Обрабатываем вложенные коллекции
    КонецЕсли;
ИначеЕсли ТипЗнч(ДанныеОтвета) = Тип("Массив") Тогда
    // Если корень JSON представляет собой список элементов
    Для Каждого Элемент Из ДанныеОтвета Цикл
        // Обработка каждого элемента массива
    КонецЦикла;
КонецЕсли;

Шаг 5. Оптимизация по памяти для работы с большими файлами JSON

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

Для оптимизации работы с большими файлами рекомендуется считывать ответ напрямую через потоки, минуя промежуточное создание тяжелых строковых переменных. Для этого используется метод ПолучитьТелоКакПоток():


Если РезультатЗапроса.КодСостояния = 200 Тогда
    // Получаем тело ответа в виде потока
    ПотокОтвета = РезультатЗапроса.ПолучитьТелоКакПоток();
    
    ЧтениеJSON = Новый ЧтениеJSON;
    // Открываем чтение напрямую из потока данных
    ЧтениеJSON.ОткрытьПоток(ПотокОтвета);
    
    // Парсинг происходит порциями, экономя оперативную память
    ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
    
    ЧтениеJSON.Закрыть();
    ПотокОтвета.Закрыть();
КонецЕсли;

Важные нюансы работы SSL на серверах под управлением Linux

Если ваше приложение 1С работает в клиент-серверном варианте, а серверная часть функционирует под управлением операционной системы Linux, стандартная инициализация Новый ЗащищенноеСоединениеOpenSSL() без параметров может приводить к ошибкам рукопожатия SSL (Handshake). Это связано с тем, что в дистрибутивах Linux платформе 1С требуется явно указывать пути к сертификатам удостоверяющих центров (CA) операционной системы.

Если при попытке соединения на Linux-сервере возникает ошибка проверки SSL, необходимо проверить наличие установленных пакетов сертификатов (например, ca-certificates) в операционной системе и при необходимости передать в параметры конструктора ЗащищенноеСоединениеOpenSSL пути к файлам сертификатов или отключить строгую проверку цепочки сертификатов, если это допустимо внутренними регламентами безопасности вашей компании.

← На главную