В современной разработке на платформе 1С:Предприятие 8.3 интеграция с внешними системами (сайтами, мобильными приложениями, государственными сервисами) чаще всего происходит через HTTP API с использованием формата JSON. Одной из самых распространенных проблем является ситуация, когда запрос уходит, но принимающая сторона (сервер на Python, PHP или Node.js) «не видит» данных в теле запроса. Рассмотрим подробно, как правильно реализовать отправку JSON POST-запросом, разберем типичные ошибки и лучшие практики.
Прежде чем отправить данные, их необходимо преобразовать из объектов 1С (Структура, Массив, Таблица значений) в строку формата JSON. Для этого в платформе предназначены объекты ЗаписьJSON и функции сериализации. Рассмотрим пример формирования данных для аптечной сети, где нам нужно передать код аптеки и массив товаров.
Проанализируем процесс создания JSON-сообщения:
// Создаем структуру с данными
Данные = Новый Структура;
Данные.Вставить("pharmacyCode", "APTEKA_001");
Данные.Вставить("dateCreate", ТекущаяДата());
// Предположим, у нас есть массив товаров
МассивТоваров = Новый Массив;
// ... заполнение массива структурами товаров ...
Данные.Вставить("pills", МассивТоваров);
// Сериализация в строку
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(, Символы.Таб); // Добавляем отступы для читаемости
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
НастройкиСериализации = Новый НастройкиСериализацииJSON;
НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO; // Стандарт для веб-сервисов
НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата;
ЗаписатьJSON(ЗаписьJSON, Данные, НастройкиСериализации);
ТекстJSON = ЗаписьJSON.Закрыть();
Обратите внимание на использование ФорматДатыJSON.ISO. Это критически важно, так как стандартные даты 1С не всегда корректно воспринимаются сторонними парсерами.
Когда строка JSON готова, нам нужно подготовить транспорт. Для этого используются объекты HTTPСоединение и HTTPЗапрос. Выясним причину, по которой данные могут не доходить до сервера. Чаще всего проблема кроется в неправильных заголовках (Headers).
Если сервер работает по защищенному протоколу HTTPS, обязательно нужно инициализировать объект ЗащищенноеСоединениеOpenSSL. Без него соединение с большинством современных сайтов не удастся.
Разберем пример создания соединения:
// Параметры сервера
Сервер = "api.mysite.ru";
Порт = 443; // Стандартный для HTTPS
// Настройка защищенного соединения
SSL = Новый ЗащищенноеСоединениеOpenSSL();
// Создаем соединение
HTTPСоединение = Новый HTTPСоединение(Сервер, Порт, , , , 30, SSL);
// Создаем запрос. Ресурс — это относительный путь к API
Ресурс = "/api/v1/datafill/";
HTTPЗапрос = Новый HTTPЗапрос(Ресурс);
Это самый важный этап. Сервер должен знать, что вы прислали именно 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Запрос.УстановитьИмяФайлаТела(ИмяФайлаТела);
Теперь выполним отправку данных методом POST. Для этого используется метод соединения ОтправитьДляОбработки или универсальный ВызватьHTTPМетод.
Посмотрим на пример обработки результата:
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
// Проверяем код состояния
КодСостояния = HTTPОтвет.КодСостояния;
Если КодСостояния >= 200 И КодСостояния < 300 Тогда
// Успешно
ОтветСервера = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ЗаписьЖурналаРегистрации("ОтправкаJSON", УровеньЖурналаРегистрации.Информация, , , "Данные успешно переданы. Ответ: " + ОтветСервера);
Иначе
// Ошибка сервера (400, 401, 500 и т.д.)
ТекстОшибки = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ЗаписьЖурналаРегистрации("ОтправкаJSON", УровеньЖурналаРегистрации.Ошибка, , , "Код ошибки: " + КодСостояния + ". Сообщение: " + ТекстОшибки);
КонецЕсли;
Исключение
// Ошибка связи (нет интернета, неверный адрес)
ЗаписьЖурналаРегистрации("ОтправкаJSON", УровеньЖурналаРегистрации.Ошибка, , , "Критическая ошибка: " + ОписаниеОшибки());
КонецПопытки;
При промышленной эксплуатации интеграций стоит учитывать следующие нюансы:
HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + ВашТокен);.HTTPСоединение указывайте разумный таймаут (например, 30 или 60 секунд), чтобы сеанс пользователя 1С не «зависал» при плохом соединении.ЖурналРегистрации не только факт ошибки, но и сам текст JSON, который вы пытались отправить (в режиме отладки). Это поможет быстро понять, почему сервер отклонил запрос.УстановитьТелоИзДвоичныхДанных(). Это самый низкоуровневый и надежный способ передачи информации без искажений кодировки.Таким образом, мы проанализировали полный цикл отправки JSON: от формирования структуры внутри 1С до обработки кода состояния ответа. Главные ключи к успеху — правильный Content-Type, отсутствие лишних символов BOM и использование защищенного соединения для внешних адресов.