Как в 1С 8.3 программно отправить HTTP POST запрос с телом в формате JSON?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В современной разработке на платформе 1С:Предприятие 8.3 интеграция с внешними системами через REST API является одной из наиболее частых задач. Чаще всего обмен данными происходит с использованием протокола HTTP и формата JSON. В данной статье мы подробно разберем, как правильно сконструировать POST-запрос, подготовить данные и обработать результат, полученный от сервера.

Разбор основных инструментов для работы с HTTP

Для реализации обмена данными в 1С используются встроенные объекты. Проанализируем ключевые из них, которые понадобятся нам в работе:

  1. HTTPСоединение — основной объект, устанавливающий сессию с сервером.
  2. HTTPЗапрос — объект, в котором формируются адрес ресурса, заголовки и тело самого запроса.
  3. HTTPОтвет — объект, содержащий данные, пришедшие от сервера после выполнения запроса.
  4. ЗаписьJSON и СериализаторXDTO — инструменты для формирования текстового сообщения в формате JSON.

Шаг 1: Формирование JSON-тела запроса

Рассмотрим ситуацию, когда нам необходимо передать структуру данных на сервер. Прежде всего, выясним причину, по которой данные нельзя передавать «как есть». Протокол HTTP работает с текстовыми данными, поэтому любой объект 1С (Структура, Соответствие, Таблица значений) должен быть сериализован в строку JSON.

Посмотрим на пример создания строки JSON из структуры:


ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("ИмяКлиента", "Иван Иванов");
ДанныеДляОтправки.Вставить("НомерЗаказа", 125);
ДанныеДляОтправки.Вставить("Дата", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
СтрокаJSON = ЗаписьJSON.Закрыть();

Важно помнить, что при использовании ЗаписатьJSON типы данных 1С автоматически конвертируются в соответствующие типы JSON (числа, строки, булево). Однако сложные типы, такие как Дата или УникальныйИдентификатор, требуют предварительного форматирования.

Шаг 2: Настройка объекта HTTPЗапрос

Теперь разберем по шагам создание самого запроса. Нам нужно указать относительный путь к ресурсу (URL без адреса сервера) и установить технические заголовки. Самый важный заголовок при отправке JSON — это Content-Type.

Проанализируем пример настройки запроса:


Запрос = Новый HTTPЗапрос("/api/v1/orders/create");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Обратите внимание на параметр ИспользованиеByteOrderMark.НеИспользовать. В большинстве современных веб-сервисов наличие BOM-метки в начале строки может вызвать ошибку парсинга, поэтому рекомендуем ее отключать.

Шаг 3: Установка соединения и отправка

Выясним, как правильно создать HTTPСоединение. Нам понадобятся адрес сервера, порт и, при необходимости, данные для авторизации. Рассмотрим пример кода:


Сервер = "api.myservice.com";
Порт = 443; // Используем 443 для HTTPS
Пользователь = "admin";
Пароль = "secret_password";

// Для безопасного соединения используем защищенное соединение OpenSSL
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

Соединение = Новый HTTPСоединение(Сервер, Порт, Пользователь, Пароль, , 30, ЗащищенноеСоединение);

Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос); // Это метод POST
Исключение
    Сообщить("Ошибка связи: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

В данном примере мы установили таймаут 30 секунд. Это важный момент: если сервер отвечает долго, 1С может «зависнуть» до получения ответа или системной ошибки. Всегда ограничивайте время ожидания.

Шаг 4: Обработка ответа сервера

После выполнения метода ОтправитьДляОбработки мы получаем объект HTTPОтвет. Нам необходимо проверить код состояния и проанализировать тело ответа. Разберем типичные коды:

Посмотрим, как считать полученный JSON обратно в структуру 1С:


Если Ответ.КодСостояния = 200 Тогда
    СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
    Результат = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    // Теперь можем обращаться к данным: Результат.status, Результат.id и т.д.
    Сообщить("Успешно создан заказ №" + Результат.id);
Иначе
    Сообщить("Ошибка сервера. Код: " + Ответ.КодСостояния);
    Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;

Рекомендации по оптимизации и безопасности

Проанализировав практику разработки, выделим несколько советов для стабильной работы обмена:

  1. Логирование: Всегда записывайте тело запроса и тело ответа в журнал регистрации или отдельный справочник, особенно при возникновении ошибок. Это сэкономит часы при отладке.
  2. Обработка больших объемов данных: Если JSON очень большой, вместо метода УстановитьТелоИзСтроки используйте запись во временный файл и метод УстановитьТелоИзФайла. Это значительно снизит потребление оперативной памяти.
  3. SSL сертификаты: При работе через HTTPS с самоподписанными сертификатами может возникнуть ошибка проверки. В этом случае в конструктор ЗащищенноеСоединениеOpenSSL необходимо передать соответствующие параметры для игнорирования проверок (хотя это не рекомендуется для рабочих систем).
  4. Использование расширений: Если вы модифицируете типовую конфигурацию, выносите логику обмена в расширение или в отдельный общий модуль с признаком «Сервер», чтобы избежать проблем при обновлении.

Мы рассмотрели полный цикл работы с HTTP-запросами. Использование связки HTTPСоединение + ЗаписьJSON является наиболее современным и производительным способом организации обмена данными в среде 1С. Тщательно проверяйте заголовки и всегда обрабатывайте исключительные ситуации, чтобы ваше решение было отказоустойчивым.

← На главную