RabbitMQ и 1С. Как я решила разобраться с брокером сообщений на практике

07.08.26

Интеграция - Перенос данных 1C

В этой статье я показываю весь путь настройки интеграции 1С и RabbitMQ от начала и до конца. Сначала мы кратко разберем, когда проекту действительно нужен брокер сообщений, а когда лучше оставить обычный REST. А дальше перейдем к практике: быстро запустим брокер, настроим виртуальный хост, пользователей и очереди. Отправим свое первое сообщение из 1С и прочитаем другое прямо из очереди брокера. Приложила готовый код на 1С для отправки и получения JSON-сообщений в RabbitMQ

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
RabbitMQ и 1С. Как я решила разобраться с брокером сообщений на практике
.epf 9,74Kb
0 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

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

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

Почему HTTP больше не решает все задачи?

Когда начинаешь изучать RabbitMQ, первый вопрос а зачем нужен брокер сообщений, если уже есть REST API? На самом деле эти технологии не конкурируют между собой. Они решают совершенно разные задачи. Чтобы понять разницу, сначала нужно разобраться в двух подходах к интеграциям: синхронном и асинхронном взаимодействии.

Синхронно (REST) — когда нужно здесь и сейчас

Почти все наши повседневные 1С-интеграции — синхронные. Мы отправляем HTTP-запрос и блокируем выполнение кода, пока не придет ответ.

  • Пример 1: Покупатель на кассе. 1С стучится в систему лояльности, чтобы узнать баланс бонусов и финальную сумму чека. Пока ответа нет — чек пробить нельзя. RabbitMQ тут только добавит тормозов и усложнит жизнь.
  • Пример 2: Оформление заказа и онлайн-проверка остатков. Задержка в пару секунд уже бесит пользователя. HTTP здесь абсолютный победитель.

Асинхронно (RabbitMQ) - когда объем имеет значение

А теперь представьте ночную выгрузку. Нам нужно отправить во внешнюю систему 800 000 чеков, 150 000 контрагентов и обновить цены. Если пулять это через HTTP, начнутся проблемы. Принимающая база ушла на обновление? Она отвечает не 100 миллисекунд, а 5 секунд? Отвалилась сеть на середине пакета?

Здесь на сцену выходит брокер. 1С больше не ждет ответа. Мы просто кидаем сообщение: вот данные, положи в очередь, дальше разбирайтесь сами. Если вторая система лежит, то сообщения спокойно копятся в брокере, а когда она оживет, то сама заберет всё накопившееся.

Краткий чек-лист:

  • Берем RabbitMQ, если данные можно обработать в фоне с небольшой задержкой, важна гарантия доставки, объемы большие, а принимающая сторона может быть нестабильна.
  • Берем HTTP, если пользователю нужен мгновенный ответ прямо сейчас на экране.

А как получить ответ от брокера?

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

Практика

После того как я разобралась с теорией, я пошла проверять всё на практике.

В этой статье я не буду подробно останавливаться на установке Docker, здесь никаких сложностей не возникло – в интернете много инструкций на эту тему.

Наша задача развернуть RabbitMQ, создать собственный Virtual Host, настроить пользователя, создать очереди и выполнить настоящий обмен сообщениями между 1С и брокером.

Поднимаем RabbitMQ за одну команду

Открываем обычную командную строку и выполняем одну команду:

docker run -d --name my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3-management

Что делает эта команда:

  • -d — запускает контейнер в фоне.
  • --name my-rabbit — дает ему понятное имя.
  • -p 5672:5672 — открывает порт, по которому 1С и CDP будут обмениваться сообщениями (служебный порт).
  • -p 15672:15672 — открывает порт для веб-интерфейса.
  • rabbitmq:3-management — скачивает официальный образ версии 3 вместе с веб-панелью управления (это очень важно, чтобы посмотреть глазками).

Как только контейнер запустится (это займет минуту-две), можно открыть браузер и перейти по адресу: http://localhost:15672

  • Логин: guest
  • Пароль: guest

 

 

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

Virtual Host (Виртуальный хост)

В RabbitMQ принято изолировать проекты друг от друга. Virtual Host — это как отдельная информационная база в 1С. Там свои пользователи, свои очереди, и они никак не пересекаются с соседями. Идем во вкладку Admin -> Virtual Hosts и создаем. Для нашего примера создадим отдельный Virtual Host.

 

 

Пользователь

В реальных проектах конечно никто не использует стандартного пользователя guest, поэтому следующим шагом я настроила нового пользователя

 

 

Очереди (Queues)

Теперь можно перейти к самому интересному. Сообщения должны где-то храниться и в RabbitMQ для этого существуют очереди. Для своего теста я решила сделать следующий пример:

Пусть 1С выгружает покупателей в систему лояльности, а обратно получает информацию о чеках. Создадим две очереди - erp.cdp.clients и cdp.erp.receipts. Тип очереди оставляем Classic, включаем Durable, чтобы сообщения не потерялись после перезапуска брокера.

 

 

В результате я вижу две очереди:

 

 

На этом настройка RabbitMQ практически закончена и можно подключать 1С и выгрузить своего первого клиента.

Почему я использую HTTP API

Если посмотреть документацию RabbitMQ, можно увидеть несколько способов работы с брокером. Самый правильный вариант — использовать AMQP-клиент. Но для первого раза мне хотелось показать максимально простой способ без лишних компонент.

Отправляем первое сообщение

Давайте представим, что в 1С есть покупатель и наша задача передать информацию о нём во внешнюю систему. В обработке я сделала кнопку «Выгрузить». По нажатию формируется JSON с данными покупателя и отправляется через HTTP API RabbitMQ.

 

 

Код в 1С:

Процедура ВыгрузитьПокупателяНаСервере() 
	
	// =======================================================
	// ШАГ 1: Формируем бизнес-JSON
	// =======================================================
	JSON = ПолучитьJSONДляСозданияКонтрагента();
	
	// =======================================================
	// ШАГ 2: Упаковываем бизнес-JSON в конверт RabbitMQ
	// =======================================================
	ИмяОчереди = "erp.cdp.clients";
	ИмяВиртуальногоХоста = "erp_cdp_test";
	
	// Настройки самого сообщения
	СвойстваСообщения = Новый Структура;
	СвойстваСообщения.Вставить("delivery_mode", 2); // 2 - сохранять на диск (гарантия от потери при перезагрузке)
	
	ТелоЗапросаRabbit = Новый Структура;
	ТелоЗапросаRabbit.Вставить("properties", СвойстваСообщения);
	ТелоЗапросаRabbit.Вставить("routing_key", ИмяОчереди);
	ТелоЗапросаRabbit.Вставить("payload", JSON); // Кладем наш бизнес-JSON внутрь конверта
	ТелоЗапросаRabbit.Вставить("payload_encoding", "string");
	
	ЗаписьJSONRabbit = Новый ЗаписьJSON;
	ЗаписьJSONRabbit.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSONRabbit, ТелоЗапросаRabbit);
	ТелоДляОтправки = ЗаписьJSONRabbit.Закрыть();
	
	// =======================================================
	// ШАГ 3: Отправка HTTP-запроса к API брокера RabbitMQ
	// =======================================================
	СерверRabbitMQ = "localhost";
	ПортHTTP = 15672;
	Логин = "1c_user"; // Или guest с правами админа
	Пароль = "1c_user"; 
	
	Соединение = Новый HTTPСоединение(СерверRabbitMQ, ПортHTTP, Логин, Пароль);
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-Type", "application/json");
	
	// URL для публикации. Обрати внимание, сюда подставляется наш Virtual Host
	URL = "/api/exchanges/" + ИмяВиртуальногоХоста + "/amq.default/publish";
	
	HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки);
	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоДляОтправки);
	
	Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
	
	// =======================================================
	// ШАГ 4: Обработка ответа
	// =======================================================
	КодОтвета = Строка(Ответ.КодСостояния);
	
	Если Ответ.КодСостояния = 200 Тогда
		JSONОтвет = "Успех! Сообщение положено в очередь. RabbitMQ ответил: " + Ответ.ПолучитьТелоКакСтроку();
	Иначе
		JSONОтвет = "Ошибка RabbitMQ: " + Ответ.ПолучитьТелоКакСтроку();
	КонецЕсли;
	
КонецПроцедуры

Но при первом запуске вместо успешной отправки я схватила такую ошибку, несмотря на то что код в 1С написан верно:

 

 

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

 

 

После этого в 1С видим успешный успех и танцуем победный танец:

 

 

В веб-панели RabbitMQ красиво загорелась единичка - наше сообщение в очереди erp.cdp.clients ждет, когда его заберут. Мы даже можем его просмотреть:

 

 

 

Теперь попробуем получить сообщение обратно

Отправка - это только половина истории. Теперь представим, что внешняя система сформировала чек и кинула его в брокер. Чтобы просимулировать эту ситуацию воспользуемся возможностями самого RabbitMQ - заходим в очередь cdp.erp.receipts, раскрываем блок Publish message, вставляем заранее подготовленный JSON и нажимаем Publish Message.

 

 

Теперь в новой очереди появилась единица. Это означает, что сообщение ожидает своего потребителя.

 

 

Читаем сообщение из 1С

Теперь всё готово. Остаётся только нажать кнопку Получить чек в нашей обработке.

 

 

Внутри у нас выполняется запрос к HTTP API RabbitMQ. Брокер возвращает сообщение. 1С разбирает JSON. После успешного получения RabbitMQ удаляет сообщение из очереди.

Код процедуры получения чека:

Процедура ПолучитьЧекИзRabbitMQНаСервере()
	
	ИмяОчереди = "cdp.erp.receipts";
	ИмяВиртуальногоХоста = "erp_cdp_test"; 
	СерверRabbitMQ = "localhost";
	ПортHTTP = 15672;
	Логин = "1c_user"; 
	Пароль = "1c_user"; 
	
	// Запрашиваем 1 сообщение из брокера с удалением из очереди (ack_requeue_false)
	ТелоЗапросаRabbit = "{""count"":1,""ackmode"":""ack_requeue_false"",""encoding"":""auto""}";
	
	Соединение = Новый HTTPСоединение(СерверRabbitMQ, ПортHTTP, Логин, Пароль);
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-Type", "application/json");
	
	URL = "/api/queues/" + ИмяВиртуальногоХоста + "/" + ИмяОчереди + "/get";
	HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки);
	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаRabbit);
	
	Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
	
	Если Ответ.КодСостояния = 200 Тогда
		
		СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
		
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
		МассивСообщений = ПрочитатьJSON(ЧтениеJSON);
		
		Если МассивСообщений.Количество() > 0 Тогда
			
			СтрокаPayload = МассивСообщений[0].payload;
			
			ЧтениеБизнесJSON = Новый ЧтениеJSON;
			ЧтениеБизнесJSON.УстановитьСтроку(СтрокаPayload);
			ДанныеЧека = ПрочитатьJSON(ЧтениеБизнесJSON);
			
			// Формируем красивый многострочный текст для текстового поля 
			МассивВывода = Новый Массив;
			МассивВывода.Добавить("====================================");
			МассивВывода.Добавить(" ПОЛУЧЕН НОВЫЙ ЧЕК ИЗ CDP");
			МассивВывода.Добавить("Номер: " + ДанныеЧека.receiptNumber + " от " + СтрЗаменить(ДанныеЧека.date, "T", " "));
			МассивВывода.Добавить("Покупатель: " + ДанныеЧека.customer.fullName + " (Доступно бонусов: " + ДанныеЧека.customer.bonusBalance + ")");
			МассивВывода.Добавить("------------------------------------");
			
			Для Каждого СтрокаТовара Из ДанныеЧека.items Цикл
				МассивВывода.Добавить(" • " + СтрокаТовара.name + " | " + СтрокаТовара.quantity + " шт/кг x " + СтрокаТовара.price + " руб. = " + СтрокаТовара.sum + " руб.");
			КонецЦикла;
			
			МассивВывода.Добавить("------------------------------------");
			МассивВывода.Добавить("Оплата наличными: " + Формат(ДанныеЧека.payment.cash, "ЧДЦ=2") + " руб.");
			МассивВывода.Добавить("Оплата картой: " + Формат(ДанныеЧека.payment.card, "ЧДЦ=2") + " руб.");
			МассивВывода.Добавить("ИТОГО К ОПЛАТЕ: " + Формат(ДанныеЧека.totalSum, "ЧДЦ=2") + " руб.");
			МассивВывода.Добавить("====================================");
			
			ТекстВывода = СтрСоединить(МассивВывода, Символы.ПС);			

			JSONОтвет1 = ТекстВывода;
			КодОтвета1 = "200 (Успешно прочитано)";
			
		Иначе
			JSONОтвет1 = "Очередь пуста! Внешняя система пока ничего не прислала.";
			КодОтвета1 = "200 (Пусто)";
		КонецЕсли;
		
	Иначе
		JSONОтвет1 = "Ошибка соединения с RabbitMQ." + Символы.ПС + Ответ.ПолучитьТелоКакСтроку();
		КодОтвета1 = Строка(Ответ.КодСостояния);
	КонецЕсли; 
	
КонецПроцедуры

Снова открываем RabbitMQ и видим очень приятную картину. В колонке Ready снова стоит ноль. Это означает, что сообщение было успешно получено и удалено из очереди.

 

 

Если нажать кнопку ещё раз, обработка честно сообщит, что новых сообщений нет.

 

 

Заключение

Подводя итог своему эксперименту, могу сказать одно: не стоит бояться брокеров сообщений.

Да, когда впервые открываешь веб-интерфейс RabbitMQ, от обилия непонятных вкладок и настроек может стать некомфортно. Это, пожалуй, единственный серьезный порог входа. Но как только вы понимаете логику работы (Виртуальный хост -> Пользователь -> Очередь), всё становится интуитивно понятно. Надеюсь, эта статья поможет вам разобраться с этим инструментом.

Проверено на следующих конфигурациях и релизах:

  • Управление торговлей, редакция 11, релизы 11.5.27.70

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Перенос данных 1C Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

58000 руб.

04.08.2015    191614    461    308    

462

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    190456    370    294    

427

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

58000 руб.

15.04.2019    85868    231    181    

168

SALE! 20%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27633 руб.

12.06.2017    162896    989    329    

486

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам.

50200 руб.

24.04.2015    209177    178    253    

297

Перенос данных 1C Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Перенос данных из УПП 1.3 в УНФ | из КА 1.1 в УНФ | из УТ 10.3 в УНФ | Перенос разработан в формате КД 2 (правила конвертации объектов) | Выгружаются все возможные виды документов, начальных остатков и вся нормативно-справочная информация | Есть фильтр по организациям при выгрузке данных | Есть несколько алгоритмов выгрузки начальных остатков товаров на выбор | Можно проверить перед покупкой на своем сервере!

58000 руб.

17.10.2019    45419    60    118    

62

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

55200 руб.

03.12.2020    46222    132    83    

120

Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Системный администратор Программист Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Платные (руб)

Обработка не только формирует начальные остатки по всем счетам на нужную дату (экономя время на свёртке базы БП 3), но и полностью переносит справочные данные и документы за заданный период. Гибкая настройка включает фильтр по организациям и множество параметров выгрузки. Работайте в удобном формате: выполните однократный полный переход или настройте регулярную догрузку только новых документов из БП 3 в БП 3.0. Интеграция правил конвертации в план обмена гарантирует точную выгрузку исключительно зарегистрированных объектов.

70760 руб.

10.04.2026    898    3    8    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. roman-gofman 07.08.26 17:46 Сейчас в теме
Использовать HTTP API для обмена сообщениями это вредный совет, на сайте кролика это прямо говорится.
Ну и приведены кейсы использования кролика перевернутые с ног на голову.
Для отправки сообщения требуется регистрация/авторизация