В современной разработке на платформе 1С:Предприятие 8.3 интеграция с внешними сервисами через API является одной из самых востребованных задач. Чаще всего такое взаимодействие строится на протоколе HTTP с использованием формата обмена данными JSON. В этой статье мы подробно разберем, как правильно настроить соединение, отправить запрос и получить результат.
Прежде чем приступать к написанию кода, проанализируем основные объекты метаданных, которые предоставляет нам платформа для этих целей. Для организации связи нам понадобятся:
HTTPСоединение — основной объект, отвечающий за установку сессии с сервером.HTTPЗапрос — объект, в котором формируются заголовки, адрес ресурса и тело передаваемого сообщения.HTTPОтвет — объект, в который платформа помещает результат выполнения запроса от сервера.Рассмотрим процесс создания объекта HTTPСоединение. Важно помнить, что параметры соединения зависят от того, используется ли защищенный протокол HTTPS. Разберем пример создания соединения с использованием защищенного протокола SSL. Для этого нам потребуется объект ЗащищенноеСоединениеOpenSSL.
Проанализируем пример кода для инициализации соединения:
Сервер = "api.service.com";
Порт = 443; // Стандартный порт для HTTPS
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 30, Защита);
В данном примере мы установили таймаут 30 секунд. Это критически важно, чтобы сеанс пользователя не "подвис" при ожидании ответа от медленного внешнего ресурса.
Метод GET обычно используется для получения данных. Давайте выясним, как правильно передать параметры в строке запроса и установить необходимые заголовки, такие как Content-Type и ключи авторизации.
Посмотрим на пример формирования GET-запроса:
АдресРесурса = "/v1/data?type=status&id=123";
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
Ответ = Соединение.Получить(Запрос);
Обратите внимание, что метод Получить() объекта HTTPСоединение возвращает объект HTTPОтвет. Нам необходимо обязательно проверить код состояния ответа (статус), чтобы убедиться в успешности операции.
Для передачи данных на сервер (например, создания нового заказа в сторонней системе) используется метод POST. В этом случае данные передаются не в строке адреса, а в теле запроса. Для формирования JSON мы воспользуемся встроенными средствами 1С: ЗаписьJSON.
Рассмотрим детально процесс подготовки тела запроса:
// Подготовим данные для отправки в виде структуры
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("Наименование", "Новый товар");
ДанныеДляОтправки.Вставить("Цена", 1500);
// Сериализация структуры в строку JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Формируем запрос
АдресРесурса = "/v1/create";
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Важный момент: при использовании метода УстановитьТелоИзСтроки() крайне рекомендуется отключать ByteOrderMark (BOM), так как многие веб-серверы некорректно обрабатывают эти символы в начале JSON-строки.
После выполнения запроса нам необходимо проанализировать КодСостояния. Код 200 или 201 означает успех, коды группы 400 говорят об ошибках в запросе, а 500 — о проблемах на стороне сервера.
Разберем, как прочитать тело ответа и преобразовать его обратно в структуру 1С:
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Теперь мы можем обращаться к данным как к свойствам структуры
Сообщить("Успешно: " + Результат.id);
Иначе
Сообщить("Ошибка выполнения запроса! Код: " + Ответ.КодСостояния);
Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Если в ответе от сервера приходит большой файл (например, PDF или картинка), не стоит считывать его в строку методом ПолучитьТелоКакСтроку(). Это может привести к значительному потреблению оперативной памяти. Вместо этого проанализируем метод Получить() с параметром записи в файл.
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
Ответ = Соединение.Получить(Запрос, ИмяВременногоФайла);
Если Ответ.КодСостояния = 200 Тогда
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяВременногоФайла);
// Дальнейшая работа с файлом
КонецЕсли;
При работе с внешними API всегда следуйте правилам "хорошего тона" программирования в 1С:
Попытка...Исключение при создании соединения и отправке запроса. Сетевые ошибки (отсутствие связи, DNS-проблемы) случаются часто.HTTPСоединение на стороне сервера (в серверных модулях), чтобы избежать лишних клиент-серверных пересылок данных.Мы проанализировали полный цикл работы с HTTP в 1С. Использование встроенных объектов HTTPСоединение и ЗаписьJSON позволяет создавать производительные и надежные механизмы обмена данными, которые легко поддерживать и масштабировать.