Разработка и Конфигурация · 9 мин
Как отправить GET-запрос из 1С
Как отправить GET-запрос из 1С: объект HTTPСоединение, HTTPЗапрос, параметры, заголовки, SSL, обработка ответа и типичные ошибки с примерами кода.
Отправка GET-запросов из 1С — стандартная задача интеграции: получение курсов валют, обмен с сайтом, работа с REST API поставщиков. Встроенный язык платформы предоставляет для этого объекты HTTPСоединение и HTTPЗапрос, которые работают как на сервере, так и на клиенте (в тонком и веб-клиенте с ограничениями).
Минимальный сценарий состоит из трёх шагов: создать соединение с сервером, сформировать запрос с адресом ресурса и параметрами, выполнить метод Получить() и прочитать ответ. Ниже разобран полный рабочий пример, варианты с HTTPS и авторизацией, а также типичные ошибки, из-за которых запрос «не уходит» или возвращает не то, что ожидалось.
Весь код приводится для управляемых форм и общих модулей с признаком «Сервер». Выполнять сетевые вызовы рекомендуется именно на сервере: это снимает проблемы с правами пользователя и ограничения клиентского окружения.
Базовый пример GET-запроса
Простейший вариант — запрос к открытому HTTP-ресурсу без авторизации. Достаточно указать сервер и путь к ресурсу:
Соединение = Новый HTTPСоединение("api.example.ru", 80);
Запрос = Новый HTTPЗапрос("/status");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
Иначе
ВызватьИсключение "Ошибка запроса: " + Ответ.КодСостояния;
КонецЕсли;Конструктор HTTPСоединение принимает хост, порт, логин и пароль (если нужна базовая авторизация), прокси и таймаут. Объект HTTPЗапрос описывает конкретный ресурс: относительный адрес, заголовки и тело (для GET тело обычно не используется).
Метод Получить() — это и есть GET-запрос. Он возвращает объект HTTPОтвет, из которого читают код состояния, заголовки и тело. Всегда проверяйте КодСостояния перед разбором ответа: при ошибке сервера тело может содержать HTML-страницу ошибки, а не ожидаемые данные.
Передача параметров в строке запроса
GET-параметры передаются прямо в адресе ресурса после знака вопроса. Их можно собрать вручную конкатенацией строк:
АдресРесурса = "/products?category=" + Категория + "&date=" + Формат(Дата, "ДФ=yyyy-MM-dd");
Запрос = Новый HTTPЗапрос(АдресРесурса);
Ответ = Соединение.Получить(Запрос);Важный нюанс — кодирование спецсимволов. Кириллица, пробелы и символы вроде & в значениях параметров должны быть закодированы, иначе сервер получит искажённые данные или запрос вообще не выполнится. Для этого используйте функцию КодироватьСтроку() с методом СпособКодированияСтроки.КодировкаURL.
Чтобы не собирать строку вручную, удобно написать небольшую функцию, которая принимает структуру параметров и возвращает готовую строку запроса с кодированием каждого значения. Это снижает риск ошибок при добавлении новых параметров.
Работа по HTTPS и защищённое соединение
Большинство современных API работают только по HTTPS. В 1С для этого в конструктор HTTPСоединение передаётся объект защищённого соединения:
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30, ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос("/v1/data");
Ответ = Соединение.Получить(Запрос);Объект ЗащищенноеСоединениеOpenSSL можно создать без параметров — тогда используется проверка сертификата по умолчанию. Если сервер использует самоподписанный сертификат (часто встречается во внутренних контурах), платформа выдаст ошибку проверки. В тестовой среде это обходят передачей Новый СертификатыУдостоверяющихЦентровОС или отключением проверки, но в продуктиве так делать не стоит: правильное решение — установить корневой сертификат в хранилище сервера 1С.
Таймаут указывается в секундах шестым параметром конструктора. Не оставляйте значение по умолчанию для внешних сервисов: зависший запрос без таймаута может надолго заблокировать сеанс или фоновое задание.
Заголовки и авторизация
Многие API требуют токен в заголовке. Заголовки запроса задаются через соответствие Запрос.Заголовки:
Запрос = Новый HTTPЗапрос("/v1/orders");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
Запрос.Заголовки.Вставить("Accept", "application/json");
Ответ = Соединение.Получить(Запрос);Для базовой HTTP-авторизации достаточно передать логин и пароль в конструктор HTTPСоединение третьим и четвёртым параметрами — платформа сама сформирует заголовок Authorization: Basic.
Храните токены и пароли не в коде, а в защищённом хранилище: в константах с ограниченным доступом, в безопасном хранилище данных или в настройках регистра сведений с разграничением прав. Токен, попавший в текст модуля, рано или поздно окажется в копии базы или выгрузке конфигурации.
Разбор ответа: JSON, коды состояния, ошибки
Чаще всего API возвращает JSON. В 1С его разбирают через ЧтениеJSON:
Если Ответ.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(Чтение, Истина); // соответствие
Чтение.Закрыть();
КонецЕсли;Коды состояния помогают диагностировать проблему: 200 — успех, 301/302 — перенаправление (проверьте адрес), 401 — нет или неверна авторизация, 403 — доступ запрещён, 404 — неверный адрес ресурса, 429 — превышен лимит запросов, 5xx — ошибка на стороне сервера. Полезно логировать код и первые символы тела ответа при неуспехе — это сильно ускоряет разбор инцидентов.
Оборачивайте вызов в попытку/исключение: сетевые ошибки (недоступность хоста, обрыв соединения) вызывают исключения платформы, а не код состояния. В обработчике исключения фиксируйте ошибку и при необходимости планируйте повторную попытку с паузой.
Как проверить результат
200 или другой ожидаемый код из документации API
401, 403, 404, 5xx или исключение платформы
Валидный JSON/XML, разбирается без ошибок
HTML-страница ошибки или пустое тело
Ответ приходит за секунды, в пределах таймаута
Запрос зависает или отваливается по таймауту
Типичные ошибки и ограничения
Самая частая проблема — выполнение кода на клиенте там, где это невозможно. В тонком клиенте HTTP-вызовы работают, но в веб-клиенте действуют ограничения браузера (кросс-доменные запросы). Надёжнее выносить обмен на сервер через вызов серверной процедуры или фоновое задание.
Вторая группа ошибок — прокси. Если сервер 1С выходит в интернет через прокси, его нужно явно указать в конструкторе HTTPСоединение объектом ИнтернетПрокси, иначе соединение не установится. Третья типичная ситуация — неверная кодировка ответа: если строка читается «кракозябрами», укажите кодировку в методе ПолучитьТелоКакСтроку(КодировкаТекста.UTF8).
Альтернативы и когда их выбирать
Если интеграция постоянная и объёмная, прямые вызовы из кода стоит обернуть в отдельный общий модуль с функциями вида ПолучитьДанные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 реализуйте повторную попытку с нарастающей задержкой, а не мгновенный повтор.