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

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

Как сделать GET-запрос в 1С

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

GET-запрос в 1С выполняется через встроенный объект HTTPСоединение и объект HTTPЗапрос. Это стандартный механизм платформы, который не требует внешних компонентов и работает как на толстом, так и на тонком клиенте, а также на сервере. Чаще всего GET-запросы используются для обращения к REST API внешних сервисов: получение курсов валют, статусов доставки, данных из CRM или проверки контрагентов.

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

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

Простейший вариант — обращение к открытому API без авторизации. В примере ниже выполняется запрос к тестовому сервису и читается ответ в виде строки.

Процедура ВыполнитьGETЗапрос()

Соединение = Новый HTTPСоединение("jsonplaceholder.typicode.com", 443, , , , ,

Новый ЗащищенноеСоединениеOpenSSL());

Запрос = Новый HTTPЗапрос("/posts/1");

Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда

ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();

Сообщить(ТелоОтвета);

Иначе

Сообщить("Ошибка: " + Ответ.КодСостояния);

КонецЕсли;

КонецПроцедуры

Код состояния 200 означает успешное выполнение. Любой другой код — 400, 401, 404, 500 — нужно обрабатывать отдельно, иначе программа попытается разобрать тело ошибки как корректные данные. Тело ответа читается методом ПолучитьТелоКакСтроку() для текстовых данных (JSON, XML) или ПолучитьТелоКакДвоичныеДанные() для файлов.

Порядок действий
  1. 1
    Создайте объект HTTPСоединение с указанием хоста, порта и защищённого соединения для HTTPS
  2. 2
    Сформируйте объект HTTPЗапрос с адресом ресурса и нужными заголовками
  3. 3
    Вызовите метод Получить() и сохраните результат в переменную типа HTTPОтвет
  4. 4
    Проверьте код состояния ответа перед обработкой тела
  5. 5
    Прочитайте тело ответа и разберите данные (JSON, XML или текст)

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

Параметры GET-запроса передаются прямо в адресе ресурса после знака вопроса, в формате ключ=значение, разделённые амперсандом. В 1С адрес формируется обычной конкатенацией строк.

Параметры = "?userId=5&status=completed";

Запрос = Новый HTTPЗапрос("/todos" + Параметры);

Ответ = Соединение.Получить(Запрос);

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

ЗначениеПараметра = КодироватьСтроку("Москва и область",

СпособКодированияСтроки.КодировкаURL);

Запрос = Новый HTTPЗапрос("/search?city=" + ЗначениеПараметра);

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

Многие API требуют заголовки: токен авторизации, указание формата ответа, идентификатор клиента. Заголовки задаются через свойство Заголовки объекта HTTPЗапрос — это соответствие, куда добавляются пары «имя — значение».

Запрос = Новый HTTPЗапрос("/api/v1/data");

Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);

Запрос.Заголовки.Вставить("Accept", "application/json");

Запрос.Заголовки.Вставить("Content-Type", "application/json");

Для Basic-авторизации логин и пароль можно передать прямо в конструктор HTTPСоединение — третьим и четвёртым параметрами. Для Bearer-токенов и API-ключей используйте заголовок Authorization или тот заголовок, который требует документация конкретного сервиса (например, X-API-Key).

Разбор ответа в формате JSON

Большинство современных API возвращают JSON. В 1С для разбора есть объект ЧтениеJSON в связке с функцией ПрочитатьJSON(), которая преобразует текст в структуру или соответствие.

Если Ответ.КодСостояния = 200 Тогда

ЧтениеJSON = Новый ЧтениеJSON;

ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());

Данные = ПрочитатьJSON(ЧтениеJSON); // Соответствие

ЧтениеJSON.Закрыть();

Сообщить(Данные["title"]);

КонецЕсли;

Если вторым параметром ПрочитатьJSON(ЧтениеJSON, Истина) передать признак «в соответствие», результат будет объектом типа Соответствие — это удобно при динамических ключах. Для фиксированной структуры ответа можно читать в Структуру и обращаться к полям через точку.

Перед разбором JSON полезно временно вывести тело ответа через Сообщить() или записать в файл. Структура реального ответа часто отличается от примеров в документации: поля вложены глубже, массивы приходят пустыми, а нужное значение лежит внутри объекта data.
ПЗ
Практическое замечание

Обработка ошибок и проверка результата

Сетевые вызовы нестабильны по своей природе: сервер может не отвечать, DNS — не резолвиться, сертификат — оказаться просроченным. Оборачивайте вызов в попытку/исключение и задавайте таймаут, чтобы фоновое задание или сеанс пользователя не зависали надолго.

Попытка

Соединение = Новый HTTPСоединение("api.example.com", 443, , , , 30,

Новый ЗащищенноеСоединениеOpenSSL());

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

Исключение

ЗаписьЖурналаРегистрации("HTTP-запрос", УровеньЖурналаРегистрации.Ошибка, , ,

ОписаниеОшибки());

Возврат;

КонецПопытки;

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

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

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

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

200 или другой ожидаемый код 2xx

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

4xx — ошибка запроса или авторизации, 5xx — сбой на стороне сервера

Тело ответа
Норма

Валидный JSON/XML с ожидаемыми полями

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

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

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

Запрос завершается в пределах заданного таймаута

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

Сеанс зависает или падает по таймауту

Типичные ошибки при выполнении GET-запросов

Большинство проблем при первой настройке сводится к нескольким повторяющимся причинам. Их стоит проверить в первую очередь, прежде чем искать ошибку в логике кода.

Типичные ошибки
01
Обращение к HTTPS-адресу без ЗащищенноеСоединениеOpenSSL — платформа выдаёт ошибку соединения или невозможности установить канал
02
Адрес ресурса указан с протоколом и доменом (https://site.com/api) вместо относительного пути (/api) — конструктор HTTPЗапрос принимает только путь
03
Кириллица и пробелы в параметрах без КодироватьСтроку — сервер возвращает 400 или искажённые данные
04
Отсутствие проверки кода состояния — тело ошибки разбирается как корректный JSON, и код падает с непонятным исключением
05
Выполнение запроса на клиенте там, где нет доступа в интернет, — запросы к внешним сервисам надёжнее выполнять на сервере 1С

Отдельная частая ситуация — запрос работает из браузера, но не из 1С. Причины: корпоративный прокси (его нужно указать в параметрах HTTPСоединение через объект ИнтернетПрокси), блокировка по User-Agent на стороне сервиса или устаревшая версия TLS, которую не поддерживает сервер.

Маршрут решения

Как выбрать действие

Сервер использует HTTPS (адрес начинается с https://)Передавайте в конструктор HTTPСоединение объект ЗащищенноеСоединениеOpenSSL
В сети используется прокси-серверСоздайте ИнтернетПрокси с настройками прокси и передайте его в HTTPСоединение
API требует токенДобавьте заголовок Authorization в объект HTTPЗапрос
Ответ приходит в кодировке, отличной от UTF-8Читайте тело через ПолучитьТелоКакПоток() и преобразуйте с нужной кодировкой

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

Чем GET-запрос отличается от POST-запроса в 1С?

GET предназначен для получения данных и передаёт параметры в строке адреса, тело запроса обычно пустое. POST отправляет данные в теле запроса и используется для создания или изменения данных на сервере — в 1С для него вызывается метод ОтправитьДляОбработки() вместо Получить().

Можно ли выполнить GET-запрос на тонком клиенте?

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

Почему запрос возвращает ошибку сертификата?

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

Как скачать файл через GET-запрос?

Используйте метод Получить() с двумя параметрами: объект запроса и имя файла для сохранения — Соединение.Получить(Запрос, "C:\temp\file.pdf"). Либо прочитайте тело через ПолучитьТелоКакДвоичныеДанные() и запишите его методом Записать(). Для больших файлов первый вариант предпочтительнее, так как не загружает всё содержимое в память.

Как отладить запрос, если сервис возвращает ошибку?

Зафиксируйте три вещи: точный адрес ресурса с параметрами, все отправленные заголовки и полный текст ответа с кодом состояния. Затем повторите тот же запрос в браузере или инструменте вроде Postman. Если там запрос проходит, а из 1С — нет, различие почти всегда в заголовках, кодировке параметров или настройках прокси.

Итог

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

GET-запрос в 1С строится на трёх объектах: HTTPСоединение, HTTPЗапрос и HTTPОтвет. Для HTTPS обязательно защищённое соединение, параметры с кириллицей кодируйте через КодироватьСтроку, код состояния проверяйте до разбора тела, а весь вызов оборачивайте в попытку с таймаутом. Внешние запросы надёжнее выполнять на сервере, а ошибки фиксировать в журнале регистрации.