Как правильно отправить данные в формате JSON через POST-запрос из 1С?

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

В современной разработке на платформе 1С:Предприятие 8.3 интеграция с внешними системами (сайтами, мобильными приложениями, государственными сервисами) чаще всего происходит через HTTP API с использованием формата JSON. Одной из самых распространенных проблем является ситуация, когда запрос уходит, но принимающая сторона (сервер на Python, PHP или Node.js) «не видит» данных в теле запроса. Рассмотрим подробно, как правильно реализовать отправку JSON POST-запросом, разберем типичные ошибки и лучшие практики.

Шаг 1: Формирование JSON-строки из данных 1С

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

Проанализируем процесс создания JSON-сообщения:


// Создаем структуру с данными
Данные = Новый Структура;
Данные.Вставить("pharmacyCode", "APTEKA_001");
Данные.Вставить("dateCreate", ТекущаяДата());

// Предположим, у нас есть массив товаров
МассивТоваров = Новый Массив;
// ... заполнение массива структурами товаров ...
Данные.Вставить("pills", МассивТоваров);

// Сериализация в строку
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(, Символы.Таб); // Добавляем отступы для читаемости
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);

НастройкиСериализации = Новый НастройкиСериализацииJSON;
НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO; // Стандарт для веб-сервисов
НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата;

ЗаписатьJSON(ЗаписьJSON, Данные, НастройкиСериализации);
ТекстJSON = ЗаписьJSON.Закрыть();

Обратите внимание на использование ФорматДатыJSON.ISO. Это критически важно, так как стандартные даты 1С не всегда корректно воспринимаются сторонними парсерами.

Шаг 2: Настройка HTTP-соединения и создание запроса

Когда строка JSON готова, нам нужно подготовить транспорт. Для этого используются объекты HTTPСоединение и HTTPЗапрос. Выясним причину, по которой данные могут не доходить до сервера. Чаще всего проблема кроется в неправильных заголовках (Headers).

Если сервер работает по защищенному протоколу HTTPS, обязательно нужно инициализировать объект ЗащищенноеСоединениеOpenSSL. Без него соединение с большинством современных сайтов не удастся.

Разберем пример создания соединения:


// Параметры сервера
Сервер = "api.mysite.ru";
Порт = 443; // Стандартный для HTTPS

// Настройка защищенного соединения
SSL = Новый ЗащищенноеСоединениеOpenSSL();

// Создаем соединение
HTTPСоединение = Новый HTTPСоединение(Сервер, Порт, , , , 30, SSL);

// Создаем запрос. Ресурс — это относительный путь к API
Ресурс = "/api/v1/datafill/";
HTTPЗапрос = Новый HTTPЗапрос(Ресурс);

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

Это самый важный этап. Сервер должен знать, что вы прислали именно JSON, а не обычную форму или текст. Для этого мы устанавливаем заголовок Content-Type. Также проанализируем ситуацию с BOM (Byte Order Mark). Некоторые серверы выдают ошибку, если видят в начале строки невидимый символ метки порядка байтов.

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


// Устанавливаем заголовки
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");

// Устанавливаем тело запроса из строки
// Третий параметр Ложь отключает использование BOM (Byte Order Mark)
HTTPЗапрос.УстановитьТелоИзСтроки(ТекстJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Важное замечание: Если ваши данные очень объемные (например, прайс-лист на 50 000 позиций), использование строки может привести к избыточному потреблению оперативной памяти. В таких случаях лучше использовать метод УстановитьИмяФайлаТела(), предварительно сохранив JSON во временный файл на диске.

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


ИмяФайлаТела = ПолучитьИмяВременногоФайла("json");
// ... код записи JSON в файл ...
HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаТела);

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

Теперь выполним отправку данных методом POST. Для этого используется метод соединения ОтправитьДляОбработки или универсальный ВызватьHTTPМетод.

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


Попытка
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    // Проверяем код состояния
    КодСостояния = HTTPОтвет.КодСостояния;
    
    Если КодСостояния >= 200 И КодСостояния < 300 Тогда
        // Успешно
        ОтветСервера = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        ЗаписьЖурналаРегистрации("ОтправкаJSON", УровеньЖурналаРегистрации.Информация, , , "Данные успешно переданы. Ответ: " + ОтветСервера);
    Иначе
        // Ошибка сервера (400, 401, 500 и т.д.)
        ТекстОшибки = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        ЗаписьЖурналаРегистрации("ОтправкаJSON", УровеньЖурналаРегистрации.Ошибка, , , "Код ошибки: " + КодСостояния + ". Сообщение: " + ТекстОшибки);
    КонецЕсли;
    
Исключение
    // Ошибка связи (нет интернета, неверный адрес)
    ЗаписьЖурналаРегистрации("ОтправкаJSON", УровеньЖурналаРегистрации.Ошибка, , , "Критическая ошибка: " + ОписаниеОшибки());
КонецПопытки;

Дополнительные рекомендации для надежной работы

При промышленной эксплуатации интеграций стоит учитывать следующие нюансы:

  1. Авторизация: Если ваш API требует токен, добавьте его в заголовок: HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + ВашТокен);.
  2. Таймауты: В конструкторе HTTPСоединение указывайте разумный таймаут (например, 30 или 60 секунд), чтобы сеанс пользователя 1С не «зависал» при плохом соединении.
  3. Логирование: Всегда записывайте в ЖурналРегистрации не только факт ошибки, но и сам текст JSON, который вы пытались отправить (в режиме отладки). Это поможет быстро понять, почему сервер отклонил запрос.
  4. Двоичные данные: Если вы хотите максимально контролировать передачу байтов, используйте УстановитьТелоИзДвоичныхДанных(). Это самый низкоуровневый и надежный способ передачи информации без искажений кодировки.

Таким образом, мы проанализировали полный цикл отправки JSON: от формирования структуры внутри 1С до обработки кода состояния ответа. Главные ключи к успеху — правильный Content-Type, отсутствие лишних символов BOM и использование защищенного соединения для внешних адресов.

← На главную