Разработка и Конфигурация · 14 мин
1С: как передать параметры в HTTP-запросе
Как передать параметры в HTTP-запросе из 1С: строка запроса, заголовки, тело POST, JSON и form-data. Примеры кода, типичные ошибки и проверка результата.
Передача параметров в HTTP-запросе из 1С — типовая задача при интеграции с веб-сервисами, REST API, сайтами и внешними системами учёта. В зависимости от требований API параметры передаются тремя способами: в строке адреса (query string), в заголовках запроса и в теле запроса. Выбор способа определяется не разработчиком 1С, а документацией конкретного сервиса.
Для работы используются объекты встроенного языка: HTTPСоединение, HTTPЗапрос и HTTPОтвет. Параметры в адресной строке добавляются в свойство АдресРесурса объекта HTTPЗапрос, заголовки — в соответствие Заголовки, а данные тела — через методы УстановитьТелоИзСтроки, УстановитьТелоИзДвоичныхДанных или УстановитьИмяФайлаТела.
Чаще всего ошибки возникают не в самом механизме передачи, а в кодировании значений: кириллица, пробелы и спецсимволы в URL требуют кодирования, иначе сервер вернёт ошибку 400 или неправильно интерпретирует параметр. Ниже разобраны все три способа с примерами кода и проверкой результата.
Подготовка: создание соединения и объекта запроса
Перед передачей параметров нужно создать два объекта. Первый — HTTPСоединение, который описывает сервер: хост, порт, защищённое соединение, таймаут и при необходимости прокси. Второй — HTTPЗапрос, который содержит адрес ресурса, заголовки и тело.
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30, ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос("/v1/orders");
Обратите внимание: адрес ресурса указывается без протокола и домена — только путь на сервере. Именно к этому пути позже добавляются GET-параметры. Таймаут стоит задавать явно, иначе при зависшем сервере сеанс 1С будет ждать слишком долго.
Для HTTPS обязательно передавайте объект ЗащищенноеСоединениеOpenSSL — без него соединение по 443 порту завершится ошибкой. Если сервер использует самоподписанный сертификат, потребуется дополнительная настройка сертификатов на стороне платформы или операционной системы.
Передача параметров в строке запроса (GET)
GET-параметры добавляются к адресу ресурса после знака вопроса в формате имя=значение, несколько параметров разделяются символом &. Это стандартный способ для фильтрации, поиска и пагинации в REST API.
Запрос = Новый HTTPЗапрос("/v1/orders?date_from=2026-01-01&status=new&limit=100");
Ответ = Соединение.Получить(Запрос);
Если значение содержит кириллицу, пробелы или спецсимволы, его необходимо закодировать. В типовых конфигурациях есть функция КодироватьСтроку общего модуля (например, ОбщегоНазначения.КодироватьСтроку в БСП) с указанием способа кодирования URL. При отсутствии БСП используется собственная функция на замене символов.
ЗначениеПараметра = КодироватьСтроку("ООО Ромашка", СпособКодированияСтроки.КодировкаURL);
АдресРесурса = "/v1/search?query=" + ЗначениеПараметра;
Запрос = Новый HTTPЗапрос(АдресРесурса);
Удобный приём — собирать параметры программно из структуры, чтобы не склеивать строку вручную и не забыть разделители:
Параметры = Новый Структура;
Параметры.Вставить("date_from", "2026-01-01");
Параметры.Вставить("status", "new");
СтрокаПараметров = "";
Для Каждого Параметр Из Параметры Цикл
СтрокаПараметров = СтрокаПараметров + ?(СтрокаПараметров = "", "?", "&")
+ Параметр.Ключ + "=" + Параметр.Значение;
КонецЦикла;
Запрос = Новый HTTPЗапрос("/v1/orders" + СтрокаПараметров);
Передача параметров в заголовках
Заголовки используются для служебных параметров: авторизационных токенов, указания формата данных, идентификаторов клиента. В 1С заголовки — это соответствие, где ключ — имя заголовка, значение — строка.
Запрос.Заголовки.Вставить("Authorization", "Bearer eyJhbGciOi...");
Запрос.Заголовки.Вставить("Accept", "application/json");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("X-Api-Key", "ваш_ключ");
Типовые сценарии: Authorization с токеном Bearer или Basic, Content-Type для указания формата тела, Accept для запроса нужного формата ответа. Некоторые API требуют нестандартные заголовки — их имена всегда указаны в документации сервиса.
Для Basic-авторизации логин и пароль кодируются в Base64 в формате «логин:пароль». В 1С для этого используется запись строки в поток и получение Base64-строки, либо логин и пароль передаются прямо в конструктор HTTPСоединение — тогда платформа сама сформирует заголовок авторизации.
Передача параметров в теле POST-запроса
POST-параметры передаются в теле запроса. Формат тела определяется API: чаще всего это JSON, реже — application/x-www-form-urlencoded, XML или multipart/form-data для файлов. Формат обязательно дублируется в заголовке Content-Type.
JSON — самый распространённый формат
Для формирования JSON используется объект ЗаписьJSON либо сериализация структуры. Ручная склейка JSON строками — частый источник ошибок с кавычками и экранированием, поэтому лучше использовать штатные средства.
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("number");
ЗаписьJSON.ЗаписатьЗначение("А-00125");
ЗаписьJSON.ЗаписатьИмяСвойства("date");
ЗаписьJSON.ЗаписатьЗначение("2026-01-15");
ЗаписьJSON.ЗаписатьИмяСвойства("amount");
ЗаписьJSON.ЗаписатьЗначение(15400.50);
ЗаписьJSON.ЗаписатьКонецОбъекта();
ТелоJSON = ЗаписьJSON.Закрыть();
Запрос = Новый HTTPЗапрос("/v1/orders");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(ТелоJSON, КодировкаТекста.UTF8);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Метод ОтправитьДляОбработки соответствует HTTP-методу POST. Для PUT и DELETE используются методы Записать и Удалить объекта соединения, а для произвольного метода — ВызватьHTTPМетод.
Формат x-www-form-urlencoded
Некоторые API (например, сервисы авторизации по OAuth 2.0) требуют параметры в теле в том же виде, что и GET-параметры: ключ=значение&ключ2=значение2. Тело формируется строкой с обязательным кодированием значений.
Тело = "grant_type=client_credentials&client_id=my_app&scope=read";
Запрос = Новый HTTPЗапрос("/oauth/token");
Запрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Запрос.УстановитьТелоИзСтроки(Тело, КодировкаТекста.UTF8);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Передача файлов и двоичных данных
Если параметром является файл, используется УстановитьТелоИзДвоичныхДанных или УстановитьИмяФайлаТела — второй вариант предпочтителен для больших файлов, так как не загружает их целиком в память. Для multipart/form-data тело придётся формировать вручную с границами (boundary) или через промежуточный файл.
Запрос = Новый HTTPЗапрос("/v1/upload");
Запрос.Заголовки.Вставить("Content-Type", "application/octet-stream");
Запрос.УстановитьИмяФайлаТела("C:\\temp\\invoice.pdf");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);Как выбрать способ передачи параметров
Способ определяется документацией API, но общая логика такова: идентификаторы и фильтры при чтении данных — в query string, данные для создания и изменения — в теле запроса, авторизация — в заголовках. Если сервис принимает параметры несколькими способами, предпочтителен тот, что описан в примерах документации.
Сравнение вариантов
Фильтры, поиск, пагинация при чтении данных. Ограничение: длина URL ограничена сервером, данные видны в логах.
Токены, ключи API, указание форматов. Не подходит для бизнес-данных запроса.
Создание и изменение объектов, сложные вложенные структуры. Требует корректного Content-Type.
OAuth-авторизация и простые формы. Неудобен для вложенных структур и массивов.
Передача файлов. Тело multipart формируется вручную, что требует аккуратности с boundary.
Как выбрать действие
Проверка результата и чтение ответа
После выполнения запроса первым делом анализируется код состояния: Ответ.КодСостояния. Значения 200–299 означают успех, 400 — ошибка в параметрах, 401/403 — проблема авторизации, 404 — неверный адрес ресурса, 500 — ошибка на стороне сервера. Не полагайтесь на то, что успешное выполнение метода без исключения означает успех операции: HTTP-ошибка не вызывает исключение в 1С.
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Иначе
ВызватьИсключение "Ошибка API: " + Ответ.КодСостояния
+ " " + Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
Тело ошибки почти всегда содержит описание причины от сервера — выводите его в сообщение об ошибке или журнал регистрации. Это экономит часы отладки: сервер прямо указывает, какой параметр отсутствует или имеет неверный формат.
Как проверить результат
200–299, тело содержит ожидаемые данные
400, 401, 404, 500 — читать тело ошибки
JSON разбирается без исключения, структура соответствует документации
HTML-страница ошибки вместо JSON — неверный адрес или прокси
Сервер видит все переданные значения корректно, включая кириллицу
Кракозябры или пустые значения — проблема кодирования
Типичные ошибки при передаче параметров
Большинство проблем при интеграции связано не с платформой 1С, а с невнимательностью к деталям протокола. Ниже — ошибки, которые встречаются чаще всего.
Отдельно отметим проблему с типами данных: числа и даты в JSON должны соответствовать ожиданиям API. Дата «15.01.2026» вместо ISO-формата «2026-01-15» — частая причина отказа сервера. Всегда сверяйте формат с примерами в документации.
Ещё одна тонкость — редиректы. Платформа 1С не всегда автоматически следует перенаправлениям (коды 301, 302): если сервер вернул редирект, нужно прочитать заголовок Location из ответа и выполнить запрос по новому адресу.
Перед тем как отлаживать запрос в 1С, выполните его в Postman или curl с теми же параметрами. Если там запрос работает, а в 1С нет — проблема в кодировании или заголовках; если не работает и там — в самих параметрах или авторизации.
Ограничения и безопасность
Токены и ключи API нельзя хранить открытым текстом в коде общих модулей — они попадут в хранилище конфигурации и выгрузки. Используйте безопасное хранилище (в БСП — ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище) или константы с ограниченным доступом.
Длительные HTTP-запросы в клиентском сеансе блокируют интерфейс пользователя. Выгрузки и синхронизации выполняйте в фоновых заданиях или регламентных операциях, а при обрывах реализуйте повторные попытки с паузой — временные ошибки сети нормальны при работе с внешними сервисами.
Помните про лимиты внешних API: многие сервисы ограничивают частоту запросов. При массовой обработке данных добавляйте паузы между вызовами и обрабатывайте код 429 (слишком много запросов), иначе ключ API могут временно заблокировать.
Что важно запомнить
GET-параметры идут в адресе ресурса с кодированием значений, POST-параметры — в теле с корректным Content-Type, авторизация — в заголовках. Успех проверяйте по коду состояния, а тело ошибки всегда читайте: сервер сам подскажет причину отказа.
Частые вопросы
Как передать параметры в GET-запросе, если значение содержит кириллицу?
Значение нужно закодировать функцией КодироватьСтроку() со способом КодировкаURL (в конфигурациях на БСП доступна через общие модули). Некодированная кириллица приводит к ошибке 400 или искажённым данным на сервере.
Чем отличается УстановитьТелоИзСтроки от УстановитьИмяФайлаТела?
Первый метод помещает в тело строку из памяти и подходит для JSON и коротких данных. Второй отправляет файл с диска без загрузки в память — используйте его для больших файлов, чтобы не получить переполнение памяти сеанса.
Сервер возвращает 200, но данных в ответе нет. Что проверить?
Проверьте, туда ли переданы параметры: некоторые API молча игнорируют лишние параметры в адресе и ждут их в теле. Также сверьте названия параметров с документацией — опечатка в имени параметра обычно не вызывает ошибку, а просто игнорируется.
Как передать массив значений в параметрах запроса?
Зависит от API: одни сервисы принимают повторяющийся параметр (id=1&id=2&id=3), другие — JSON-массив в теле, третьи — значения через запятую. Точный формат смотрите в документации; универсального стандарта здесь нет.
Можно ли выполнять HTTP-запросы на тонком и веб-клиенте?
На сервере 1С — да, это основной сценарий. На тонком клиенте объекты HTTP доступны с ограничениями, а в веб-клиенте прямые HTTP-запросы из встроенного языка не выполняются. Правильная архитектура — вызывать серверные процедуры, которые выполняют запрос на стороне сервера.
Как отладить, что именно ушло на сервер?
Выведите в журнал регистрации адрес ресурса, все заголовки и тело запроса перед отправкой (кроме токенов). Для полного контроля можно временно направить запрос на тестовый сервис-эхо, который возвращает принятые данные, и сравнить с ожидаемым.