В современной разработке на платформе 1С:Предприятие 8.3 интеграция с внешними веб-сервисами стала повседневной задачей. Чаще всего нам требуется передать данные во внешнюю систему или получить их, используя протокол HTTP и формат данных JSON. В рамках данной статьи мы подробно разберем, как реализовать механизм обмена данными, настроить параметры соединения и правильно сформировать структуру запроса.
Для реализации обмена данными в 1С используются специализированные объекты. Давайте проанализируем, за что отвечает каждый из них:
HTTPСоединение — основной объект, устанавливающий сессию с сервером. Здесь указываются адрес сервера, порт, данные для авторизации и настройки прокси.HTTPЗапрос — объект, описывающий конкретный запрос к ресурсу. В нем мы задаем относительный путь (URL), заголовки (Headers) и тело запроса.HTTPОтвет — объект, который мы получаем от сервера после выполнения запроса. Он содержит код состояния (например, 200 или 404) и само тело ответа.Большинство современных API работают по протоколу HTTPS. Проанализируем ситуацию: если мы попытаемся подключиться к такому серверу без использования сертификатов, система выдаст ошибку. Рассмотрим, как создать объект защищенного соединения:
// Инициализируем защищенное соединение
// Для использования системных сертификатов оставляем параметры пустыми
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Важно помнить, что в некоторых случаях может потребоваться указание конкретных сертификатов, если сервер требует клиентской аутентификации. Однако для большинства публичных API стандартного конструктора ЗащищенноеСоединениеOpenSSL вполне достаточно.
Прежде чем отправить данные, их необходимо сериализовать в формат JSON. Разберем по шагам, как это сделать с помощью встроенных средств 1С. Мы будем использовать объект ЗаписьJSON и структуру данных.
// Подготовим данные для отправки
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("id", 101);
ДанныеЗапроса.Вставить("наименование", "Товар тестовый");
ДанныеЗапроса.Вставить("количество", 10);
// Сериализуем в строку JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
Использование объекта ЗаписьJSON позволяет гарантировать корректность формата и правильную обработку спецсимволов и кодировок (по умолчанию используется UTF-8 без BOM).
Теперь рассмотрим процесс создания самого запроса. Нам нужно указать заголовки, чтобы сервер понял, что мы отправляем именно JSON-данные. Основным заголовком здесь является Content-Type.
// Создаем объект запроса, указывая относительный путь к API
АдресРесурса = "/api/v1/products/create";
Запрос = Новый HTTPЗапрос(АдресРесурса);
// Устанавливаем заголовки
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Если требуется базовая авторизация, она добавляется в заголовок Authorization
// Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
// Помещаем сформированную строку JSON в тело запроса
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Выясним, как правильно выполнить отправку и проанализировать ответ сервера. Мы воспользуемся методом ОтправитьДляОбъекта или ВызватьHTTPМетод. Проанализируем пример отправки методом POST.
// Параметры сервера
Сервер = "api.example.com";
Порт = 443;
Попытка
// Создаем соединение
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 30, Защита);
// Выполняем запрос
Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
// Проверяем код состояния
Если Ответ.КодСостояния = 200 Или Ответ.КодСостояния = 201 Тогда
Сообщить("Запрос успешно выполнен!");
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
// Разберем ответ сервера (десериализация)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
РезультатСтруктура = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Теперь мы можем работать с РезультатСтруктура как с обычной структурой 1С
Иначе
Сообщить("Ошибка при выполнении запроса. Код: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
// Обработка сетевых ошибок или проблем с доступностью сервера
Инфо = ИнформацияОбОшибке();
Сообщить("Произошла критическая ошибка: " + КраткоеПредставлениеОшибки(Инфо));
КонецПопытки;
Проанализируем несколько важных моментов, которые помогут избежать типовых ошибок при разработке интеграций:
HTTPСоединение всегда указывайте таймаут (в примере выше — 30 секунд). Это предотвратит "зависание" сеанса пользователя при нестабильной работе внешнего сервиса.КодировкаТекста.UTF8 и ИспользованиеByteOrderMark.НеИспользовать. Веб-сервисы крайне чувствительны к лишним символам в начале строки (BOM).Соединение.ВызватьHTTPМетод("НАЗВАНИЕ_МЕТОДА", Запрос).ИнтернетПрокси и передать его в конструктор HTTPСоединение.Рассмотрим подробнее ситуацию, когда сервер возвращает ошибку 401 (Unauthorized). Это означает, что ваши учетные данные неверны или срок действия токена истек. В таких случаях мы рекомендуем реализовать механизм автоматического обновления токена перед повторной отправкой основного запроса.
В завершение подчеркнем, что работа с HTTPСоединение требует аккуратной обработки исключений через блок Попытка...Исключение, так как сетевые ошибки (обрыв связи, DNS-проблемы) не зависят от логики вашего кода в 1С.