В процессе разработки интеграционных решений часто возникает задача обмена данными между двумя независимыми базами 1С. Хотя 1С не имеет «коробочной» реализации протокола JSON-RPC, мы можем самостоятельно построить такую архитектуру, используя возможности платформы. Давайте разберем, как организовать этот процесс, сделав его надежным и масштабируемым.
Для того чтобы одна база 1С могла передавать данные другой с помощью JSON-RPC, нам необходимо реализовать модель «Клиент-Сервер». База-сервер (та, из которой мы получаем или в которую отправляем данные) должна предоставлять точку входа. В 1С для этого лучше всего подходят HTTP-сервисы.
Поскольку JSON-RPC — это надстройка над HTTP, работающая по принципу удаленного вызова процедур, нам нужно создать HTTP-сервис, который будет принимать POST-запросы, разбирать их содержимое и вызывать соответствующую логику в коде конфигурации.
На стороне базы-сервера создадим HTTP-сервис. Основным методом работы будет обработка тела запроса. Рассмотрим пошагово, как это организовать:
HTTP-сервис.POST.Для чтения входящего JSON-пакета используйте объект ЧтениеJSON. Рассмотрим пример того, как может выглядеть базовая обработка запроса:
// Пример обработки входящего запроса в HTTP-сервисе
Функция PostМетод(Запрос)
ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку();
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТелоЗапроса);
ДанныеЗапроса = ПрочитатьJSON(Чтение);
// Извлекаем поля JSON-RPC
Метод = ДанныеЗапроса["method"];
Параметры = ДанныеЗапроса["params"];
Идентификатор = ДанныеЗапроса["id"];
// Выполняем диспетчеризацию
Результат = ВыполнитьЛогику(Метод, Параметры);
// Формируем ответ
Ответ = Новый HTTPОтвет(200);
Ответ.УстановитьТелоИзСтроки(СформироватьОтветJSON(Результат, Идентификатор));
Возврат Ответ;
КонецФункции
При реализации важно строго придерживаться структуры запроса. Стандарт требует наличия следующих полей:
jsonrpc — версия протокола, обычно «2.0».method — имя процедуры, которую мы вызываем в 1С.params — массив или объект с аргументами вызова.id — уникальный идентификатор для отслеживания цепочки «запрос-ответ».Со стороны второй базы 1С, которая инициирует запрос, мы используем стандартный объект HTTPСоединение и HTTPRequest. Важно правильно передать заголовки, чтобы сервер понял, что пришел JSON-пакет.
// Пример отправки запроса
Соединение = Новый HTTPСоединение("адрес_сервера", 80);
Запрос = Новый HTTPЗапрос("/api/v1/rpc");
Запрос.УстановитьЗаголовок("Content-Type", "application/json");
Данные = Новый Структура;
Данные.Вставить("jsonrpc", "2.0");
Данные.Вставить("method", "ПолучитьДанные");
Данные.Вставить("params", Новый Массив);
Данные.Вставить("id", 1);
Запрос.УстановитьТелоИзСтроки(ЗаписатьJSON(Данные));
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
При построении такого интерфейса не забывайте о безопасности. HTTP-сервисы по умолчанию доступны, поэтому:
Authorization (Basic Auth или токены).Попытка...Исключение в серверном коде, чтобы в случае ошибки возвращать клиенту корректный JSON-ответ с описанием ошибки (согласно кодам ошибок JSON-RPC), а не стандартную 500-ю ошибку веб-сервера.Хотя JSON-RPC дает отличную инкапсуляцию бизнес-логики (вы просто вызываете метод «получить баланс»), иногда проще использовать OData для прямого доступа к данным или обычные HTTP-сервисы как REST API. Выбирайте JSON-RPC, если вы хотите скрыть детали структуры метаданных и предоставить строго определенный набор «процедур» для внешней системы. В противном случае, классический REST будет более стандартизированным и легким в поддержке решением.