Параметры 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", Запрос);
Частая ошибка: указать сервер как "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: пробел превращается в %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. Платформа сама этот заголовок не проставляет. -
Authorization—Bearer <токен>для OAuth/JWT. Для Basic-аутентификации проще передать пользователя и пароль в конструкторHTTPСоединение— платформа сама сформирует заголовок. -
Accept— какой формат ответа ждём. -
Content-Length— не задавайте вручную. Платформа посчитает длину тела сама и подставит правильное значение.
В Консоли кода агент сам собирает объекты
HTTPСоединение и HTTPЗапрос, ставит нужные заголовки под
Content-Type и Authorization, кодирует 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", Запрос);
Для файлов и произвольных бинарных данных:
Данные = Новый ДвоичныеДанные("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Метод() не бросает исключение при
ошибке 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.НеИспользовать.