В современной разработке на платформе 1С:Предприятие 8.3 задачи интеграции с внешними веб-сервисами встречаются повсеместно. Одной из наиболее типичных задач является отправка данных на сторонний ресурс с использованием метода POST и передачей данных в формате JSON. В рамках данной статьи мы детально разберем процесс реализации такого взаимодействия, проанализируем необходимые объекты платформы и изучим правильную последовательность действий для стабильной работы обмена.
Прежде чем приступать к отправке запроса, нам необходимо определить, требуется ли использование протокола HTTPS. Большинство современных API работают именно через защищенный протокол. Проанализируем ситуацию: если адрес сервера начинается с https://, нам потребуется создать объект ЗащищенноеСоединениеOpenSSL. Рассмотрим, как это сделать правильно, чтобы избежать ошибок проверки сертификатов на стороне сервера.
Для создания типового защищенного соединения воспользуемся следующим кодом:
ИспользованиеSSL = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(),
Новый ВалидацияСертификатаПеречнемСертификатовПроверяющихЦентровWindows()
);
Данный подход позволяет использовать системные хранилища сертификатов Windows для проверки подлинности сервера. Если же требования безопасности позволяют игнорировать проверку сертификата (что не рекомендуется для рабочих систем, но удобно при отладке), можно передать Неопределено в параметры конструктора.
Теперь разберем процесс установки связи с сервером. Нам потребуется объект HTTPСоединение. Важно помнить, что в параметрах этого объекта указывается только базовый адрес сервера (хост) без указания протокола и пути. Например, если целевой URL — https://api.example.com/v1/data, то хостом будет api.example.com.
Выясним причину возможных задержек: при работе с внешними ресурсами всегда следует устанавливать Таймаут. По умолчанию он может быть слишком велик, что приведет к зависанию сеанса пользователя при нестабильной связи.
Сервер = "api.example.com";
Порт = 443; // Стандартный порт для HTTPS
Таймаут = 30; // Время ожидания в секундах
Соединение = Новый HTTPСоединение(
Сервер,
Порт,
Логин,
Пароль,
Proxy,
Таймаут,
ИспользованиеSSL
);
Одним из самых ответственных этапов является подготовка данных. Платформа 1С предоставляет мощные инструменты для работы с JSON. Мы не рекомендуем формировать строку запроса вручную с помощью конкатенации, так как это чревато ошибками в структуре (пропущенные кавычки, неправильная кодировка спецсимволов). Вместо этого рассмотрим использование объектов ЗаписьJSON и СериализаторXDTO (или просто соответствий и массивов).
Посмотрим на пример формирования сложной структуры данных:
ДанныеДляОтправки = Новый Соответствие;
ДанныеДляОтправки.Вставить("id", "123");
ДанныеДляОтправки.Вставить("наименование", "Товар №1");
Параметры = Новый Массив;
Параметры.Добавить("Срочно");
Параметры.Добавить("Хрупкое");
ДанныеДляОтправки.Вставить("теги", Параметры);
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
В данном примере мы использовали Соответствие, которое автоматически преобразуется в объект JSON, и Массив, преобразуемый в массив JSON. Это гарантирует валидность итоговой строки СтрокаЗапроса.
После того как соединение установлено и тело сформировано, необходимо создать объект HTTPЗапрос. Здесь мы указываем относительный путь к ресурсу (endpoint) и обязательно прописываем заголовки (Headers). Для передачи JSON критически важно установить заголовок Content-Type в значение application/json, иначе сервер может не понять формат входящих данных.
Разберем по шагам настройку запроса:
HTTPЗапрос, указывая путь к методу API.Заголовки.Вставить().JSON в тело запроса.
АдресРесурса = "/v1/data";
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("Accept", "application/json");
// Помещаем данные в тело
Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
// Выполняем отправку
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Исключение
ЗаписьЖурналаРегистрации("Ошибка_HTTP", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Возврат;
КонецПопытки;
Получив объект HTTPОтвет, мы должны проанализировать код состояния (Status Code). Код 200 (OK) или 201 (Created) обычно означает успех. Коды 4xx говорят об ошибке в параметрах запроса, а 5xx — о проблемах на стороне сервера.
Проанализируем содержимое ответа. Обычно сервер возвращает результат также в формате JSON. Для его десериализации в объекты 1С (Структуры или Соответствия) используем ЧтениеJSON.
КодСостояния = Ответ.КодСостояния;
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Если КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Теперь можем работать с данными
Сообщить("Успешно! ID объекта: " + Результат["id"]);
Иначе
Сообщить("Ошибка при отправке! Код: " + КодСостояния);
Сообщить("Текст ошибки: " + ТекстОтвета);
КонецЕсли;
При реализации обмена данными важно учитывать несколько важных нюансов, которые помогут сделать ваш код более отказоустойчивым:
ЖурналРегистрации или специальный регистр сведений, особенно на этапе отладки. Это поможет быстро выяснить причину сбоя при изменении API на стороне контрагента.УстановитьТелоИзСтроки всегда указывайте ИспользованиеByteOrderMark.НеИспользовать, так как многие веб-серверы не корректно воспринимают BOM-символы в начале JSON-пакета.Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);.Таким образом, мы рассмотрели полный цикл работы с HTTP POST запросами в 1С. Использование встроенных объектов HTTPСоединение и ЗаписьJSON позволяет создавать надежные и быстрые интеграционные решения, соответствующие современным стандартам веб-разработки.