Получение/отправка сообщений 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 интеграция

См. также

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

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

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

5040 руб.

04.05.2021    17849    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25856    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88877    162    216    

318

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

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

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

12000 руб.

02.02.2021    16464    42    49    

23

Merlion Commander Версия 1.3.9.2 - июль 2022 г. (Интеграция с 1С: УT, редакция 11.4, 1С:Розница 2.3,1С:ERP Управление предприятием 2, УТ 10.3, редакция веб-сервиса MERLION API 3.0 от 18.08.2021)

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

Расширении конфигурации "Управление торговлей, редакция 11" для работы с веб-сервисом Мерлион с помощью Merlion API. Расширение и набор подключаемых дополнительных обработок позволяет без изменения конфигурации получить возможность работы с API крупнейшего российского дистрибьютора http://merlion.com. Логика работы максимально приближена к работе веб-сервиса b2b. Вы сможете создать и исправить заказ, зарезервировать товар прямо из 1С, посмотреть актуальные остатки и цены, импортировать штрихкода EAN13 товаров, загружать заказ c автоматическим созданием номенклатуры в 1С и корректности создания. Можно выбирать характеристики по товарным группам и загружать товар с выбранными характеристиками, загружать изображения товара. Не требуется установки дополнительного ПО для работы с веб-сервисом. Кроссплатформенное решение для ОС Windows и Linux. Весь код модулей открыт и доступен для просмотра и внесения изменений.

8280 руб.

02.05.2017    40955    43    64    

50
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. dsdred 3318 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 74 24.09.22 17:54 Сейчас в теме
(1) Не помню точно почему так, давно эта процедура была написана, кажется был там какой-то нюанс, поэтому так и разнесены методы. Но да - перепишу пожалуй.
3. kolya_tlt 86 25.09.22 23:22 Сейчас в теме
использовали более года rest интерфейса. примерно из 1млн сообщений теряем 1. купили компоненту от пули и стали использовать ack, проблемы кончились
NikeeNik; +1 Ответить
5. NikeeNik 74 26.09.22 07:28 Сейчас в теме
(3) Компонента от пули таки стоит денег (деньги не проблема, проблема это пропихнуть в закупку) и что-то они вообще пропали с горизонта. Я текущую реализацию тоже считаю временной, следующую версию интеграции в планах запилить на 1с:шине.
Насчёт пропадания сообщений, я у себя реализовал через квитирование - не панацея конечно, но позволит хотя бы понять что не дошло.
7. NikeeNik 74 26.09.22 11:15 Сейчас в теме
(6) Это не компонента от пули, а их конкурент от БиТа. Ну и у меня есть подозрения, что они положили прибор на развитие и поддержку своего продукта - последний релиз очень сырой.
8. gybson 26.09.22 12:09 Сейчас в теме
(7) Но бесплатный и открытый.

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

А есть информация по какой причине ронялся rphost? Из-за накопления незакрытых соединений?
15. NikeeNik 74 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 74 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 74 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 74 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 74 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 коннект... я младенец(
буду рад любой инфе
Оставьте свое сообщение