В современной разработке на платформе 1С:Предприятие 8.3 интеграция с внешними веб-сервисами через API становится стандартной задачей. Чаще всего обмен данными происходит с использованием протокола HTTP и формата JSON. В данной статье мы подробно разберем, как правильно настроить соединение с сервером, сформировать структуру данных, преобразовать её в строку JSON и отправить методом POST.
Прежде чем отправлять запрос, проанализируем, какие данные нам необходимо передать. Платформа 1С предоставляет мощные средства для работы с форматом JSON. Для начала создадим объект Структура или Соответствие, который будет содержать наши данные, а затем воспользуемся объектом ЗаписьJSON для преобразования этой структуры в строку.
Рассмотрим пример формирования простого JSON-объекта:
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("Идентификатор", "12345");
ДанныеДляОтправки.Вставить("Наименование", "Товар тестовый");
ДанныеДляОтправки.Вставить("Количество", 10);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
СтрокаJSON = ЗаписьJSON.Закрыть();
Обратим внимание, что метод ЗаписатьJSON автоматически обрабатывает типы данных 1С, переводя их в соответствующие типы JSON (числа, строки, булево). Если в структуре присутствуют специфические типы, такие как Дата, нам потребуется дополнительная настройка параметров сериализации через объект ПараметрыЗаписиJSON.
Следующим этапом выясним, как установить связь с удаленным сервером. Для этого используется объект HTTPСоединение. Важно правильно указать адрес сервера, порт и, при необходимости, параметры безопасности (SSL). Разберем ситуацию, когда мы используем защищенное соединение HTTPS.
Проанализируем пример создания соединения и формирования объекта HTTPЗапрос:
Сервер = "api.external-service.com";
Порт = 443; // Стандартный порт для HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 30, ЗащищенноеСоединение);
АдресРесурса = "/v1/data/sync";
Запрос = Новый HTTPЗапрос(АдресРесурса);
После создания запроса необходимо указать заголовки. Это критически важный момент, так как сервер должен понимать, в каком формате мы присылаем данные. Для JSON-обмена обязательным является заголовок Content-Type со значением application/json.
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Теперь рассмотрим процесс непосредственной отправки данных. Мы будем использовать метод ОтправитьДляОбъекта или ВызватьHTTPМетод. Посмотрим на пример выполнения POST-запроса и анализа кода состояния ответа.
Попытка
Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
КодСостояния = Ответ.КодСостояния;
Если КодСостояния = 200 Тогда
// Успешное выполнение
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
// Разберем полученный JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Сообщить("Данные успешно отправлены. Ответ сервера: " + Результат.status);
Иначе
Сообщить("Ошибка при отправке! Код состояния: " + КодСостояния);
Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Не удалось установить соединение с сервером. Проверьте настройки сети.");
КонецПопытки;
Разберем по шагам основные проблемы, с которыми сталкиваются разработчики при работе с HTTP в 1С:
ЗащищенноеСоединениеOpenSSL с параметрами игнорирования ошибок, но в рабочих системах рекомендуется устанавливать корневые сертификаты в хранилище ОС или 1С.КодировкаТекста.UTF8 при установке тела запроса и получении ответа. Несоответствие кодировок приведет к "кракозябрам" в строковых полях.Таймаут в конструкторе HTTPСоединение по умолчанию может быть недостаточным для обработки тяжелых запросов. Рекомендуется устанавливать значение от 30 до 60 секунд.Authorization (например, Basic или Bearer) должны быть добавлены в объект Запрос.Заголовки вручную или через параметры конструктора соединения.Если объем передаваемых данных велик (например, выгрузка тысяч строк товаров), использование промежуточной строки может привести к перерасходу оперативной памяти. В таких случаях проанализируем возможность записи данных напрямую в поток.
ИмяФайла = ПолучитьИмяВременногоФайла("json");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(ИмяФайла, КодировкаТекста.UTF8);
// Записываем большой массив данных по частям
ЗаписатьJSON(ЗаписьJSON, МассивОбъектов);
ЗаписьJSON.Закрыть();
Запрос.УстановитьТелоИзФайла(ИмяФайла);
// После отправки не забудьте удалить временный файл
УдалитьФайлы(ИмяФайла);
Использование метода УстановитьТелоИзФайла позволяет эффективно передавать файлы любого объема, не загружая их целиком в память процесса 1cv8.
Мы рассмотрели полный цикл работы с внешними API в среде 1С. Помните, что ключевыми объектами являются HTTPСоединение, HTTPЗапрос и ЗаписьJSON. Правильная настройка заголовков и обработка кодов состояния (таких как 200, 201, 400, 404, 500) позволит создать надежную систему интеграции. Для отладки запросов рекомендуем использовать внешние инструменты, такие как Postman или Fiddler, чтобы убедиться в корректности формата отправляемого JSON до написания кода в 1С.