Осваиваем протокол gRPC по HTTP/2 в 1С

24.05.22

Разработка - Языки и среды

Не так давно на форуме была заведена тема по интеграции с распределенным реестром под 1С, и был выявлен следующий момент, что текущие релизы платформы не поддерживают соединение по HTTP/2 для протокола gRPC. В этой публикации разберем, как удалось решить этот вопрос.

Начнем с определения gRPC и почему он вдруг понадобился.

gRPC (Remote Procedure Calls) — это система удалённого вызова процедур (RPC) с открытым исходным кодом, первоначально разработанная в Google в 2015 году. В качестве транспорта используется HTTP/2, в качестве языка описания интерфейса — Protocol Buffers. gRPC предоставляет такие функции, как аутентификация, двунаправленная потоковая передача и управление потоком, блокирующие или неблокирующие привязки, а также отмена и тайм-ауты. Генерирует кроссплатформенные привязки клиента и сервера для многих языков. Следуя из определения, технология должна решать межсервисные взаимосвязи на разных языках программирования, но в нашем случае это все не про 1С. Поддерживаемый транспорт на текущий момент это HTTP/1.1 и он не подходит. Список языков перечислен на домашней странице протокола gRPC и практически охватывает весь возможный современный спектр.

Ранее в проектах уже проводилась работа с использованием JavaScript, поэтому остановимся на выборе node.JS, но более родное для 1С под windows будет конечно же C#, т.е. gRPC for .NET, установка которого в целом полностью аналогична и возможно 1С также сможет запустить этот проект через внешний скрипт *.сs командой dotnet run -f netcoreapp2.1.

В качестве примера серверная часть будет работать на Windows, и его сервисная служба реализована на node.JS, дефолтовый порт службы для связи 50051. Нам потребуется установка NODE, скачиваем ее и производим инсталяцию. Для проверки в командной строке PowerShell введем npm -v и node -v , при успешном результате получим ответ об установленной  версии. После чего разворачиваем уже сам пакет gprc через команду $ npm install grpc

Установленный пакет уже содержит примеры работы клиентской и серверной частей, для этого нужно только перейти через командную строку PowerShell в нужную нам директорию и запустить скрипты:

Из examples/node/dynamic_codegenкаталога:

  1. Запустите сервер:

    $ node greeter_server.js
    
  2. С другого терминала запустите клиент:

    $ node greeter_client.js
    

Поздравляем! Вы только что запустили клиент-серверное приложение с gRPC. 

Подробно останавливаться на том, как создать свои собственные сервисы, в этой публикации останавливаться не будем, эта информация есть на домашней страничке протокола. Как запустить скрипт клиентской части, возможно, вы уже знаете, но на всякий случай пример:

  WshShell = Новый COMОбъект("wscript.shell"); 
  WshShell.Run("wscript.exe ""greeter_client.js""); 

Реализация скрипта может быть динамической, т.е. создаем текстовое сообщение под 1С платформой и записываем его во внешний файл скрипта. 

 Скрипт = Новый ТекстовыйДокумент(); 
        Скрипт.УстановитьТекст 
        ( 
        "....какой то код на JS;" 
        ); 
        Скрипт.Записать("greeter_client.js", КодировкаТекста.ANSI); 

На этом, пожалуй, можно и закончить описание работы с данной технологией протокола, как видно из примеров, оно достаточно простое и, самое главное, имеет гибкость и высокую скорость реализации, и вы можете использовать их для реализации своих безопасных сервисов связи.

...и да, пример самого скрипта со стороны клиентской части, если его не удалось найти самостоятельно:

  var client = new hello_proto.Greeter('localhost:50051',
                                       grpc.credentials.createInsecure());
  client.sayHello({name: 'you'}, function(err, response) {
    console.log('Greeting:', response.message);
  });

 

gPRC node.js C# *.cs *.js

См. также

Языки и среды Программист Платформа 1С v8.3 Бесплатно (free)

Будем писать свои скрипты на питоне и запускать их на 1С.

15.04.2024    4028    YA_418728146    13    

62

Мобильная разработка Языки и среды 1С:Элемент Программист Бесплатно (free)

Flutter может быть использован с 1С:Предприятием для разработки кроссплатформенных мобильных приложений, обеспечивая единый интерфейс и функциональность на устройствах под управлением iOS и Android. Это позволяет создавать приложения с высокой производительностью благодаря использованию собственного движка рендеринга Flutter. Интеграция Flutter с 1С:Предприятием позволяет создавать мобильные приложения любого уровня сложности, интегрировать их в корпоративные информационные системы, а также реализовывать бизнес-логику

19.03.2024    18310    ROk_dev    74    

43

Языки и среды Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Существует множество языков программирования, и каждый имеет свои особенности по работе с типами данных. Слабые, явные, динамические и другие... Но кто же здесь 1С и почему с приходом "строгой" типизации EDT 1С-программистам стоит задуматься над изменением своих привычек.

16.01.2024    7327    SeiOkami    25    

61

Языки и среды Программист Бесплатно (free)

Пример небольшого приложения, с которого можно начать изучать язык программирования Dart.

08.08.2023    4205    acvatoris    6    

15

Языки и среды Программист Платформа 1С v8.3 Россия Бесплатно (free)

Написание статического анализатора для 1С традиционным способом на Си.

30.06.2023    3496    prohorp    15    

12

Языки и среды Программист Абонемент ($m)

Поставили нам задачу - вынести на отдельный сервер функционал получения заказов от клиентов по электронной почте, парсинг полученных XLS в приемлемый вид и трансформация заказов в красивый JSON, понятный нашей учетной системе на 1С. Всю эту красоту желательно запустить в отдельном докер - контейнере, по возможности не тратя лицензии, поэтому отдельно стоящую конфигурацию на БСП отвергаем сразу. Можно было бы собрать всё на Apache Airflow или Apache NiFi, но решили попробовать реализовать всю логику без Open Source, будем делать свой ETL, с Исполнителем, который в версии 3.0 научился взаимодействовать с электронной почтой по IMAP. Начнем с середины - сначала напишем скрипты, а потом соберем их в рабочую конструкцию

1 стартмани

01.06.2023    2313    0    kembrik    2    

7

Языки и среды Программист Платформа 1С v8.3 Бесплатно (free)

При работе с 1С ORM (object relation mapping) все время преследует ощущение постоянного создания монолитного приложения — один раз привязался к какой либо сущности (например, справочник Контрагенты), и весь код заполнен ссылками на эту конкретную реализацию. Можно ли независимо разрабатывать в ORM совместимые между собой справочник «Контрагентов» и использующий его документ «Платежное поручение», но при этом избежать жестких зависимостей? Спасут ли нас микросервисы? Пример на аннотациях Java демонстрирует, как это возможно делать.

13.03.2023    1305    1CUnlimited    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1324 24.05.22 15:03 Сейчас в теме
На картинке сервер Java, в заголовке утверждение что "текущие релизы платформы не поддерживают соединение по HTTP/2 для протокола gRPC", к концу статьи понятно что имеется ввиду клиентская часть. В коде приведен непонятный пример с использованием "COMОбъект" и костылями через файл..

Опишите пожалуйста в каком контексте используете и почему не хватило JSON RPC например.

https://infostart.ru/1c/articles/1541021/ - описание стандарта,
https://infostart.ru/1c/articles/1645365/ - описание документирования.
Так же в публикациях есть реализации пары клиентов.
2. JetBrain 76 24.05.22 16:26 Сейчас в теме
(1) да , на картинке с Java сервером, но это не имеет значения, это может быть любая реализация С++, C#, Python, Java, Node и прочие из списка доступных языков, в этом и межсервисная "прелесть". gRPC обладает буферами протоколов определяющие структуры данных, которые вы хотите сериализовать в прото-файле и компилятором этого буфера. Клиентское приложение может напрямую вызывать метод серверного приложения на другом компьютере, как если бы это был локальный объект. Все это ориентированно на большую производительность через двоичное кодирование и мультиплексирование вызовов через всего одно соединение. Более подробно это все описано на домашней странице протокола ссылка была в публикации.
..."текущие релизы платформы не поддерживают соединение по HTTP/2" - это речь про платформы 1С.
3. JetBrain 76 25.05.22 09:36 Сейчас в теме
(1) если на клиенте вы использовали
БезопасноеСоединение = Новый HTTPСоединение(URI.ИмяСервера,443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
то к сожалению это только HTTP/1.1 и через него gRPC не пройдет, а у нас в примере интеграция с конкретным сервером и выбора нет другого, кроме как городить внешний файл скрипта.
4. malikov_pro 1324 25.05.22 15:47 Сейчас в теме
(2) У меня вызывает диссонанс "производительность" и COMОбъект. Что gRPC хорош это понятно, но прото-файл еще нужно уметь готовить.
"Не так давно на форуме была заведена тема по интеграции с распределенным реестром под 1С" - будет полезна ссылка на источник.

(3) Если в организации уже используется gRPC, то вариант через NativeAPI собирать обмен, с нагрузками когда оно может быть применено не сталкивался. С другой стороны "прямой вызов" это усиление связанности и при больших потоках применяют очереди Rabit, Kafka итд.
5. JetBrain 76 25.05.22 16:02 Сейчас в теме
(4) COMОбъект на сервер не влияет, но на клиенте понятно не лучший вариант, не ждать же когда 1с сделают поддержку. ссылка на форум Создаем распределенный реестр для 1С , за решение есть вознаграждение, если получится подобрать другое решение будет круто.
8. JetBrain 76 26.05.22 07:30 Сейчас в теме
(4) заменить использование COMОбъекта можно вариантами с применением HTML, разбор ответов всего скорей тоже будет удобнее:
https://infostart.ru/1c/articles/570446/
https://infostart.ru/public/398366/
https://infostart.ru/1c/articles/1355214/
6. malikov_pro 1324 25.05.22 20:14 Сейчас в теме
(5) Не увидел обратной связи с требованиями по скорости, если не критично то накатывается REST и работается через него
https://hyperledger.github.io/composer/v0.19/integrating/getting-started-rest-api
Упоминание нашел в https://infostart.ru/1c/articles/849888/.
Со своей стороны диалог закрываю, т.к. блокчейн не моя специализация и ресурсы планирую тратить на другие темы.
7. JetBrain 76 25.05.22 20:52 Сейчас в теме
(6) composer другой проект, под него возможно и подходит, пример описан под iroha. с автором указанной статьи и разбирали HTTP/2 в комментах форума он же)
9. alex_s_v 14.05.24 15:51 Сейчас в теме
А на каком языке можно сгенерить клиентскую либу для 1С?

У нас есть в protobuf описание сервиса и мы хотим отдать разработчику на 1С писать интеграцию с нашим сервисом.
10. JetBrain 76 16.05.24 06:51 Сейчас в теме
Добрый день! интеграционный сервис выступает сервером или клиентом? в данном примере 1с выступает клиентом и ей не требуется библиотека дополнительно "самописная". В теле HTML соответственно JavaScript используется.
11. alex_s_v 16.05.24 22:06 Сейчас в теме
(10)

Наш сервис - сервер, у него есть protobuf-схема из которой мы генерируем клиентов. Вопрос на каком языке для 1С разработчика сгенерировать клиента, чтобы он смог из 1С писать данные в наш сервис, через этот клиент.
12. alex_s_v 16.05.24 22:16 Сейчас в теме
(10) - Я отсек варианты с промежуточным рест сервисов и использование HTTP сервисов. И хочу вариант, через COM-объекты, чтобы можно было методы сервиса напрямую вызывать.

GPT вот что подсказывает - верно ли это? Как бы вы поступили?


### Генерация библиотеки для 1С с использованием protobuf клиента

Для интеграции с сервисом, описанным в protobuf, и использования сгенерированного клиента, вы можете создать COM-объект на языке, который поддерживает protobuf (например, C#), и зарегистрировать его как COM-сервис. Далее, этот COM-объект можно будет вызывать из 1С, упрощая процесс интеграции.

#### Шаги для создания и использования COM-объекта

1. **Создание COM-объекта на C#**:
- Установите необходимый protobuf клиент и сгенерируйте из него классы для вашего сервиса.
- Создайте класс, который будет выступать оберткой для вашего protobuf клиента.
- Убедитесь, что ваш класс и методы помечены атрибутами для COM-видимости.

2. **Регистрация COM-объекта**:
- Скомпилируйте ваш C# проект в .NET DLL.
- Зарегистрируйте эту DLL в Windows как COM-объект.

3. **Использование COM-объекта в 1С**:
- Подключите COM-объект в 1С.
- Используйте методы COM-объекта для вызова методов сервиса.

### Подробное описание каждого шага

#### 1. Создание COM-объекта на C#

Создайте новый проект на C#. Добавьте сгенерированные protobuf классы в проект.

```csharp
using System.Runtime.InteropServices;
using YourGeneratedClientNamespace; // Пространство имен, сгенерированное из protobuf
using Newtonsoft.Json;

namespace YourNamespace
{
[ComVisible(true)]
[Guid("your-guid-here")]
[ClassInterface(ClassInterfaceType.None)]
public class YourServiceWrapper : IYourServiceWrapper
{
private readonly YourServiceClient _client;

public YourServiceWrapper()
{
_client = new YourServiceClient("https://your-api-endpoint.com");
}

public string YourMethod(string jsonParams)
{
var request = JsonConvert.DeserializeObject<YourRequestType>(jsonParams);
var response = _client.YourMethod(request);
return JsonConvert.SerializeObject(response);
}
}

[ComVisible(true)]
[Guid("your-guid-here")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IYourServiceWrapper
{
[DispId(1)]
string YourMethod(string jsonParams);
}
}
```

#### 2. Регистрация COM-объекта

После компиляции проекта, зарегистрируйте DLL как COM-объект:

1. Откройте командную строку от имени администратора.
2. Выполните команду:

```shell
regasm /codebase /tlb YourAssembly.dll
```

- `/codebase`: Указывает, что регистрируемая сборка будет использоваться как COM-объект.
- `/tlb`: Создает файл библиотеки типов (.tlb) для доступа к объекту из других языков.

#### 3. Использование COM-объекта в 1С

Теперь вы можете использовать COM-объект в 1С. Пример кода:

```1C
Попытка
КомОбъект = Новый COMОбъект("YourNamespace.YourServiceWrapper");
ТелоЗапроса = "{""param1"": ""value1"", ""param2"": ""value2""}";
Ответ = КомОбъект.YourMethod(ТелоЗапроса);
Сообщить("Ответ: " + Ответ);
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
```
13. JetBrain 76 17.05.24 12:40 Сейчас в теме
(12) такой путь думаю возможен, но это более трудоемко создавать dll, но будут преимущества. вариант через js скрипт html более гибкий, но у него есть свои ограничения, если потребуется вызвать например регламентное задание на самом сервере 1с, т.е. html дает возможность работать, как клиент 1с и клиент grpc.
15. alex_s_v 17.05.24 14:26 Сейчас в теме
(13)
но это более трудоемко создавать dll, но будут преимущества


Вроде не совсем трудоемко, у нас же из proto генерируется клиент на C# и оно оборачивается в COM, а C# умеет в http2

----
Конечно! Вот краткое объяснение для форума:

---

Для интеграции 1С с gRPC, учитывая что 1С не поддерживает HTTP/2, можно использовать следующий подход:

1. **Создайте C# клиент**: Генерируйте C# клиент из вашего `.proto` файла с помощью `Grpc.Tools`.
2. **Создайте COM-объект**: Оберните сгенерированные gRPC методы в C# класс и сделайте его доступным как COM-объект.
3. **Регистрация COM-объекта**: Настройте проект для регистрации COM и скомпилируйте его. Затем зарегистрируйте COM-объект с помощью `regasm`.
4. **Использование в 1С**: В 1С создайте экземпляр COM-объекта и вызывайте необходимые методы.

### Пример кода C#:

```csharp
using System;
using System.Runtime.InteropServices;
using Grpc.Net.Client;
using Protos;

[ComVisible(true)]
[Guid("YOUR_GUID_HERE")]
[ClassInterface(ClassInterfaceType.None)]
public class GrpcClient : IGrpcClient
{
    private readonly MyService.MyServiceClient _client;

    public GrpcClient()
    {
        var channel = GrpcChannel.ForAddress("https://localhost:5001");
        _client = new MyService.MyServiceClient(channel);
    }

    public string FirstMethod(string name)
    {
        var request = new RequestMessage { Name = name };
        var response = _client.FirstMethod(request);
        return response.Message;
    }

    public string SecondMethod(string name)
    {
        var request = new RequestMessage { Name = name };
        var response = _client.SecondMethod(request);
        return response.Message;
    }
}

[ComVisible(true)]
[Guid("YOUR_GUID_HERE")]
public interface IGrpcClient
{
    string FirstMethod(string name);
    string SecondMethod(string name);
}
```
Показать


### Пример кода 1С:
```1C
Попытка
    GrpcClient = Новый COMОбъект("GrpcComClient.GrpcClient");

    ПервыйОтвет = GrpcClient.FirstMethod("name1");
    Сообщить("Первый ответ: " + ПервыйОтвет);

    ВторойОтвет = GrpcClient.SecondMethod(ПервыйОтвет);
    Сообщить("Второй ответ: " + ВторойОтвет);
Исключение
    Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
```
Показать

Этот метод позволяет использовать возможности gRPC с HTTP/2, обойдя ограничения 1С, благодаря использованию COM-объекта.

---
JetBrain; +1 Ответить
14. alex_s_v 17.05.24 14:20 Сейчас в теме
(13)
https://chatgpt.com/share/81b2bd33-179f-4940-ad2e-cbe6d6492642
ГПТ помог разобраться с идей "js скрипт html" - как я понял, это создаем из строки JS и запускаем его через COM-объект.

Но возникает проблема - а результаты если нужно в 1С обработать? То хранить их в файлах - гпт предложило, но это как-то добавляется слой общение 1с и JS через эти файлы..
16. JetBrain 76 18.05.24 08:37 Сейчас в теме
(14) тут не совсем так, пример с вешним скриптом тоже может быть, но последний предложенный вариант это использование объект поле html в 1с, где 1с внутри себя через встроенный браузер работает, а он соответственно только на клиенте, от сюда и вытекают ограничения. пример более понятный это подключение например яндекс.карт в html поле.
17. Nx6600 24 26.10.24 13:26 Сейчас в теме
Эх, я как то пытался создать на с# универсальную либу с вызовом из 1С с передачей в нее protobuf описания клиента. Либа динамически строит клиента и делает запрос. Но, не прлучилось
Оставьте свое сообщение