Разработка и Конфигурация · 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-страница ошибки, и разбор данных упадёт уже в другом месте с неочевидным сообщением.
Соединение = Новый 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» — разные ключи. Перед использованием значения проверяйте его наличие, иначе при изменении формата ответа на стороне сервера код упадёт с ошибкой обращения к несуществующему ключу.
- 1Определите адрес сервера, путь ресурса и параметры по документации API
- 2Создайте HTTPСоединение: для HTTPS добавьте ЗащищенноеСоединениеOpenSSL
- 3Сформируйте HTTPЗапрос с путём, закодированными параметрами и заголовками
- 4Вызовите метод Получить() и проверьте КодСостояния ответа
- 5Разберите тело ответа через ПрочитатьJSON или как текст
- 6Закройте соединение и обработайте возможные исключения через Попытка/Исключение
Обработка ошибок и таймауты
Сетевые вызовы нестабильны по своей природе, поэтому код запроса следует оборачивать в Попытка/Исключение и фиксировать ошибки в журнале регистрации:
Попытка
Ответ = Соединение.Получить(Запрос);
Исключение
ЗаписьЖурналаРегистрации("ОбменAPI", УровеньЖурналаРегистрации.Ошибка,
, , ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
По умолчанию таймаут соединения составляет около 20 секунд, но для тяжёлых API его имеет смысл увеличить — таймаут передаётся одним из параметров конструктора HTTPСоединение. Слишком маленький таймаут приведёт к ложным обрывам, слишком большой — к зависанию сеанса пользователя, если запрос выполняется синхронно в интерфейсе.
Если запрос вызывается из пользовательского режима (например, по кнопке в форме), выполняйте его на сервере и в фоне через ДлительныеОперации, чтобы не блокировать интерфейс. В файловой базе без сервера 1С фоновое выполнение недоступно — это ограничение нужно учитывать при проектировании.
Через какие ещё объекты можно выполнить GET
Помимо HTTPСоединение, в платформе есть объект HTTPЗапрос в связке с методом ПолучитьИмяВременногоФайла — устаревший подход через WinHTTP, который встречается в старых конфигурациях. Его не рекомендуется использовать в новых разработках: он зависит от настроек Windows и хуже диагностируется.
Для обмена с типовыми сервисами иногда проще использовать готовые механизмы: публикацию HTTP-сервисов, планы обмена или библиотеку стандартных подсистем, где есть программный интерфейс для работы с сетью. Если задача — периодический опрос внешнего API, оптимальная схема — регламентное задание, вызывающее общий модуль с описанной выше логикой.
Способы выполнить GET-запрос
Стандартный и рекомендуемый способ: полный контроль над заголовками, SSL, таймаутом. Подходит для любых API
Вариант для периодического обмена. Требует серверной базы для фонового выполнения
Устаревший подход для старых конфигураций. Зависит от ОС, сложно отлаживается, в новых разработках не применяется
Что важно запомнить
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.