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

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

При интеграции 1С с внешними API через протокол HTTPS разработчики часто сталкиваются с ситуацией, когда вместо ожидаемого JSON-ответа приходит пустая строка или возникает ошибка. Давайте разберем по шагам, почему это происходит и как правильно организовать обмен данными, чтобы код стал надежным и устойчивым к изменениям на стороне сервера.

1. Анализ кодов состояния HTTP

Первая и самая распространенная ошибка — доверие к ответу без проверки заголовков. Серверы часто сообщают о своем состоянии с помощью кодов HTTP. Многие начинающие разработчики ждут ответа 200 OK, однако сервер может вернуть 301 Moved Permanently (ресурс переехал) или 302 Found, если адрес API изменился.

Рассмотрим пример того, как правильно проверять ответ сервера:


HTTPСоединение = Новый HTTPСоединение("www.blockchain.com",,,,, 5, Новый ЗащищенноеСоединениеOpenSSL);
HTTPЗапрос = Новый HTTPЗапрос("ru/ticker");
ОтветHTTP = HTTPСоединение.Получить(HTTPЗапрос);

Если ОтветHTTP.КодСостояния >= 200 И ОтветHTTP.КодСостояния < 300 Тогда
    // Обработка успешного ответа
    СтрокаJSON = ОтветHTTP.ПолучитьТелоКакСтроку("UTF-8");
Иначе
    // Обработка ошибок или перенаправлений
    Сообщить("Ошибка соединения: " + ОтветHTTP.КодСостояния);
    Если ОтветHTTP.КодСостояния = 301 ИЛИ ОтветHTTP.КодСостояния = 302 Тогда
        НовыйАдрес = ОтветHTTP.Заголовки.Получить("Location");
        Сообщить("Ресурс перемещен по адресу: " + НовыйАдрес);
    КонецЕсли;
КонецЕсли;

Как видите, мы проверяем не только 200, но и весь диапазон 2xx, что позволяет программе корректно обрабатывать различные варианты успешного ответа, такие как 201 Created или 204 No Content.

2. Работа с кодировками

Современные веб-сервисы используют стандарт UTF-8 для передачи данных. Указание windows-1251 при чтении тела ответа может привести к искажению символов, особенно если в JSON попадут спецсимволы или нелатинские знаки.

Всегда старайтесь использовать UTF-8, так как это общепринятый стандарт для API. Если вы все же столкнулись с необходимостью принудительного преобразования, помните, что это потенциальный источник ошибок при декодировании данных.

3. Корректный адрес и заголовки

Обратите внимание на то, как вы инициализируете HTTPСоединение. Часто проблема кроется в префиксе www. Некоторые серверы строго настроены на конкретный домен, и обращение к blockchain.com вместо www.blockchain.com может приводить к постоянным переадресациям.

Также важно учитывать заголовки запроса. Некоторые современные серверы блокируют запросы от автоматизированных систем, если в заголовках не указан User-Agent. Вы можете добавить его следующим образом:


HTTPЗапрос = Новый HTTPЗапрос("ru/ticker");
HTTPЗапрос.Заголовки.Вставить("User-Agent", "1C:Enterprise/8.3");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");

4. Подготовка защищенного соединения

Для HTTPS запросов в 1С критически важно наличие корректно настроенного объекта ЗащищенноеСоединениеOpenSSL. Если на сервере 1С установлена старая версия библиотек OpenSSL, вы можете получать пустые ответы или ошибки SSL-рукопожатия. Проверьте актуальность библиотек в папке установки платформы.

Основные рекомендации по отладке:

  1. Проверяйте КодСостояния: Никогда не полагайтесь на то, что ответ будет всегда успешным.
  2. Анализируйте заголовки: Если ответ не 200, посмотрите заголовки ответа через ОтветHTTP.Заголовки, там часто скрыта причина (например, Location при 301).
  3. Логируйте тело ответа: В процессе разработки выводите тело ответа в файл или лог-файл, чтобы видеть реальный текст, который возвращает сервер, если JSON не распарсился.
  4. Используйте инструменты тестирования: Перед написанием кода в 1С попробуйте выполнить запрос через Postman или cURL. Если там все работает, а в 1С нет — проблема в настройках заголовков или библиотеки OpenSSL.

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

← На главную