Как получить и обработать JSON через HTTP-запрос в 1С 8.3

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

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

Анализ проблемы: почему COM-объекты — не лучший выбор

Рассмотрим ситуацию, с которой начал автор темы. Использование COMОбъект("WinHttp.WinHttpRequest.5.1") часто приводит к ошибке "A connection with the server could not be established". Это происходит по нескольким причинам:

  1. Протоколы безопасности: Старые версии Windows или настройки системы по умолчанию могут пытаться использовать устаревшие протоколы SSL 3.0 или TLS 1.0, в то время как современные серверы требуют TLS 1.2 или 1.3.
  2. Зависимость от окружения: Работа COM-объекта зависит от системных библиотек и настроек Internet Explorer на конкретном сервере или компьютере пользователя.

Проанализируем правильный подход: использование встроенных средств платформы 1С. Это делает код кроссплатформенным (работает и на Windows, и на Linux) и более стабильным.

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

Если адрес сервера начинается с https://, нам обязательно нужно использовать объект ЗащищенноеСоединениеOpenSSL. Без него попытка соединения завершится ошибкой "Server returned nothing" или отказом в установке связи. Выясним, как это выглядит в коде.

Для создания защищенного соединения обычно достаточно инициализировать объект с параметрами по умолчанию. Платформа сама подберет нужные протоколы TLS.


// Создаем объект защищенного соединения
Сертификат = Новый ЗащищенноеСоединениеOpenSSL();

Шаг 2. Создание HTTP-соединения с учетом порта

Важный момент: если в URL указан нестандартный порт (например, :44304), его нельзя оставлять внутри строки адреса сервера. Платформа ожидает адрес сервера и порт как отдельные параметры. Рассмотрим на примере:


// Правильное разделение адреса и порта
Сервер = "vpn.bisoft.fi";
Порт = 44304;

// Создаем соединение
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 15, Сертификат);

В данном примере мы указали тайм-аут 15 секунд и передали наш объект Сертификат (защищенное соединение).

Шаг 3. Подготовка и выполнение HTTP-запроса

Теперь подготовим сам запрос. Параметры, идущие после знака вопроса (логин, пароль, команды), помещаются в строку ресурса. Обратите внимание на необходимость кодирования спецсимволов (пробелы заменяются на %20 и т.д.), если вы формируете строку вручную.


// Формируем строку запроса с параметрами
Ресурс = "/login?username=log_expeditor&password=log_expeditor1&command=query&qry_name=stock%20report%20extended";

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

// Выполняем GET-запрос
Ответ = Соединение.Получить(Запрос);

Шаг 4. Работа с кодировкой и получение JSON

Часто после получения ответа программисты сталкиваются с проблемой кодировки (например, текст превращается в "кракозябры"). Это случается, если сервер отдает данные в UTF-8, а 1С пытается прочитать их в ANSI. Разберем, как правильно прочитать тело ответа в строку.

Вместо того чтобы сохранять ответ сразу в файл (где сложно управлять кодировкой), мы рекомендуем получать текст напрямую из объекта HTTPОтвет.


Если Ответ.КодСостояния = 200 Тогда
    // Получаем тело ответа как строку в кодировке UTF-8
    СтрокаJSON = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    // Теперь можно работать со строкой или записать её в файл без BOM
    ТекстДок = Новый ЗаписьТекста("C:\temp\report.json", КодировкаТекста.UTF8, , Ложь);
    ТекстДок.Записать(СтрокаJSON);
    ТекстДок.Закрыть();
Иначе
    Сообщить("Ошибка запроса! Код состояния: " + Ответ.КодСостояния);
КонецЕсли;

Шаг 5. Десериализация JSON в объекты 1С

Проанализируем ситуацию: просто получить строку — недостаточно для работы. Чтобы использовать данные в алгоритмах (заполнять справочники или документы), JSON нужно преобразовать в Структуру или Массив. В платформе 8.3 для этого есть встроенный механизм.


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

// Теперь мы можем обращаться к данным как к структуре
Если ТипЗнч(Данные) = Тип("Структура") Тогда
    // Например, получаем значение по ключу
    Результат = Данные.stock_report;
КонецЕсли;

Полезные советы при работе с HTTP в 1С

Проверка кодов состояния: Всегда проверяйте Ответ.КодСостояния. Код 200 означает успех, 401 — ошибку авторизации, 404 — ресурс не найден, а 500 — внутреннюю ошибку сервера.

Безопасность данных: Передача паролей в URL (как в примере выше) не является безопасной, так как они попадают в логи серверов. По возможности используйте Basic-авторизацию, добавляя данные в заголовки запроса:


// Пример добавления заголовка авторизации
Запрос.Заголовки.Вставить("Authorization", "Basic " + База64ЛогинПароль);

Обработка ошибок связи: Оборачивайте вызов метода Соединение.Получить() в блок Попытка...Исключение, так как физическое отсутствие интернета или недоступность сервера вызовет исключительную ситуацию, которую нужно корректно обработать.

Подведем итог: использование встроенных объектов HTTPСоединение и ЗащищенноеСоединениеOpenSSL — это наиболее надежный и современный способ интеграции 1С с внешними системами. Это гарантирует правильную работу с HTTPS и избавляет от зависимости от настроек операционной системы.

← На главную