К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как отправить POST-запрос из 1С

Как отправить POST-запрос из 1С через HTTPСоединение: настройка заголовков, JSON-тела, SSL, обработка ответа и типичные ошибки с примерами кода.

POST-запросы в 1С нужны всякий раз, когда конфигурация обменивается данными с внешними сервисами: отправляет заказы в CRM, передаёт чеки в кассовый сервис, обращается к API банка, сайта или службы доставки. В отличие от GET-запроса, где параметры передаются в адресной строке, POST отправляет тело сообщения — JSON, XML или форму — и именно поэтому используется для передачи структурированных данных.

Встроенный язык 1С предоставляет для этого объектную модель HTTP: HTTPСоединение, HTTPЗапрос и HTTPОтвет. Этого достаточно для большинства интеграций — не нужны ни внешние компоненты, ни COM-объекты. Код работает и на сервере, и на клиенте (в тонком клиенте с ограничениями), что упрощает разработку.

Ниже разобран полный цикл: создание соединения, формирование тела запроса, работа с JSON через стандартные средства платформы, защищённое соединение, обработка ответа и разбор ошибок, которые чаще всего встречаются при первой настройке обмена.

Какие объекты платформы нужны для POST-запроса

Работа с HTTP в 1С строится на трёх объектах. HTTPСоединение описывает сервер: адрес, порт, логин и пароль для базовой аутентификации, прокси и параметры защищённого соединения. HTTPЗапрос описывает конкретное обращение: относительный адрес ресурса, заголовки и тело. HTTPОтвет возвращается платформой после отправки и содержит код состояния, заголовки и тело ответа сервера.

Ключевой метод для POST — ОтправитьДляОбработки(HTTPЗапрос) у объекта HTTPСоединение. Именно он выполняет POST. Метод Получить() соответствует GET, Записать() — PUT, Удалить() — DELETE. Если API требует другой метод, проверьте документацию сервиса и выберите соответствующий вызов.

Важно понимать, где выполняется код. HTTP-вызовы надёжнее размещать на сервере (в серверной процедуре общего модуля или фоновом задании): сервер обычно имеет стабильный доступ в интернет, а учётные данные не попадают на клиентские машины. Выполнение запроса на клиенте оправдано только для локальных сервисов внутри сети предприятия.

Минимальный пример POST-запроса

Простейший сценарий — отправить строку на сервер и прочитать ответ. Создайте HTTPСоединение, указав домен без протокола и слешей, затем HTTPЗапрос с относительным путём ресурса:

HTTPСоединение = Новый HTTPСоединение("api.example.ru");

Запрос = Новый HTTPЗапрос("/v1/orders");

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

Запрос.УстановитьТелоИзСтроки("{""number"":""0001""}", КодировкаТекста.UTF8);

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

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

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

Иначе

ВызватьИсключение "Ошибка HTTP: " + Ответ.КодСостояния;

КонецЕсли;

Обратите внимание на три момента. Во-первых, адрес сервера в конструкторе указывается без «http://» — протокол определяется портом и параметрами защищённого соединения. Во-вторых, кавычки внутри строки на встроенном языке удваиваются. В-третьих, заголовок Content-Type должен соответствовать реальному формату тела, иначе сервер вернёт ошибку 400 или 415.

Код состояния нужно проверять всегда. Успешные ответы — это диапазон 200–299: 200 (OK), 201 (создано), 204 (нет содержимого). Коды 4xx означают ошибку в вашем запросе, 5xx — сбой на стороне сервера. Не считайте запрос успешным только потому, что исключения не произошло: сервер мог вернуть осмысленный отказ.

Порядок действий
  1. 1
    Создайте HTTPСоединение с адресом сервера без указания протокола
  2. 2
    Создайте HTTPЗапрос с относительным путём ресурса
  3. 3
    Заполните заголовки: Content-Type, Authorization при необходимости
  4. 4
    Установите тело запроса строкой или из файла
  5. 5
    Вызовите ОтправитьДляОбработки() и проверьте код состояния ответа
  6. 6
    Прочитайте тело ответа и разберите его (например, как JSON)

Как сформировать JSON-тело запроса

Большинство современных API принимают данные в формате JSON. Собирать JSON конкатенацией строк — плохая практика: легко ошибиться с экранированием и структурой. Платформа предоставляет объект ЗаписьJSON, который формирует корректный документ:

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписьJSON.ЗаписатьНачалоОбъекта();

ЗаписьJSON.ЗаписатьИмяСвойства("orderNumber");

ЗаписьJSON.ЗаписатьЗначение("АБ-001234");

ЗаписьJSON.ЗаписатьИмяСвойства("amount");

ЗаписьJSON.ЗаписатьЗначение(1500.50);

ЗаписьJSON.ЗаписатьИмяСвойства("items");

ЗаписьJSON.ЗаписатьНачалоМассива();

ЗаписьJSON.ЗаписатьНачалоОбъекта();

ЗаписьJSON.ЗаписатьИмяСвойства("sku");

ЗаписьJSON.ЗаписатьЗначение("T-100");

ЗаписьJSON.ЗаписатьКонецОбъекта();

ЗаписьJSON.ЗаписатьКонецМассива();

ЗаписьJSON.ЗаписатьКонецОбъекта();

ТелоЗапроса = ЗаписьJSON.Закрыть();

Альтернатива — собрать структуру данных в объекте Соответствие или Структура и сериализовать её через ЗаписатьJSON(ЗаписьJSON, Данные). Это удобнее, когда данные уже лежат в структурах: платформа сама преобразует типы. Булевы значения станут true/false, даты потребуют ручного преобразования в строку нужного формата — уточните в документации API, какой формат дат он ожидает (часто ISO 8601).

Для чтения JSON-ответа используется парный объект ЧтениеJSON с методом ПрочитатьJSON: он возвращает Соответствие или Структуру, из которой значения извлекаются по имени свойства. Перед обращением к свойству проверяйте его наличие — внешний сервис может не вернуть поле, и обращение к несуществующему ключу вызовет ошибку.

Заголовки, авторизация и отправка файлов

Помимо Content-Type, почти всегда требуется заголовок авторизации. Самые распространённые варианты: Authorization: Bearer токен для OAuth и API-ключей, либо базовая аутентификация — тогда логин и пароль можно передать прямо в конструктор HTTPСоединение, и платформа сама сформирует заголовок. Токены и пароли храните в защищённом хранилище (например, в безопасном хранилище паролей БСП), а не в коде и не в открытых константах.

Если API принимает форму (Content-Type application/x-www-form-urlencoded), тело собирается как строка вида key1=value1&key2=value2 с URL-кодированием значений. Для multipart/form-data (загрузка файлов вместе с полями) тело придётся формировать вручную с разделителями boundary — это трудоёмко, и часто проще уточнить у владельца API, поддерживает ли он загрузку файла бинарным телом запроса.

Отправить файл бинарным телом просто: метод УстановитьИмяФайлаТела() у HTTPЗапроса подключает файл диска как тело запроса. Укажите корректный Content-Type (например, application/pdf или application/octet-stream). Перед отправкой больших файлов проверьте ограничения принимающего сервиса — многие API ограничивают размер одного запроса.

HTTPS и защищённое соединение

Если сервер работает по HTTPS (а публичные API почти всегда), в конструктор HTTPСоединение нужно передать объект защищённого соединения, иначе платформа попытается соединиться по обычному HTTP и получит отказ или перенаправление:

SSL = Новый ЗащищенноеСоединениеOpenSSL();

HTTPСоединение = Новый HTTPСоединение("api.example.ru", 443, , , , , SSL);

Объект ЗащищенноеСоединениеOpenSSL по умолчанию проверяет сертификат сервера по системному хранилищу. Если сервер использует самоподписанный сертификат (типично для внутренних сервисов), проверка завершится ошибкой. Варианты решения — установить сертификат в доверенные на машине, где работает сервер 1С, или передать в конструктор собственный сертификат клиента и параметры проверки. Полностью отключать проверку сертификата на продуктивном обмене небезопасно: соединение станет уязвимым для подмены сервера.

Учтите, что настройки SSL применяются на той стороне, где выполняется код. Если запрос идёт с сервера 1С, сертификаты и доступ в интернет нужны именно на сервере, а не на компьютере пользователя.

Обработка ответа и диагностика ошибок

После вызова ОтправитьДляОбработки анализируйте код состояния и тело ответа. Многие API при ошибке возвращают JSON с описанием проблемы — прочитайте его через ЧтениеJSON и запишите в журнал регистрации, это сильно упростит поддержку. Сетевые сбои (недоступный сервер, таймаут) вызывают исключение, поэтому вызов стоит оборачивать в попытку:

Попытка

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

Исключение

ЗаписьЖурналаРегистрации("ОбменAPI", УровеньЖурналаРегистрации.Ошибка,

, , ОписаниеОшибки());

Возврат;

КонецПопытки;

Таймаут задаётся параметром конструктора HTTPСоединение (в секундах). Для интерактивных операций разумно ограничение в десятки секунд, для фоновой выгрузки больших пакетов — больше. Без таймаута при зависшем сервере сеанс может ждать слишком долго и заблокировать пользователя или фоновое задание.

Если запрос не доходит, проверяйте по цепочке: доступен ли сервер с той машины, где выполняется код (ping, telnet по порту); не режет ли трафик прокси или файрвол; правильно ли указан порт и SSL; совпадает ли Content-Type с ожиданиями API. Для отладки полезно временно логировать полный текст запроса и ответа — но без паролей и токенов в журнале.

Типичные ошибки
01
Указание адреса с http:// в конструкторе HTTPСоединение — платформа трактует всю строку как имя хоста, соединение не устанавливается
02
Отсутствие защищённого соединения при обращении к HTTPS-серверу — ошибка соединения или перенаправление, которое POST не проходит
03
JSON, собранный конкатенацией строк без экранирования — сервер возвращает 400 из-за битой структуры
04
Отсутствие проверки кода состояния — ошибка API молча проглатывается, данные считаются отправленными
05
Хранение токена в коде или открытой константе — компрометация доступа при выгрузке конфигурации

Как выбрать подход и проверить результат

Для разовой интеграции достаточно прямого кода с HTTPСоединение в общем модуле. Если обменов несколько, вынесите формирование соединения, установку заголовков и обработку ошибок в общие процедуры — это убережёт от расхождений в логике. В конфигурациях на БСП есть готовые программные интерфейсы для работы с HTTP и безопасного хранения паролей — используйте их вместо изобретения собственных.

Проверку результата делайте на двух уровнях: техническом (код 2xx, валидный JSON в ответе) и прикладном (сервис подтвердил создание объекта, вернул его идентификатор). Только прикладное подтверждение гарантирует, что данные приняты и обработаны.

Контрольные точки

Как проверить результат

Код состояния ответа
Норма

200–299, тело ответа читается как валидный JSON

Тревожный признак

4xx/5xx или пустое тело при ожидаемых данных

Прикладное подтверждение
Норма

API вернул идентификатор созданного объекта или статус успеха

Тревожный признак

Технический успех, но объект в системе-получателе не появился

Журнал регистрации
Норма

Нет ошибок по событию обмена, зафиксирован успешный вызов

Тревожный признак

Исключения по таймауту, SSL или разбору ответа

Частые вопросы

Чем метод ОтправитьДляОбработки отличается от Получить?

ОтправитьДляОбработки выполняет POST — запрос с телом для передачи данных на сервер. Получить выполняет GET — запрос без тела для чтения данных, параметры передаются в адресной строке. Выбор метода определяется документацией конкретного API, а не удобством.

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

Создайте объект ИнтернетПрокси, укажите адрес и порт прокси (для HTTPS — соответствующий тип прокси), при необходимости логин и пароль, и передайте объект в конструктор HTTPСоединение. Если прокси настроен системно, проверьте, требуется ли явная настройка, — на сервере 1С системные параметры могут не применяться.

Сервер возвращает 401, хотя токен верный. Что проверить?

Убедитесь, что заголовок называется именно Authorization, схема указана как Bearer с пробелом перед токеном, сам токен не содержит лишних пробелов и переводов строк при копировании, а его срок действия не истёк. Также проверьте, не требует ли API передачи ключа в другом заголовке или в параметрах адреса.

Можно ли выполнять POST-запрос на клиенте в тонком клиенте?

Технически объекты HTTP доступны и на клиенте, но делать это стоит только для локальных сервисов. Для внешних API выполняйте вызов на сервере: так надёжнее, не требуется доступ в интернет с каждого рабочего места, а токены не покидают сервер.

Как передать дату в JSON, чтобы API её принял?

Преобразуйте дату в строку вручную в формате, который ждёт сервис, — чаще всего ISO 8601 вида «2026-05-17T14:30:00». Функция ЗаписатьДатуJSON поддерживает несколько форматов сериализации, но автоматическая сериализация структур может выдать формат, не совпадающий с ожиданиями API, поэтому надёжнее форматировать дату явно.

Итог

Что важно запомнить

POST-запрос в 1С — это HTTPСоединение + HTTPЗапрос + метод ОтправитьДляОбработки. Тело формируйте через ЗаписьJSON, для HTTPS подключайте ЗащищенноеСоединениеOpenSSL, всегда проверяйте код состояния и прикладное подтверждение, а токены храните в защищённом хранилище. Код выполняйте на сервере.