Как отправить POST-запрос в 1С: пошаговый рабочий пример
Чтобы отправить POST-запрос 1С, нужно четыре объекта платформы:
HTTPСоединение (сервер, порт, защищённое соединение, таймаут),
HTTPЗапрос (адрес ресурса, заголовки, тело),
метод ОтправитьДляОбработки() и HTTPОтвет
(свойство КодСостояния и ПолучитьТелоКакСтроку()).
Для HTTPS обязателен параметр ЗащищённоеСоединение = Новый ЗащищённоеСоединениеOpenSSL()
и порт 443 (для http — 80).
Тело JSON собирайте через ЗаписьJSON и передавайте в
УстановитьТелоИзСтроки() с кодировкой UTF-8 и без BOM.
Успех определяется по КодСостояния из диапазона 2xx.
Объекты платформы для POST-запроса в 1С
Http-запрос 1С POST собирается из тех же примитивов, что и GET, — отличие только в вызове метода и в наличии тела запроса. Ниже — ключевые сигнатуры из синтакс-помощника 1С:Предприятие 8.3.
Соединение = Новый HTTPСоединение(
"api.example.com", // Сервер
443, // Порт (443 для https, 80 для http)
, // Пользователь
, // Пароль
, // Прокси
30, // Таймаут, сек
Новый ЗащищённоеСоединениеOpenSSL(), // ЗащищённоеСоединение — обязателен для https
Ложь // ИспользоватьАутентификациюОС
);
Запрос = Новый HTTPЗапрос("/v1/orders", Заголовки);
АдресРесурса, ЗаголовкиОтвет = Соединение.ОтправитьДляОбработки(Запрос);
КодСостояния, Заголовки, ПолучитьТелоКакСтроку())
Метод ОтправитьДляОбработки() — это именно POST. У HTTPСоединение
есть и другие вызовы: Получить() — GET, Записать() — PUT,
Удалить() — DELETE. Универсальный низкоуровневый вариант — ВызватьHTTPМетод(<HTTPМетод>, <HTTPЗапрос>),
куда HTTP-метод передаётся строкой ("POST", "PATCH" и т.д.).
POST-запрос 1С пошагово: HTTPS, заголовки, тело JSON
Разберём отправку POST-запроса 1С в JSON API по шагам. Порядок действий одинаковый для любого REST-сервиса.
Шаг 1. Заголовки. Для JSON обязателен Content-Type,
для авторизации — Authorization. Accept подсказывает серверу желаемый формат ответа.
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json;charset=utf-8");
Заголовки.Вставить("Accept", "application/json");
Заголовки.Вставить("Authorization", "Bearer eyJhbGciOi...");
Шаг 2. Тело JSON. Собираем структуру данных и сериализуем через ЗаписьJSON.
Никогда не склеивайте JSON строками — потеряете экранирование кавычек и кириллицы.
Данные = Новый Структура;
Данные.Вставить("order_id", "A-100");
Данные.Вставить("amount", 1250.50);
Данные.Вставить("client", "ООО Ромашка");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
ТелоJSON = ЗаписьJSON.Закрыть();
Шаг 3. HTTPS-соединение. Порт 443, Новый ЗащищённоеСоединениеOpenSSL(),
разумный таймаут.
Соединение = Новый HTTPСоединение(
"api.example.com", 443, , , , 30, Новый ЗащищённоеСоединениеOpenSSL());
Шаг 4. Тело запроса. В УстановитьТелоИзСтроки() явно указываем UTF-8
и ИспользоватьBOM = НеИспользовать: BOM в JSON ломает разбор на стороне сервера.
Запрос = Новый HTTPЗапрос("/v1/orders", Заголовки);
Запрос.УстановитьТелоИзСтроки(
ТелоJSON,
КодировкаТекста.UTF8,
ИспользованиеByteOrderMark.НеИспользовать);
Шаг 5. Отправка и разбор ответа. Успех — коды 2xx, всё остальное — ошибка API.
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
Если Ответ.КодСостояния >= 200 И Ответ.КодСостояния < 300 Тогда
// Разбираем ответ как JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
Результат = ПрочитатьJSON(ЧтениеJSON);
Иначе
ВызватьИсключение "API вернул " + Ответ.КодСостояния + ": " + ТелоОтвета;
КонецЕсли;
Полный рабочий пример POST-запроса 1С с JSON
&НаСервере
Функция ОтправитьPOSTЗапрос(АдресРесурса, ДанныеСтруктура, Токен)
// 1. Заголовки
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json;charset=utf-8");
Заголовки.Вставить("Accept", "application/json");
Заголовки.Вставить("Authorization", "Bearer " + Токен);
// 2. Тело — JSON через ЗаписьJSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеСтруктура);
ТелоJSON = ЗаписьJSON.Закрыть();
// 3. HTTPS-соединение: порт 443 + ЗащищённоеСоединениеOpenSSL + таймаут 30 сек
Соединение = Новый HTTPСоединение(
"api.example.com", 443, , , , 30, Новый ЗащищённоеСоединениеOpenSSL());
// 4. HTTPЗапрос + UTF-8 без BOM
Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
Запрос.УстановитьТелоИзСтроки(
ТелоJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
// 5. Отправка + разбор ответа
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Исключение
ЗаписьЖурналаРегистрации(
"Интеграция.POST",
УровеньЖурналаРегистрации.Ошибка,
, ,
"Сетевая ошибка: " + ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
Если Ответ.КодСостояния >= 200 И Ответ.КодСостояния < 300 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
Возврат ПрочитатьJSON(ЧтениеJSON);
Иначе
ЗаписьЖурналаРегистрации(
"Интеграция.POST",
УровеньЖурналаРегистрации.Ошибка,
, ,
"HTTP " + Ответ.КодСостояния + ": " + Лев(ТелоОтвета, 500));
ВызватьИсключение "API вернул " + Ответ.КодСостояния;
КонецЕсли;
КонецФункции
Вызов из формы или обработчика — одной строкой:
Данные = Новый Структура("order_id, amount, client", "A-100", 1250.50, "ООО Ромашка");
Результат = ОтправитьPOSTЗапрос("/v1/orders", Данные, "eyJhbGciOi...");
POST-запрос 1С с form-urlencoded (не JSON)
Часть API (OAuth-эндпоинты, старые сервисы) ожидают тело в формате
application/x-www-form-urlencoded — как у обычной HTML-формы. В таком теле
значения обязательно URL-кодируются: пробелы, кириллицу и спецсимволы
прогоняем через КодироватьСтроку(..., СпособКодированияСтроки.КодировкаURL).
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Параметры = Новый Массив;
Параметры.Добавить("grant_type=client_credentials");
Параметры.Добавить("client_id="
+ КодироватьСтроку("my-app", СпособКодированияСтроки.КодировкаURL));
Параметры.Добавить("scope="
+ КодироватьСтроку("orders read", СпособКодированияСтроки.КодировкаURL));
ТелоФормы = СтрСоединить(Параметры, "&");
Запрос = Новый HTTPЗапрос("/oauth/token", Заголовки);
Запрос.УстановитьТелоИзСтроки(
ТелоФормы, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Правило простое: кодируем только значения, разделители = и &
остаются как есть. Иначе сервер получит один слипшийся параметр.
Обработка ошибок, таймаут и логирование
У POST-запроса 1С бывает два принципиально разных класса сбоев, и путать их нельзя.
-
Сетевые ошибки (DNS, TLS, разрыв, таймаут) — метод
ОтправитьДляОбработки()выбрасывает исключение. ЛовимПопытка / Исключение, читаемОписаниеОшибки(). -
Ошибки уровня API — соединение прошло, вернулся
HTTPОтветс кодом 4xx/5xx. Никаких исключений платформа не бросает, статус нужно проверять руками поКодСостояния.
Location), 4xx — ошибка в запросе клиента (тело, заголовки,
авторизация), 5xx — ошибка на стороне сервера, можно повторять с бэкоффом.
Таймаут задаётся 6-м параметром конструктора HTTPСоединение.
Не оставляйте 0 (без ограничения) на боевых интеграциях: одно зависшее соединение
заблокирует фоновое задание или регламентный процесс на часы. Разумный старт — 30-60 секунд
для обычных API и до 300 для тяжёлых отчётов.
Логирование. Пишите в ЗаписьЖурналаРегистрации() и код,
и первые 500-1000 символов тела ответа — этого хватает, чтобы разобраться в 4xx.
Тело писать в лог целиком не нужно: там могут быть персональные данные и токены.
Частые ошибки при отправке POST-запроса в 1С
-
Нет
ЗащищённоеСоединениеOpenSSL()для https. При обращении к https без последнего параметра конструктора платформа не установит TLS и попытается работать по plain HTTP на 443-м порту — типовая «ошибка при выполнении POST-запроса». - Порт не соответствует схеме. Для https — 443, для http — 80. Отправка на 80 к https-сервису даёт таймаут или странные 4xx.
-
Схема и хост попали в
АдресРесурса. ВHTTPЗапроспередаётся только путь, начинающийся со «/» (например,/v1/orders). Значение вида"https://api.example.com/v1/orders"сервер отдаст с 400. -
BOM в теле JSON.
УстановитьТелоИзСтроки()безИспользованиеByteOrderMark.НеИспользоватьдописывает BOM в начало — строгий JSON-парсер сервера падает на первом символе. -
Ручная склейка JSON строками. Кавычки и кириллица теряют экранирование.
Всегда собирайте объект и сериализуйте через
ЗаписатьJSON(). -
Проверка
КодСостояния = 200. Успехом считаются все коды2xx— например,201 Createdи204 No Content. Проверяйте диапазон, а не одно значение. -
Нет
Попытка / ИсключениевокругОтправитьДляОбработки(). При обрыве сети регламентная задача упадёт без осмысленного сообщения в журнал. -
Нет URL-кодирования в form-urlencoded. Кириллица, пробелы и
+доедут до сервера искажёнными — API вернёт 400 или неверно разберёт параметры.
Частые вопросы про POST-запрос в 1С
Каким методом отправить POST-запрос в 1С 8.3?
Штатный способ — HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос).
Универсальная альтернатива — ВызватьHTTPМетод("POST", HTTPЗапрос),
она же используется для нестандартных методов вроде PATCH.
Как отправить POST-запрос 1С с JSON в теле?
Соберите данные в Структуру или Соответствие, сериализуйте
через ЗаписатьJSON(), положите строку в УстановитьТелоИзСтроки()
с кодировкой UTF-8 и ИспользованиеByteOrderMark.НеИспользовать, а в заголовки
добавьте Content-Type: application/json;charset=utf-8.
Почему возникает ошибка при выполнении POST-запроса 1С?
Чаще всего — из-за пропущенного ЗащищённоеСоединениеOpenSSL() для https,
неверного порта, BOM в теле JSON, схемы и хоста внутри АдресРесурса или
отсутствия Content-Type. Смотрите КодСостояния и первые
500 символов ответа — они дают точный диагноз.