Интеграции в 1С

Как отправить 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Соединение
Серверхост без схемы: "api.example.com"
Порт443 для https, 80 для http
Пользователь / Парольдля Basic-аутентификации
Проксиобъект ИнтернетПрокси
Таймаутсекунды, 0 — без ограничения
ЗащищённоеСоединениеНовый ЗащищённоеСоединениеOpenSSL() для https
ИспользоватьАутентификациюОСNTLM/Kerberos
Запрос = Новый HTTPЗапрос("/v1/orders", Заголовки);
Новый HTTPЗапрос
АдресРесурсапуть начиная с "/", без схемы и хоста
ЗаголовкиСоответствие имя→значение
HTTPЗапрос со свойствами АдресРесурса, Заголовки
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ОтправитьДляОбработки
HTTPЗапросподготовленный объект запроса
ИмяВыходногоФайласохранить тело ответа в файл
HTTPОтвет (КодСостояния, Заголовки, ПолучитьТелоКакСтроку())

Метод ОтправитьДляОбработки() — это именно 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

Пример готов к копированию: подставьте свой хост, путь ресурса и токен — и его можно запускать во внешней обработке, серверной процедуре или на стороне REST-клиента 1С. Все объекты — штатные, никаких внешних компонент.
&НаСервере
Функция Отправить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. Никаких исключений платформа не бросает, статус нужно проверять руками по КодСостояния.
Ориентируйтесь на диапазоны кодов: 2xx — успех, 3xx — редирект (по-хорошему обработать 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 символов ответа — они дают точный диагноз.