PinkRabbitMQ — Native API компонента 1С с открытым исходным кодом, для обмена сообщениями через RabbitMQ





PinkRabbitMQ представляет собой Native API компоненту для 1С Предприятия 8 (Windows 32bit и 64bit) с открытым исходным кодом на с++ (можно собрать компоненту самостоятельно). PinkRabbitMQ это низкоуровневая компонента которая реализует обмен по протоколу AMQP с брокером сообщений RabbitMQ. Для организации высокоуровнего обмена между информационными базами предназначен Адаптер. Компонента разрабатывается в рамках проекта Адаптер.

Предпосылки создания своей компоненты

  • Мы активно развиваем свой проект Адаптер (о нем мы уже писали на инфостарте), в котором реализован обмен через RabbitMQ
  • Т.к. 1С напрямую не поддерживает протокол AMQP (а для обмена с брокером RabbitMQ через http есть ограничения) нам потребовалась внешняя компонента
  • Раньше мы использовали стороннюю компоненту Yellow RabbitMQ, но для некоторых наших заказчиков было важно избежать зависимости от конкретного поставщика, и наличие закрытого кода (в виде скомпилированной компоненты) являлось важным аргументом против использования Yellow RabbitMQ
  • Технически создание своей компоненты нам казалось не сложным
  • У нас уже был весь набор тестов для Адаптера, который позволил нам быть уверенными, что наша компонента работает
  • Хотелось получить возможность самостоятельного развития компоненты

 

Наши цели публикации исходных кодов компоненты Pink RabbitMQ:

  • Она у нас все равно есть, и для нас это "ничего не стоит"
  • Мы хотим улучшить код компоненты
  • Мы хотим "продвинуть кролика в массы", как "среду" обмена данными, и как средство для построения событийно-ориентированных интеграций
  • Мы надеемся, что это будет полезно и для нашего Адаптера, как инструмента организации обмена

 

Особенности компоненты Pink RabbitMQ:

  • Описание API компоненты содержится в https://github.com/BITERP/PinkRabbitMQ/blob/master/README.md
  • Представляет собой Native API компоненту для 1С Предприятия 8 (Windows 32bit и 64bit). Для Linux мы не компилировали, но радикальных препятствий для этого нет (примерно понятно, какие нужно для этого сделать доработки)
  • С точки зрения API компонента практически полностью совместима с  Yellow RabbitMQ т.е. в Адаптер мы просто замени компоненту на нашу, но те механизмы, которые не нужны в Адаптере мы не реализовывали
  • В основе компоненты лежат "свежие" библиотеки
    •  AMQP-CPP — асинхронный клиент для работы  c протоколом AMQP
    •  POCO C++ — только для работы с tcp socket
  • Для обеспечения совместимости с Yellow RabbitMQ мы внутри компоненты превратили асинхронные методы библиотеки в синхронные, что немного повлияло на производительность
  • При разработке исходный код компоненты проверяются Sonar Cube и тестируются BDD тестами Адаптера (см. бэджи в репозитории)

 

Вопросы производительности

Поскольку мы использовали ранее Yellow RabbitMQ, то и сравнивали с ней:

Простой синтетический тест

Метод

Yellow RabbitMQ

Pink RabbitMQ

Последовательная отправка 1000 сообщений (сек)

28.30

57.54

Последовательное получение 1000 сообщений (с отправкой 2000 логов) (сек) 220.41 390.70

 

Тест на реальном проекте где в Адаптере компонента Yellow RabbitMQ была заменена на Pink RabbitMQ.

У нас не было цели провести отдельный чистый тест, мы просто хотели убедиться, что на одном из наших проектов, на котором мы недавно перешли с обмена БСП (не типового) на обмен через RabbitMQ при переходе на компоненту Pink RabbitMQ не будет проблем с производительностью.

В рамках теста из базы УТ10.3 в базу ERP переносился 1241 документ и проводился в ERP (реализации товаров превращались в поступления)

Метод

Yellow RabbitMQ

Pink RabbitMQ

План обмена из БСП в формате КД2

Длительность отправки из УТ 10.3 (час) 1:47 2:19 1:38
Длительность загрузки в ERP (час) 3:10 2:48 3:36
Общая длительность от момента как начали отправлять до момента, что все получили (час) 3:12 2:51 3:47

т.е. мы видим, что на реальном проекте

  • Меньшая скорость работы самой компоненты "теряется" во времени записи и проведения реальных загруженных документов
  • Общая длительность обмена зависит от прочих факторов гораздо больше, чем от скорости работы самой компоненты

по этому пока мы не считаем меньшую производительность Pink RabbitMQ проблемой

 

API

Компонента имеет ряд методов для работы из встроенного языка 1С. Параметры с тегом [НЕ РЕАЛИЗОВАНО] имеют пустую реализацию, но передавать их все равно требуется. Параметры с тегом [НЕОБЯЗАТЕЛЬНЫЙ] можно не передавать. Список методов:

Connect — устанавливает соединение с сервером RabbitMQ

Параметры:

  • host — Строка — Адрес сервера RabbitMQ
  • port — Число — Порт работы через tcp (обычно 5672)
  • login — Строка — Имя пользователя
  • pwd — Строка — Пароль пользователя
  • vhost — Строка — Vhost пользователя
  • pingRate — Число — [НЕ РЕАЛИЗОВАНО][НЕОБЯЗАТЕЛЬНЫЙ]. Частота пульса

DeclareExchange — Объявить точку обмена

Параметры:

  • name — Строка — Имя exchange
  • type — Строка — Тип точки обмена. Поддерживаются "direct", "fanout", "topic"
  • onlyCheckIfExists — Булево — [НЕ РЕАЛИЗОВАНО] Не создавать новую, выбросить исключение, если такой точки нет.
  • durable — Булево — Сохранять сообщения на диске на случай рестарта RMQ (не рекомендуется)
  • autodelete — Булево — Удалить после того, как от точки будут отвязаны все очереди.

DeleteExchange — Удаляет очередь с сервера

Параметры:

  • name — Строка- Имя точки обмена.
  • ifunused — Булево — Удаление будет выполнено, только если точка обмена не используется.

DeclareQueue — Объявить очередь

Параметры:

  • name — Строка — Имя объявляемой очереди.
  • onlyCheckIfExists — Булево — [НЕ РЕАЛИЗОВАНО] Не создавать очередь с таким именем, использовать существующую
  • save — Булево — Кешировать сообщения на диске, на случай падения RMQ.
  • exclusive — Булево — [НЕ РЕАЛИЗОВАНО] Только текущее соединение может иметь доступ к этой очереди.
  • autodelete — Булево — Удалить очередь если к ней был подключен, а затем отключен читающий клиент.

Возвращаемое значение:

  • Имя очереди, заданное явно в 1-м параметре.

DeleteQueue — Удаляет очередь с сервера

Параметры:

  • name — Строка — Имя очереди
  • onlyIfIdle — Булево — Удаление будет выполнено, только если очередь не используется
  • onlyIfEmpty — Булево — Удаление будет выполнено, только если очередь пуста

BindQueue — Установить связь очереди. Создает маршрут от точки обмена до очереди.

Параметры:

  • queue — Строка — Имя очереди
  • exchange — Строка — Имя точки обмена
  • routingKey — Строка — Rлюч маршрутизации.

UnbindQueue — Отсоединяет очередь от точки обмена.

Параметры:

  • queue — Строка — Имя очереди
  • exchange — Строка — Имя точки обмена
  • routingKey — Строка — Rлюч маршрутизации.

BasicPublish — Отправить сообщение

Параметры:

  • exchange — Строка — Имя точки в которую отправляется сообщение
  • routingKey — Строка — Ключ маршрутизации (см. руководство RMQ)
  • message — Строка — Тело сообщения
  • livingTime — Число — [НЕ РЕАЛИЗОВАНО] Время жизни сообщения в миллисекундах
  • persist — Булево — [НЕ РЕАЛИЗОВАНО] Сбрасывать сообщение на диск

BasicReject — Отказывается от последнего полученного сообщения. Работает по принципу Ack, но в обратную сторону.

Параметры отсутствуют

BasicConsume — Начать чтение. Регистрирует потребителя сообщений для очереди.

Параметры:

  • queue — Строка — Очередь из которой будем читать сообщения.
  • consumerId — Строка — [НЕ РЕАЛИЗОВАНО] имя потребителя. Если не задан, то имя потребителя сгенерирует сервер и вернет из метода
  • noConfirm — Булево — [НЕ РЕАЛИЗОВАНО] не ждать подтверждения обработки. Сообщения будут удалены из очереди сразу после отправки на клиента.
  • exclusive — Булево — [НЕ РЕАЛИЗОВАНО] монопольно захватить очередь
  • selectSize — Число — [НЕ РЕАЛИЗОВАНО] количество сообщений единовременно отправляемых клиенту. Оптимизационный параметр, если > 1 усложняет программирование клиента

Возвращаемое значение:

  • Строка. Имя потребителя, сгенерированное сервером или переданное в параметре ИмяПотребителя.

BasicConsumeMessage — Получить сообщение

Параметры:

  • consumerId — Строка — [НЕ РЕАЛИЗОВАНО] Имя зарегистрированного потребителя
  • outdata — Строка — Выходной параметр. Тело сообщения.
  • timeout — Число — Таймаут ожидания сообщения в миллисекундах. 0 означает без ожидания

BasicCancel — Закрывает канал для чтения сообщений

Параметры:

  • channelId — Строка — Имя созданного ранее потребителя.

BasicAck Отсылает серверу подтверждение (ack), что сообщение обработано и его можно удалить. Подтвердить можно только последнее прочитанное сообщение.

Параметры отсутствуют

GetLastError — получает информацию о последней ошибке

Параметры отсутствуют

Возвращаемое значение:

  • Строка — Последнее сообщение ошибки

 

Наши ближайшие планы:

  • Мы собираемся поддерживать компоненту, т.к. она является частью нашего решения Адаптер
  • С точки зрения функционала ходим добавить в компоненту асинхронные методы (как в 1С), что увеличит скорость работы и немного упростит алгоритмы Адаптера

 

Как начать использовать Pink RabbitMQ:

  • Скачать демонстрационную обработку, приложенную к статье (компонента находится в ней в виде макета)
  • Скачать из репозитория исходники и воспользоваться инструкцией из readme.md

 

Интересные технические особенности:

  • Источником вдохновения послужила статья https://habr.com/ru/post/253317/
  • Сборка компоненты осуществляется как через sln проект на VS Studio 2024, так и через cmake (см. readme.md)
  • Все зависимости проекта (в частности POCO и AMQP) поставляются прекомпилированными либами для простоты сборки (поэтому репозиторий много весит, но проект собирается элементарно )

Как стать контрибьютером:

  • Репозиторий проекта https://github.com/BITERP/PinkRabbitMQ
  • Как обычно, создавайте issues, делайте форки, вносите доработки, собирайте и проверяйте компоненту и делайте пулл-реквест
  • Мы со своей стороны будем принимать пулл-реквесты после
    • прохождения проверок Sonar Cube и BDD тестами Адаптера
    • оценки соответствия предлагаемых изменений концепции/планам развития Pink RabbitMQ

 

Ждем ваших вопросов/замечаний/предложений

91 Comments

  1. barelpro

    Когда-то это должно было случится! ) Спасибо!

    Reply
  2. Evil Beaver

    Вот так придумаешь на внутреннем совещании звучное название, напишешь компоненту, научишь людей Кролику, а они тебе за это сравнение производительности не в твою пользу, плагиат-троллинг названия, скопированный 1-в-1 API (который ты мучился сочинял, чтобы удобно было) и даже никаких спасибо. Ну бывает, чего. Не любят у нас в отрасли спасибо говорить.

    Reply
  3. Begemoth80

    (2)

    а они тебе за это сравнение производительности не в твою пользу

    Почему? Я же явно пишу в разделе «Простой синтетический тест» что Желтый кролик в 1,5 раза быстрее?

    Reply
  4. Tahallus

    (2)

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

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

    Все друг друга копируют таков сейчас мир, это не хорошо и не плохо. Такое чувство что при каждом упоминание 1С+RabbitMQ нужно писать/говорить спасибо.

    Reply
  5. Evil Beaver

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

    Здесь я среагировал тон статьи, название, основанное на названии конкурирующего продукта и увидел выделенные жирным цифры производительности. Это все в совокупности выглядит, как «а мы на*бали серебряную пулю, мы молодцы».

    Скажем, если бы статья называлась «MegaRMQ — Бесплатный клиент RabbitMQ для 1С» и предлагаемое API было бы отличным от YellowRMQ — вообще никаких вопросов.

    А здесь — прямое копирование с целью заменить и никакого стеснения перед авторами: да, чуваки, мы взяли ваше API, вашу работу по популяризации кролика, даже ваше название, но ничего личного, just business.

    Reply
  6. Evil Beaver

    (3) А в соседнем — не пишете 🙂

    Конкуренция это хорошо. Выпустить бесплатный продукт, вытесняющий с рынка Пулю (или любого другого вендора) — это нормально, это даже хорошо, конкуренция развивает. А вот перевирать названия — плохо.

    Представьте, что кто-то начал выпускать автомобили FasterAudi с четырьмя кольцами по кругу или компьютеры GreenApple, где яблоко не откушено. Какое ощущение возникает? Кроссовки Abadis! С соответствующим отношением.

    Reply
  7. Tahallus

    (6) славы у тебя хоть отбавляй и знающие люди понимают с кого началось движение, клиентов думаю они у вас не сильно отберут, все таки больше покупают опыт чем команду в придачу к инструменту. С названием они конечно переборщили согласен. На счет API, опять же это у все так, возьми amazon и их api, почти все взяли чтобы конкурировать в облаках, и чтобы для конечного пользователя переход был менее болезненным.

    Reply
  8. Evil Beaver

    (8) Ну, во-первых, клиентов отберут не у меня, я не работаю в SB. Согласны, что с названием переборщили, и то ладно. И все-таки, в посте, о том «как мы сделали аналог платного продукта» я ожидал увидеть хотя бы минимальный обзор этого продукта и хоть какой-то tribute.

    Reply
  9. Begemoth80

    (7)

    А в соседнем — не пишете

    Цитирую соседний раздел «по этому пока мы не считаем меньшую производительность Pink RabbitMQ проблемой»

    перевирать названия

    Pink — один из наших корпоративных цветов

    RabbitMQ — стандартная часть названия, указывающая с кем обмениваемся

    Reply
  10. Evil Beaver

    (10) Ой, блин, ну продолжайте делать вид, что названия вообще никак не коррелируют в семантике

    Reply
  11. Begemoth80

    (9)

    я ожидал увидеть хотя бы минимальный обзор этого продукта

    В статье содержится 3 прямые ссылки на Yellow RabbitMQ (в самых первых разделах) и по тексту он упоминается несколько раз

    Reply
  12. Evil Beaver

    (12) ну блиин, вы серьезно считаете «упоминание» и «обзор» синонимами?

    Reply
  13. Begemoth80

    (13)

    Возьмем к примеру ПароВоз и ТеплоВоз.

    Кажется что:

    1.То что в этих словах часть слова одинаковая не является проблемой или перевиранием названия

    2.В статье на WiKi про ТеплоВоз не должно быть обзора ПароВоза, но должна быть на него ссылка

    Reply
  14. Evil Beaver

    (14) вы сейчас на какую мою фразу отвечаете? Если вверх по ветке переписки, то в этой ветке нет ничего про названия, эта ветка про обзор.

    Reply
  15. oleg-x

    (14) С названием продукта все очень сложно. Например попробуйте выпустить свой продукт (компьютер/планшет/телефон/часы и прочие технологические продукты) с названием Apple, налетят юристы и начнут судится, за плагиат торговой марки.

    Reply
  16. vandalsvq

    А что с БИТ случилось? Я что-то пропустил и они начинают превращаться в корпорацию «добра»?

    Или стартапу БИТ:ERP вдруг дали немного больше привилегий, чем остальным?

    Reply
  17. Begemoth80

    (15) я отвечаю на фразы из (13) и (11) одним примером

    Reply
  18. ZLENKO

    Ждем реализацию вендором протокола AMQP 🙂

    Reply
  19. Begemoth80

    (19) А чем это будет лучше/полезней чем компонента с открытым исходным кодом (кроме маркетинга)?

    Т.е. если посмотреть код компоненты, то никакой «хитрой» логики там нет, это всего-лишь небольшая надстройка над типовой библиотекой AMQP-CPP для взаимодействия с 1С.

    Что бы 1С могла туда полезного добавить с точки зрения функций или технологий?

    Reply
  20. TODD22

    (20)

    Что бы 1С могла туда полезного добавить с точки зрения функций или технологий?

    Поддержку из коробки, без всяких компонент.

    Reply
  21. Begemoth80

    (21) А чем поддержка

    из коробки, без всяких компонент

    лучше чем внешняя компонента с открытым кодом?

    Т.е. с точки зрения кода 1С отличие в 2 сточках, где подключается компонента.

    Reply
  22. Tahallus

    (17) БИТ вообще волшебная компания, сотрудник БИТ-а чтобы обучиться БИТ:Адаптер должен сам заплатить деньги в размере 50к, внезапно )), так что похоже на чье-то несогласованное действие. Предвижу что либо удалять все это, либо больше не будут обновлять репозиторий.

    Reply
  23. Begemoth80

    (6)

    название, основанное на названии конкурирующего продукта

    Мне кажется что компонента PinkRabbitMQ не является конкурентом продукту Yellow RabbitMQ, также, как она не является конкурентом нашему же продукту Адаптер(иначе мы бы ее не публиковали, так ведь?).

    Компонента — это всего лишь компонента (обертка над типовой библиотекой), а «Подсистема Yellow RabbitMQ содержит в себе высокоуровневые абстракции для наиболее распространенных схем» (цитирую из статьи по ссылке).

    Т.е. в том же Адаптере, на мой взгляд, ценность не в транспорте, а в том, что он на типовых (и не типовых) конфигурациях позволяет сделать обмен из коробки.

    С другой стороны чем больше людей познакомятся с новой технологией, тем лучше (а открытый код компоненты этому способствует)

    Reply
  24. Begemoth80

    (23)

    ибо удалять все это

    Как можно удалить опубликованный и 7 раз «форкнутый» репозиторий? 😉

    Reply
  25. glebushka

    (23)

    (17) БИТ вообще волшебная компания, сотрудник БИТ-а чтобы обучиться БИТ:Адаптер должен сам заплатить деньги в размере 50к, внезапно )).

    Это сейчас было сугубо для пущего эпатажа? Если нет, прошу сообщить (можно в личку) конкретику: кто, когда, кому и при каких обстоятельствах в компании Первый БИТ предложил курс сотруднику за 50 тыс. руб.?

    Сотрудникам компании офисом-разработчиком (БИТ:ERP) предоставляются скидки для повышения квалификации, и по имеющейся практике офисы, где работает сотрудник, компенсирует затраты на обучение и сертификацию по БИТ.Адаптер вплоть до 100% от стоимости (но это зависит от офиса, сотрудника и его руководства).

    Reply
  26. Tahallus

    (25) не так выразился бро, удалять статью и обсуждение, забросят репозиторий.

    Reply
  27. Tahallus

    (26) И правда попутал, БИТ стал великодушен и для собственных холопов сделал скидку.

    Reply
  28. Begemoth80

    (27)

    удалять статью и обсуждение, забросят репозиторий

    Зачем? Я вроде попытался описать нашу мотивацию в статье и в этом комментарии (24).

    Т.е. это не баг, это фитча 🙂

    И да, мы ожидаем, что в результате публикации компоненты https://github.com/BITERP/PinkRabbitMQ придут разработчики, и помогут сделать ее лучше

    Reply
  29. Begemoth80

    (27)

    удалять статью и обсуждение

    Зачем? Я вроде в статье и в комментарии (24) попробовал описать нашу мотивацию.

    Т.е. это не баг, это фича 🙂

    И да, мы заинтересованы в том, чтобы на GitHub в репозиторий компоненты пришли разработчики, и помогли сделать компоненту лучше.

    Reply
  30. TODD22

    (22)

    лучше чем внешняя компонента с открытым кодом?

    А чем хуже?

    Reply
  31. TODD22

    (28)

    И правда попутал, БИТ стал великодушен и для собственных холопов сделал скидку.

    Скоро придётся доплачивать за работу в БИТе:

    -Вам выпала великая честь работать в нашей компании, с нашими отраслевыми продуктами, с вас 50 тыс руб в месяц и на работу просим не опаздывать.

    Reply
  32. Begemoth80

    (31) На мой взгляд особой разницы нет, по этому будет сложно просить

    реализацию вендором протокола AMQP
    Reply
  33. Rashid80

    «В рамках теста из базы УТ10.3 в базу ERP переносился 1241 документ и проводился в ERP (реализации товаров превращались в поступления)



    План обмена из БСП в формате КД2″

    Не понятно — вы гоняли тяжелые XML через кролик или что? В чем заключается обмен с помощью кролика?

    Reply
  34. Begemoth80

    (34) Обмен с использованием Pink RabbitMQ и Yellow RabbitMQ выполняется с помощью Адаптера, там свой достаточно легковесный формат (в принципе у нас есть в общедоступной документации, но могу отдельно про него написать). Данные передаются через кролика.

    Обмен «из БСП в формате КД2» выполняется через файлы (т.е. «типовой обмен», кролик тут не участвует)

    Reply
  35. Begemoth80

    (19) (21) Мы опубликовали вопрос платформе https://partners.v8.1c.ru/forum/topic/1846210

    Reply
  36. qwed557

    (28) И правда волшебная контора, своих же сотрудников для работы со свей же разработкой обучать за деньги сотрудников.

    Reply
  37. Gureev

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

    Не слушайте завистников и злопыхателей.

    Комерсы всегда будут втыкать палки в колеса технического прогресса.

    Reply
  38. artbear

    (38) Коллега, Вы бы почитали (2) (6) (8) и задумались, что, возможно, ситуация с «новым» продуктом все-таки сильно (!) отличается от простого «Сделать открытый продукт и выложить исходники» 🙁

    Reply
  39. Gureev

    (39) Я все прочитал.

    Воровство кода доказано? — Нет.

    Название? — Я думаю Битлз были первыми.

    API? — Ну логично, что будет что-то совместимое. Программист же не идиот, делать несовместимый продукт с написанной инфраструктурой.

    Я помню ситуацию с маней, когда кто-то написал аналог его супер-пупер «продукта», сколько было вони.

    А потом как маню феерично выпилили с ИС из-за жадности.

    Reply
  40. theshadowco

    (10)

    RabbitMQ — стандартная часть названия, указывающая с кем обмениваемся

    (10) В поддержку названия (и только его) посмотрите на github https://github.com/search?p=5&q=RabbitMQ&type=Repositories

    Reply
  41. izidakg

    Сейчас мало кто выкладывает исходный код, даже уже «устаревших» решений и уже поэтому автору спасибо, а учитывая актуальность темы — СПАСИБО

    Если получится, с большим удовольствием поучаствую хотя бы в тестировании.

    Что касается благодарности, то как понимаю вопрос не в отсутствии, а качестве))) Ну а по претензии что API 1-в-1 вопрос: кто помнит про такое понятие как СТАНДАРТЫ, ГОСТ? В конце концов даже в публикации от Yellow RabbitMQ есть раздел «Без имени нет предмета».

    Получается при желании разработать свой продукт, разработчик должен придумать все свои наименования объектов, команд? Возможно есть ситуации где это реально необходимо, но в большинстве случаев это глупость мешающая развитию.

    А в целом статья Yellow RabbitMQ мне очень понравилась, для важно было подробное описание элементарных вещей, жаль нет возможности поработать с компонентой без оплаты. Эта статья по сути как продолжение, что-то вроде технического описания с приложенным функционалом для работы

    Reply
  42. leemuar

    (33) ЕМНИП внешние компоненты не умеют работать с коллекциями (массивы, структуры) и другими встроенными объектами (потоки, например). Это не всегда удобно

    Reply
  43. Begemoth80

    (42)

    Если получится, с большим удовольствием поучаствую хотя бы в тестировании.

    Да, вы бы могли очень помочь проекту.

    Сейчас у нас выполняется автоматическое тестирование сборок компоненты с использованием ADD (он тоже есть на GitHub, его делает Артур, он тоже участвует в этом обсуждении).

    ADD нам полностью подходит, но сама проверка выполняется на тестах Адаптера.

    Т.е. мы автоматически заменяем компоненту на новую сборку в Адаптере, и прогоняем на нем функцональные тесты (результат в виде бэджика в репозитории)

    С точки зрения проверки, что ничего не сломали, это хорошо, но мы не можем отдать эти тесты партнерам, а хотелось бы, чтобы они сами могли тестировать свои доработки в компоненте.

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

    1. Разработать некий минимальный (но полный) набор BDD тестов которые проверяют именно работу компоненты, например используя ADD

    2. Включить эти тесты в репозиторий PinkRabbitMQ

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

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

    Мы чуть позже выложим в репозиторий файлик CONTRIBUTING.MD в котором опишем правила, как можно вносить изменения в репозиторий. Но если вам интересна такая задача, то можно прямо сейчас начать с создание соответсвующей issue в репозитории.

    Reply
  44. hawk911

    (44) тогда, да — некрасиво получается.

    Reply
  45. Evil Beaver

    (40) воровства кода нет. Я даже посмотрел в код — написано очень по 1совски «в лоб». Даже кажется знаю почему оно медленнее. Омнокод.

    И вообще, воровство в IT плоходоказуемое, ибо это на 80% идеи и лишь на 20% код.

    Еще раз повторюсь: сделать конкурирующий продукт это нормально. Сделать его бесплатным — нормально. В чистую содрать АПИ (недореализовав heartbeats, потому что ниасилили) и поведение, накрыв это ёрничающим названием — некрасиво. Просто некрасиво. Но легально

    Reply
  46. genayo

    (48) С названием несколько промахнулись, белый кролик имело бы намного более глубокий подтекст :))

    Reply
  47. izidakg

    (44) и все таки кто-то чего-то не договаривает и под «нахальства коллег» похоже имеется что-то другое, а не описанное в постах (2) (6) (8)

    про использование API 1-в-1 даже в (8) написано что это норма, продуктов похожихидентичных много и требовать другие наименования команд глупо.

    еще хотя основная мысль в этих трех постах что было слизано название, которое рождалось в муках творчества и это в серьез? в (6) даже высказано что авторы этой публикации должны были убрать из названия «Rabbit». Вопрос только один — а разве представители Пули являются разработчиком «Rabbit»? Если да, тогда они в праве требовать что-либо на эту тему.

    о претензии что Yellow RabbitMQ популизировало кролика, а тут приперлись на все готовое также раздута. Про кролика больше ни кто не пишет?

    Да статья получилась немного не политкорректна, ссылок на конкурента хватает. И как понимаю ключевая проблема в исходниках, что в наше время среди «крутых» разработчиков не принято.

    Разработчики как понимаю с нуля написали свою компоненту, если есть факты воровства кода, то должны быть приведены факты.

    Reply
  48. ripreal1

    Кстати, YellowRabbitMQ API — не что-то эдакое особенное, а просто переадресация и адаптация под 1С части методов либы, вероятно использованной в ее основе http://alanxz.github.io/rabbitmq-c/docs/0.5.0/annotated.html. Да и вообще обе либы ничего сами не делают по сути, а просто перенаправляют вызовы для их понимания 1С-ом. Нормальный С++ прогер может написать эту либу за 2 дня. И стоит ли ради таких вещей разводить споры?

    НО!
    Reply
  49. ripreal1

    (46) О том как поучаствовать в проекте см. файл CONTRIBUTING.MD

    Reply
  50. Infactum

    (51) 2 дня — это слишком оптимистичная оценка.

    Тесты? Причем не только юниты на уровне C++, но и интеграционные на 1С. Кросплатформенность? Да и ссылку вы дали на С библиотеку.

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

    Reply
  51. glebushka

    (49) это имя уже занято в 2012 году: https://github.com/kakaranet/white_rabbit 🙂 Причем там практически все варианты сочетаний с белым есть.

    Reply
  52. minimajack

    (53) ссылка на rabbitmq-c не относится к PinkRabbitMQ

    В статье все ссылки на либы : с++ и кроссплатформенные.

    2 дня — это как раз норм для MVP; что бы работало хоть как то.

    Тесты не обязательно как бы. Кому нужны могут сделать pull request.

    Reply
  53. Infactum

    (55) Ну а кому нужен MVP? Тем, кто просто хочет хайпануть, рассказывая , что использует «кролик» ?

    Реальному бизнесу нужен продукт. Надежный и протестированный. И на сколько я вижу PinkRabbit так и позиционируется. Хоть и сыроват пока.

    Так что фраза про 2 дня выглядит неуместной. Особенно в контексте этой темы, где постоянно сравнивают с продуктом пули.

    Reply
  54. minimajack

    Вот не понимаю я SB.

    (2)

    на утреннем совещании звучное название, напишешь компоненту, научишь людей Кролику, а они тебе за это сравнение производительности не в твою пользу, плагиат-троллинг названия, скопированный 1-в-1 API (который ты мучился сочинял, чтобы удобно было) и даже никаких спасибо. Ну бывает, чего

    Я бы еще понял претензии если бы вы компоненту писали работая в первом бите…а так либо работая в SB или по заказу SB.

    Давайте трезво:

    — Сравнение производительности — еще осталось добавить «ЗАПРЕТИТЬ ВЫКЛАДЫВАТЬ РЕЗУЛЬТАТЫ ЛУЧШЕ ЧЕМ ХХХХХХ»

    — SILVER BULLETES — хм…тоже цвет первый, совпадение….а давайте Yellow (желтая программа 1С) и RabbitMq сольем…вот круто будет! УНИКАЛЬНОСТЬ прям 100-го левела.

    — Написали обертку на популярную, или как нынче можно говорить — ХАЙПОВУЮ, технологию. Ну уж ampq-либы явно не сами писали. Как там в комплекте с поставкой от SB лицензии на opensource либы прикладываются?

    — Что то нет в опенсорсе «yellow rabbitmq» за что спасибо?

    — Спасибо за обучение технологией которую сами же и впариваете, REALLY?

    з.ы. Без обид парни…не храните все яйца в одной корзине. Я понимаю бизнес-шмизнес, но к такому надо быть готовым.

    з.з.ы. сори за срач не по теме

    Reply
  55. minimajack

    (56) MVP — minimum viable product. Даже если это будет работать медленно, синхронно, только получать сообщения — это все равно продукт который можно использовать в бизнесе.

    Понятно что есть риски, но зачем продавать со своей подсистемой «левую» компоненту, когда можно написать свою?

    Бит:Адаптер и «Событийная интеграция» — никто не сравнивает, сравниваются NativeApi компоненты в конкретной задаче.

    з.ы. Я не смог бы заопенсорсить продукт который ломает бизнес другим…но прогресс не может стоять на месте

    Reply
  56. mybracho

    (35) Где почитать про ваш внутренний легковесный формат?

    Reply
  57. Begemoth80

    (59) https://c.bit-erp.ru/pages/viewpage.action?pageId=36450607

    Если будут вопросы, спрашивайте

    Reply
  58. glebushka

    (58)

    Я не смог бы заопенсорсить продукт который ломает бизнес другим…но прогресс не может стоять на месте

    Вообще я не согласен, например, мы начали и не доделали https://github.com/BITERP/vanessa_debugger/

    Но мы всё-равно выложили. Вдруг кто доделает? Зачем велосипед с нуля делать?

    В общем, разумеется, не нужно вводить в заблуждение, но не выкладывать что-то потому что «вдруг у кого чего сломает» — имхо, неправильно.

    Но конкретно к данной компоненте это не относится. Используется уже на нескольких «нагруженных» внедрениях, и имеет вполне себе CI (отчет по которому доступен с гитхаб)

    Reply
  59. Evil Beaver

    (42) демо-версия YRMQ бесплатная, насколько я знаю.

    Reply
  60. minimajack

    (61) Спасибо убедили.

    Все что не выложено — исключительно по причинам личного характера. Если это кому нибудь надо — даешь опенсорс!!!

    Reply
  61. Begemoth80

    (45) Ну вроде в нашем конкретном случае это не является проблемой.

    Кажется, что проблема обходится, если вместе с компонентой делать некий общий модуль-обертку, в котором «спрятаны» подобные особенности. А функции этого модуля если смотреть «снаружи» уже не имеют таких ограничений.

    Reply
  62. izidakg

    (51) нескольких ссылок на их публикацию мало? если бы на инфостате не было публикации, то да. В конце концов Yellow RabbitMQ в первую очередь должен был дать ссылку на себя

    Reply
  63. Begemoth80

    (48)

    Даже кажется знаю почему оно медленнее. Омнокод.

    Подскажите пожалуйста, «куда копать» (мы не большие специалисты в с++)?

    Кажется для партнеров было-бы очень полезным, если бы в компоненте не было явного Омнокода, который к тому-же влияет на ее работу (а именно на производительность)

    Reply
  64. Evil Beaver

    (66) Ну не, посоны, давайте сами и без обид.

    Reply
  65. Eret1k

    Хорошее решение, но кое-чего все же не хватает.

    Почему не реализовали метод BasicGet?

    Вам не кажется что это, выглядит как минимум странно:

    Потребитель = КлиентКомпоненты.BasicConsume(ИмяОчереди, «», Истина, Ложь, 0);
    КлиентКомпоненты.BasicConsumeMessage(«», ОтветноеСообщение, 5);
    КлиентКомпоненты.BasicAck();
    

    Если уж вы пишите native и намекаете на использование consumer-a, то имеет смысл попробовать реализовать передачу «Описание оповещения» или «ДобавитьОбработчик»

    То что Я описывал на основании COM куда проще.

    Результат = Модель.BasicGet(ИмяОчереди, Ложь);

    Нет методов: QueueDeclarePassive() и ExchangeDeclarePassive(), а ведь они очень удобно позволяют проверять наличие обмена и очереди на сервере.

    Также брокер сообщений RabbitMQ поддерживает маршрутизацию сообщений не только по «routingKey» но еще и по «Headers», второе имеет смысл реализовать, так как в больших компаниях их использовать проще и более наглядно.

    P/S/

    Спасибо за OpenSource! В мире 1С этого всегда не хватает.

    Но мне кажется, что мое описание через com все же проще: https://infostart.ru/public/1051620/

    Reply
  66. zurapa

    (34) Мужик! Это просто жесть! Ты когда берёшь технологию, ты хотя бы посмотри чуть-чуть видосики от разрабов объясняющие, как это рабтает и для каких целей. Везде где говорят о кролике, говорят о том, что он для мелких порций данных но очень частых. Большое в него сувать — это как пытаться срать ракетами — будет очень больно и смертельно даже. Не спрашивай такие вещи! Их даже читать не нужно, об этом рассказывают!..

    Reply
  67. kembrik

    (17) Корпорация добра? Нет, не про них. Сам Адаптер как то «внезапно» со 150 подорожал до 200, плюс агрессивно навязывается недешевый саппорт. Ах вы купили год назад и не оплатили саппорт? Ну бывает. Надумали внедрять? Ну, хорошо. Оплатите саппорт за то время, которое не платили и ещё купите годик, будем разговаривать. Комплект поставки адаптера вообще за гранью, это конвертик с лицензией. Всё! Т.е за эти бабки мы даже инструкции «В бумаге» не получили

    Reply
  68. acanta

    Пока фирма 1с не сделает собственную сертификацию по постгресу и вообще каждый отдельной поддерживаемой СУБД как предшествующую экзамену на эксплуататора…

    Reply
  69. Rashid80

    (71)

    Если это ответ мне то я прекрасно знаю как работает кролик ибо использую его в других языках. Именно поэтому я и удивился как они скрестили обмен и кролика. По факту это просто rpc.

    Прежде чем рвать тельняшку и доказывать очевидное можно выдохнуть и спросить

    Reply
  70. glebushka

    (72)

    Кролик — весьма сомнительная технология, как и кафка для 1С.

    А кто вам сказал что клиентам нужно продавать кролика и данную компоненту к кролику? Это оупенсоурс, и незаконно 🙂

    Мы продаем решение, которое состоит из коробки, готовых шаблонов интеграций между популярными системами и курсом (с сертификацией) для специалистов заказчика. По практике спец, который ранее занимался обменами на КД2/3 в течение недели начинает делать обмены на БИТ.Адаптер, в течение двух недель скорость разработки интеграций становится не меньше чем раньше, а в течение месяц интеграции разрабатываются быстрее. При этом сообщения мелкие, передаются часто, доставляются быстро и надежно. Разница очевидна при этом не только спецам, но и конечным пользователям.

    А для корпораций есть версия КОРП, которая дополнительно и готовый CI-контур содержит. Но тут я соглашусь, для среднего бизнеса это пока слишком дорого в первичной настройке и обслуживании.

    Поэтому мы и не паримся, и вложили в опенсоурс. Так как те, кто пользуются нашей компонентой это:

    1. или энтузиасты, которые как минимум помогут улучшить и компоненту, и БИТ.Адаптер, как максимум — наши будущие сотрудники 🙂

    2. или наши будущие клиенты, которые столкнувшись с описанными проблемами, сформируют как раз ту потребность, которую закрывает БИТ.Адаптер.

    PS. С точки зрения сложности внедрения, поддержки и диагностики проблем традиционные решения гораздо сложнее чем кролик

    Reply
  71. ripreal1

    (69)

    Метод BasicGet() забирает только одно сообщение из очереди. На практических задачах требуется обычно забрать все сообщения из очереди. Поэтому его нет. Можно реализовать самому, т.к. он достаточной простой через issue и пулл реквест.

    Компонента не использует Внешние события, вт.ч. ОбработчикОповещение, т.к. все это работает только на клиенте. Это не очень удобно, учитывая, что полученное сообщение обычно сразу нужно записать на сервере. Поэтому на проектах компонента изначально инициализируется на сервере.

    По поводу QueueDeclarePassive() и ExchangeDeclarePassive(), В API компоненты в методах DeclareQueue и DeclareExchange предусмотрен параметр onlyCheckIfExists. Она еще не реализован, т.к. не было необходимости.

    «Headers» в данной компоненте вообще не поддерживаются. Если кому-то потребуется на реальных задачах можно завести issue на гитхабе, чтобы ускорить процесс

    Reply
  72. glebushka

    (69) (77) реально ускорит процесс примеры из жизни, где бы потребовался указанный функционал, которые бы были релевантны реальным или потенциальным пользователям БИТ.Адаптер.

    Если же это специфическое требование, нужное (69), то самый надежный способ: сделать самому и сделать пулл-риквест.

    Reply
  73. glebushka

    (73)

    Приношу извинения. Скорее всего вас неверно информировали. У нас изменилась не только цена. Было введено требование обязательного наличия квалифицированного специалиста в команде внедрения/поддержки.

    Мы не сможем у вас принять деньги за саппорт. Поскольку, как я понял из вашего сообщения, у вашей компании нет специалиста с действующим сертификатом «БИТ.Профессионал по интеграции».Это сейчас проверяется при каждой отгрузке. Поэтому если сертификата на этапе отгрузки не окажется, то мы возвращаем деньги (без отгрузки). Обратите внимание, чтобы не терять время.

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

    Reply
  74. vandalsvq

    (79) т.е. надо ещё м сертифицировать своего сотрудника чтобы с БИТ работать? А затраты на сертификацию бит компенсирует?

    Reply
  75. zurapa

    (75) Из вопроса было понято, что вы пытались запихать туда большое. А это только могут делать те, кто не знает особенностей, поэтому меня тут прорвало.

    Если вы это знаете, то могли бы намекнуть как-то в своём сообщении. Забавно же получилось в примером, про «срать ракетами»?.. 😉

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

    Мир вам.

    Reply
  76. glebushka

    (80) Нет, не компенсирует. Стоимость обучения и сертификации специалиста здесь: https://bit-erp.ru/adapter#edu

    Reply
  77. Begemoth80

    (75)

    По факту это просто rpc

    Уточните пожалуйста, что вы здесь имеете в виду?

    Что кролика можно использовать только для реализации RPC (remote procedure call) и нельзя/не эффективно использовать для передачи данных (даже если это просто информация о событии, например Создан контрагент ООО «Молоко»)?

    Reply
  78. zurapa

    (76) Позвольте я перефразирую ваши слова в контексте своего мнения как это выглядит на мой взгляд.

    Вы говорите, что не продаёте кролика, а лишь продаёте курсы обучающие определённому стеку технологий. Там во всей моей тираде, как раз и объясняется, что вы делаете. Вы придумываете новый стек технологий, новый уровень компетенций, чтобы:

    1. Из специалистов выжать деньги.

    2. Из компаний выжать деньги на новых специалистов, подготовленных вами.

    Это, как делать всё более требовательные к ресурсам приложения, чтобы покупали более дорогие и современные смартфоны.

    Утилитарно вы не несёте никакой пользы, лишь вкраиваете в технический стек ещё больше мусора, который потом просто так уже не выкинешь, а придётся поддерживать как-то.

    И Кстати о цене. У вас недешёвый продукт. Для большой корпорации это конечно не деньги, но вопрос в том, что это не хлеб… Платить деньги за кота в мешке, который не известно как будет работать на моей инфраструктуре — это как минимум не компетентно. Ваши тесты и обещания это не о чём.

    Если вы такие прогрессивные за OpenSource сделайте так, чтобы нужно было платить за поддержку, обучении, сделайте продукт свободным для скачивания, а не 200-500 тыс. руб. Если продукт того стоит, то, думаю корпорации поддержат его рублём. Или нет?

    С 1С’овской иглой и так всё понятно, к ней привыкли, с неё не соскочить. А ваша иголка очень дорогая. Но если 1С упирается где-то в потолок своих возможностей, и компания позволяет содержать штат разработчиков, то я бы что-нибудь своё, или из opensource взял и допиливал в складчину с другой такой же отчаянной компанией, нежели платил бы за очередной костыль для 1С, который всё равно упрёт меня в потолок но чуть позже.

    П,С.: OpenSource можно продавать, и это законно. Вы всего лишь должны полностью открыть код для разработчиков, чтобы они могли его взять и поправить. Так работает BSD лицензия. Вы можете взять любой BSD код и продавать его. Можете его скопировать, модифицировать, закрыть и продавать. OpenSource — открытый код. Там не сказано про запрещение продавать. И даже в GPL если не ошибаюсь можно продавать такой код — только закрывать нельзя.

    Reply
  79. Eret1k

    (77)

    Метод BasicGet() забирает только одно сообщение из очереди. На практических задачах требуется обычно забрать все сообщения из очереди. Поэтому его нет.

    Со всем уважением к данным трудам, но в данной реализации:

    КлиентКомпоненты.BasicConsumeMessage(«», ОтветноеСообщение, 5) Тогда
    КлиентКомпоненты.BasicAck();

    И

    Результат = Модель.BasicGet(ИмяОчереди, Ложь);

    делают абсолютно одно и тоже.

    Если Я правильно понимаю API, чтобы забрать все сообщения через компоненту, нужно:

    Потребитель = КлиентКомпоненты.BasicConsume(ИмяОчереди, «», Истина, Ложь, 0);
    МассивСообщений = Новый Массив;
    ОтветноеСообщение = «»;
    Пока КлиентКомпоненты.BasicConsumeMessage(«», ОтветноеСообщение, 5) Цикл
    КлиентКомпоненты.BasicAck();
    МассивСообщений.Добавить(ОтветноеСообщение);
    КонецЦикла;

    Если бы реализовали Метод BasicGet() и MessageCount() было бы так:

    МассивСообщений = Новый Массив;
    Пока КлиентКомпоненты.MessageCount(ИмяОчереди) Цикл
    Результат = КлиентКомпоненты.BasicGet(ИмяОчереди, Ложь);
    МассивСообщений.Добавить(Результат.Сообщение);
    КонецЦикла;

    Второй вариант красивее и более интуитивно понятный чем имеющийся на данный момент.

    Reply
  80. kembrik

    (79) Это достаточно новая инициатива, на момент покупки нами адаптера таковой не было. То есть, получается что затраты на Адаптер сейчас составят 200 тысяч за конвертик с лицензией, 50 тысяч за доступ на месяц к курсам (эффективность их и наполнение под большим вопросом) и 20 тысяч за сертификат специалисту, заплатить 67 тысяч за обновление и каждый год потом ещё оплачивать 67+20 (обновления плюс подтверждение сертификата). Не знаю как у вас, но у меня перед глазами стоит Золотая антилопа.

    А нет ли лёгкого диссонанса с утверждением:

    Мы продаем решение, которое состоит из коробки, готовых шаблонов интеграций между популярными системами и курсом (с сертификацией) для специалистов заказчика. По практике спец, который ранее занимался обменами на КД2/3 в течение недели начинает делать обмены на БИТ.Адаптер, в течение двух недель скорость разработки интеграций становится не меньше чем раньше, а в течение месяц интеграции разрабатываются быстрее. При этом сообщения мелкие, передаются часто, доставляются быстро и надежно. Разница очевидна при этом не только спецам, но и конечным пользователям.

    Фирма же, которая по новым правилам приобрела Адаптер, купила доступ на месяц к курсам и провела сертификацию специалиста, при увольнении данного специалиста получает неработающий немасштабируемый блок, сравнимый по стоимости с ERP

    Нет у вас «коробки», не вводите людей в заблуждение. По крайней мере не было год назад. Есть бумажка с лицензией, пара ссылок на Confluence и файлик с внешней обработкой, всё. «Коробочный» продукт в понимании человека, который выделил на данный «прожект» деньги это сущность, позволяющая сотруднику с определенным опытом работы, но без опыта работы с «кроликом» через неделю после покупки выдать MVP.

    Ну это если вынести за скобки фактическую функциональность Адаптера, особенно если попробовать реализовать на нём «из коробки» обмены типовых конфигураций. не относящихся к «Большой тройке»

    Вы молодцы, тут вопросов нет, светлые головы, жадные до денег, вот только денег вам дарить больше не хочется, лучше дождаться когда 1С в типовых добавить «обмен через кролика» и мне всё равно чью внешнюю компоненту они возьмут за основу, из данного топика или «ту, другую»

    Reply
  81. kabanoff

    Не получается проверить вашу компоненту.

    Создал себе тестовый стенд на cloudamqp.com, в демонстрационной обработке прописал параметры подключения. При попытке подключиться обработка напрочь зависает как на клиенте, так и на сервере. Зависает на методе КлиентКомпоненты.Connect().

    Reply
  82. ripreal1

    (85) Не получится так сделать. Нет метода, который позволяет получить количество сообщений в очереди. Кроме того мы делали API совместимое с серебрянной пулей.

    Reply
  83. ripreal1

    (87) Компонента зависает, если пытается подключиться к порту, которого не сущесвует на сервере. Поэтому скорее всего неправильно прописан порт.

    Reply
  84. glebushka
    Reply
  85. kabanoff

    (89) Да, всё получилось. Спасибо!

    Reply
  86. altu71

    Напишите, пожалуйста, поподробнее, что нужно сделать, чтобы заработала ваша компонента на сервере под Линуксом? Достаточно собрать с указанием нужной платформы или нужно вносить изменения в исходный код компоненты? Если второе, то планируете ли вы в ближайшее время это сделать? В наше импортозамещаемое время это было бы актуально для многих, мне кажется.

    Reply
  87. kembrik

    (90) «Сообщение не отправлено, отложенная группа», что бы это ни значило. ник в Tg @Kembreg

    Reply
  88. ripreal1

    (92)

    Код нуждается в небольшой доработке. Кроме этого нужно пересобрать 2 зависимости, а также сделать новый конфиг в sln проекте для запуска под линукс. Пока таких планов нет. Контрибьюторы приветствуются.

    Reply
  89. Alex_Smolensky

    (62) может она бесплатная для избранных. Мне не удалось достать ни демо-версию ни описание к ней ни через сайт ни через телефон.

    Reply
  90. leobrn

    а как в компоненте закрыть соединение ? .Close() не отрабатывает, в документации компоненты не нашел.

    Reply
  91. ripreal1

    (97)

    Соединение закрывается автоматически при очищении NativeAPI объекта. Нужно установить переменную компоненты в Неопределено. Метода Close() не предусмотрено.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *