В современной разработке на платформе 1С:Предприятие 8.3 задачи интеграции с внешними системами через API встречаются повсеместно. Будь то обмен данными с маркетплейсами, государственными информационными системами или внутренними веб-сервисами компании, базовым механизмом остается использование протокола HTTP и формата обмена данными JSON. В этой статье мы подробно разберем, как правильно настроить соединение, сформировать запрос и корректно обработать полученные данные.
Прежде чем приступать к отправке данных, нам необходимо установить связь с удаленным сервером. Для этого в платформе используется объект HTTPСоединение. Проанализируем основные параметры, которые нам потребуются для инициализации этого объекта. Нам важно понимать, что соединение устанавливается с хостом, а конкретные адреса (пути) ресурсов указываются уже в самом запросе.
Рассмотрим пример создания базового соединения:
Сервер = "api.service.com";
Порт = 443; // Стандартный порт для HTTPS
Пользователь = "admin";
Пароль = "password123";
Прокси = Неопределено; // Если требуется работа через прокси, создается объект HTTPПрокси
Таймаут = 30; // Время ожидания ответа в секундах
// Для защищенного соединения HTTPS используем объект ЗащищенноеСоединениеOpenSSL
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, Порт, Пользователь, Пароль, Прокси, Таймаут, Защита);
Обратим внимание на объект ЗащищенноеСоединениеOpenSSL. Без его использования попытка подключиться к ресурсу по протоколу HTTPS (порт 443) завершится ошибкой. В большинстве современных сервисов это обязательное требование.
Теперь, когда соединение установлено, разберем по шагам создание простого GET-запроса для получения данных. Нам нужно создать объект HTTPЗапрос и указать относительный путь к ресурсу (URL-path).
Выясним, как передать параметры в строке запроса и получить результат:
// Указываем путь к методу API и параметры
АдресРесурса = "/v1/products?category=electronics&status=available";
Запрос = Новый HTTPЗапрос(АдресРесурса);
// Добавляем необходимые заголовки, если API требует авторизацию по токену
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
Запрос.Заголовки.Вставить("Accept", "application/json");
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
// Далее переходим к разбору JSON
Иначе
Сообщить("Ошибка сервера: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Ошибка при выполнении запроса: " + ОписаниеОшибки());
КонецПопытки;
Важно помнить, что использование метода ПолучитьТелоКакСтроку() удобно для небольших ответов. Если ожидается передача огромного массива данных, правильнее будет сохранить ответ в файл или использовать потоковое чтение.
Для создания или обновления данных на сервере чаще всего используется метод POST. В этом случае нам необходимо не только сформировать заголовки, но и упаковать данные 1С (структуры, массивы) в строку формата JSON. Рассмотрим этот процесс подробнее.
Проанализируем ситуацию, когда нам нужно отправить информацию о новом заказе:
// Подготовим данные в виде структуры 1С
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("id", "ORD-2023-001");
ДанныеЗаказа.Вставить("date", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));
Товары = Новый Массив;
Товары.Добавить(Новый Структура("sku, qty", "ITEM-01", 10));
ДанныеЗаказа.Вставить("items", Товары);
// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
ЗаписатьJSON(ЗаписьJSON, ДанныеЗаказа);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Формируем запрос
ЗапросPOST = Новый HTTPЗапрос("/v1/orders");
ЗапросPOST.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
ЗапросPOST.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
// Отправляем данные
Ответ = Соединение.ОтправитьДляОбработки(ЗапросPOST);
При использовании УстановитьТелоИзСтроки обязательно указывайте ИспользованиеByteOrderMark.НеИспользовать, так как многие веб-серверы некорректно воспринимают наличие BOM-символа в начале JSON-пакета.
После получения ответа от сервера нам нужно преобразовать строку JSON обратно в объекты 1С, с которыми удобно работать в коде — Структура и Массив. Для этого используется объект ЧтениеJSON.
Разберем алгоритм десериализации:
// Предположим, ТелоОтвета содержит строку JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
// Преобразуем JSON в структуру 1С
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Теперь мы можем обращаться к данным через точку или по индексу
Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("status") Тогда
Если Результат.status = "success" Тогда
Сообщить("Данные успешно обработаны на сервере");
КонецЕсли;
КонецЕсли;
Посмотрим на важный нюанс: функция ПрочитатьJSON по умолчанию преобразует даты в строковом формате просто в строки. Если ваше API передает даты в формате ISO 8601, вы можете передать вторым параметром имя функции-обработчика для автоматического преобразования строк в тип Дата 1С.
Работа с внешними ресурсами всегда сопряжена с рисками недоступности сети или изменений в API. Проанализируем, как сделать наш код более отказоустойчивым:
HTTPПрокси, иначе соединения будут блокироваться.Рассмотрим пример настройки прокси:
ПроксиСервер = Новый HTTPПрокси;
ПроксиСервер.ИспользоватьПроксиНаЛокальныхАдресах = Ложь;
ПроксиСервер.Сервер = "192.168.1.10";
ПроксиСервер.Порт = 8080;
ПроксиСервер.Пользователь = "proxy_user";
ПроксиСервер.Пароль = "proxy_pass";
// Далее передаем этот объект в конструктор HTTPСоединение
Таким образом, мы проанализировали полный цикл работы с HTTP в 1С: от настройки защищенного соединения до парсинга сложных структур данных. Использование штатных объектов HTTPСоединение, HTTPЗапрос и встроенных средств работы с JSON позволяет реализовывать производительные и надежные механизмы интеграции любой сложности.