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

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

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

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

Отправка запросов из 1С — стандартная задача интеграции: обмен с банковскими сервисами, сайтами, CRM, курьерскими службами и внутренними API. Во встроенном языке для этого используется объект HTTPСоединение вместе с объектами HTTPЗапрос и HTTPОтвет. Этот механизм доступен и на сервере, и на клиенте, но на практике запросы выполняют на сервере, чтобы не зависеть от настроек рабочего места пользователя.

Прежде чем писать код, нужно знать четыре вещи: адрес сервера (хост и порт), ресурс на сервере (путь после домена), метод запроса (GET, POST, PUT и другие) и формат тела (JSON, XML, form-data). Любой из этих параметров, указанный неверно, приведёт либо к ошибке соединения, либо к отказу сервера принять запрос.

Важно понимать разницу между ошибкой соединения и ошибкой ответа. Ошибка соединения — это исключение встроенного языка: сервер недоступен, неправильный порт, проблема с сертификатом. Ошибка ответа — это код состояния HTTP (например, 400, 401, 404, 500): соединение установлено, но сервер отказался выполнить операцию. Их нужно обрабатывать по-разному.

Как работает механизм HTTP-запросов в 1С

Объект HTTPСоединение описывает канал связи с конкретным сервером: хост, порт, логин и пароль базовой авторизации, прокси и параметры TLS. Само по себе соединение ничего не отправляет — это лишь «труба», по которой уходят запросы. Запрос создаётся отдельным объектом HTTPЗапрос, где задаётся адрес ресурса, заголовки и тело.

Отправка выполняется методом ВызватьHTTPМетод(Метод, Запрос) или укороченными вариантами Получить() для GET и ОтправитьДляОбработки() для POST. Результат возвращается как объект HTTPОтвет, из которого читают КодСостояния и тело через ПолучитьТелоКакСтроку() или ПолучитьТелоКакПоток().

Для защищённых соединений (https) в конструктор HTTPСоединение последним параметром передаётся объект ЗащищенноеСоединениеOpenSSL. Без него при обращении к https-адресу вы получите ошибку установки соединения. Проверка сертификата в таком объекте может быть отключена для тестового стенда, но в рабочей базе отключать проверку небезопасно.

Как отправить GET-запрос: минимальный пример

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

bsl
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30,
    Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/v1/status?id=12345");
Запрос.Заголовки.Вставить("Accept", "application/json");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;

Обратите внимание на параметры конструктора: хост указывается без «https://» и без пути, порт для https — 443, для http — 80. Шестой параметр (в примере 30) — таймаут в секундах. Без таймаута запрос при недоступном сервере может «зависнуть» надолго и заблокировать сеанс пользователя или фоновое задание.

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

Как отправить POST-запрос с телом в формате JSON

POST-запросы применяются для передачи данных: создания заявки, отправки заказа, авторизации по API-ключу. Тело чаще всего формируется в JSON. В 1С для сборки JSON используется ЗаписьJSON, либо структура сериализуется через ЗаписатьJSON.

bsl
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30,
    Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/v1/orders");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("Authorization", "Bearer ВАШ_ТОКЕН");
Запрос.УстановитьТелоИзСтроки("{""number"":""A-101"",""sum"":1500}");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Заголовок Content-Type обязателен: без него многие серверы не распознают тело и вернут ошибку 400 или 415. Авторизация обычно передаётся либо заголовком Authorization с токеном, либо параметрами логина и пароля в самом объекте HTTPСоединение (basic-авторизация) — какой способ требуется, указано в документации конкретного API.

Ответ в формате JSON разбирается объектом ЧтениеJSON: создаёте объект, вызываете УстановитьСтроку(ТелоОтвета), затем ПрочитатьJSON с параметром ПрочитатьВСоответствие = Истина. Дальше значения извлекаются из соответствия по ключам.

Как обработать ответ и ошибки

Код состояния — первое, что нужно проверить. Значения 200–299 означают успех, 301–302 — перенаправление, 400–499 — ошибку на стороне запроса (неверные данные, нет доступа), 500–599 — сбой на сервере. Не стоит считать успехом сам факт получения ответа: сервер мог вернуть 500 с текстом ошибки в теле.

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

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

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

200–299, тело содержит ожидаемые данные

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

4xx или 5xx — читайте текст ошибки в теле ответа

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

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

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

Пустое тело или HTML-страница ошибки вместо данных

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

Ответ приходит в пределах заданного таймаута

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

Исключение по таймауту — проверяйте сеть и доступность сервера

Исключения соединения (сервер недоступен, ошибка TLS, таймаут) перехватываются конструкцией Попытка ... Исключение ... КонецПопытки. В блоке исключения логируйте ОписаниеОшибки() вместе с адресом и методом запроса — без этого разбирать инциденты будет нечего. Для регламентных обменов полезно писать ошибки в журнал регистрации через ЗаписьЖурналаРегистрации.

При кодах 401 и 403 не повторяйте запрос в цикле: проблема в авторизации, и повтор только усугубит ситуацию вплоть до блокировки ключа. При 429 (превышен лимит запросов) и 5xx разумна повторная попытка с паузой, но число попыток ограничивайте, например тремя.

Типичные ошибки
01
Хост указан с «https://» или с путём — конструктор HTTPСоединение принимает только имя сервера, иначе ошибка разбора адреса
02
Нет таймаута — при недоступном сервере сеанс зависает надолго
03
Не указан Content-Type для POST — сервер отклоняет тело запроса
04
Код состояния не проверяется — программа считает ошибочный ответ успешным и портит данные
05
Пароль или токен хранится прямо в коде общего модуля — утечка при выгрузке конфигурации

Альтернативные способы обмена: веб-сервисы и HTTP-сервисы

Если обе стороны обмена — ваши системы, вместо ручной сборки HTTP-запросов часто удобнее другие механизмы платформы. Для приёма запросов в 1С публикуются HTTP-сервисы (объект конфигурации «HTTP-сервисы») — тогда внешняя система сама обращается к вашей базе по REST-подобному адресу. Для SOAP-интеграций используются веб-сервисы и WS-ссылки, которые генерируют прокси-объекты по WSDL-описанию.

Сравнение вариантов

HTTPСоединение в коде

Универсальный способ обращения к любому внешнему API; требует ручной работы с JSON, заголовками и ошибками

HTTP-сервис в своей базе

Подходит, когда внешняя система должна вызывать 1С; требует публикации базы на веб-сервере

WS-ссылка (SOAP)

Удобна для корпоративных сервисов с WSDL; платформа сама формирует XML, но механизм тяжелее и менее гибок

Стандартный OData-интерфейс

Даёт доступ к данным базы без кода; подходит для чтения, ограничен в логике и требует настройки публикации

Выбор зависит от направления обмена: если 1С выступает клиентом чужого API — почти всегда это HTTPСоединение; если 1С должна принимать вызовы — HTTP-сервисы. Публикация базы на веб-сервере (IIS или Apache) — отдельная задача администрирования: без публикации HTTP-сервисы и OData извне недоступны.

Где выполнять запросы и как защитить доступ

Запросы к внешним системам выполняйте на сервере или в фоновом задании. Выполнение на клиенте создаёт проблемы: у пользователя может не быть доступа в интернет, прокси настроен иначе, а длительный запрос блокирует интерфейс. Для регулярных обменов используйте регламентные задания с обработкой ошибок и журналированием.

Секреты (токены, пароли API) не храните в коде модулей и в открытом виде в константах. Распространённая практика — хранение в защищённом хранилище (ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище в конфигурациях на БСП) или в отдельном регистре с ограниченными правами. Доступ к функциям обмена ограничивайте ролями: рядовому пользователю кнопка «Отправить запрос» обычно не нужна.

Порядок действий
  1. 1
    Изучите документацию API: хост, путь, метод, формат тела, способ авторизации
  2. 2
    Проверьте запрос во внешнем инструменте (Postman, curl), чтобы отделить проблемы API от проблем кода
  3. 3
    Напишите код: HTTPСоединение с таймаутом и TLS, HTTPЗапрос с заголовками и телом
  4. 4
    Оберните вызов в Попытка/Исключение, проверьте КодСостояния, разберите тело ответа
  5. 5
    Протестируйте ошибочные сценарии: неверный токен, недоступный сервер, пустой ответ
  6. 6
    Вынесите секреты в безопасное хранилище и настройте права доступа

Отладка: как понять, что именно не работает

Главный приём отладки — воспроизвести запрос вне 1С. Если тот же запрос с теми же заголовками и телом в Postman или curl возвращает 200, а из 1С — ошибку, проблема в коде: адресе, кодировке, заголовках. Если и внешний инструмент получает отказ — проблема в данных или доступе, и код трогать бессмысленно.

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

Частая ситуация: запрос из 1С возвращает кракозябры вместо русского текста. Причина почти всегда в кодировке — сервер отдал тело в UTF-8, а строка прочитана иначе. Указывайте кодировку явно в ПолучитьТелоКакСтроку(КодировкаТекста.UTF8) и в заголовке Content-Type при отправке.
ПЗ
Практическое замечание

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

Итог

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

Запрос из 1С — это HTTPСоединение плюс HTTPЗапрос: хост без префикса, обязательный таймаут, TLS для https, корректный Content-Type, проверка кода состояния и обработка исключений. Секреты — в безопасном хранилище, обмены — на сервере, отладка — через сравнение с внешним инструментом.

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

Как отправить запрос из 1С без программирования?

Штатного «конструктора запросов к API» для пользователя в типовых конфигурациях нет. Если нужен разовый обмен, проще использовать внешний инструмент (Postman, curl) и загрузить результат в 1С файлом. Постоянные обмены без доработки возможны только там, где конфигурация уже содержит готовую интеграцию с нужным сервисом.

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

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

Почему запрос работает на клиенте, но падает на сервере?

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

Как передать файл в запросе?

Небольшие файлы передают в теле запроса в base64 внутри JSON или как бинарное тело через УстановитьТелоИзДвоичныхДанных(). Для multipart/form-data тело формируют вручную с границами (boundary) — готового конструктора multipart в платформе нет, это нужно учитывать при оценке трудоёмкости.

Можно ли выполнять запросы асинхронно, чтобы не блокировать работу?

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

Что делать, если сервер возвращает ошибку 403, хотя токен верный?

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