Интеграция 1С со сторонними сервисами (сайты, маркетплейсы, внешние API) — одна из самых распространенных задач для современного программиста. Чаще всего обмен данными происходит по протоколу HTTP с использованием формата JSON. В этой статье мы подробно разберем, как правильно настроить соединение, сформировать заголовки, сериализовать данные и обработать ответ сервера.
Мы рассмотрим процесс пошагово, начиная от подготовки данных и заканчивая получением результата. Будем использовать стандартные методы платформы, доступные в современных версиях 1С.
Прежде чем отправлять запрос, нам необходимо подготовить данные. Обычно в 1С мы работаем со структурами, массивами или таблицами значений. Однако API сторонних систем ожидают строку в формате JSON. Для преобразования данных 1С в JSON используется объект ЗаписьJSON.
Рассмотрим пример, где нам нужно отправить информацию о заказе. Создадим структуру с данными:
// Подготовим данные для отправки
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("order_id", "12345");
ДанныеЗаказа.Вставить("date", Строка(ТекущаяДата()));
ДанныеЗаказа.Вставить("amount", 5000);
МассивТоваров = Новый Массив;
МассивТоваров.Добавить(Новый Структура("product", "Товар 1"));
МассивТоваров.Добавить(Новый Структура("product", "Товар 2"));
ДанныеЗаказа.Вставить("items", МассивТоваров);
Теперь нам нужно превратить эту структуру в строку. Обратите внимание: при записи JSON важно явно указывать параметры записи, чтобы формат соответствовал ожиданиям сервера (например, экранирование символов). Рассмотрим код сериализации:
// Настройки записи JSON
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина);
// Запись в строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
ЗаписатьJSON(ЗаписьJSON, ДанныеЗаказа);
СтрокаJSON = ЗаписьJSON.Закрыть();
В переменной СтрокаJSON теперь содержится готовый текст, который мы будем передавать в теле запроса.
Для выполнения запроса необходимо установить соединение с сервером. В 1С для этого используется объект HTTPСоединение. Ключевой момент здесь — работа с защищенным протоколом HTTPS. Большинство современных API работают именно через него, поэтому нам потребуется настроить защищенное соединение.
Разберем создание объекта HTTPСоединение:
ЗащищенноеСоединениеOpenSSL для работы по HTTPS.
Сервер = "api.example.com";
Порт = 443; // Стандартный порт для HTTPS
Ресурс = "/v1/orders/create"; // Адрес метода API
// Настройка SSL (для HTTPS)
// В большинстве случаев достаточно пустого конструктора,
// но иногда требуются сертификаты клиента
SSL = Новый ЗащищенноеСоединениеOpenSSL(неопределено, неопределено);
// Создание соединения
Соединение = Новый HTTPСоединение(
Сервер,
Порт,
,, // Пользователь и пароль (если нужна Basic Auth)
, // Прокси
60, // Таймаут в секундах
SSL // Наш объект SSL
);
Важно: Если вы работаете с самоподписанными сертификатами или тестовыми серверами, настройки ЗащищенноеСоединениеOpenSSL могут потребовать указания файла сертификата.
Сервер должен понимать, в каком формате мы присылаем данные. Для этого критически важно установить заголовок Content-Type. Также часто требуются заголовки для авторизации (например, токен).
Создадим объект HTTPЗапрос и заполним заголовки:
// Заголовки запроса
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Заголовки.Вставить("Authorization", "Bearer Ваш_Токен_Доступа");
// Создание запроса к конкретному ресурсу
ЗапросHTTP = Новый HTTPЗапрос(Ресурс, Заголовки);
Теперь необходимо поместить наше JSON-тело внутрь запроса. Для этого используем метод УстановитьТелоИзСтроки. Обязательно указываем кодировку КодировкаТекста.UTF8, так как это стандарт де-факто для веб-обмена.
// Установка тела запроса
ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Обратите внимание на параметр ИспользованиеByteOrderMark.НеИспользовать (BOM). Многие веб-серверы (особенно написанные на PHP или Python) могут некорректно обрабатывать JSON, если в начале строки присутствует маркер последовательности байтов (BOM), который 1С может добавить по умолчанию.
Все готово для отправки. Используем метод ОтправитьДляОбработки или ВызватьHTTPМетод. Для POST-запросов чаще всего используется второй вариант или специализированный метод.
Проанализируем код отправки:
Попытка
// Выполнение POST запроса
ОтветHTTP = Соединение.ВызватьHTTPМетод("POST", ЗапросHTTP);
// Также можно использовать:
// ОтветHTTP = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
Исключение
Сообщить("Ошибка соединения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
После выполнения запроса мы получаем объект HTTPОтвет. Нам нужно проверить два свойства:
КодСостояния — числовой код HTTP (200, 201 — успех, 4xx, 5xx — ошибки).ПолучитьТелоКакСтроку() — текст ответа от сервера (обычно тоже JSON).Давайте посмотрим, как правильно обработать ответ:
КодОтвета = ОтветHTTP.КодСостояния;
ТекстОтвета = ОтветHTTP.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Если КодОтвета = 200 Или КодОтвета = 201 Тогда
Сообщить("Успешная отправка!");
// Читаем ответ сервера (например, ID созданного заказа)
Попытка
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Сообщить("ID заказа: " + ДанныеОтвета.id);
Исключение
Сообщить("Не удалось прочитать JSON ответа: " + ТекстОтвета);
КонецПопытки;
Иначе
Сообщить("Ошибка API. Код: " + КодОтвета);
Сообщить("Тело ошибки: " + ТекстОтвета);
КонецЕсли;
При реализации интеграции обратите внимание на следующие нюансы:
HTTPСоединение через объект ИнтернетПрокси.Используя этот подход, вы сможете организовать надежный обмен данными с любыми REST API сервисами.