Интеграции в 1С

Параметры HTTP-запроса в 1С: URL, заголовки, тело, GET и POST

Коротко

HTTP-запрос в 1С собирается из двух объектов: HTTPСоединение хранит сервер, порт, таймаут и защищённость канала, а HTTPЗапроспуть (АдресРесурса), заголовки и тело. GET-параметры дописываются в АдресРесурса после ? и обязательно кодируются через КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL).

Тело задаётся методами УстановитьТелоИзСтроки() или УстановитьТелоИзДвоичныхДанных(), кодировка по умолчанию — UTF-8. Content-Type задаётся вручную в заголовках: платформа не проставляет его сама. Результат отдаёт HTTPОтвет со свойствами КодСостояния и Заголовки — успех у HTTP это 200-299, всё остальное — ошибка сервиса, а не платформы.

Из чего состоит запрос: HTTPСоединение, HTTPЗапрос и URL

Параметры HTTP-запроса в 1С разнесены по двум объектам, и это первое, что путает при интеграции:

  • HTTPСоединение — параметры канала связи: сервер, порт, пользователь/пароль (Basic Auth), прокси, таймаут, защищённое соединение (HTTPS). Один объект соединения переиспользуется для всех запросов к одному хосту.
  • HTTPЗапрос — параметры конкретного обращения: путь ресурса (без хоста!), заголовки, тело. Создаётся отдельно для каждого вызова.
  • HTTPОтвет — результат: код состояния, заголовки ответа, тело (строка или двоичные данные).

HTTP-метод (GET, POST, PUT, DELETE) в объекты не входит — он передаётся отдельным аргументом в ВызватьHTTPМетод().

Полный URL https://api.example.com:443/v2/orders/42 в 1С разбивается на две части. Сервер, порт и признак HTTPS уходят в конструктор HTTPСоединение, а путь после хоста (/v2/orders/42) — в HTTPЗапрос.АдресРесурса:

Соединение = Новый HTTPСоединение(
    "api.example.com",   // сервер БЕЗ схемы и без пути
    443,                 // порт
    ,                    // Пользователь (Basic Auth)
    ,                    // Пароль
    ,                    // Прокси
    30,                  // Таймаут, сек
    Новый ЗащищенноеСоединениеOpenSSL()  // HTTPS
);

Запрос = Новый HTTPЗапрос("/v2/orders/42");
Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);
Новый HTTPСоединение
Серверхост без схемы и пути
Порт80 для http, 443 для https
Пользовательдля Basic-аутентификации
Парольдля Basic-аутентификации
Проксиобъект ИнтернетПрокси
Таймаутсекунды, 0 — без ограничения
ЗащищенноеСоединениеобъект ЗащищенноеСоединениеOpenSSL для https
ИспользоватьАутентификациюОСNTLM/Negotiate
HTTPСоединение

Частая ошибка: указать сервер как "https://api.example.com/v2/". Платформа не разберёт эту строку — схема задаётся отдельным параметром ЗащищенноеСоединение, а путь идёт в HTTPЗапрос.

GET-параметры (строка запроса): передать значения в 1С HTTP-запрос

Строка запроса (?a=1&b=2) — часть АдресРесурса, а не отдельный параметр объекта. Все значения обязательно кодируются функцией КодироватьСтроку() со способом СпособКодированияСтроки.КодировкаURL:

Параметры = Новый Соответствие;
Параметры.Вставить("q", "накладная №5");
Параметры.Вставить("limit", "20");

Части = Новый Массив;
Для Каждого КЗ Из Параметры Цикл
    Ключ = КодироватьСтроку(КЗ.Ключ, СпособКодированияСтроки.КодировкаURL);
    Значение = КодироватьСтроку(КЗ.Значение, СпособКодированияСтроки.КодировкаURL);
    Части.Добавить(Ключ + "=" + Значение);
КонецЦикла;

Путь = "/api/search?" + СтрСоединить(Части, "&");
Запрос = Новый HTTPЗапрос(Путь);
Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);
КодироватьСтроку
Строкаисходное значение
СпособКодированияСтрокиКодировкаURL — процентное кодирование по RFC 3986
Строка

Что даёт КодировкаURL: пробел превращается в %20, кириллица — в последовательность байтов UTF-8 (%D0%9E и т.д.), спецсимволы (& = ? #) — в свои процент-коды. Без кодирования сервер получит битые параметры или ответит 400 Bad Request.

Не путайте КодировкаURL с КодировкаURLВПараметре: вторая дополнительно кодирует зарезервированные символы +, /, = — используйте её именно для значений, если сервис их не разбирает.

Заголовки HTTP-запроса в 1С: Content-Type, Authorization, Accept

Заголовки HTTP-запроса в 1С хранятся в свойстве HTTPЗапрос.Заголовки — это Соответствие (ключ и значение — строки). Задавайте заголовки до вызова ВызватьHTTPМетод():

Запрос = Новый HTTPЗапрос("/api/orders");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("Accept", "application/json");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
Запрос.Заголовки.Вставить("User-Agent", "1C:Enterprise/8.3");

Ключевые заголовки, которые придётся выставлять в интеграциях:

  • Content-Type — формат тела. Для JSON — application/json; charset=utf-8, для форм — application/x-www-form-urlencoded, для XML — application/xml. Платформа сама этот заголовок не проставляет.
  • AuthorizationBearer <токен> для OAuth/JWT. Для Basic-аутентификации проще передать пользователя и пароль в конструктор HTTPСоединение — платформа сама сформирует заголовок.
  • Accept — какой формат ответа ждём.
  • Content-Lengthне задавайте вручную. Платформа посчитает длину тела сама и подставит правильное значение.
Как это в Консоли кода

В Консоли кода агент сам собирает объекты HTTPСоединение и HTTPЗапрос, ставит нужные заголовки под Content-Type и Authorization, кодирует GET-параметры и запускает запрос прямо в вашей базе — вы задаёте только цель обращения.

Собери HTTP-запрос к внешнему сервису: авторизация Bearer, JSON в теле, GET-параметр фильтра по дате.

Тело HTTP-запроса в 1С: строка, JSON, двоичные данные

Тело выставляется после создания HTTPЗапрос, до вызова HTTP-метода. Для текстовых форматов (JSON, XML, form-urlencoded) — УстановитьТелоИзСтроки(), для файлов и произвольных бинарных данных — УстановитьТелоИзДвоичныхДанных():

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Новый Структура("order_id, sum", 42, 1500));
ТелоСтрокой = ЗаписьJSON.Закрыть();

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

Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
УстановитьТелоИзСтроки
ТелоКакСтрокасериализованное тело (JSON, XML, form)
КодировкаКодировкаТекста.UTF8 (по умолчанию), Windows1251 и др.
ИспользованиеByteOrderMarkдля HTTP всегда НеИспользовать
→ (без возврата, изменяет запрос)

Для файлов и произвольных бинарных данных:

Данные = Новый ДвоичныеДанные("C:\temp\invoice.pdf");
Запрос = Новый HTTPЗапрос("/api/upload");
Запрос.Заголовки.Вставить("Content-Type", "application/pdf");
Запрос.УстановитьТелоИзДвоичныхДанных(Данные);

Для формы (application/x-www-form-urlencoded) тело собирается так же, как GET-параметры: key=value&key2=value2 с процент-кодированием, но уходит в тело, а не в URL.

GET и POST: где хранить параметры

В 1С разница между GET и POST — только в аргументе метода ВызватьHTTPМетод() и в том, куда попадают параметры:

  • GET — параметры только в URL (АдресРесурса после ?). Тела у GET-запроса быть не должно; многие серверы игнорируют тело в GET, а прокси могут его вырезать.
  • POST/PUT/PATCH — параметры в теле; путь может содержать только идентификатор ресурса (/api/orders/42). Обязательно Content-Type, иначе сервер не поймёт формат тела.
  • DELETE — обычно только путь, без тела и без параметров.

Один и тот же объект HTTPЗапрос можно передать в разные вызовы ВызватьHTTPМетод("GET", …) и ВызватьHTTPМетод("POST", …) — метод задаётся снаружи.

HTTPОтвет: код состояния, заголовки и разбор тела

ВызватьHTTPМетод() возвращает объект HTTPОтвет. Проверяйте сначала КодСостояния, потом читайте тело:

Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);

Если Ответ.КодСостояния >= 200 И Ответ.КодСостояния < 300 Тогда
    ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();  // UTF-8 по умолчанию
    // разбор JSON…
ИначеЕсли Ответ.КодСостояния = 401 Тогда
    ВызватьИсключение "Не авторизован: проверь токен";
ИначеЕсли Ответ.КодСостояния = 400 Тогда
    ВызватьИсключение "Плохой запрос: " + Ответ.ПолучитьТелоКакСтроку();
Иначе
    ВызватьИсключение "HTTP " + Ответ.КодСостояния;
КонецЕсли;
HTTPОтвет
КодСостояниячисло: 200 — OK, 4xx — ошибка клиента, 5xx — сервера
ЗаголовкиСоответствие с заголовками ответа
ПолучитьТелоКакСтроку(<Кодировка>)если сервер не прислал charset, укажите явно
ПолучитьТелоКакДвоичныеДанные()для файлов и произвольного бинаря

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

Частые ошибки при сборе HTTP-запроса в 1С

  • Схема https:// в имени сервера. HTTPСоединение ждёт хост без схемы. HTTPS включается объектом ЗащищенноеСоединениеOpenSSL() в конструкторе.
  • GET-параметры без кодирования. Кириллица, пробелы и & в значении ломают строку запроса. Всегда прогоняйте значения через КодироватьСтроку(…, СпособКодированияСтроки.КодировкаURL).
  • Забыли Content-Type. Без заголовка сервер не знает, как разобрать тело POST-запроса, и отвечает 400/415. Платформа заголовок сама не проставляет.
  • BOM в теле. Если УстановитьТелоИзСтроки() вызвать с ИспользованиеByteOrderMark.Использовать, JSON начнётся с невидимых байтов EF BB BF, и парсер на стороне сервиса упадёт с «неожиданным символом». Для HTTP-тела BOM всегда не используется.
  • Проверка результата через Попытка. HTTP-ошибки (401, 404, 500) — не исключения платформы. Их нужно проверять по Ответ.КодСостояния, а не ловить.
  • Тело в GET-запросе. Формально можно, но многие сервисы и прокси его игнорируют. Параметры GET кладите в URL.
  • Одноразовое соединение под каждый запрос в цикле. На массовых обращениях к одному хосту создавайте HTTPСоединение один раз и переиспользуйте — сэкономите TLS-handshake.
Как это в Консоли кода

Если внешний сервис вернул 400 или 401 — не нужно вручную выяснять, какой заголовок забыли или что не так с кодировкой. Опишите задачу агенту в Консоли кода, приложите документацию API, и он соберёт корректный запрос сразу под сервис.

Собери GET-запрос с фильтрами (кириллица, дата в диапазоне) и правильно закодируй параметры для внешнего API.

Частые вопросы о параметрах HTTP-запроса в 1С

Куда в 1С писать URL: в HTTPСоединение или в HTTPЗапрос?

URL делится: сервер и порт — в конструктор HTTPСоединение, путь после хоста и строка запроса — в HTTPЗапрос.АдресРесурса. Схему (http/https) задаёт отдельный параметр ЗащищенноеСоединение конструктора соединения.

Как передать GET-параметры с кириллицей в HTTP-запросе 1С?

Соберите строку ключ=значение&ключ2=значение2, предварительно закодировав и ключи, и значения через КодироватьСтроку(Строка, СпособКодированияСтроки.КодировкаURL), и допишите её к пути после ?. Функция преобразует кириллицу в процент-коды UTF-8, которые понимает любой сервер.

Почему сервер возвращает 400 на POST-запрос из 1С?

Чаще всего забыт заголовок Content-Type — платформа его сама не проставляет. Другая типичная причина — BOM в теле: если при вызове УстановитьТелоИзСтроки() оставить BOM, JSON-парсер сервиса не поймёт первые байты. Ставьте ИспользованиеByteOrderMark.НеИспользовать.