Передача параметров в HTTP-запросах из 1С:Предприятие — одна из самых востребованных задач при интеграции с внешними сервисами, API банков, маркетплейсов или собственными веб-приложениями. Без правильной передачи данных запросы либо не дойдут до адресата, либо вернут ошибку 400 Bad Request или 500 Internal Server Error. В этой статье разберём все актуальные способы передачи параметров: от простых GET-запросов до сложных POST с авторизацией и загружаемыми файлами.

Особенность работы с HTTP в заключается в ограничениях платформы: здесь нет встроенных библиотек вроде axios или requests, а все операции выполняются через объект HTTPСоединение или HTTPЗапрос. Это требует ручной сборки строки запроса, кодирования символов и обработки ответов. Мы покажем, как избежать типовых ошибок и оптимизировать код для разных сценариев — от отправки JSON до передачи бинарных данных.

1. Базовые принципы HTTP-запросов в 1С

Прежде чем передавать параметры, важно понять, как взаимодействует с HTTP-протоколом. В платформе есть два основных объекта:

  • 🔹 HTTPСоединение — устанавливает соединение с сервером и отправляет запросы. Поддерживает как синхронные, так и асинхронные операции.
  • 📄 HTTPЗапрос — формирует сам запрос (метод, заголовки, тело). Часто используется вместе с HTTPСоединение.
  • 🔄 ИнтернетПрокси — нужен для настройки прокси-сервера, если доступ в интернет идёт через него.

Основные методы HTTP, которые поддерживает 1С 8.3:

  • 🔍 GET — параметры передаются в URL (видно в адресной строке). Подходит для запросов данных.
  • 📦 POST — параметры отправляются в теле запроса. Используется для создания/обновления данных.
  • 🔄 PUT/PATCH — обновление ресурсов (реже используется, но поддерживается).
  • 🗑️ DELETE — удаление данных (требует поддержки сервером).

Важно: не поддерживает современные фичи вроде HTTP/2 или WebSockets. Все запросы идут по HTTP/1.1, а для работы с HTTPS требуется корректно настроенный сертификат на сервере.

📊 Какой метод HTTP вы чаще используете в 1С?
GET
POST
PUT/PATCH
DELETE

2. Передача параметров в GET-запросах

GET-запросы — самый простой способ отправить данные. Параметры добавляются прямо в URL после знака ? в формате ключ=значение, разделённые символом &. Например:

https://api.example.com/data?param1=value1¶m2=value2

В для этого используется объект HTTPЗапрос с методом УстановитьАдресСтрокиЗапроса(). Пример кода:

Запрос = Новый HTTPЗапрос();

Запрос.УстановитьАдресСтрокиЗапроса("https://api.example.com/data?param1=значение1¶m2=значение2");

Соединение = Новый HTTPСоединение();

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

Ключевые моменты:

  • 🔠 Кодирование символов: Русские буквы и спецсимволы (?, &, =, +, пробел) нужно кодировать с помощью СтрЗакодироватьСтроку(). Например, СтрЗакодироватьСтроку("привет мир", КодировкаТекста.UTF8) вернёт %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82+%D0%BC%D0%B8%D1%80.
  • 📏 Ограничение длины URL: Некоторые серверы и браузеры обрезают URL длиннее 2048 символов. Для больших данных используйте POST.
  • 🔒 Безопасность: GET-запросы кэшируются браузерами и прокси, а параметры остаются в истории. Не передавайте так конфиденциальные данные (пароли, токены).
💡

Для отладки GET-запросов используйте инструменты вроде Postman или curl. Они помогут проверить, как сервер обрабатывает параметры до написания кода в 1С.

3. Передача параметров в POST-запросах

POST-запросы используются, когда нужно отправить много данных или когда параметры не должны отображаться в URL. В для этого используется метод УстановитьТекст() объекта HTTPЗапрос, куда передаётся тело запроса в одном из форматов:

Формат Пример данных Заголовок Content-Type Когда использовать
application/x-www-form-urlencoded param1=value1¶m2=value2 application/x-www-form-urlencoded Стандартный формат для HTML-форм. Подходит для простых данных.
multipart/form-data Сложная структура с границами (boundary). multipart/form-data; boundary=---123 Для отправки файлов или бинарных данных.
application/json {"param1": "value1", "param2": "value2"} application/json Для работы с REST API (наиболее распространён).
text/xml <request><param1>value1</param1></request> text/xml Для SOAP или устаревших API.

Пример POST-запроса с JSON:

Запрос = Новый HTTPЗапрос();

Запрос.АдресРесурса = "https://api.example.com/data";

Запрос.УстановитьТекст(

"{""param1"": ""значение1"", ""param2"": ""значение2""}",

КодировкаТекста.UTF8,

"application/json"

);

Соединение = Новый HTTPСоединение();

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Проверьте формат данных (JSON, form-data и т.д.)|Закодируйте тело запроса в UTF-8|Установите правильный заголовок Content-Type|Обработайте возможные ошибки сервера (4xx, 5xx)-->

4. Передача параметров в заголовках (Headers)

Некоторые API требуют передачи параметров не в теле или URL, а в заголовках запроса. Типичные примеры:

  • 🔑 Авторизация: Authorization: Bearer token123 или Basic auth.
  • 🛡️ API-ключи: X-API-Key: your_key_here.
  • 📅 Метки времени: X-Timestamp: 2026-05-20T12:00:00Z.
  • 🌍 Локализация: Accept-Language: ru-RU.

В заголовки устанавливаются методом УстановитьЗаголовок(). Пример с авторизацией:

Запрос = Новый HTTPЗапрос();

Запрос.АдресРесурса = "https://api.example.com/secure";

Запрос.УстановитьЗаголовок("Authorization", "Bearer " + ТокенДоступа);

Запрос.УстановитьЗаголовок("Content-Type", "application/json");

Соединение = Новый HTTPСоединение();

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

⚠️ Внимание: Некоторые серверы чувствительны к регистру в названиях заголовков. Например, content-type и Content-Type могут восприниматься по-разному. Всегда сверяйте требования API-документации.

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

5. Передача файлов и бинарных данных

Для отправки файлов (например, выгрузка отчётов в PDF или загрузка изображений) используется формат multipart/form-data. В это реализуется через ручную сборку тела запроса с границами (boundary). Пример:

Граница = "-----12345";

ТелоЗапроса = "--" + Граница + Символы.ПС +

"Content-Disposition: form-data; name=""file""; filename=""report.pdf""" + Символы.ПС +

"Content-Type: application/pdf" + Символы.ПС + Символы.ПС +

ДвоичныеДанныеВBase64 + Символы.ПС +

"--" + Граница + "--";

Запрос = Новый HTTPЗапрос();

Запрос.АдресРесурса = "https://api.example.com/upload";

Запрос.УстановитьТекст(ТелоЗапроса, КодировкаТекста.UTF8, "multipart/form-data; boundary=" + Граница);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Ключевые нюансы:

  • 📎 Граница (boundary) должна быть уникальной для каждого запроса.
  • 🖼️ Бинарные данные (например, содержимое файла) нужно конвертировать в Base64 с помощью Base64Строка().
  • 📄 Имя файла в заголовке Content-Disposition должно совпадать с реальным именем.
⚠️ Внимание: При загрузке больших файлов (>10 МБ) может потребоваться настройка таймаута в HTTPСоединение через метод УстановитьТаймаут(). Стандартное значение (60 секунд) может быть недостаточным.

6. Обработка ответов сервера и типичные ошибки

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

  • 📜 ПолучитьТекст() — тело ответа (JSON, XML или текст).
  • 🔢 КодСостояния — HTTP-статус (200, 404, 500 и т.д.).
  • 🏷️ ПолучитьЗаголовок() — чтение заголовков ответа (например, Content-Type).

Пример обработки JSON-ответа:

Если Ответ.КодСостояния = 200 Тогда

ТекстОтвета = Ответ.ПолучитьТекст(КодировкаТекста.UTF8);

Данные = Новый ЧтениеJSON;

Данные.УстановитьСтроку(ТекстОтвета);

Результат = Данные.Прочитать();

Иначе

Сообщить("Ошибка: " + Ответ.КодСостояния + " - " + Ответ.ПолучитьТекст());

КонецЕсли;

Типичные ошибки и их причины:

Ошибка Причина Решение
400 Bad Request Некорректный формат параметров или заголовков. Проверьте кодировку, синтаксис JSON/XML, имена параметров.
401 Unauthorized Отсутствует или неверный токен авторизации. Обновите токен, проверьте заголовок Authorization.
403 Forbidden Недостаточно прав доступа. Уточните права у администратора API.
500 Internal Server Error Ошибка на стороне сервера. Проверьте логи сервера или свяжитесь с поддержкой.
💡

Всегда логируйте коды состояния и тела ошибок — это ускорит диагностику проблем при интеграции.

7. Оптимизация и безопасность HTTP-запросов

При активном использовании HTTP-запросов в важно следить за производительностью и безопасностью:

  • 🔄 Повторное использование соединений: Объект HTTPСоединение можно инициализировать один раз и использовать для нескольких запросов (экономит время на установку TCP-соединения).
  • 🛡️ HTTPS вместо HTTP: Всегда используйте защищённое соединение, особенно при передаче чувствительных данных.
  • 🗝️ Хранение токенов: Не жестко прописывайте токены в коде. Используйте ХранилищеЗначений или внешние конфигурационные файлы.
  • Асинхронные запросы: Для фоновых задач используйте HTTPСоединение.ОтправитьДляОбработкиАсинхронно(), чтобы не блокировать интерфейс.

Пример оптимизированного кода с повторным использованием соединения:

Соединение = Новый HTTPСоединение();

Соединение.УстановитьТаймаут(120); // Увеличиваем таймаут для больших файлов

// Первый запрос

Запрос1 = Новый HTTPЗапрос();

Запрос1.АдресРесурса = "https://api.example.com/data1";

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

// Второй запрос (используем то же соединение)

Запрос2 = Новый HTTPЗапрос();

Запрос2.АдресРесурса = "https://api.example.com/data2";

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

⚠️ Внимание: При работе с публичными API (например, маркетплейсов) условия авторизации и лимиты запросов могут меняться. Всегда сверяйте актуальные требования в документации сервиса.

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

Как передать массив параметров в POST-запросе?

Для передачи массива в JSON используйте следующий формат:

{

"parameters": [

{"name": "param1", "value": "value1"},

{"name": "param2", "value": "value2"}

]

}

В массив можно сформировать с помощью объекта Массив и сериализовать в JSON:

МассивПараметров = Новый Массив;

МассивПараметров.Добавить(Новый Структура("name, value", "param1", "value1"));

Запрос.УстановитьТекст(ЗаписатьJSON(МассивПараметров), КодировкаТекста.UTF8, "application/json");

Почему сервер возвращает ошибку 415 Unsupported Media Type?

Эта ошибка означает, что сервер не поддерживает указанный вами Content-Type. Проверьте:

  • Корректность заголовка (например, application/json вместо text/json).
  • Совпадение Content-Type с форматом тела запроса (если отправили JSON, а указали XML — будет ошибка).
  • Требования API: некоторые серверы ожидают конкретную версию (например, application/vnd.api+json).
Как отправить запрос с Basic Auth?

Для авторизации по схеме Basic Auth нужно:

  1. Объединить логин и пароль через двоеточие: login:password.
  2. Закодировать результат в Base64: Base64Строка("login:password").
  3. Передать в заголовке Authorization:
Запрос.УстановитьЗаголовок(

"Authorization",

"Basic " + Base64Строка("login:password")

);

Можно ли отправить запрос без ожидания ответа?

Да, для этого используйте метод ОтправитьДляОбработкиАсинхронно(). Пример:

Соединение.ОтправитьДляОбработкиАсинхронно(

Запрос,

Новый ОписаниеОповещения("ПриОбработкеОтвета", ЭтотОбъект)

);

Процедура ПриОбработкеОтвета(Результат, ДополнительныеПараметры) Экспорт

// Обработка ответа

КонецПроцедуры

Это полезно для фоновых задач, например, отправки логов или уведомлений.

Как отладить HTTP-запрос, если сервер не отвечает?

Используйте следующие шаги:

  1. Проверьте доступность сервера через ping или telnet.
  2. Убедитесь, что нет блокировки фаерволом или антивирусом.
  3. Включите логирование в :
Соединение.УстановитьЛоггирование(Истина, "C:\logs\http_log.txt");

Также проверьте, не требует ли сервер специфичных заголовков (например, User-Agent).