Разработка и Конфигурация · 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Создайте HTTPСоединение с адресом сервера без указания протокола
- 2Создайте HTTPЗапрос с относительным путём ресурса
- 3Заполните заголовки: Content-Type, Authorization при необходимости
- 4Установите тело запроса строкой или из файла
- 5Вызовите ОтправитьДляОбработки() и проверьте код состояния ответа
- 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. Для отладки полезно временно логировать полный текст запроса и ответа — но без паролей и токенов в журнале.
Как выбрать подход и проверить результат
Для разовой интеграции достаточно прямого кода с 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, всегда проверяйте код состояния и прикладное подтверждение, а токены храните в защищённом хранилище. Код выполняйте на сервере.