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

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

Как выполнить GET-запрос в 1С: инструкция с примерами

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

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

Логика проста: создаётся соединение с сервером, формируется объект запроса с адресом ресурса и заголовками, вызывается метод Получить (Get), а результат читается из объекта HTTPОтвет. Все сложности обычно связаны не с самим запросом, а с авторизацией, SSL-сертификатами и разбором ответа в формате JSON.

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

Минимальный рабочий пример GET-запроса

Базовый сценарий занимает несколько строк кода. Пример ниже запрашивает данные с тестового API и выводит тело ответа:

HTTPСоединение = Новый HTTPСоединение("api.example.com");

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

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

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

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

Иначе

ВызватьИсключение "Ошибка HTTP: " + Ответ.КодСостояния;

КонецЕсли;

Метод Получить() — это и есть GET-запрос. В английском синтаксисе он называется Get(), оба варианта работают одинаково. В конструктор HTTPСоединение передаётся только имя сервера (или IP-адрес) без префикса http:// и без пути — путь указывается в HTTPЗапрос.

Код состояния проверять обязательно: платформа не вызывает исключение при ответах 404 или 500, а просто возвращает ответ с соответствующим кодом. Если проигнорировать проверку, в обработку попадёт HTML-страница ошибки, и разбор данных упадёт уже в другом месте с неочевидным сообщением.

bsl
Соединение = Новый HTTPСоединение("api.example.com");
Запрос = Новый HTTPЗапрос("/data/list");
Ответ = Соединение.Получить(Запрос);
Тело = Ответ.ПолучитьТелоКакСтроку();

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

Параметры GET-запроса добавляются прямо в путь ресурса после знака вопроса. Специального объекта для query-параметров в платформе нет, строку формируют вручную:

ПутьНаСервере = "/products?category=" + Категория + "&limit=50";

Запрос = Новый HTTPЗапрос(ПутьНаСервере);

Здесь критично кодировать значения параметров. Кириллица, пробелы и спецсимволы в URL недопустимы — их нужно пропустить через функцию КодироватьСтроку с способом КодированиеURL:

Значение = КодироватьСтроку(НазваниеТовара, СпособКодированияСтроки.КодированиеURL);

Путь = "/search?q=" + Значение;

Если пропустить кодирование, сервер либо вернёт ошибку 400, либо интерпретирует параметр неправильно — например, обрежет значение по первому пробелу или символу «&».

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

Большинство реальных API требуют авторизацию. Заголовки добавляются в соответствие Заголовки объекта HTTPЗапрос:

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

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

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

Для Basic-авторизации логин и пароль можно передать прямо в конструктор соединения — вторым и третьим параметрами после имени сервера:

Соединение = Новый HTTPСоединение("api.example.com", , "Логин", "Пароль");

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

HTTPS и защищённое соединение

Практически все современные API работают только по HTTPS. Для защищённого соединения в конструктор HTTPСоединение последним параметром передаётся объект ЗащищенноеСоединениеOpenSSL:

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

Соединение = Новый HTTPСоединение("api.example.com", 443, , , , , Защита);

Если защищённое соединение не указать, платформа попытается соединиться по обычному HTTP, и сервер либо вернёт редирект, либо разорвёт соединение. Ошибка при этом часто выглядит как «Ошибка соединения с сервером», что сбивает диагностику.

Для сайтов с самоподписанными сертификатами (типично для внутренних корпоративных сервисов) проверку сертификата можно отключить, передав в конструктор ЗащищенноеСоединениеOpenSSL параметры с пустыми сертификатами. Делать это допустимо только в закрытой контуре — в интернете отключение проверки открывает путь к перехвату трафика.

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

Подавляющее большинство API возвращают JSON. В 1С его разбирают через ЧтениеJSON:

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

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

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

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

По умолчанию ПрочитатьJSON возвращает Соответствие, где обращение к полям идёт через квадратные скобки: Данные["price"]. Если передать вторым параметром Истина (в ряде версий — через параметры чтения), результат будет Структурой, что удобнее для полей с латинскими именами.

Учитывайте, что имена свойств в JSON регистрозависимы: поле «Price» и «price» — разные ключи. Перед использованием значения проверяйте его наличие, иначе при изменении формата ответа на стороне сервера код упадёт с ошибкой обращения к несуществующему ключу.

Порядок выполнения GET-запроса
  1. 1
    Определите адрес сервера, путь ресурса и параметры по документации API
  2. 2
    Создайте HTTPСоединение: для HTTPS добавьте ЗащищенноеСоединениеOpenSSL
  3. 3
    Сформируйте HTTPЗапрос с путём, закодированными параметрами и заголовками
  4. 4
    Вызовите метод Получить() и проверьте КодСостояния ответа
  5. 5
    Разберите тело ответа через ПрочитатьJSON или как текст
  6. 6
    Закройте соединение и обработайте возможные исключения через Попытка/Исключение

Обработка ошибок и таймауты

Сетевые вызовы нестабильны по своей природе, поэтому код запроса следует оборачивать в Попытка/Исключение и фиксировать ошибки в журнале регистрации:

Попытка

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

Исключение

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

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

Возврат Неопределено;

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

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

Если запрос вызывается из пользовательского режима (например, по кнопке в форме), выполняйте его на сервере и в фоне через ДлительныеОперации, чтобы не блокировать интерфейс. В файловой базе без сервера 1С фоновое выполнение недоступно — это ограничение нужно учитывать при проектировании.

Типичные ошибки
01
Указание полного URL с http:// в конструкторе HTTPСоединение — соединение не установится, адрес нужно разделять на сервер и путь
02
Отсутствие проверки КодСостояния — в обработку попадает тело страницы ошибки, и разбор JSON падает с непонятным сообщением
03
Забытое ЗащищенноеСоединениеOpenSSL для HTTPS-адреса — запрос уходит по HTTP и обрывается
04
Некодированные кириллические параметры — сервер возвращает 400 или искажённые данные
05
Игнорирование кодировки ответа — русский текст читается «кракозябрами», если не указать кодировку в ПолучитьТелоКакСтроку(КодировкаТекста.UTF8)

Через какие ещё объекты можно выполнить GET

Помимо HTTPСоединение, в платформе есть объект HTTPЗапрос в связке с методом ПолучитьИмяВременногоФайла — устаревший подход через WinHTTP, который встречается в старых конфигурациях. Его не рекомендуется использовать в новых разработках: он зависит от настроек Windows и хуже диагностируется.

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

Способы выполнить GET-запрос

HTTPСоединение + HTTPЗапрос

Стандартный и рекомендуемый способ: полный контроль над заголовками, SSL, таймаутом. Подходит для любых API

Регламентное задание + общий модуль

Вариант для периодического обмена. Требует серверной базы для фонового выполнения

WinHTTP через COM-объект

Устаревший подход для старых конфигураций. Зависит от ОС, сложно отлаживается, в новых разработках не применяется

Итог

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

GET-запрос в 1С — это HTTPСоединение плюс HTTPЗапрос и метод Получить(). Ключевые точки отказа: разделение адреса на сервер и путь, кодирование параметров, SSL для HTTPS, проверка кода состояния и корректный разбор JSON. Оборачивайте вызов в Попытка/Исключение и не храните токены в коде.

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

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

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

Как передать параметры, если их много?

Сформируйте строку параметров циклом по структуре или соответствию, кодируя каждое значение через КодироватьСтроку. Если параметров очень много или они содержат сложные данные, пересмотрите подход: возможно, API предлагает для этого POST-запрос с телом JSON.

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

Метод ПолучитьТелоКакСтроку() по умолчанию определяет кодировку из заголовков ответа. Если сервер заголовок charset не отдаёт, укажите кодировку явно: Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8). Большинство современных API работают в UTF-8.

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

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

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

Сначала повторите тот же запрос во внешнем инструменте (Postman, curl) с теми же заголовками — это отделит проблемы кода 1С от проблем самого API. Затем выведите в отладку полный путь запроса, заголовки и тело ответа с кодом состояния. Часто причина в отсутствующем заголовке Accept или неверном формате токена.

Есть ли ограничение на размер ответа?

Жёсткого лимита платформа не накладывает, но большие ответы целиком загружаются в память сеанса. При выгрузках больших объёмов используйте потоковое чтение через ПолучитьТелоКакПоток() и построчную обработку, либо запрашивайте данные порциями через параметры постраничной выборки API.