Введение
Концепция удаленного вызова процедур (RPC), а также технологии, использующие ее для взаимодействия между информационными системами имеют богатую историю и активно используются в настоящее время. Это позволяет программисту оперировать более высокоуровневыми сущностями при описании и реализации взаимодействия между системами, что повышает скорость разработки.
В настоящее время, платформа 1С:Предприятие содержит реализацию данной концепции в виде web-сервисов SOAP, однако их использование нельзя назвать очень простым. Отчасти, сюда же можно отнести и механизм http-сервисов, однако, он предполагает знание протокола http и работу на относительно низком уровне.
Таким образом, настоящая публикация - это попытка "легковесной" реализации концепции удаленного вызова процедур средствами платформы, по возможности простой в использовании и позволяющей сконцентрироваться на написании прикладного кода.
Исходный код библиотеки, также доступен на github.
Выбор технологии
Пожалуй, наиболее популярной в настоящее время, является технология gRPC + protobuf, которая, в силу использования бинарного формата данных, обладает прекрасной производительностью и часто используется в высоконагруженных системах. Однако, есть и оборотная сторона, которая заключается в необходимости компиляции схемы данных в прикладной код, который обеспечивает манипуляции с передаваемыми данными, что неудобно для языков с динамической типизацией, а также скриптовых языков.
В отличие от gRPC, спецификация JSON-RPC 2.0, имеет в основе формат JSON, который c одной стороны более компактен и удобочитаем, чем xml, не требует схемы данных, не требует создания кода для манипуляции с данными. Платой за это является больший объем передаваемых данных и как следствие - более медленная работа по сравнению с бинарными форматами.
На основании вышеизложенного, по совокупности факторов, с учетом простоты реализации, в качестве основы была выбрана спецификация JRPC.
Описание
Библиотека дает возможность из одного прикладного решения вызывать процедуры и функции общих модулей другого прикладного решения или функции стороннего JRPC сервера.
Библиотека оформлена в виде конфигурации и состоит из нескольких подсистем:
БиблиотекаСерверJRPC - реализация сервера JRPC. Точка входа (endpoint) реализована с использованием механизма http-сервисов.
БиблиотекаКлиентJRPC - реализация клиента JRPC.
ТестБиблиотекаJRPC - пример использования библиотеки для взаимодействия между прикладными решениями.
Конфигурация разработана на платформе 8.3.21.1674, однако, может использоваться на платформах, начиная с 8.3.10+.
Использование
Сервер JRPC
Функция ОбработчикВызоваHTTPСервиса(Запрос)
// Добавляем модули и методы, вызов которых разрешен
РазрешенныеМодули = Новый Массив;
// Все процедуры/функции общего модуля ТестСерверJRPC
РазрешенныеМодули.Добавить("ТестСерверJRPC.");
// Все процедуры/функции общего модуля ТестСерверJRPC, имена которых начинаются на ФункцияJRPC
РазрешенныеМодули.Добавить("ТестСерверJRPC.ФункцияJRPC");
// Выполняем вызов, возвращаем результат
Возврат СерверJRPC.ОбработатьЗапрос(Запрос, РазрешенныеМодули);
КонецФункции
Клиент JRPC
// Создаем структуру, содержащую информацию, необходимую для подключения к серверу JRPC
ТочкаПодключения = КлиентJRPC.НовыйТочкаПодключенияСервиса("http://server.contoso.com/jrpc", "Логин", "Пароль");
// Вызываем функцию общего модуля ТестСерверJRPC.ТестоваяФункция1(Строка1, Строка2), которая складывает две строки и возвращает результат
// Формируем массив параметров
ПараметрыВызова = Новый Массив;
Параметрывызова.Добавить("Hello ");
Параметрывызова.Добавить("World!");
// Вызываем
Результат = КлиентJRPC.ВызватьФункцию(ТочкаПодключения, "ТестСерверJRPC.ТестоваяФункция1", ПараметрыВызова);
// Проверяем на ошибки
Если КлиентJRPC.ЭтоОшибка(Результат) Тогда
Сообщить("Ошибка! code:" + Строка(Результат.error.code) + " message:" + Результат.error.message);
КонецЕсли;
// Вызываем процедуру общего модуля ТестСерверJRPC.ТестоваяПроцедура1
// Доступно только для взаимодействия 1С->1C
// Формируем массив параметров
ПараметрыВызова = Новый Массив;
Параметрывызова.Добавить("Вызов тестовой процедуры");
// Вызываем
Результат = КлиентJRPC.ВызватьПроцедуру(ТочкаПодключения, "ТестСерверJRPC.ТестоваяПроцедура1", ПараметрыВызова);
// Проверяем на ошибки
Если КлиентJRPC.ЭтоОшибка(Результат) Тогда
Сообщить("Ошибка! code:" + Строка(Результат.error.code) + " message:" + Результат.error.message);
КонецЕсли;
Заключение
Надеюсь, что настоящая публикация поможет вам сэкономить некоторое время на разработку и уменьшит time-to-market.