В современной разработке на платформе 1С:Предприятие 8.3 задачи по интеграции с внешними сервисами становятся повседневными. Будь то обмен данными с маркетплейсами, государственными информационными системами или внутренними веб-сервисами компании, основным инструментом выступает протокол HTTP. В данной статье мы подробно разберем, как правильно настроить взаимодействие, сформировать запрос в формате JSON и обработать полученный ответ.
Для реализации обмена нам потребуется освоить работу с тремя ключевыми объектами платформы: HTTPСоединение, HTTPЗапрос и HTTPОтвет. Проанализируем роль каждого из них в процессе интеграции. HTTPСоединение отвечает за установку канала связи с сервером, параметры аутентификации и настройки безопасности (SSL). HTTPЗапрос инкапсулирует в себе адрес ресурса, заголовки и само тело передаваемых данных. Наконец, HTTPОтвет позволяет нам получить результат выполнения операции и проанализировать код состояния.
Большинство современных REST API используют формат JSON для передачи данных. Рассмотрим, как подготовить данные в 1С. Разберем по шагам создание структуры и её сериализацию. Проанализируем ситуацию, когда нам нужно передать информацию о товаре.
Для этого мы используем объекты ЗаписьJSON и СериализаторXDTO или ручное формирование структуры. Рассмотрим пример создания JSON-пакета:
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("id", "12345");
ДанныеДляОтправки.Вставить("Наименование", "Тестовый товар");
ДанныеДляОтправки.Вставить("Цена", 1500);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
СтрокаJSON = ЗаписьJSON.Закрыть();
Важный момент: при формировании СтрокаJSON следите за тем, чтобы типы данных в 1С соответствовали ожиданиям внешнего API (например, числа не должны превращаться в строки, если сервис ожидает числовой тип).
Теперь выясним причину, по которой соединение может не устанавливаться. Чаще всего это неправильно указанный порт или параметры прокси-сервера. Создадим объект HTTPСоединение. Обратите внимание на использование защищенного соединения (HTTPS), которое требует создания объекта ЗащищенноеСоединениеOpenSSL.
Рассмотрим код создания соединения:
Сервер = "api.external-service.ru";
Порт = 443;
Таймаут = 30; // Секунды
ИспользоватьSSL = Новый ЗащищенноеСоединениеOpenSSL();
Попытка
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , Таймаут, ИспользоватьSSL);
Исключение
Сообщить("Ошибка при установке соединения: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
После того как канал связи установлен, нам необходимо подготовить сам запрос. Разберем подробнее настройку заголовков. Для REST API критически важно указать Content-Type, чтобы сервер понимал, в каком формате пришел контент. Также часто требуется заголовок Authorization для передачи токена доступа.
Проанализируем пример настройки объекта HTTPЗапрос:
АдресРесурса = "/v1/products/update";
Запрос = Новый HTTPЗапрос(АдресРесурса);
// Установка необходимых заголовков
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
// Помещаем подготовленный JSON в тело запроса
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Теперь отправим запрос. Мы можем использовать методы ВызватьHTTPМетод, ОтправитьДляОбработки (POST) или Получить (GET). В нашем примере воспользуемся методом POST.
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Исключение
Сообщить("Сетевая ошибка при отправке запроса: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
Получив HTTPОтвет, мы должны первым делом проверить КодСостояния. Код 200 или 201 обычно означает успех, тогда как коды 4xx и 5xx свидетельствуют об ошибках клиента или сервера соответственно. Посмотрим на пример логики обработки:
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Работаем с результатом
Сообщить("Данные успешно обновлены. ID: " + Результат.status);
Иначе
Сообщить("Сервер вернул ошибку. Код: " + Ответ.КодСостояния);
Сообщить("Текст ответа: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Разберем ситуацию, когда внешний сервис не может прочитать ваш JSON. Часто это связано с меткой ByteOrderMark (BOM). В 1С при вызове метода УстановитьТелоИзСтроки по умолчанию может добавляться BOM, что приводит к ошибке "Invalid character" на стороне некоторых веб-серверов (например, на базе Node.js или Go). Чтобы избежать этой проблемы, всегда явно указывайте ИспользованиеByteOrderMark.НеИспользовать.
В корпоративных сетях доступ к интернету часто ограничен. Выясним, как настроить работу через прокси. Для этого в конструктор HTTPСоединение передается объект ИнтернетПрокси. Это позволяет приложению обходить ограничения и успешно взаимодействовать с внешним миром.
Прокси = Новый ИнтернетПрокси(Ложь); // Использовать настройки ОС или задать вручную
Прокси.Установить("https", "192.168.1.1", 8080, "proxy_user", "password");
Соединение = Новый HTTPСоединение(Сервер, Порт, , , Прокси, Таймаут, ИспользоватьSSL);
Резюмируя пройденный материал: для стабильной интеграции необходимо не только правильно написать код, но и предусмотреть обработку исключительных ситуаций. Всегда используйте блоки Попытка...Исключение, логируйте тело ответа при ошибках и проверяйте соответствие форматов данных. Мы проанализировали полный цикл работы: от формирования Структура до разбора HTTPОтвет, что позволяет создать надежный механизм обмена данными в любой конфигурации 1С.