Получение/отправка сообщений RabbitMQ через REST API

04.10.22

Интеграция - WEB-интеграция

Простой пример получения и отправки сообщений в брокер сообщений RabbitMQ через REST API из 1С без сторонних компонент и middleware.

Скачать исходный код

Наименование Файл Версия Размер
Получение/отправка сообщений RabbitMQ через REST API:
.epf 9,89Kb
40
.epf 1.0 9,89Kb 40 Скачать

Не буду углубляться в тему, что такое брокер сообщений RabbitMQ, для чего он нужен и как его устанавливать/настраивать, об этом уже много было рассказано, например, тут: ссылка

Но напрямую работать с API RabbitMQ из 1С не получится, придется использовать либо сторонние компоненты (ссылка), либо на каком-нибудь языке написать прослойку (ссылка). Однако RabbitMQ поддерживает работу с ним через REST API, методы которого поддерживаются платформой 1С без дополнительных средств. 

Вводная по работе через REST описана здесь: ссылка. Само описание API расположено здесь: ссылка

Для того чтобы REST API заработал, необходимо поставить плагин Management Plugin (ссылка), который дает нам веб-интерфейс по настройке RabbitMQ, без которого настраивать сервис довольно грустно, если только вы не привыкли делать всё подряд через консоль. Если без подробностей, то плагин ставится командой: 

rabbitmq-plugins enable rabbitmq_management

Сразу предупрежу (типа дисклеймер): судя по всему, REST API в RabbitMQ предназначен в основном для администрирования и мониторинга, функция отправки и приема сообщений в нем реализована в простейшем виде, возможно она вообще не предназначена для промышленного использования, поэтому практически не упоминается в официальной документации (в официальной документации REST API упоминается так: The API is intended to be used for basic observability tasks). 

В целом плюсы и минусы обращения к RabbitMQ через REST API вижу так:

  + Нет сторонних компонент и стороннего ПО (собственно потребность в REST API возникла не на пустом месте, а после словленных серьезных и нерешаемых проблем с внешней компонентой)

  + Простота использования

  - Ограниченный функционал - мы можем только отправлять по одному сообщению и получать массив сообщений, подтверждение принятия каждого сообщения (ack) нет. Можем только управлять режимом получения всего массива сообщений (впрочем можно получать сообщения по одному, выставляя при каждой итерации нужный режим).

  - Вероятно подходит только для ненагруженных обменов типа обмена кадровой информацией (хотя я отправил в цикле 2000 сообщений и все выгрузилось и загрузилось корректно).

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

  - Так как REST API тут нужен скорее для администрирования, то пользователь сервиса должен иметь административные права, что не очень хорошо с точки зрения безопасности.

Немного про режимы обработки сообщений - в REST API их 4: ack_requeue_true, reject_requeue_true, ack_requeue_false, reject_requeue_false. Соответственно ack это подтверждение приема сообщений, reject - отказ, requeue_true - сообщения остаются в очереди, requeue_false - удаляются из очереди. С ack и requeue все просто, а reject (в полном API есть схожий метод nack, отличающийся от reject некоторыми нюансами) работает следующим образом: к нашей точке обмена можно привязать (bind) дополнительную очередь с признаком "Dead letter exchange" - в эту очередь будут попадать сообщения которым выставили отказ (и некоторые другие, подробнее ссылка):

 

 

В принципе основной режим приёма в простом варианте обмена это ack_requeue_false.

 

Собственно код по отправке сообщения:

Фабрика_XDTO = ПолучитьФабрикуXDTO();
        
ОбъектСообщение = Фабрика_XDTO.Создать(Фабрика_XDTO.Тип("http://rest_rmq", "message_out"));
        
ОбъектСообщение.routing_key           = ПараметрыПодключения.КлючМаршрутизации;
ОбъектСообщение.payload_encoding      = "string"; // вариант "base64"
ОбъектСообщение.properties            = Фабрика_XDTO.Создать(Фабрика_XDTO.Тип("http://rest_rmq", "message_properties"));

ОбъектСообщение.payload               = ТекстСообщения;
        
ТекстJSON = ОбъектXDTO_ПолучитьJSON(ОбъектСообщение, Фабрика_XDTO);

// %2f это vhost по умолчанию "/"
АдресРесурса = СтрШаблон("/api/exchanges/%1/%2/publish", "%2f", ПараметрыПодключения.ТочкаОбмена);
        
Ответ = ОтправитьHTTPЗапрос(ПараметрыПодключения, АдресРесурса, "POST", ТекстJSON);

Для чего нужен параметр "properties" сообщения я не понял - в него можно поместить произвольную структуру, но в получаемое сообщение она не приходит, хотя было бы очень удобно там размещать метаданные сообщения.

 

Получение сообщений:

Сообщения = Новый Массив;

Фабрика_XDTO = ПолучитьФабрикуXDTO();
    
Сообщение = Фабрика_XDTO.Создать(Фабрика_XDTO.Тип("http://rest_rmq", "messages_request"));
        
Сообщение.count = 1000; //количество получаемых сообщений
Сообщение.ackmode = ПараметрыПодключения.РежимПолучения; // варианты "ack_requeue_true", "reject_requeue_true", "ack_requeue_false", "reject_requeue_false"
Сообщение.encoding = "auto"; // вариант "base64"
        
ТекстJSON = ОбъектXDTO_ПолучитьJSON(Сообщение, Фабрика_XDTO);

// %2f это vhost по умолчанию "/"
АдресРесурса = СтрШаблон("/api/queues/%1/%2/get", "%2f", ПараметрыПодключения.ОчередьОбмена);
        
Ответ = ОтправитьHTTPЗапрос(ПараметрыПодключения, АдресРесурса, "POST", ТекстJSON);
        
Если Ответ.КодСостояния <> 200 Тогда
    Сообщить("Ошибка: " + Ответ.ПолучитьТелоКакСтроку());
    Возврат;
КонецЕсли;

ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
        
ОбъектСообщения = Фабрика_XDTO.ПрочитатьJSON(ЧтениеJSON, Фабрика_XDTO.Тип("http://rest_rmq", "collection_messages_in"));
        
Для каждого Сообщение Из ОбъектСообщения.message Цикл
    Сообщения.Добавить(Сообщение.payload);
КонецЦикла;

Служебные процедуры:

&НаСервереБезКонтекста
Функция ОтправитьHTTPЗапрос(ПараметрыПодключения, АдресРесурса, Метод = "POST", ТекстJSON)

    Заголовки = Новый Соответствие;
    Заголовки.Вставить("content-type", "application/json");
    
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
    
    HTTPЗапрос.УстановитьТелоИзСтроки(ТекстJSON);
    
    АдресСервера    = ПараметрыПодключения.АдресСервера;
    Логин            = ПараметрыПодключения.Логин;
    Пароль            = ПараметрыПодключения.Пароль;
    
    HTTPСоединение = Новый HTTPСоединение(АдресСервера, 15672, Логин, Пароль,, 60);
    
    Ответ = HTTPСоединение.ВызватьHTTPМетод(Метод, HTTPЗапрос);
    
    Возврат Ответ;
    
КонецФункции

&НаСервере
Функция ПолучитьФабрикуXDTO()

    // схема в макете обработки
    ТекстXSD = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Схема").ПолучитьТекст();
    
    // в случае встроенного в конфигурацию пакета XDTO необходимо использовать встроенную фабрику:
    // Возврат ФабрикаXDTO;
    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ТекстXSD);

    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
    
    ПостроительСхем = Новый ПостроительСхемXML;
    СхемаXML = ПостроительСхем.СоздатьСхемуXML(ДокументDOM.ЭлементДокумента);

    НаборСхемXML = Новый НаборСхемXML;
    НаборСхемXML.Добавить(СхемаXML);
    
    Фабрика_XDTO = Новый ФабрикаXDTO(НаборСхемXML);    
    
    Возврат Фабрика_XDTO;

КонецФункции

&НаСервереБезКонтекста
Функция ОбъектXDTO_ПолучитьJSON(ОбъектXDTO, Фабрика_XDTO)
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    
    Фабрика_XDTO.ЗаписатьJSON(ЗаписьJSON, ОбъектXDTO, НазначениеТипаXML.Неявное); 
    
    ТекстJSON = ЗаписьJSON.Закрыть();
    
    // платформа помещает наш объект в свою структуру с ключом #value,
    // можем отдельно получить значение по ключу и еще раз сериализовать,
    // либо просто вырезать открывающий и закрывающий тег
    
    СтрокаТега1С = """#value"": {";
    
    ПозицияНачалоТега1С = СтрНайти(ТекстJSON, СтрокаТега1С);
    ПозицияКонецТега1С  = ПозицияНачалоТега1С + СтрДлина(СтрокаТега1С);
    
    ТекстJSON = Лев(ТекстJSON, ПозицияНачалоТега1С - 2) + Сред(ТекстJSON, ПозицияКонецТега1С + 1, СтрДлина(ТекстJSON) - ПозицияКонецТега1С - 1);
    
    Возврат ТекстJSON;

КонецФункции

Схема сообщений:

<xs:schema xmlns:tns="http://rest_rmq" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://rest_rmq" attributeFormDefault="unqualified" elementFormDefault="qualified">
	<xs:simpleType name="ackmode_type">
		<xs:restriction base="xs:string">
			<xs:enumeration value="ack_requeue_true"/>
			<xs:enumeration value="reject_requeue_true"/>
			<xs:enumeration value="ack_requeue_false"/>
			<xs:enumeration value="reject_requeue_false"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="collection_messages_in">
		<xs:sequence>
			<xs:element name="message" type="tns:message_in" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:simpleType name="encoding_type">
		<xs:restriction base="xs:string">
			<xs:enumeration value="auto"/>
			<xs:enumeration value="base64"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="message_in">
		<xs:sequence>
			<xs:element name="payload_bytes" type="xs:integer"/>
			<xs:element name="redelivered" type="xs:boolean"/>
			<xs:element name="exchange" type="xs:string"/>
			<xs:element name="routing_key" type="xs:string"/>
			<xs:element name="message_count" type="xs:integer"/>
			<xs:element name="properties" type="tns:message_properties"/>
			<xs:element name="payload" type="xs:string"/>
			<xs:element name="payload_encoding" type="tns:payload_encoding_type"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="message_out">
		<xs:sequence>
			<xs:element name="properties" type="tns:message_properties"/>
			<xs:element name="routing_key" type="xs:string" nillable="true"/>
			<xs:element name="payload" type="xs:string"/>
			<xs:element name="payload_encoding" type="tns:payload_encoding_type"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="message_properties"/>
	<xs:complexType name="messages_request">
		<xs:sequence>
			<xs:element name="count" type="xs:integer"/>
			<xs:element name="ackmode" type="tns:ackmode_type"/>
			<xs:element name="encoding" type="tns:encoding_type"/>
			<xs:element name="truncate" type="xs:integer" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
	<xs:simpleType name="payload_encoding_type">
		<xs:restriction base="xs:string">
			<xs:enumeration value="string"/>
			<xs:enumeration value="base64"/>
		</xs:restriction>
	</xs:simpleType>
</xs:schema>

Схему можно поместить в отдельный файл xsd, в текстовый макет или можно импортировать в конфигурацию в виде XDTO пакета и использовать встроенный в платформу объект ФабрикаXDTO вместо своей фабрики.

 

И в конце, чтобы не создавать отдельную публикацию, поделюсь удачным, как мне кажется, опытом настройки двухстороннего обмена сообщениями между несколькими базами. Этот вопрос почему-то особо не поднимается и у каждого, кто настраивает RabbitMQ в первый раз возникает вопрос: а сколько точек обмена и очередей создавать и как маршрутизировать это. И с первого раза обычно получается огород из очередей и точек, хаотично связанных, так что непосвященному вообще тяжело разобраться что для чего и куда идут сообщения.
Рассматривается свой, не типовой план обмена, вероятно в больших, серьезных обменах стоит рассмотреть стандартные планы обмена типа СинхронизацияЧерезУниверсальныйФормат, но это тема отдельного разговора в каких случаях это оправдано.

Мой вариант:

Предположим у нас есть три базы: ЗУП, БП и ДО, кадровая информация из ЗУП должна попасть в БУ и ДО, оттуда должны придти подтверждения (тикеты) о том, что сообщения приняты успешно. Мы присваиваем базам идентификаторы: hrm, acc, do и создаем соответствующие узлы в базах (в БП можно не создавать узел ДО, соответственно в ДО не создавать БП), присваиваем узлам соответствующие идентификаторы (например в коде узла), предопределенному узлу присваиваем идентификатор этой базы.

В RabbitMQ мы настраиваем три точки обмена (exchange) с идентификаторами баз и три очереди (queue) с такими же идентификаторами. Далее создаются привязки (bindings) каждой очереди с корреспондирующими точками обмена и указывается ключ маршрутизации (routing key), совпадающий с именем точки обмена. То есть в нашем случае создаются привязки hrm -> do (key: do), hrm -> acc (key: acc), do -> hrm (key: hrm), acc -> hrm (key: hrm).

Пример для очереди hrm:

 

 

Сообщение из ЗУП в ДО отправляем в точку обмена с именем, соответствующему предопределенному узлу базы ЗУП (exchange = hrm) и ключом маршрутизации, соответствующему имени узла, в который отправляем сообщение (routing key = do). Соответственно в ДО мы получаем сообщение из очереди обмена с именем, соответствующему предопределенному узлу базы ДО (queue = do). Откуда пришло сообщение мы узнаем из свойства сообщения exchange, по этому идентификатору мы находим узел базы, откуда сообщение пришло и применяем соответствующие правила и настройки.

То есть, допустим сообщение с кадровой информацией из ЗУП ушло в БП и ДО, соответственно оттуда пришли подтверждения о получении, они попадают в очередь hrm, в одну кучу. Мы получаем массив сообщений и у каждого сообщения считываем свойство exchange, где будут указаны соответственно do и acc - то есть каждому сообщению мы сопоставляем узел, считываем настройки и правила обработки сообщений и обрабатываем.

 

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

Обработка разрабатывалась и тестировалась на платформе 8.3.21, но должна работать и на более ранних версиях платформы.

Конфигурация не важна, методы БСП не использовались.

RabbitMQ интеграция

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    16095    13    18    

13

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    18188    10    15    

16

Автоматическая загрузка файлов (например, прайс-листов) из электронной почты, FTP, HTTP, их обработка и выгрузка на FTP (на сайт) и для других целей

Прайсы WEB-интеграция Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Автомобили, автосервисы Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа с заданным интервалом времени (или по ручной команде) скачивает файлы (например, прайс-листы поставщиков) из различных источников: письма электронной почты, FTP или HTTP-адреса, и сохраняет их в каталог упорядоченной структуры. При этом извлекает файлы из архивов, может переименовывать файлы и менять их формат (csv, xls, txt). Можно настроить выгрузку обработанных файлов на сайт (через FTP-подключение). Программа будет полезна компаниям, у которых есть большое количество поставщиков и/или прайс-листы поставщиков обновляются часто (необязательно прайс-листы, файлы могут быть любого назначения). Собранные таким образом актуальные версии прайс-листов можно выгрузить с помощью программы себе на сайт (или на любой FTP-сервер) или выполнить другие необходимые задачи.

25200 руб.

28.05.2015    85422    26    51    

50

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    13003    33    8    

12

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

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

12000 руб.

02.02.2021    16634    43    49    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dsdred 3340 24.09.22 11:09 Сейчас в теме
Если Метод = "POST" Тогда

Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

ИначеЕсли Метод = "PUT" Тогда

Ответ = HTTPСоединение.Записать(HTTPЗапрос);

ИначеЕсли Метод = "GET" Тогда

Ответ = HTTPСоединение.Получить(HTTPЗапрос);

ИначеЕсли Метод = "DELETE" Тогда

Ответ = HTTPСоединение.Удалить(HTTPЗапрос);

КонецЕсли;
Показать


Всё это можно реализовать одной строкой.

Ответ = HTTPСоединение.ВызватьHTTPМетод(Метод, HTTPЗапрос) ;

И все.
akR00b; portwein; NikeeNik; whitedeath; +4 Ответить
2. NikeeNik 75 24.09.22 17:54 Сейчас в теме
(1) Не помню точно почему так, давно эта процедура была написана, кажется был там какой-то нюанс, поэтому так и разнесены методы. Но да - перепишу пожалуй.
3. kolya_tlt 86 25.09.22 23:22 Сейчас в теме
использовали более года rest интерфейса. примерно из 1млн сообщений теряем 1. купили компоненту от пули и стали использовать ack, проблемы кончились
NikeeNik; +1 Ответить
5. NikeeNik 75 26.09.22 07:28 Сейчас в теме
(3) Компонента от пули таки стоит денег (деньги не проблема, проблема это пропихнуть в закупку) и что-то они вообще пропали с горизонта. Я текущую реализацию тоже считаю временной, следующую версию интеграции в планах запилить на 1с:шине.
Насчёт пропадания сообщений, я у себя реализовал через квитирование - не панацея конечно, но позволит хотя бы понять что не дошло.
7. NikeeNik 75 26.09.22 11:15 Сейчас в теме
(6) Это не компонента от пули, а их конкурент от БиТа. Ну и у меня есть подозрения, что они положили прибор на развитие и поддержку своего продукта - последний релиз очень сырой.
8. gybson 26.09.22 12:09 Сейчас в теме
(7) Но бесплатный и открытый.

Вообще я бы еще посмотрел на rest-обертки для кролика.
9. NikeeNik 75 26.09.22 13:46 Сейчас в теме
(8) Если благодаря открытости вы сможете дописать компоненту так, чтобы она перестала ронять rphost, то снимаю перед вами шляпу. Я бы тоже глянул, но кмк их не густо и больше пишут для себя, не выкладывая в публичный доступ.
14. Pine-river 09.01.23 09:46 Сейчас в теме
(9)
чтобы она перестала ронять rphost,

А есть информация по какой причине ронялся rphost? Из-за накопления незакрытых соединений?
15. NikeeNik 75 09.01.23 11:26 Сейчас в теме
(14) Я до причины падений так и не докопался( Какая-то инфа по падениям у них появилась как раз вот, в декабре - в обсуждении компоненты: https://infostart.ru/public/1099423/
16. Pine-river 09.01.23 11:32 Сейчас в теме
(15) Можете ткнуть носом?) Не нашел там декабрьских комментов за 22 год
18. Flextor74 28.08.23 13:49 Сейчас в теме
(5)Добрый день. Можете поподробнее описать реализацию через квитирование? Так же реализовал обмен через rest. Но при загрузке сообщений в режиме ack_requeue_false может произойти что-нибудь с сетью и сообщение не дойдет до получателя, а из очереди удалится. Пытаюсь понять с какой стороны подойти к этой проблеме.
19. NikeeNik 75 29.08.23 10:10 Сейчас в теме
(18) Ну это уже не имеет отношения к транспорту обмена - это уже относится к методике обмена. Квиток это просто сообщение о получении и успешной обработке сообщения приемником. Реализуется по разному - можно посмотреть как это сделано в универсальном обмене - поискать по слову "ИспользоватьКвитирование" в модуле "ОбменДаннымиXDTOСервер", если в двух словах, то отправитель выгружает данные, зарегистрированные на плане обмена (номер сообщения генерируется платформой через механизм планов обмена при формировании сообщения обмена) , приемник загружает и при успешной загрузке отправляет квиток с номером полученного сообщения и когда отправитель получает этот квиток он удаляет регистрацию изменений с плана обмена с номером сообщения <= номеру в квитке (метод ПланыОбмена.УдалитьРегистрациюИзменений()). И вот пока этот квиток не получен обмен будет выгружать каждый раз все зарегистрированные на плане обмена объекты.
Тут правда есть один нюанс в такой схеме - если в обмене что-то сломается и не будет быстрой реакции на поломку, то объем выгружаемых данных через какое-то время может достигнуть невразумительных размеров, т.к. без квитка не будет отмены регистрации, без отмены регистрации все данные с этого номера сообщения и всех последующих будут выгружаться с каждым запуском обмена и количество последующих будет постоянно расти, если в базе происходят изменения к выгрузке. Поэтому при такой реализации нужен постоянный мониторинг размера очереди обмена (я видел реализацию такого мониторинга очереди через красивые графики, выводимые на огромный телевизор, висящий в кабинете программистов)))
Если писать какой-то свой механизм квитирования - то это просто регистр сведений в который в разрезе узлов обмена пишутся номера отправляемых сообщений, какой-нибудь идентификатор отправляемого объекта (для ссылочных объектов это ссылка, а вот с регистрами сведений уже сложнее) и дата/время отправления. Получатель при успешной обработке сообщения отправляет служебное сообщение с номером принятого сообщения обратно в отправитель, там соответственно в модуле обработки входящих сообщений вылавливаются квитки по какому-нибудь признаку, находится соответствующая запись регистра и проставляется признак, что сообщение доставлено. Ну и какой-нибудь регламент, который будет отбирать сообщения за период, которые не были доставлены и что-нибудь делать - оповещать, еще раз регистрировать или что там можно придумать. На каком этапе проводить снятие объектов с регистрации на выгрузку тоже вопрос, который надо решить в рамках построения методики обмена - типовая методика имеет свои нюансы, которые описаны выше.
Flextor74; +1 Ответить
20. Flextor74 29.08.23 12:34 Сейчас в теме
(19) Большое спасибо за ответ. Но интересует именно момент получения данных с RMQ. В случае с обменом через по протоколу AMQP 1с подключается к очереди и в цикле получает все сообщения, отвечая успех/не успех после каждого полученного сообщения. В случае с REST выполняется 1 запрос, в параметрах которого указывается ack_mode. Поэтому у меня нет понимания, как вернуть ошибку, в случае, если сообщения не дошли до 1с в результате запроса, либо дошли и 1с сразу упала по каким-то причинам. Возможно для REST это не реализуемо...
21. NikeeNik 75 29.08.23 14:18 Сейчас в теме
(20) Сложно сказать, мне тут вероятно не хватает теоретических знаний об организации обменов - потому что тема эта вообще непростая.
Вариантов почему сообщение может быть не доставлено - масса. Начиная от ошибок в алгоритме формирования сообщения и заканчивая тем, что при загрузке документ не проведется из-за конфликта блокировок или потому что конфигурация приемника изменилась, посередине могут быть всякие сбои в сервисе транспорта. Поэтому отдельно ловить ситуации с ошибками получения сообщений из брокера сообщений или шины и ставить им признак "не успех" мне кажется лишним - если мы можем получить сообщение из брокера, значит по идее это уже "успех", а дальше там множество вариантов отказа, большая часть которых подразумевает отсутствие смысла оставлять сообщение в очереди.
Я думаю, что лучше отслеживать процесс полностью - только получение квитка из приемника об успешной загрузке передаваемых данных будет свидетельствовать об успехе обмена. Вопрос конечно остается с тем, что делать с квитком об успехе, что делать с квитком об отказе и что делать, когда квиток вообще не пришел.
Flextor74; +1 Ответить
10. JohnyDeath 301 27.09.22 09:23 Сейчас в теме
Еще из бесплатных есть компонента от СофтБаланса https://sbpg.atlassian.net/wiki/spaces/1C2RMQ/overview
stoptime; Pine-river; NikeeNik; +3 Ответить
11. NikeeNik 75 27.09.22 09:50 Сейчас в теме
(10) спасибо, будем знать.
12. leonvlas 06.10.22 08:21 Сейчас в теме
Вот еще один вариант https://github.com/zhichkin/dajet-agent
stoptime; Pine-river; NikeeNik; +3 Ответить
13. NikeeNik 75 07.10.22 08:57 Сейчас в теме
(12) это, насколько я понял, мидлваре, но автору респект - целая подсистема обмена, все документировано, даже настройка RMQ из подсистемы, неплохо, неплохо.
22. polo453 01.04.24 14:20 Сейчас в теме
Добрый день, есть формат файла, который надо поместить через:

Импорт данных из 1с

Авторизация

Токен Bearer : 8b29271f-a073-4196-9f2f-"..................."

Испорт сотрудника в CRM, метод POST

https://sd.____.ru/api/extensions/44162a51-c7e2-4ad9-a5f0-5ff393f7175f/script/import_employees

скажите плизз, для реализации этой задачи Ваша обработка поможет?

раньше всегда пользовался com-соединениями, но на последних платформах одни ошибки, а через api коннект... я младенец(
буду рад любой инфе
Оставьте свое сообщение