Перейти к основному содержимому

HTTP-запросы из 1С

Разработчику Архитектору

Когда 1С выступает клиентом

Прикладное решение обращается к внешнему HTTP API — банк, маркетплейс, сайт, другой экземпляр 1С через HTTP-сервис или OData. На стороне BSL используют три объекта:

ОбъектРоль
HTTPСоединениеСессия с хостом, таймаут, прокси, HTTPS
HTTPЗапросМетод, путь, заголовки, тело
HTTPОтветКодСостояния, заголовки, тело

Код размещают на сервере (общий модуль, фоновое или регламентное задание). Длительный запрос из модуля формы блокирует интерфейс пользователя.


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

Функция ПолучитьJSON(Сервер, Порт, Путь, ТаймаутСек = 30) Экспорт

Соединение = Новый HTTPСоединение(Сервер, Порт, , , , ТаймаутСек);
Запрос = Новый HTTPЗапрос(Путь);
Запрос.Заголовки.Вставить("Accept", "application/json");

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

Если Ответ.КодСостояния >= 300 Тогда
ВызватьИсключение "HTTP " + Ответ.КодСостояния + ": " + Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;

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

КонецФункции

Разбор JSON — 128.md. Обработка сбоев и повторов — 119.md.


Методы HTTPСоединение

HTTP-методМетод 1СНазначение
GETПолучить(Запрос)Чтение ресурса
POSTОтправитьДляОбработки(Запрос)Создание, команда, тело в запросе
PUTЗаписать(Запрос)Полная замена ресурса (OData)
PATCHИзменить(Запрос)Частичное обновление (OData)
DELETEУдалить(Запрос)Удаление

Для POST с JSON-телом:

Запрос = Новый HTTPЗапрос("/api/v1/orders");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(ТелоJSON, КодировкаТекста.UTF8);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);

HTTPS и аутентификация

Для HTTPS в конструктор HTTPСоединение передают защищённое соединение и при необходимости клиентский сертификат. Доверенные корневые сертификаты настраивают в администрировании кластера серверов 1С.

Типичные заголовки:

  • Authorization: Basic ... или Bearer <token> — доступ к API;
  • Accept / Content-Type — формат JSON или XML;
  • пользовательские заголовки контрагента (идempotency-key, trace-id).

Секреты хранят в защищённом хранилище или константах с ограничением роли, а не в коде модуля формы.


Коды состояния и перенаправления

Проверяйте Ответ.КодСостояния:

ДиапазонСмысл
2xxУспех
3xxПеренаправление — часто 302 с заголовком Location
4xxОшибка клиента (неверный URL, авторизация)
5xxОшибка сервера — имеет смысл повтор с задержкой

При 302 прочитайте Ответ.Заголовки.Получить("Location") и выполните запрос по новому адресу (с ограничением числа редиректов, чтобы избежать цикла).


Вызов своего HTTP-сервиса 1С

Если сервис опубликован по адресу https://host/base/hs/employees/code/001:

Соединение = Новый HTTPСоединение("host", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/base/hs/employees/code/001");
Запрос.Заголовки.Вставить("Authorization", "Basic " + Base64Строка("user:password"));
Ответ = Соединение.Получить(Запрос);

DELETE к тому же ресурсу — Соединение.Удалить(Запрос) с тем же путём.


Файлы через HTTP

HTTPСоединение умеет получить, записать и удалить файл по URL без ручной сборки тела — удобно для простых интеграций с файловыми endpoint.


Эксплуатация

  • Задайте таймаут (6-й параметр конструктора) — иначе зависший контрагент блокирует рабочий процесс.
  • Логируйте URL (без паролей), код ответа и фрагмент тела при ошибке — журнал регистрации или регистр сведений обмена.
  • Тестируйте на копии базы и тестовых ключах API.
  • Для идемпотентности повторной отправки используйте ключ обмена — см. 120.md.

Сервер Linux
COM и клиентские компоненты Windows для HTTP здесь не при чём, но помните: код интеграции должен выполняться там, где есть сеть и сертификаты — обычно на сервере 1С, а не на тонком клиенте пользователя.


Связанные материалы


Практика 15 минут

  1. Выполните GET к публичному JSON API (курс валют, погода).
  2. Проверьте код 200 и разбор тела через ПрочитатьJSON.
  3. Сымитируйте ошибку (неверный путь) и зафиксируйте код 404 в журнале.

Проверка себя

  • Каким методом HTTPСоединение отправить POST с JSON?
  • Где настраивается таймаут?
  • Что делать при ответе 302?

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").