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

Публикация № 1051620

Разработка - Системная интеграция - Внешние источники данных

Программирование RabbitMQ AMQP COM COMОбъект HelloWorld UTF-8 CP-1251 Интеграция Интеграции RegAsm DotNet .NET ПотокВПамяти Кодировка ЧтениеДанных ЗаписьДанных Байт COMSafeArray RMQ

"Hello world" из 1С на сервер RabbitMQ и обратно. Полностью открытый код 1С! Реализация протестирована на 1С 8.3.12.1714 (x64).

WARNING

Данная статья не претендует на оригинальность и не является конечным решением.
Подходы решения задач и примеры программного кода несут исключительно обучающий характер.

 

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

Некоторые плюсы использования единого сервера обмена:

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

На данный момент один из бесплатных и популярных решений - сервис (отдельный сервер или служба) RabbitMQ. Данный сервис имеет множество библиотек под самые разные языки программирования за исключением 1С. Посмотреть подробное описание и возможности самого сервиса можно на его официальном сайте RabbitMQ.com

Итак приступим к "Hello world!" интеграции RabbitMQ и 1С!


Что нам нужно:

  1. Платформа 1С v8.3.*;
  2. Сервер RabbitMQ с настроенным обменом и пользователем для подключения;
  3. Стандартная библиотека RabbitMQ Client для DotNet.

 

С первым пунктом все ясно, но со второго возникают сложности:

Бесплатный экземпляр сервера RabbitMQ (а точнее его хост) можно получить на CloudAMQP.com. Нужно просто зарегистрироваться, создать новый "инстанс" и новый хост с правами админа готов.

 
 Немного о предоставляемой CloudAMQP бесплатной услуге (тарифный план Little Lemur)

 

Библиотека 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 должен быть в той-же папке.

     
     Снимок экрана использования RegAam.exe

     


Реализация программного кода 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();
	
КонецПроцедуры

Описание общих этапов алгоритма:

  1. Получение зарегистрированного COM объекта из стандартной сборки DotNet - RabbitMQ.Client;
  2. Создание соединения с сервером;
  3. Проверка правильности заполнения "Параметров обмена";
  4. Подготовка сообщения для отправки;
  5. Отправка сообщения;
  6. Проверка наличия сообщений для прочтения;
  7. Чтение сообщения;
  8. Преобразование сообщения в текст.

Плюсы использования:

  • Реализация полностью OpenSource;
  • Нет никакого платного либо самописного коннектора;
  • Можно использовать и обновлять официальную библиотеку RabbitMQ.Client.dll.

Описание дополнительных способов кодирования и декодирования:

  1. Помимо манипуляции с байтами(описано тут) при помощи потоков можно еще использовать стандартный COM Объект "System.Text.UTF8Encoding".
    Пример:
    UTF8Encoding = Новый COMОбъект("System.Text.UTF8Encoding");
    СтрокаSafeArray = UTF8Encoding.GetBytes_4("Hello world!");
    Строка = UTF8Encoding.GetString(СтрокаSafeArray);
    

    Но тогда мы ограничиваем себя исключительно кодировкой UTF-8.

  2. Еще можно использовать стандартные возможности платформы "Символ()" и "КодСимвола()", для сборки и разборки COMSafeArray. Но тогда мы ограничимся символами чей код не более 255 (как бы ASCII получается), потому что массив типа "VT_UI1" имеет однобайтовые ячейки.

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

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
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 778 24.04.19 16:55 Сейчас в теме
(3) Не просто развернуть!
Превратить в собственный бесплатный провайдер EDI.
7. TODD22 19 24.04.19 18:03 Сейчас в теме
(6)
Превратить в собственный бесплатный провайдер EDI.

За свой счёт это не бесплатно :) бесплатно это за чужой счёт :)
Andreeei; RFP; Eret1k; +3 Ответить
2. Идальго 131 24.04.19 13:14 Сейчас в теме
Хм, никогда не сталкивался с такими системами (как разработчик). Скажите пожалуйста, а вы этот RabbitMQ внедрили у себя в проекте (в конторе), или просто изучали возможность интеграции? Какие результаты от внедрения, решило ли это какие-то проблемы(если таковые были, конечно)?
mip128; Eret1k; +2 Ответить
5. Eret1k 778 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 288 24.04.19 19:50 Сейчас в теме
(4) Думаю вот статья, которую вы читали.
Evil Beaver; Eret1k; +2 Ответить
18. Senator_I 13 25.04.19 08:27 Сейчас в теме
34. Evil Beaver 6746 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. Идальго 131 24.04.19 23:36 Сейчас в теме
(11) Погодите, ведь тут речь о системе, которая, как я опять же понял, обеспечивает гарантированную доставку с использованием специального механизма очереди. Хм, ну в таком случае можно через rest, grpс, наконец сокеты передавать в некий сервак(т.н. брокер) сообщения. Там они ставятся в стековую очередь, сервак выдает квитанцию что типа получил и зарегал сообщение (все это в рамках одной транзакции). Ну и всё, а далее сервак примерно таким же макаром передает сообщение приемнику, а тот подтвержает через аналогичный механизм подтверждения доставки. Теперь брокер может считать это сообщение доставленным. Как-то так. И тут не нужно никаких com или ВК))) Хотя для сокетов всеж потребуется.
17. Labotamy 25.04.19 08:22 Сейчас в теме
(12)Речь о добавлении поддержки протокола amqp в платформу.
13. comol 4321 25.04.19 00:35 Сейчас в теме
Получение сообщений из очереди путём регулярного опроса RabbitMQ с заданным интервалом... хм... В случае такой "Архитектуры" точно нужен RabbitMQ? Ну и как бы COMSafeArray... ну нельзя так :(
GreenDragon; +1 Ответить
35. Evil Beaver 6746 08.08.19 17:52 Сейчас в теме
(13) Где ком, там и safearray, чего удивительного. Бяка? Бяка. Зато бесплатно и без этих ваших сиплюсплюсов. (Про добавленный гемор с RegAsm умолчим, к тому же Labotamy все сказал выше)
14. d.zhukov 705 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 6746 08.08.19 17:52 Сейчас в теме
19. EvgeTrofi 17 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 778 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 17 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 778 05.06.19 12:45 Сейчас в теме
(22)номер порта очень странный у вас.
С чего вы вообще взяли эти цифры?
24. dracoola 05.06.19 12:58 Сейчас в теме
25. dracoola 05.06.19 12:59 Сейчас в теме
Может что то неправильно настроила изначально . Такие настройки в облачном кролике
26. Eret1k 778 05.06.19 13:39 Сейчас в теме
(25) попробуйте порт по умолчанию 5 672
juliia1992; dracoola; +2 Ответить
27. Eret1k 778 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 778 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 778 20.06.19 16:14 Сейчас в теме
(31)странно
Есть в сети утилита показывающая все зарегистрированные библиотеки RegDllView Ссылка
Проверьте зарегистрировался ли тип: RabbitMQ.client или что-то на подобие того.
33. juliia1992 21.06.19 09:36 Сейчас в теме
(32) Спасибо, библиотека зарегистрирована.
Прикрепленные файлы:
37. Evil Beaver 6746 08.08.19 17:54 Сейчас в теме
(33) А теперь не забывайте повторять на каждом сервере 1С и в случае переездов с машины на машину. :)
39. GreenDragon 14.08.19 16:00 Сейчас в теме
40. 2dnk 26.09.19 16:02 Сейчас в теме
Коллеги, Дмитрий, приветствую!
Благодаря Вашему примеру смогли подключиться к Раббиту. Создали в нем очередь. А дальше просьба пояснить, чему должны быть равны параметры "ИмяМаршрута" и "ИмяОбмена". Я не нашел таких переменных в Раббит.

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

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

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

См. также

Кэширование COM-соединения. Три способа Промо

Практика программирования Перенос данных из 1С7.7 в 1C8.X Внешние источники данных WEB v8 Россия Бесплатно (free)

Статья о трех способах кэширования COM-соединения в 1С:Предприятии 8.x.

11.04.2013    40350    0    YPermitin    33    

Структура обработки загрузки цен и остатков поставщика с примерами и комментариями

Внешние источники данных WEB v8 1cv8.cf Россия Бесплатно (free)

В статье опишу структуру обработки по загрузке цен и остатков от поставщика с примерами.

27.06.2020    927    0    malikov_pro    0    

Диадок. Подключаемый модуль. Отладка

Интеграция Внешние источники данных v8 1cv8.cf Бесплатно (free)

Небольшой пример, как работать с подключаемым модулем Диадок (для изменения УПД перед выгрузкой на сайт Диадок.). Отладка подключаемого модуля, если не смогли подключить стандартную отладку.

17.06.2020    2034    0    John_d    1    

Учимся готовить кроликов с редиской: опыт применения Rabbit MQ и Redis в интеграционных проектах

Производительность и оптимизация (HighLoad) Интеграция Бесплатно (free)

При построении мощных производительных отказоустойчивых решений для интеграции во всем мире активно используются технологии обработки очередей сообщений с помощью брокера RabbitMQ и кэш-сервера Redis. О практическом опыте использования этих технологий при построении ИТ-ландшафта, включающего системы на 1С, на конференции Infostart Event 2019 Inception рассказал Сергей Наумов.

12.05.2020    4296    0    SergeyN    3    

Перенос данных из учетных программ Парус в конфигурации 1С Промо

Внешние источники данных v7.7 v8 БП2.0 ЗУП2.5 ЗКБУ БГУ 1С7:Бух 1С7:ЗиК 1С7:ББУ Россия БУ Госбюджет Бесплатно (free)

Статья посвящена анализу процессов переноса данных из учетных программ Парус в конфигурации 1С.

05.11.2012    50702    0    sklowsky    16    

Как мы загружаем данные в "Центр управления кассами Магнита"

Внешние источники данных Интеграция v8 1cv8.cf Бесплатно (free)

Статья о том, как мы делали механизм загрузки больших объемов данных в "Центр управления кассами Магнита"

08.05.2020    4214    0    chernenko_vv    25    

Интеграция СуперОкна7 и УНФ

Интеграция Внешние источники данных v8 УНФ Россия Бесплатно (free)

Изучаем базу данных СуперОкна7, смотрим возможности передачи и получения информации.

08.05.2020    1610    0    vostok1.dz    2    

Синхронизация БИТ:СКУД 8 с Parsec.Net 2.5

Интеграция Внешние источники данных v8 1cv8.cf Бесплатно (free)

Настройка синхронизации БИТ:СКУД 8 с Parsec.Net.2.5, выгрузка данных из внешней системы контроля доступа.

04.05.2020    3326    0    RPGrigorev    0    

Сканируем без сканера или MXL to JPG Промо

Внешние источники данных Универсальные функции Печатные формы документов v8 1cv8.cf Бесплатно (free)

Хотите конвертировать документы в формат изображения менее чем за минуту, не имея сканера? Тогда эта статья для вас.

24.05.2012    33434    0    shakmaev    47    

Получение данных из Сигур

Внешние источники данных v8 1cv8.cf Бесплатно (free)

Получение данных из СКУД Сигур (без танцов с бубном)

25.12.2019    3307    0    skaoxy    5    

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

Внешние источники данных v8 1cv8.cf Бесплатно (free)

Отправка "Hello world" из 1С на сервер RabbitMQ и обратно при помощи web REST API. Проще уже некуда! Совместимо с Linux и Windows! Реализация протестирована на 1С 8.3.14.1854 (x64).

21.10.2019    12210    0    Eret1k    24    

Выгрузка из 1С номенклатуры со штрихкодами без программирования

Загрузка и выгрузка в Excel Внешние источники данных v8 УТ11 Россия Бесплатно (free)

Я так и не смог найти простой инструкции или обработки, чтобы выгрузить из 1С: Управление торговлей 11 номенклатуру вместе со штрихкодами, поэтому решил написать собственную инструкцию.

28.08.2019    9328    0    user1114182    4    

Вставка BLOB в таблицы ORACLE средствами 1С 8.х с использованием Microsoft OLEDB Provider

Внешние источники данных v8 1cv8.cf Россия Бесплатно (free)

Столкнулся с необходимостью выгружать картинки из 1С 8 в ORACLE-таблицу.

08.08.2019    4365    0    nomad_irk    0    

Выгрузка данных в таблицу MS SQL SERVER

Внешние источники данных v8 Бесплатно (free)

Процедура по выгрузке данных из 1C (таблица значений) в таблицу MS SQL SERVER через COM.

02.07.2019    7044    0    EvgenSav    18    

1С и компьютерное зрение: новый подход к контролю за ассортиментом магазина

Розничная торговля Внешние источники данных Розничная торговля v8 1С:Франчайзи, автоматизация бизнеса УУ Бесплатно (free)

Машинное зрение в магазинах и 1С. Как поднять эффективность торгового предприятия (магазин. кафе, шоурум и т.д.) с совершенно неожиданной стороны? Как получить реальные демографические данные покупателей и, самое главное, как это использовать в повседневной работе магазина? Как можно расширить привычные ABC и XYZ анализ, добавив в них пласт данных о трафике и демографии покупателей? Что необходимо для 1С, чтобы использовать данные видеоанализа людского трафика?

20.06.2019    8431    0    osipov_cvizi    16    

MS Access и 1С. Что, когда и зачем?

Практика программирования Внешние источники данных Разработка v8 Бесплатно (free)

Об использовании MS Access в связке с 1С. Можно ли использовать продукты Office на сервере. Когда Access может быть полезен. Примеры работы и другое.

09.04.2019    26489    0    YPermitin    36    

RabbitMQ + Конвертация Данных 3.0

Внешние источники данных Обмен через XML Интеграция Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

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

21.03.2019    24261    0    barelpro    82    

Загрузка ЭЛН (электронных листов нетрудоспособности) из файлов

Внешние источники данных Зарплата Зарплата v8 УПП1 Россия БУ ФОМС, ПФ, ФСС Бесплатно (free)

Что делать, если по каким-то причинам нет возможности разместить 1С и Крипто-Про на одном рабочем месте? Правильно - открывать конфигуратор и пилить. Благо, там не сложно. Непосредственно решение для УПП 1.3. Для ЗиК 2.5 и Комплексной автоматизации должно быть аналогично.

07.02.2019    6275    0    SatanClaws    4    

Работа с кассой Atol через веб-сервер ДТО-10

Внешние источники данных ККМ Фискальный регистратор Кассовые операции Кассовые операции v8 Россия НДС Бесплатно (free)

Поддержка многопользовательской печати на одном устройстве ККТ. Поддержка изменений в законодательстве (Переход на ФФД 1.05 и НДС 20%).

31.12.2018    31447    0    medangel    43    

RabbitMQ, Python и Windows. Step By Step

Внешние источники данных v8 Бесплатно (free)

Работа с шиной RabbitMQ, используя Python на Windows. Пошаговый быстрый старт.

13.12.2018    8512    0    w.r.    8    

Из 1С в IIKO: Передаем перемещения УТ в приходные накладные

Внешние источники данных Оптовая торговля Оптовая торговля v8 УТ11 Рестораны, кафе и фаст-фуд УУ Бесплатно (free)

Рассмотрение вариантов передачи документа "Перемещение товаров" из Управление торговлей 11 в документ "Приходная накладная" IIKO.

12.09.2018    8104    0    oyti    7    

IIKO (Айко). Обмениваемся накладными с 1С

Внешние источники данных v8 БП3.0 Рестораны, кафе и фаст-фуд БУ УУ Бесплатно (free)

Типовое решение от компании Айко по передаче данных в 1С Бухгалтерию не всегда удовлетворяет реалиям бизнес-процессов организации. Попробуем поразмышлять о том, как реализовать двунаправленный обмен с Айко в фоне.

01.06.2018    14533    0    oyti    19    

Юридически значимый электронный документооборот с Контур.Диадок

Внешние источники данных v8 НУ НДС Бесплатно (free)

Пример использования компоненты DiadocComApi http://diadocsdk-1c.readthedocs.io/ru/latest/

31.05.2018    11683    0    savostin.alex    8    

Интеграция Zimbra и 1С

Внешние источники данных Управление взаимоотношениями с клиентами (СRM) Управление взаимоотношениями с клиентами (СRM) v8 Россия УУ Бесплатно (free)

В публикации описывается способ интеграции 1С с почтовым сервером Zimbra, используя SOAP сервис. Рассматривать вопрос интеграции будем на примере бизнес задачи, из блока CRM. Реализации общей адресной книги(GAL-Global Address List) между сотрудниками. Сотрудники(компания) ведет весь учет в 1С, в том числе и элементы CRM, а Zimbra выступает лишь в роли почтового сервиса. Сделать данную публикация побудило отсутствие в интернете готовых примеров совместной работы 1С и Zimbra. Надеюсь, она поможет кому-либо сократить время на реализацию похожей задачи.

16.04.2018    11538    0    Гексагон    17    

Обмен сведениями о пособиях с ФСС для Зарплата и Управление персоналом 2.5.129.3

Внешние источники данных Зарплата Зарплата v8 v8::СПР ЗУП2.5 Россия БУ ФОМС, ПФ, ФСС Бесплатно (free)

Ошибка отправки файла при обмене сведениями о пособиях с ФСС. Зарплата и Управление Персоналом, редакция 2.5 (2.5.129.3).

06.03.2018    18230    0    Igorexa    30    

Загрузка данных из DocsVision

Внешние источники данных v8 Бесплатно (free)

Необходимо было реализовать загрузку данных из программы документооборота "DocsVision 5" в "1С:Документооборот 8". Данное описание оставляю больше для себя, чтобы не забыть, ну и, может, еще кому поможет, т.к. не нашел нигде нормального описания.

17.01.2018    9051    0    apxi    4    

Создание мобильного клиента 1С на Android с использованием HTTP-сервисов

Внешние источники данных Мобильная разработка v8 v8::Mobile Бесплатно (free)

Краткий курс по созданию мобильного приложения на Android, который связывается с сервером 1С через HTTP-сервис. Публикация рассчитана на тех, кто хорошо знаком с программированием на платформе 1С и владеет основами программирования на платформе Android (умеет создавать Activity и знает, как устроена структура проекта).

03.11.2017    32812    0    cdiamond    15    

Как сделать конфигурацию «1С:Предприятие 8» приложением QuickBooks. Проходим авторизацию OAuth 1.0a+OpenID 2.0

Внешние источники данных Практика программирования v8 Бесплатно (free)

Пришло время, когда интеграция со сторонними организациями и их приложениями стала необходимостью для успешного ведения бизнеса. В этой статье будет рассмотрено прохождение авторизации OAuth 1.0a+OpenID 2.0 и превращение конфигурации «1С:Предприятие 8» в приложение QuickBooks.

10.09.2017    20497    0    pbazeliuk    28    

Редактирование пользовательских полей в Битрикс24 через REST API

Внешние источники данных v8 1cv8.cf Россия Бесплатно (free)

Меняем значения пользовательских полей в Битрикс24 через REST API на примере редактирования контактов

06.02.2017    15096    0    user662672_explorer2000    2    

Нагрузочное тестирование сервера 1С при использовании WEB сервисов

Производительность и оптимизация (HighLoad) Внешние источники данных WEB v8 ИТ-компания Бесплатно (free)

Проведение нагрузочного тестирования WEB-сервисов, развернутых на платформе 1С. Целью тестирования является ознакомление с возможностями платформы 1С при работе с большим количеством запросов через опубликованные WEB сервисы на IIS 7.5

01.02.2017    27195    0    BraunAlex    34    

Передаем контакты из 1С в Битрикс24 через REST API

Внешние источники данных v8 УТ11 Россия Бесплатно (free)

Хочу поделиться опытом использования Битрикс24 REST API для экспорта контактов из 1С УТ 11

09.01.2017    53536    0    user662672_explorer2000    111    

Используем механизмы обмена данными БСП для произвольного обмена

Универсальные функции Внешние источники данных БСП (Библиотека стандартных подсистем) v8 Бесплатно (free)

Механизм БСП заточен на обмен XML по правилам обмена. Чтобы использовать его для любого другого обмена, коих в мире немало, требуются доработки. В статье описан вариант, как из положения выйти.

23.08.2016    33250    0    Патриот    28    

Технология проведения миграции данных в крупных проектах

Внешние источники данных Перенос данных из 1C8 в 1C8 v8 Бесплатно (free)

В статье систематизируется проектный опыт проведения миграции данных в крупных проектах, связанных с переходом Заказчиков на работу в конфигурациях «1С:Предприятие 8».

17.05.2016    32493    0    cinimex    26    

7 причин, почему интеграцию необходимо строить на очередях. Практика RabbitMQ. Отказ от Zato ESB и OData в 1С

Внешние источники данных v8 Бесплатно (free)

Этот набросок является продолжение предыдущей статьи "7 причин, почему интеграция стала приятной. Не упускайте ряд потрясающих возможностей". В большей части это описание боли, через которую пришлось пройти на практике, используя сервисную шину данных Zato ESB и OData протокол совместно с «1С:Предприятие 8».

18.03.2016    64311    0    pbazeliuk    129    

1C + ЭДО Мегафон

Практика программирования Внешние источники данных v8 1cv8.cf Бесплатно (free)

Тестируем модуль обмена 1С с ЭДО Мегафон (модуль прилагается пользователям ресурса ЭДО Мегафон бесплатно).

1 стартмани

21.12.2015    13742    0    JetBrain    4    

Linq to ODATA

Внешние источники данных v8 1cv8.cf Бесплатно (free)

1С сейчас совершенствует REST интерфейс приложения, автоматически генерируемый платформой, и протокол обмена ODATA версии 3. С недавнего времени появилась возможность обмениваться, используя JSON. На просторах интернета мало информации по использованию Linq для ODATA для 1С. Поэтому решил поделиться опытом. Это продолжение статей https://infostart.ru/public/402433/

29.09.2015    32240    0    Serginio    11    

1С Предприятие 8.2: Обмен данными между базами на основе инструментов SQL

Внешние источники данных v8 1cv8.cf Россия Бесплатно (free)

Обмен данными (сотрудники организаций) между базами (1С Предприятие 8.2: Бухгалтерия и 1С Предприятие 8.2: Зарплата и управление персоналом) на основе триггера SQL, отслеживающего изменения таблицы

06.11.2013    22061    0    jan27    25    

Алгоритм выгрузки из 1С в Access

Практика программирования Внешние источники данных v8 Россия Бесплатно (free)

Работающий алгоритм выгрузки из 1С в Access. Понадобилось выгрузить отчет в ACCESS, пришлось разбираться.

31.10.2013    30324    0    dimens    10    

Организация обмена с прочими программами через XML. Имитация двухстороннего обмена без именения конфигурации

Внешние источники данных Обмен через XML v8 Бесплатно (free)

Настраиваем обмен типовой конфигурации со сторонними базами данных, с функционалом двустороннего обмена

24.04.2013    15012    0    Stim213    6    

Подсистема "COMExchange": прямой доступ к EXCEL через ADO

Файловые протоколы обмена, FTP Загрузка и выгрузка в Excel Внешние источники данных v8 1cv8.cf УТ10 УПП1 Россия Бесплатно (free)

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

20.01.2013    23826    0    yuraos    7    

Простой TCP сервер с обработкой событий на стороне 1С

Практика программирования Внешние источники данных v8 1cv8.cf Бесплатно (free)

В моей работе все чаще и чаще встречаются задачи связи 1С и стороннего оборудования / промышленного софта. В большинстве случаев есть некая внешняя компонента для связи с этим всем. Но эта компонента стоит денег. Плюс не каждого устроит «черный ящик», который что то крутит в себе, и выдает готовый результат. Данная статья в «картинках» покажет как можно реализовать TCP сервер для связи с чем либо «своими руками».

05.12.2012    29940    0    VoDo    7