Интеграция решений на 1С и сервиса обмена данными RabbitMQ
Разработка - Системная интеграция - Внешние источники данных
WARNING
Данная статья не претендует на оригинальность и не является конечным решением. Подходы решения задач и примеры программного кода несут исключительно обучающий характер. |
В больших компаниях и холдингах не редкое явление встретить огромное количество интеграционных потоков. Бывают ситуации, когда эти потоки делались по факту потребности и на скорую руку. Решением для возможности управления такими потоками являются сервисы (службы или брокеры) обмена.
Некоторые плюсы использования единого сервера обмена:
- Один или несколько стандартных протоколов обмена данными;
- Возможность построить карту маршрутов передаваемых данных.
На данный момент один из бесплатных и популярных решений - сервис (отдельный сервер или служба) RabbitMQ. Данный сервис имеет множество библиотек под самые разные языки программирования за исключением 1С. Посмотреть подробное описание и возможности самого сервиса можно на его официальном сайте RabbitMQ.com
Итак приступим к "Hello world!" интеграции RabbitMQ и 1С!
Что нам нужно:
- Платформа 1С v8.3.*;
- Сервер RabbitMQ с настроенным обменом и пользователем для подключения;
- Стандартная библиотека RabbitMQ Client для DotNet.
С первым пунктом все ясно, но со второго возникают сложности:
Бесплатный экземпляр сервера RabbitMQ (а точнее его хост) можно получить на CloudAMQP.com. Нужно просто зарегистрироваться, создать новый "инстанс" и новый хост с правами админа готов.
Библиотека RabbitMQ Client для DotNet:
Где получить:
-
Сама библиотека (v5) доступна в репозитории NuGet;
-
Имеет единственную зависимость Microsoft.Diagnostics.Tracing.EventSource.Redist v1.1.28
Как установить:
-
Можно установить через стандартные менеджеры пактов NuGet или DotNet;
-
Можно скачать оба пакета NuPkg, извлечь нужные DLL и зарегистрировать в windows через RegAsm.exe:
-
Для x32 \Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase <пусть до распакованной RabbitMQ.Client.dll>
-
Для x64 \Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /codebase <пусть до распакованной RabbitMQ.Client.dll>
-
-
Для корректной регистрации RabbitMQ.Client.dll через RegAsm, файл Microsoft.Diagnostics.Tracing.EventSource.dll должен быть в той-же папке.
Реализация программного кода 1С с подробными комментариями:
(код описанный ниже, теоретический может быть переписан под любой язык программирования поддерживающий работу с COM объектами, так как по сути вызывает стандартные методы библиотеки RabbitMQ.Client.dll, ПримерыAPI, ОписаниеAPI)
// выполнить тест отправки и получения сообщения через RabbitMQ
&НаСервере
Процедура ВыполнитьТестНаСервере()
// создать новый COM объект RabbitMQ Client Factory
Попытка
ФабрикаAMQP = Новый COMОбъект("RabbitMQ.Client.ConnectionFactory");
Исключение
Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
// установим параметры подключения
ФабрикаAMQP.HostName = АдресСервера;
ФабрикаAMQP.UserName = ИмяПользователя;
ФабрикаAMQP.Password = Пароль;
ФабрикаAMQP.Port = Порт;
ФабрикаAMQP.VirtualHost = Хост;
// попытка подключится
Попытка
Соединение = ФабрикаAMQP.CreateConnection();
Исключение
Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
// создать бызовые СОМ для работы с серврером RabbitMQ
Модель = Соединение.CreateModel();
ПараметрыОтправки = Модель.CreateBasicProperties();
// установим параметры обмена
ПараметрыОбмена = Новый Структура("ИмяМаршрута, ИмяОчереди, ИмяОбмена");
ЗаполнитьЗначенияСвойств(ПараметрыОбмена, ЭтаФорма);
////////////////////////////////////////////////////////////////////////////////////////////////////
// проверить наличие обмена и очреди
// если данные введены неверно то получим исключение
Попытка
Модель.ExchangeDeclarePassive(ПараметрыОбмена.ИмяОбмена);
Модель.QueueDeclarePassive(ПараметрыОбмена.ИмяОчереди);
Исключение
Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецПопытки;
// подготовить сообщение
// дело в том, что метод BasicPublish() принемает в качестве сообщения только массив байтов (COMSafeArray - VT_UI1)
// по этому соберем его !!!
ПотокВПамяти = ПолучитьДвоичныеДанныеИзСтроки(Сообщение, Кодировка).ОткрытьПотокДляЧтения();
ЧтениеДанных = Новый ЧтениеДанных(ПотокВПамяти, Кодировка);
СтрокаSafeArray = Новый COMSafeArray("VT_UI1", ПотокВПамяти.Размер());
Пока ПотокВПамяти.ТекущаяПозиция() < ПотокВПамяти.Размер() Цикл
Позиция = ПотокВПамяти.ТекущаяПозиция();
СтрокаSafeArray.SetValue(Позиция, ЧтениеДанных.ПрочитатьБайт());
КонецЦикла;
ЧтениеДанных.Закрыть();
ПотокВПамяти.Закрыть();
// собрали СтрокаSafeArray!
// подготовим параметры для отправки
ПараметрыОтправки.AppId = "Любимый 1С!"; // кто отправитель?
ПараметрыОтправки.ContentType = "text/plain"; // тип передоваемых данных
ПараметрыОтправки.DeliveryMode = 2; // 1 - хранить сообщение в ОЗУ сервера, 2 - хранить сообщение на диске сервера
ПараметрыОтправки.CorrelationId = Строка(Новый УникальныйИдентификатор); // - id сообщения
// вызвать метод отправки
// (помещать BasicPublish() в попытку нет смысла,
// он не вызыват исключений никогда, если типы передаваемых значений правельные)
Модель.BasicPublish(ПараметрыОбмена.ИмяОбмена, ПараметрыОбмена.ИмяМаршрута, False, ПараметрыОтправки, СтрокаSafeArray);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// проверить есть ли сообщения в очереди
Если НЕ Модель.MessageCount(ПараметрыОбмена.ИмяОчереди) Тогда
Возврат;
КонецЕсли;
// прочитаем одно сообщение из очереди
Результат = Модель.BasicGet(ПараметрыОбмена.ИмяОчереди, Ложь); // второй параметр делает BasicAck() - сразу, лучше сделать его потом
Если Результат = Неопределено ИЛИ Результат = NULL Тогда
Возврат;
КонецЕсли;
// получим массив байтов (оно же сообщение)
ОтветSafeArray = Результат.Body;
// получим параметры ответа
// это тоже самое что и ПараметрыОтправки только сейчас мы их получим обратно
ПараметрыОтвета = Результат.BasicProperties();
Сообщить(ПараметрыОтвета.AppID); // выведет того кто сообщение в Rabbit отправил - "Любимый 1С!"
// Тег доствки - число, позволяет удалить сообщение из очереди после приема
ТегДоставкиВПределахСессии = Результат.DeliveryTag;
// выпонить ответ об прочтении сообщения
// (без ответа оно не будет удалено и останеться в очереди)
Модель.BasicAck(ТегДоставкиВПределахСессии, false);
// преобразуем массив байтов в строку
ПотокВПамяти = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(ПотокВПамяти, Кодировка);
Для Каждого Байт Из ОтветSafeArray.Выгрузить() Цикл
ЗаписьДанных.ЗаписатьБайт(Байт);
КонецЦикла;
ЗаписьДанных.Закрыть();
Ответ = ПолучитьСтрокуИзДвоичныхДанных(ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные(), Кодировка);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// закртыть соединение
Модель.Close();
Соединение.Close();
КонецПроцедуры
Описание общих этапов алгоритма:
- Получение зарегистрированного COM объекта из стандартной сборки DotNet - RabbitMQ.Client;
- Создание соединения с сервером;
- Проверка правильности заполнения "Параметров обмена";
- Подготовка сообщения для отправки;
- Отправка сообщения;
- Проверка наличия сообщений для прочтения;
- Чтение сообщения;
- Преобразование сообщения в текст.
Плюсы использования:
- Реализация полностью OpenSource;
- Нет никакого платного либо самописного коннектора;
- Можно использовать и обновлять официальную библиотеку RabbitMQ.Client.dll.
Описание дополнительных способов кодирования и декодирования:
- Помимо манипуляции с байтами(описано тут) при помощи потоков можно еще использовать стандартный COM Объект "System.Text.UTF8Encoding".
Пример:UTF8Encoding = Новый COMОбъект("System.Text.UTF8Encoding"); СтрокаSafeArray = UTF8Encoding.GetBytes_4("Hello world!"); Строка = UTF8Encoding.GetString(СтрокаSafeArray);
Но тогда мы ограничиваем себя исключительно кодировкой UTF-8.
-
Еще можно использовать стандартные возможности платформы "Символ()" и "КодСимвола()", для сборки и разборки COMSafeArray. Но тогда мы ограничимся символами чей код не более 255 (как бы ASCII получается), потому что массив типа "VT_UI1" имеет однобайтовые ячейки.
P.S. так как обработка грубо говоря состоит из одной процедуры, выкладывать ее сюда не вижу смысла.
Специальные предложения
См. также
Интеграция решений на 1С и сервиса обмена данными RabbitMQ через Web REST API 61
21.10.2019 4998 Eret1k 12
Перенос данных УТ 10.3 => УТ 11 / КА 2 / ERP 2 (ЕРП 2) (документы, остатки и справочная информация из "1С:Управление торговлей, ред. 10.3" в УТ 11 / КА 2 / ERP 2). Обновлен до УТ 10.3.56.х, УТ 11.4.10.х, КА 2.4.10.х и ERP 2.4.10.х! Промо
Уже более 100 компаний приобрели перенос и выполнили переход на УТ 11 / КА 2 / ERP 2 с помощью нашей разработки! Обработка перехода с УТ 10.3 на УТ 11 / КА 2 / ERP 2 позволяет перенести не только остатки на указанную дату (как типовой перенос), но и все возможные документы за выбранный период. При выходе новых релизов этих программ оперативно выпускаем обновление обработки. Предоставляем техническую поддержку. Можем сделать бесплатный тестовый перенос!
29700 руб.
Вставка BLOB в таблицы ORACLE средствами 1С 8.х с использованием Microsoft OLEDB Provider 4
08.08.2019 1656 nomad_irk 0
Программы для исполнения 54-ФЗ Промо
С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.
1С и компьютерное зрение: новый подход к контролю за ассортиментом магазина 23
20.06.2019 4855 osipov_cvizi 16
Подборка программ для взаимодействия с ЕГАИС Промо
ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.
Перенос документов и справочников ERP 2 / КА 2 / УТ 11 => БП 3.0 Промо
Перенос позволяет настроить собственный обмен данными между указанными программами, альтернативный предлагаемому фирмой 1С. Предоставляем техподдержку по всем вопросам данного обмена. Можем подключиться к вам удаленно для разбора ситуаций. Оперативно обновляем при выходе новых релизов 1С. Бесплатные обновления в течение полугода.
19700 руб.
Перенос данных БП 3.0 => УТ 11 / КА 2 / ERP 2 (ЕРП) (перенос остатков, документов и справочной информации из "1С:Бухгалтерия предприятия 8", ред.3.0). Обновлено до БП 3.0.73.х, УТ 11.4.10.х, КА 2.4.10.х., ERP 2.4.10.х! Промо
Переносятся документы за выбранный период, справочная информация и остатки по счетам бух. учета в программу УТ 11 / КА 2 / ЕРП 2 (ERP). Переносятся все возможные виды операций ввода остатков на нужную дату. Есть отбор по периоду переноса документов и фильтр по организации, доступен выбор даты ввода остатков. Если нужно переносить что-то дополнительно, то обычно бесплатно добавляем это в перенос . Смотрите видеодемонстрацию со звуком - советами по переносу и рекомендациями настройки программ.
29700 руб.
Очный семинар по регулярному менеджменту Александра Фридмана "Вы или Хаос", 12 декабря 2019 г. , Санкт-Петербург Промо
Семинар по регулярному менеджменту от Александра Фридмана для собственников, первых лиц и топов. Технология управленческого планирования, комплексного управления временем и другими ресурсами, выполнением поручений, делами, информацией, контактами (встречи-звонки-почта).
от 11000 до 29000 рублей
Перенос данных КА 1.1 / УПП 1.3 => БП 3.0 (перенос остатков, документов и справочников из "1С:Комплексная автоматизация 1.1" / УПП 1.3 в "1С:Бухгалтерия 3.0"). Обновлен до версий КА 1.1.115.х, УПП 1.3.127.х! Промо
Разработка позволяет перенести остатки по всем счетам бух.учета в программу "1С:Бухгалтерия предприятия 8", ред. 3.0 на выбранную дату начала ведения учета. Также переносятся документы за период и вся необходимая справочная информация. Правила оперативно обновляю при выходе новых релизов. Рассылка обновлений правил бесплатно в течение 12 месяцев. Есть видеодемонстрация проведения переноса данных. Конфигурации при использовании обмена остаются полностью типовыми. Перенос данных возможен в Бухгалтерию 3.0 версии ПРОФ, КОРП или базовую.
24700 руб.
Программы для исполнения 488-ФЗ: Маркировка товаров Промо
1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.
Обмен сведениями о пособиях с ФСС для Зарплата и Управление персоналом 2.5.129.3 11
06.03.2018 15516 Igorexa 30
Готовые переносы данных из различных конфигураций 1C Промо
Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.
Создание мобильного клиента 1С на Android с использованием HTTP-сервисов 145
03.11.2017 28354 cdiamond 15
Как сделать конфигурацию «1С:Предприятие 8» приложением QuickBooks. Проходим авторизацию OAuth 1.0a+OpenID 2.0 53
10.09.2017 18127 pbazeliuk 28
Базовый курс по разработке мобильных 1C-приложений для Android-устройств. Третий поток. Онлайн-интенсив с 11 февраля по 05 марта 2020 г. Промо
Данный онлайн-курс предусматривает изучение базовых принципов создания приложений для операционной системы Android, работающих на мобильной платформе “1С:Предприятие”. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие” при разработке прикладных решений для “обычных” компьютеров, но пока ещё не занимался разработкой 1С-приложений, предназначенных для работы на мобильных устройствах.
7500 рублей
Редактирование пользовательских полей в Битрикс24 через REST API 7
06.02.2017 12474 user662672_explorer2000 2
Новый раздел на Инфостарте - Electronic Software Distribution Промо
Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.
- Низкие цены, без скрытых платежей и наценок
- Оперативная отгрузка
- Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
- Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)
Новогодние скидки на авторское ПО Промо
В преддверии праздника в Маркетплейсе на Инфостарт действует скидка на все платные авторские программы. Размер скидок начинается от 10%. Советуем не откладывать покупки, многие наши партнеры повышают цены на свои продукты именно в начале нового года.
7 причин, почему интеграцию необходимо строить на очередях. Практика RabbitMQ. Отказ от Zato ESB и OData в 1С 167
18.03.2016 57680 pbazeliuk 125