К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как отправить GET-запрос из 1С

Как отправить GET-запрос из 1С: объект HTTPСоединение, HTTPЗапрос, параметры, заголовки, SSL, обработка ответа и типичные ошибки с примерами кода.

Отправка GET-запросов из 1С — стандартная задача интеграции: получение курсов валют, обмен с сайтом, работа с REST API поставщиков. Встроенный язык платформы предоставляет для этого объекты HTTPСоединение и HTTPЗапрос, которые работают как на сервере, так и на клиенте (в тонком и веб-клиенте с ограничениями).

Минимальный сценарий состоит из трёх шагов: создать соединение с сервером, сформировать запрос с адресом ресурса и параметрами, выполнить метод Получить() и прочитать ответ. Ниже разобран полный рабочий пример, варианты с HTTPS и авторизацией, а также типичные ошибки, из-за которых запрос «не уходит» или возвращает не то, что ожидалось.

Весь код приводится для управляемых форм и общих модулей с признаком «Сервер». Выполнять сетевые вызовы рекомендуется именно на сервере: это снимает проблемы с правами пользователя и ограничения клиентского окружения.

Базовый пример GET-запроса

Простейший вариант — запрос к открытому HTTP-ресурсу без авторизации. Достаточно указать сервер и путь к ресурсу:

bsl
Соединение = Новый HTTPСоединение("api.example.ru", 80);
Запрос = Новый HTTPЗапрос("/status");
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
Иначе
    ВызватьИсключение "Ошибка запроса: " + Ответ.КодСостояния;
КонецЕсли;

Конструктор HTTPСоединение принимает хост, порт, логин и пароль (если нужна базовая авторизация), прокси и таймаут. Объект HTTPЗапрос описывает конкретный ресурс: относительный адрес, заголовки и тело (для GET тело обычно не используется).

Метод Получить() — это и есть GET-запрос. Он возвращает объект HTTPОтвет, из которого читают код состояния, заголовки и тело. Всегда проверяйте КодСостояния перед разбором ответа: при ошибке сервера тело может содержать HTML-страницу ошибки, а не ожидаемые данные.

Передача параметров в строке запроса

GET-параметры передаются прямо в адресе ресурса после знака вопроса. Их можно собрать вручную конкатенацией строк:

bsl
АдресРесурса = "/products?category=" + Категория + "&date=" + Формат(Дата, "ДФ=yyyy-MM-dd");
Запрос = Новый HTTPЗапрос(АдресРесурса);
Ответ = Соединение.Получить(Запрос);

Важный нюанс — кодирование спецсимволов. Кириллица, пробелы и символы вроде & в значениях параметров должны быть закодированы, иначе сервер получит искажённые данные или запрос вообще не выполнится. Для этого используйте функцию КодироватьСтроку() с методом СпособКодированияСтроки.КодировкаURL.

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

Работа по HTTPS и защищённое соединение

Большинство современных API работают только по HTTPS. В 1С для этого в конструктор HTTPСоединение передаётся объект защищённого соединения:

bsl
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30, ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос("/v1/data");
Ответ = Соединение.Получить(Запрос);

Объект ЗащищенноеСоединениеOpenSSL можно создать без параметров — тогда используется проверка сертификата по умолчанию. Если сервер использует самоподписанный сертификат (часто встречается во внутренних контурах), платформа выдаст ошибку проверки. В тестовой среде это обходят передачей Новый СертификатыУдостоверяющихЦентровОС или отключением проверки, но в продуктиве так делать не стоит: правильное решение — установить корневой сертификат в хранилище сервера 1С.

Таймаут указывается в секундах шестым параметром конструктора. Не оставляйте значение по умолчанию для внешних сервисов: зависший запрос без таймаута может надолго заблокировать сеанс или фоновое задание.

Заголовки и авторизация

Многие API требуют токен в заголовке. Заголовки запроса задаются через соответствие Запрос.Заголовки:

bsl
Запрос = Новый HTTPЗапрос("/v1/orders");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
Запрос.Заголовки.Вставить("Accept", "application/json");
Ответ = Соединение.Получить(Запрос);

Для базовой HTTP-авторизации достаточно передать логин и пароль в конструктор HTTPСоединение третьим и четвёртым параметрами — платформа сама сформирует заголовок Authorization: Basic.

Храните токены и пароли не в коде, а в защищённом хранилище: в константах с ограниченным доступом, в безопасном хранилище данных или в настройках регистра сведений с разграничением прав. Токен, попавший в текст модуля, рано или поздно окажется в копии базы или выгрузке конфигурации.

Разбор ответа: JSON, коды состояния, ошибки

Чаще всего API возвращает JSON. В 1С его разбирают через ЧтениеJSON:

bsl
Если Ответ.КодСостояния = 200 Тогда
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
    Данные = ПрочитатьJSON(Чтение, Истина); // соответствие
    Чтение.Закрыть();
КонецЕсли;

Коды состояния помогают диагностировать проблему: 200 — успех, 301/302 — перенаправление (проверьте адрес), 401 — нет или неверна авторизация, 403 — доступ запрещён, 404 — неверный адрес ресурса, 429 — превышен лимит запросов, 5xx — ошибка на стороне сервера. Полезно логировать код и первые символы тела ответа при неуспехе — это сильно ускоряет разбор инцидентов.

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

Контрольные точки

Как проверить результат

Код состояния ответа
Норма

200 или другой ожидаемый код из документации API

Тревожный признак

401, 403, 404, 5xx или исключение платформы

Содержимое тела ответа
Норма

Валидный JSON/XML, разбирается без ошибок

Тревожный признак

HTML-страница ошибки или пустое тело

Время выполнения
Норма

Ответ приходит за секунды, в пределах таймаута

Тревожный признак

Запрос зависает или отваливается по таймауту

Типичные ошибки и ограничения

Самая частая проблема — выполнение кода на клиенте там, где это невозможно. В тонком клиенте HTTP-вызовы работают, но в веб-клиенте действуют ограничения браузера (кросс-доменные запросы). Надёжнее выносить обмен на сервер через вызов серверной процедуры или фоновое задание.

Вторая группа ошибок — прокси. Если сервер 1С выходит в интернет через прокси, его нужно явно указать в конструкторе HTTPСоединение объектом ИнтернетПрокси, иначе соединение не установится. Третья типичная ситуация — неверная кодировка ответа: если строка читается «кракозябрами», укажите кодировку в методе ПолучитьТелоКакСтроку(КодировкаТекста.UTF8).

Типичные ошибки
01
Не проверяется КодСостояния — программа пытается разобрать страницу ошибки как JSON и падает
02
Параметры вставляются в URL без кодирования — кириллица и спецсимволы ломают запрос
03
Не задан таймаут — зависший внешний сервис блокирует сеанс пользователя
04
Токен хранится прямо в тексте модуля и утекает вместе с выгрузкой конфигурации
05
Запрос выполняется на клиенте, где нет доступа к сети, вместо серверного вызова

Альтернативы и когда их выбирать

Если интеграция постоянная и объёмная, прямые вызовы из кода стоит обернуть в отдельный общий модуль с функциями вида ПолучитьДанныеAPI(Метод, Параметры) — так проще менять адреса, токены и логику повторных попыток в одном месте.

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

Итог

Что важно запомнить

GET-запрос в 1С — это HTTPСоединение + HTTPЗапрос + метод Получить(). Для HTTPS добавьте ЗащищенноеСоединениеOpenSSL, параметры кодируйте, код состояния проверяйте всегда, таймаут задавайте явно, а сетевые вызовы выполняйте на сервере с обработкой исключений.

Частые вопросы

Чем отличается метод Получить() от ВызватьHTTPМетод()?

Получить() — короткая форма именно для GET. ВызватьHTTPМетод("GET", Запрос) делает то же самое, но позволяет указать любой метод (POST, PUT, DELETE) единообразным способом, что удобно в универсальных функциях обмена.

Как отправить GET-запрос через прокси-сервер?

Создайте объект ИнтернетПрокси, задайте адрес, порт и при необходимости логин с паролем, затем передайте его пятым параметром в конструктор HTTPСоединение. Без этого соединение пойдёт напрямую и, скорее всего, не установится в корпоративной сети.

Почему ответ приходит в неправильной кодировке?

Платформа определяет кодировку по заголовку Content-Type ответа, и не все серверы указывают её корректно. Явно передайте кодировку: Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8) — это решает проблему «кракозябр» в большинстве случаев.

Можно ли выполнять GET-запросы в фоновом задании?

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

Что делать при ошибке проверки SSL-сертификата?

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

Как ограничить количество запросов, чтобы не получить блокировку API?

Многие API ограничивают частоту обращений и отвечают кодом 429. Добавьте паузы между запросами в циклах, кешируйте результаты, которые редко меняются, и при получении 429 реализуйте повторную попытку с нарастающей задержкой, а не мгновенный повтор.