В современной разработке на платформе 1С:Предприятие 8.3 взаимодействие с внешними веб-сервисами через HTTP-запросы является одной из самых частых задач. Однако новички часто сталкиваются с трудностями при настройке защищенных соединений (HTTPS), обработке специфических портов и работе с кодировками данных. Разберем по шагам, как правильно реализовать получение JSON-данных, избегая типичных ошибок.
Рассмотрим ситуацию, с которой начал автор темы. Использование COMОбъект("WinHttp.WinHttpRequest.5.1") часто приводит к ошибке "A connection with the server could not be established". Это происходит по нескольким причинам:
Проанализируем правильный подход: использование встроенных средств платформы 1С. Это делает код кроссплатформенным (работает и на Windows, и на Linux) и более стабильным.
Если адрес сервера начинается с https://, нам обязательно нужно использовать объект ЗащищенноеСоединениеOpenSSL. Без него попытка соединения завершится ошибкой "Server returned nothing" или отказом в установке связи. Выясним, как это выглядит в коде.
Для создания защищенного соединения обычно достаточно инициализировать объект с параметрами по умолчанию. Платформа сама подберет нужные протоколы TLS.
// Создаем объект защищенного соединения
Сертификат = Новый ЗащищенноеСоединениеOpenSSL();
Важный момент: если в URL указан нестандартный порт (например, :44304), его нельзя оставлять внутри строки адреса сервера. Платформа ожидает адрес сервера и порт как отдельные параметры. Рассмотрим на примере:
// Правильное разделение адреса и порта
Сервер = "vpn.bisoft.fi";
Порт = 44304;
// Создаем соединение
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 15, Сертификат);
В данном примере мы указали тайм-аут 15 секунд и передали наш объект Сертификат (защищенное соединение).
Теперь подготовим сам запрос. Параметры, идущие после знака вопроса (логин, пароль, команды), помещаются в строку ресурса. Обратите внимание на необходимость кодирования спецсимволов (пробелы заменяются на %20 и т.д.), если вы формируете строку вручную.
// Формируем строку запроса с параметрами
Ресурс = "/login?username=log_expeditor&password=log_expeditor1&command=query&qry_name=stock%20report%20extended";
// Создаем объект запроса
Запрос = Новый HTTPЗапрос(Ресурс);
// Выполняем GET-запрос
Ответ = Соединение.Получить(Запрос);
Часто после получения ответа программисты сталкиваются с проблемой кодировки (например, текст превращается в "кракозябры"). Это случается, если сервер отдает данные в UTF-8, а 1С пытается прочитать их в ANSI. Разберем, как правильно прочитать тело ответа в строку.
Вместо того чтобы сохранять ответ сразу в файл (где сложно управлять кодировкой), мы рекомендуем получать текст напрямую из объекта HTTPОтвет.
Если Ответ.КодСостояния = 200 Тогда
// Получаем тело ответа как строку в кодировке UTF-8
СтрокаJSON = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
// Теперь можно работать со строкой или записать её в файл без BOM
ТекстДок = Новый ЗаписьТекста("C:\temp\report.json", КодировкаТекста.UTF8, , Ложь);
ТекстДок.Записать(СтрокаJSON);
ТекстДок.Закрыть();
Иначе
Сообщить("Ошибка запроса! Код состояния: " + Ответ.КодСостояния);
КонецЕсли;
Проанализируем ситуацию: просто получить строку — недостаточно для работы. Чтобы использовать данные в алгоритмах (заполнять справочники или документы), JSON нужно преобразовать в Структуру или Массив. В платформе 8.3 для этого есть встроенный механизм.
// Читаем JSON во внутренние объекты 1С
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Теперь мы можем обращаться к данным как к структуре
Если ТипЗнч(Данные) = Тип("Структура") Тогда
// Например, получаем значение по ключу
Результат = Данные.stock_report;
КонецЕсли;
Проверка кодов состояния: Всегда проверяйте Ответ.КодСостояния. Код 200 означает успех, 401 — ошибку авторизации, 404 — ресурс не найден, а 500 — внутреннюю ошибку сервера.
Безопасность данных: Передача паролей в URL (как в примере выше) не является безопасной, так как они попадают в логи серверов. По возможности используйте Basic-авторизацию, добавляя данные в заголовки запроса:
// Пример добавления заголовка авторизации
Запрос.Заголовки.Вставить("Authorization", "Basic " + База64ЛогинПароль);
Обработка ошибок связи: Оборачивайте вызов метода Соединение.Получить() в блок Попытка...Исключение, так как физическое отсутствие интернета или недоступность сервера вызовет исключительную ситуацию, которую нужно корректно обработать.
Подведем итог: использование встроенных объектов HTTPСоединение и ЗащищенноеСоединениеOpenSSL — это наиболее надежный и современный способ интеграции 1С с внешними системами. Это гарантирует правильную работу с HTTPS и избавляет от зависимости от настроек операционной системы.