В современной разработке на платформе 1С:Предприятие 8.3 задачи интеграции с внешними веб-сервисами встречаются повсеместно. Будь то обмен с государственными информационными системами, маркетплейсами или внутренними корпоративными порталами, основным инструментом выступает протокол HTTP и формат обмена данными JSON. В этой статье мы подробно разберем, как правильно сконструировать запрос, передать данные и обработать полученный от сервера ответ.
Прежде чем приступать к отправке данных, проанализируем инфраструктуру подключения. Большинство современных API работают по защищенному протоколу HTTPS. Для корректной работы 1С с такими ресурсами нам необходимо инициализировать объект ЗащищенноеСоединениеOpenSSL. Если мы проигнорируем этот шаг, система выдаст ошибку при попытке установить связь с сервером по 443 порту.
Рассмотрим пример инициализации соединения с использованием стандартных настроек операционной системы:
// Создаем настройки защищенного соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКриптографии(),
Новый СертификатыУдостоверяющихЦентровWindows()
);
// Указываем адрес сервера без протокола (без https://)
Сервер = "api.example.com";
Порт = 443;
// Создаем объект соединения
Соединение = Новый HTTPСоединение(
Сервер,
Порт,
, // Имя пользователя
, // Пароль
, // Прокси
60, // Таймаут в секундах
ЗащищенноеСоединение
);
Выясним причину использования таймаута: установка значения в 60 секунд позволяет избежать зависания сеанса пользователя при нестабильной работе внешнего сервиса. Проанализируем также конструктор HTTPСоединение: важно помнить, что адрес сервера передается как строка, не содержащая префиксов http:// или https://.
Разберем по шагам процесс подготовки данных. Чаще всего внешние сервисы ожидают структуру данных в формате JSON. Для этого в 1С предусмотрены специализированные объекты ЗаписьJSON и СериализаторXDTO (или простая запись структур).
Посмотрим на пример создания структуры и её преобразования в строку JSON:
// Подготовим данные для отправки
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("id", "12345");
ДанныеЗапроса.Вставить("status", "active");
ДанныеЗапроса.Вставить("date", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));
// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
Здесь мы использовали объект ЗаписьJSON. Метод УстановитьСтроку позволяет подготовить объект к записи данных в переменную, а функция ЗаписатьJSON автоматически обходит структуру и преобразует её типы в соответствующие типы JSON (строки, числа, булево).
Теперь проанализируем процесс отправки. Нам необходимо создать объект HTTPЗапрос, указать в нем ресурс (путь к методу API) и установить заголовки. Самым важным заголовком при работе с JSON является Content-Type.
HTTPЗапрос, указывая относительный путь.Content-Type со значением application/json.ОтправитьДляОбъекта или ВызватьHTTPМетод.
// Указываем путь к ресурсу
Ресурс = "/v1/update-status";
Запрос = Новый HTTPЗапрос(Ресурс);
// Устанавливаем заголовки
Запрос.УстановитьЗаголовок("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьЗаголовок("Authorization", "Bearer token_string");
// Устанавливаем тело запроса
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеМаркераПоследовательностиБайтов.НеИспользовать);
// Выполняем POST запрос
Попытка
ОтветСервера = Соединение.ВызватьHTTPМетод("POST", Запрос);
Исключение
Сообщить("Ошибка при выполнении запроса: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Обратите внимание на параметр ИспользованиеМаркераПоследовательностиБайтов.НеИспользовать. Это критически важный момент: многие веб-серверы не понимают BOM (Byte Order Mark) и выдают ошибку 400 (Bad Request), если 1С добавит его в начало строки запроса.
После выполнения запроса мы получаем объект HTTPОтвет. Нам необходимо проверить код состояния. Если код равен 200 (или другой в диапазоне 200-299), значит запрос выполнен успешно. В противном случае нужно проанализировать тело ответа на предмет ошибок.
Рассмотрим подробнее парсинг полученного JSON-ответа:
Если ОтветСервера.КодСостояния = 200 Тогда
// Читаем тело ответа
СтрокаОтвета = ОтветСервера.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
// Десериализация JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Теперь работаем с результатом как со Структурой или Соответствием
Если Результат.success Тогда
Сообщить("Данные успешно обновлены!");
КонецЕсли;
Иначе
Сообщить("Сервер вернул ошибку. Код состояния: " + ОтветСервера.КодСостояния);
Сообщить("Текст ошибки: " + ОтветСервера.ПолучитьТелоКакСтроку());
КонецЕсли;
Использование метода ПрочитатьJSON позволяет мгновенно превратить текстовый ответ сервера в коллекцию 1С (Структура или Соответствие), что значительно упрощает дальнейший доступ к данным. Мы можем обращаться к полям ответа через точку, например: Результат.data.items.
Рассмотрим несколько нюансов, которые помогут сделать ваш код более надежным:
Попытка...Исключение при вызове Соединение.ОтправитьДляОбъекта(), так как сетевые ошибки (отсутствие связи, таймаут) генерируют исключение.УстановитьТелоИзФайла, чтобы сэкономить оперативную память сервера 1С.СтрШаблон или конкатенацию для формирования пути ресурса.Таким образом, мы проанализировали полный цикл взаимодействия 1С с внешним API по протоколу HTTP. Следуя этой структуре, вы сможете реализовать интеграцию любой сложности, обеспечив высокую надежность и корректность обработки данных в формате JSON.