Интеграция решений на 1С и сервиса обмена данными RabbitMQ

0. Eret1k 786 24.04.19 11:12 Сейчас в теме
"Hello world" из 1С на сервер RabbitMQ и обратно. Полностью открытый код 1С!
Реализация протестирована на 1С 8.3.12.1714 (x64).

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 24.04.19 13:03 Сейчас в теме
Некоторые плюсы использования единого сервера обмена:

Один или несколько стандартных протоколов обмена данными;
Возможность построить карту маршрутов передаваемых данных.



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

в общем, если плюсов больше нет, то минуса:
- сливать свои данные куда-попало;
- изучать нечто долго и упорно с риском, что
-- его блокнут;
-- оно перестанет работать;
-- захочет денег.
-

как-то отпугивают
Andreeei; AneJIbcuH; Eret1k; +3 5 Ответить
3. TODD22 19 24.04.19 13:31 Сейчас в теме
(1)
- сливать свои данные куда-попало;
- изучать нечто долго и упорно с риском, что
-- его блокнут;
-- оно перестанет работать;
-- захочет денег.

Так можно и свой сервер развернуть.
Irwin; maxopik2; berezdetsky; Robbi; Eret1k; +5 Ответить
6. Eret1k 786 24.04.19 16:55 Сейчас в теме
(3) Не просто развернуть!
Превратить в собственный бесплатный провайдер EDI.
7. TODD22 19 24.04.19 18:03 Сейчас в теме
(6)
Превратить в собственный бесплатный провайдер EDI.

За свой счёт это не бесплатно :) бесплатно это за чужой счёт :)
Andreeei; RFP; Eret1k; +3 Ответить
2. Идальго 133 24.04.19 13:14 Сейчас в теме
Хм, никогда не сталкивался с такими системами (как разработчик). Скажите пожалуйста, а вы этот RabbitMQ внедрили у себя в проекте (в конторе), или просто изучали возможность интеграции? Какие результаты от внедрения, решило ли это какие-то проблемы(если таковые были, конечно)?
mip128; Eret1k; +2 Ответить
5. Eret1k 786 24.04.19 16:12 Сейчас в теме
(2)
Внедрение RabbitMQ, да это был проект,
Решило ли проблемы - да,
Результаты - положительные,
Проблемы, а куда без них)
Стоило ли оно того - однозначно да!

А вообще тут рядом живут две полезные статьи: "Что такое обмен сообщениями" и Хорошое описание масштабной интеграции через RabbitMQ
juliia1992; barelpro; +2 Ответить
4. Senator_I 13 24.04.19 15:07 Сейчас в теме
Я читал, как на основании таких запросов получали моментально данные по чекам (только на кассе закрывался чек, тут же летел в RabbitMQ, а оттуда уже в 1С, в итоге продажи приходили в Центр практически онлайн, причем через самое плохое интернет-подключение и без УРБД.
Evil Beaver; maxopik2; MaZaHacKa_13; Eret1k; +4 Ответить
8. Infactum 283 24.04.19 19:50 Сейчас в теме
(4) Думаю вот статья, которую вы читали.
Evil Beaver; Eret1k; +2 Ответить
18. Senator_I 13 25.04.19 08:27 Сейчас в теме
34. Evil Beaver 6776 08.08.19 17:50 Сейчас в теме
(18) О, дык это ж я писал :)
Senator_I; +1 Ответить
38. Senator_I 13 09.08.19 09:51 Сейчас в теме
(34) о как, рад познакомится с автором, статья очень зашла, жаль поздно узнал, на одном проекте как раз такое нужно было.
9. Labotamy 24.04.19 20:50 Сейчас в теме
Вот все отлично кроме com(
zakiap; Evil Beaver; olegtymko; acanta; +4 Ответить
10. spogo 2 24.04.19 21:27 Сейчас в теме
11. Labotamy 24.04.19 22:24 Сейчас в теме
(10) Мне известен только один кроссплатформенный метод расширения функциональных возможностей платформы - внешние компоненты по технологии Native API.

А эту цитату из документации я просто оставлю тут:

При работе на сервере «1С:Предприятия» допустимо использовать только компоненты, разработанные по технологии Native API, которые могут быть как отдельными файлами, так и упакованными в специальные zip-архивы.
okulus; zakiap; Evil Beaver; comol; acanta; +5 Ответить
12. Идальго 133 24.04.19 23:36 Сейчас в теме
(11) Погодите, ведь тут речь о системе, которая, как я опять же понял, обеспечивает гарантированную доставку с использованием специального механизма очереди. Хм, ну в таком случае можно через rest, grpс, наконец сокеты передавать в некий сервак(т.н. брокер) сообщения. Там они ставятся в стековую очередь, сервак выдает квитанцию что типа получил и зарегал сообщение (все это в рамках одной транзакции). Ну и всё, а далее сервак примерно таким же макаром передает сообщение приемнику, а тот подтвержает через аналогичный механизм подтверждения доставки. Теперь брокер может считать это сообщение доставленным. Как-то так. И тут не нужно никаких com или ВК))) Хотя для сокетов всеж потребуется.
17. Labotamy 25.04.19 08:22 Сейчас в теме
(12)Речь о добавлении поддержки протокола amqp в платформу.
13. comol 4344 25.04.19 00:35 Сейчас в теме
Получение сообщений из очереди путём регулярного опроса RabbitMQ с заданным интервалом... хм... В случае такой "Архитектуры" точно нужен RabbitMQ? Ну и как бы COMSafeArray... ну нельзя так :(
GreenDragon; +1 Ответить
35. Evil Beaver 6776 08.08.19 17:52 Сейчас в теме
(13) Где ком, там и safearray, чего удивительного. Бяка? Бяка. Зато бесплатно и без этих ваших сиплюсплюсов. (Про добавленный гемор с RegAsm умолчим, к тому же Labotamy все сказал выше)
14. d.zhukov 738 25.04.19 07:43 Сейчас в теме
Добрый день. К сожалению, некогда вникать в тему. Просто подскажите плз, можно ли данной штукой отправить файл (допустим pdf) на сервер rabbitmq и получить ссылку на его открытие в браузере без каких-либо авторизаций?
15. GreenDragon 25.04.19 08:12 Сейчас в теме
(14) Вам немножко не сюда. Вам бы файлопомойку без авторизации организовать под такую задачу.
16. Labotamy 25.04.19 08:16 Сейчас в теме
36. Evil Beaver 6776 08.08.19 17:52 Сейчас в теме
19. EvgeTrofi 19 08.05.19 11:54 Сейчас в теме
Подскажите пожалуйста, чему у Вас равны переменные:
	ФабрикаAMQP.HostName = АдресСервера;
	ФабрикаAMQP.UserName = ИмяПользователя;
	ФабрикаAMQP.Port = Порт;
	ФабрикаAMQP.VirtualHost = Хост; 

Я задал
	АдресСервера = "zebra.rmq.cloudamqp.com";
	ИмяПользователя = "kibgbbpf";
	Порт = "1883";
	Хост = "kibgbbpf";

После строчки
Соединение = ФабрикаAMQP.CreateConnection();

Получается ошибка: Произошла исключительная ситуация (RabbitMQ.Client): None of the specified endpoints were reachable
Не знаете, в чём может быть причина?
20. Eret1k 786 08.05.19 18:35 Сейчас в теме
(19)
Скорее всего проблема с номером порта:
у меня так - ФабрикаAMQP.Port 5 672 Число

Я смог повторить вашу ошибку, когда правилами файрвола закрыл напрочь этот порт:
{ВнешняяОбработка.HelloWorldForRabbitMQ.Форма.Форма.Форма(46)}: Ошибка при вызове метода контекста (CreateConnection)
        Соединение = ФабрикаAMQP.CreateConnection();
по причине:
Произошла исключительная ситуация (RabbitMQ.Client): None of the specified endpoints were reachable
soci0pat; juliia1992; EvgeTrofi; +3 Ответить
21. EvgeTrofi 19 13.05.19 05:58 Сейчас в теме
(20) Огромное спасибо! Проблема была в номере порта. Его действительно нужно задавать числом, а не строкой.
soci0pat; Eret1k; +2 Ответить
22. dracoola 05.06.19 11:57 Сейчас в теме
Добрый день, пытаюсь подключиться к облачному CloudAMQP.com выпадает ошибка
None of the specified endpoints were reachable

ФабрикаAMQP.HostName = "toad-01.rmq.cloudamqp.com"; ФабрикаAMQP.UserName = "afaneugp"; ФабрикаAMQP.Port = 1883; ФабрикаAMQP.VirtualHost = "afaneugp";

Подскажите,пожалуйста, в чем может быть проблема ? Ошибка выпадает именно на моменте самого подключения. Порт задан именно числом . Пробовала и другой 8883, ошибка аналогична (
23. Eret1k 786 05.06.19 12:45 Сейчас в теме
(22)номер порта очень странный у вас.
С чего вы вообще взяли эти цифры?
24. dracoola 05.06.19 12:58 Сейчас в теме
25. dracoola 05.06.19 12:59 Сейчас в теме
Может что то неправильно настроила изначально . Такие настройки в облачном кролике
26. Eret1k 786 05.06.19 13:39 Сейчас в теме
(25) попробуйте порт по умолчанию 5 672
juliia1992; dracoola; +2 Ответить
27. Eret1k 786 05.06.19 19:45 Сейчас в теме
(25)Проверил, у меня в облаке как ни странно тоже указан порт 1883 но работает нормально только по 5 672
28. dracoola 05.06.19 20:12 Сейчас в теме
(27) спасибо огромное!! вначале вывалилась какая-то другая ошибка, но в итоге все заработало!!!
29. juliia1992 19.06.19 15:56 Сейчас в теме
Добрый день! При попытке подключения к фабрике
ФабрикаAMQP = Новый COMОбъект("RabbitMQ.Client.ConnectionFactory");
возникает ошибка: "Класс не зарегистрирован!" Кто-нибудь сталкивался с такой проблемой?
Прикрепленные файлы:
30. Eret1k 786 19.06.19 18:58 Сейчас в теме
(29) Значит RabbitMQ.Client.dll не зарегистрирован в системе.
31. juliia1992 20.06.19 08:48 Сейчас в теме
(30) Компоненту регистрировала
Для x64 \Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /codebase <пусть до распакованной RabbitMQ.Client.dll>
И файл Microsoft.Diagnostics.Tracing.EventSource.dll положила в ту же папку, где и лежит RabbitMQ.Client.dll.
32. Eret1k 786 20.06.19 16:14 Сейчас в теме
(31)странно
Есть в сети утилита показывающая все зарегистрированные библиотеки RegDllView Ссылка
Проверьте зарегистрировался ли тип: RabbitMQ.client или что-то на подобие того.
33. juliia1992 21.06.19 09:36 Сейчас в теме
(32) Спасибо, библиотека зарегистрирована.
Прикрепленные файлы:
37. Evil Beaver 6776 08.08.19 17:54 Сейчас в теме
(33) А теперь не забывайте повторять на каждом сервере 1С и в случае переездов с машины на машину. :)
39. GreenDragon 14.08.19 16:00 Сейчас в теме
40. 2dnk 26.09.19 16:02 Сейчас в теме
Коллеги, Дмитрий, приветствую!
Благодаря Вашему примеру смогли подключиться к Раббиту. Создали в нем очередь. А дальше просьба пояснить, чему должны быть равны параметры "ИмяМаршрута" и "ИмяОбмена". Я не нашел таких переменных в Раббит.

Ваш пример:
// установим параметры обмена
ПараметрыОбмена = Новый Структура("ИмяМаршрута, ИмяОчереди, ИмяОбмена");

Пока для меня только очевиден один параметр - ИмяОчереди

Заранее благодарен за помощь!
42. Eret1k 786 27.09.19 11:52 Сейчас в теме
(40)
Имя маршрута -> Routing key;
ИмяОбмена -> Exchange;
41. 2dnk 26.09.19 16:08 Сейчас в теме
и подскажите пожалуйста, где параметры "ИмяМаршрута" и "ИмяОбмена" прописываются в Реббит?
43. kotlovD 66 03.10.19 11:15 Сейчас в теме
Спасибо большое за статью! Реализовываем обмен данными 1С - сайт. Рэббит это просто панацея.

Есть одно замечание к коду 1С, а именно сериализация сообщения в ComSafeArray. Код из статьи работает очень медленно на больших объемах данных (может занимать до 90% всего времени выполнения обмена), также может вызывать ошибки выделения памяти.

Переписал на этот, может кому пригодятся:

	Текст = Новый COMОбъект("System.Text.UTF8Encoding");
	СтрокаSafeArray = Текст.GetBytes_4(ДанныеДляОбмена);
44. 2dnk 03.10.19 19:37 Сейчас в теме
(43) Спасибо за информацию!
46. Hawk_sib 23 20.02.20 07:55 Сейчас в теме
(43)
Текст.GetBytes_4(ДанныеДляОбмена);

а каким образом обратно строку получить не подскажите?
47. kotlovD 66 20.02.20 11:32 Сейчас в теме
(46)
а каким образом обратно строку получить не подскажите?


А зачем обратно строку? Она же как раз и содержится в переменной ДанныеДляОбмена.

Ниже весь мой метод отправки данных в раббита. В качестве данных для обмена он принимает либо строку, либо массив строк. В результате испытаний на реальных данных в случае больших посылок, когда к примеру идет первоначальный полный обмен, мы бьем посылку на несколько по 30 000 объектов. Были моменты когда одна большая не пролезала вне зависимости от квот настроенных на самом раббите

Функция ОтправитьДанныеВПроксиОчередьRabbitMQ(ДанныеДляОбмена, ПараметрыПодключения, КлючМаршрутизации) Экспорт
	
	Если ТипЗнч(ДанныеДляОбмена) <> Тип("Массив") Тогда
		МассивПосылок = Новый Массив;
		МассивПосылок.Добавить(ДанныеДляОбмена);
	Иначе
		МассивПосылок = ДанныеДляОбмена;
	КонецЕсли;
	
	ФабрикаAMQP = Новый COMОбъект("RabbitMQ.Client.ConnectionFactory");
	ФабрикаAMQP.HostName = Параметрыподключения.ПроксиОчередь.АдресРесурса;
	ФабрикаAMQP.UserName = Параметрыподключения.УчетнаяЗапись.Пользователь;
	ФабрикаAMQP.Password = Параметрыподключения.УчетнаяЗапись.Пароль;
	ФабрикаAMQP.Port 	 = 5672;
	//ФабрикаAMQP.VirtualHost = ПроксиОчередь.АдресРесурса; 
	
	// попытка подключится
	Попытка
		Соединение = ФабрикаAMQP.CreateConnection();
	Исключение
		Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;
	
	Модель = Соединение.CreateModel();
	ПараметрыОтправки = Модель.CreateBasicProperties();
	
	// подготовим параметры для отправки
	ПараметрыОтправки.AppId = "UPP"; // кто отправитель?
	ПараметрыОтправки.ContentType = "direct";//"text/plain"; // тип передоваемых данных
	ПараметрыОтправки.DeliveryMode = 2; // 1 - хранить сообщение в ОЗУ сервера, 2 - хранить сообщение на диске сервера
	ПараметрыОтправки.CorrelationId = Строка(Новый УникальныйИдентификатор); // - id сообщения
	
	Для Каждого Посылка Из МассивПосылок Цикл
	
		ТекстUTF8 		= Новый COMОбъект("System.Text.UTF8Encoding");
		СтрокаSafeArray = ТекстUTF8.GetBytes_4(Посылка);
					
		Попытка
			Модель.BasicPublish("WEB", КлючМаршрутизации, False, ПараметрыОтправки, СтрокаSafeArray);
		Исключение
			Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
			Возврат Ложь;
		КонецПопытки;
		
	КонецЦикла;
		
	Модель.Close();
	Соединение.Close();
		
	Возврат Истина;
	
КонецФункции
Показать
48. Hawk_sib 23 20.02.20 12:23 Сейчас в теме
(47)
А зачем обратно строку?


что бы в обратку в 1с читать
49. kotlovD 66 20.02.20 16:52 Сейчас в теме
50. Hawk_sib 23 21.02.20 10:14 Сейчас в теме
45. McSlym 23.12.19 13:58 Сейчас в теме
Добрый день.
Спасибо за статью.

У кого то есть готовый пример как подстроить обмен между 3 разных баз 1С, к примеру справочник Контрагенты, или любой другой, на базе текущей статьи. Очень хочется начать использовать RabbitMQ для синхронизации данных между несколько баз 1С и сайт.

Спасибо заранее

буду признателен если кто то соизволит помочь мне, как для меня это все очень новое )
51. Hawk_sib 23 21.02.20 11:15 Сейчас в теме
может быть кто сталкивался, с помощью указанной библиотеки (RabbitMQ Client для DotNet) отправляю и читаю данные в Rabbitе
отправляю просто строки длиной от 1 до 7 символов, заметил, что отправка происходит почти мгновенно, а вот чтение занимает чуть ли не вечность, результаты моих замеров:

Отправлено 60 сообщений(е) за 11 мс.,
затрачено на подключение и получение структуры модели 5995 мс.
Прочитано сообщений: 60 за 20768 мс.
затрачено на подключение и получение структуры модели 2422 мс.

заметил, что тормозит при чтении метод BasicAck

кто знает, это стандартное поведение кролика?
52. Hawk_sib 23 04.06.20 10:59 Сейчас в теме
BasicGet читает одно сообщение из очереди. Мы можем вызвать метод в приложении (из 1с) и прочитать только 1 сообщение. конечно в цикле можно вызвать его столько раз, сколько сообщений накопилось в очереди и будет прочитана очередь одним потоком. но RabbitMQ - сервер очередей, подразумевающий событиюную модель взаимодействия с приложениями. То есть сам RabbitMQ может "дёргать" методы 1С ки, что бы та, производила чтение. Пообщавшись с php программистами, выяснил, что есть событие BasicConsume, которе как раз возникает при появлении сообщения в очереди, вот его я бы и хотел научиться использовать, но к сожалению, не удалось ни декомпилить библиотеку, ни угодать как вызвать метод. Пробовал
ДобавитьОбработчик Модель.BasicConsume, ОбработатьСобытие;
- не взлетело. Может кто знает, где взять описание к библиотеке???
Оставьте свое сообщение
Вопросы с вознаграждением