Мы команда разработчиков системного программного обеспечения.
Мы дружим с ИТ-компаниями, работающими в сфере технического аутсорсинга,
и наши идеи
позволяют автоматизировать работу системных администраторов.
Наша цель – дать коллегам по цеху инструменты, упрощающие им работу.
Продукт позволяет реализовать программное взаимодействие нескольких экземпляров приложений 1С между собой и с сервером баз данных MSSQL посредством использования службы очередей сообщений PAUTMessageService.
Задача взаимодействия приложений в распределённой сети является актуальной для разработчиков 1С конфигураций. Если рассмотреть потребности в подобных решениях, можно выделить следующие задачи:
1. Для отображения актуальных данных из какого-либо справочника у разработчиков 1С конфигураций нет механизма получения оповещения от сервера баз данных или приложения изменившего данные. Для этих целей в упрощённом варианте применяется обновление по таймеру.
2. Выполнение длительных операций возможно с использованием объекта «Фоновое задание», и существующий механизм позволит «узнать» о том, когда задание завершено, но приложение осуществляющее проверку завершения задания не может выполнять каких-либо других действий. Поэтому разработчикам приходится «отмечать» на сервере баз данных, что операция завершена, а на клиентских приложениях снова пользоваться таймерами.
3. При разработке любой системы приближенной к системам реального времени разработчикам 1С приходится «изобретать» механизм взаимодействия приложений, отвлекаясь от реализации прикладной задачи. К таким продуктам можно отнести системы управления складскими запасами и др.
4. Разработчикам 1С приходится состыковывать свои продукты с другими учётными системами, «узнавая» об изменениях в «чужих» данных с задержкой.
В общем случае для решения этих задач предназначены очереди сообщений. Например, такие продукты как MSMQ и различные реализации стандарта JMS вроде бы не сложны в развёртывании, по ним доступна документация, но их интеграция с продуктами 1С требует написания кода внешних компонент и знаний по администрированию и сопровождению этих продуктов.
В своей реализации мы предлагаем следующее:
1. Службу очередей сообщений – простую в установке и использовании;
2. Универсальную для всех релизов 1С внешнюю компоненту взаимодействия с этой службой;
3. Расширенная хранимая процедура для СУБД MSSQL также взаимодействующая со службой;
4. Приложение позволяющее создавать триггеры в базах данных 1С, которые могут оповестить об изменениях в справочниках, документах и других объектах.
На схеме 1 отображено взаимодействие всех предлагаемых компонентов продукта в распределённой сети. Фактически взаимодействие и обмен сообщениями осуществляется экземплярами службы PAUTMessageService установленными на всех узлах сети. Каждый хост может быть наделён одной из указанных ролей или все компоненты продукта могут быть установлены на одном узле.
Схема 1. Взаимодействие компонентов продукта.
Сценарий развёртывания компонентов продукта:
1. На клиентские ПК устанавливается инсталляционный пакет «AddIn нотификации объектов 1С.msi» в который входит служба очередей сообщений и необходимые библиотеки;
2. На компьютер являющийся сервером баз данных 1С с развёрнутым сервером MSSQL устанавливаем пакет «PAUT Core 1.3.msi»;
3. На компьютер разработчика устанавливаем пакет «Менеджер нотификации объектов 1С.msi» содержащий приложение для управления триггерами производящими оповещение клиентских приложений об изменении информации в базе данных.
Далее будет описано работа службы PAUTMessageService, использование внешней компоненты «PAUT1CObjNotify.dll» и приложения «Менеджер нотификации объектов 1С».
Служба реализует простой механизм асинхронного взаимодействия приложений с использованием очередей сообщений. Реализована схема подписки на сообщения с сохранением состояния. Необходимо определится с терминологией в контексте данной задачи:
Сообщение – это блок данных, передаваемый от одного приложения к другому через цепочку служб обмена сообщениями. Содержимое блока данных определяется программистом использующим службы обмена сообщениями и является «понятным» как для отправляющей, так и для принимающей стороны. Каждому сообщению назначается произвольное наименование.
Приложение – программа «желающая» передать данные запакованные в именованное сообщение другому экземпляру программы или другому приложению «ожидающему» получения сообщений.
Очередь – программный механизм внутри службы, предназначенный для буферизации сообщений перед отправкой и реализующий алгоритм их маршрутизации.
Асинхронная передача – вариант реализации, при котором приложения отправляющие сообщения в очередь могут немедленно продолжить свою работу, а приложения желающие получить сообщение не «ждут» его, а получают оповещение о приходе сообщения, не приостанавливая свою работу для его обработки.
Подписчик (слушатель) – приложение, регистрирующееся на получение сообщений по определённому имени. Регистрация может быть осуществлена на удалённом сетевом узле, на котором развёрнута служба PAUTMessageService. Тогда при поступлении сообщения с таким именем подписчик будет оповещён об этом событии.
Сохранение состояния – это возможность хранить и восстанавливать список регистраций подписчиков на случае рестарта службы или какого-либо аппаратного сбоя.
Необходимо отметить, что данная реализация не претендует на оригинальность, а лишь повторяет уже отлаженные алгоритмы, предлагая простой программный интерфейс для разработчика.
Служба PAUTMessageService фактически является TCP сервером, принимающим входящие соединения. Так как сети строятся с использованием маршрутизаторов, в данной реализации был заложен механизм преодоления трансляторов сетевых адресов (NAT) для передачи сообщений между «закрытыми» сетями.
Что бы использовать функционал службы сообщений в своих разработках, в поставку продукта включена клиентская библиотека «PAUTMessageServiceClient.dll». Она передаёт вызовы в службу и выполняет обратные вызовы (оповещения о принятых сообщениях) из службы.
Данная внешняя компонента работает в 1С версий 7.7, 8.0 - 8.2. Она взаимодействует со службой очередей сообщений PAUTMessageService через клиентскую библиотеку «PAUTMessageServiceClient.dll» и фактически является «обёрткой» для осуществления вызовов из конфигураций 1С. Разработчики конфигураций 1С могут использовать эту компоненту для обмена сообщениями между своими приложениями 1С и для взаимодействия со сторонними продуктами, использующими клиентскую библиотеку службы очередей сообщений PAUTCommandService.
Чтобы создать экземпляр объекта компоненты, необходимо объявить переменную для объекта.
Перем глСлужбаСообщений Экспорт;
|
Создание экземпляра в различных версиях 1С различно.
В версии 1С 7.7
Если ЗагрузитьВнешнююКомпоненту("PAUT1CObjNotify.dll") = 1 Тогда глСлужбаСообщений = СоздатьОбъект("Addin.PAUT1CObjNotify"); Сообщить("Компонента PAUT1CObjNotify загружена"); Иначе Сообщить("Компонента PAUT1CObjNotify не загружена!"); КоценЕсли;
|
В версии 1С 8.х
Попытка ЗагрузитьВнешнююКомпоненту("PAUT1CObjNotify.dll"); глСлужбаСообщений = Новый("Addin.PAUT1CObjNotify"); Сообщить("Компонента PAUT1CObjNotify загружена"); Исключение Сообщить(ОписаниеОшибки()); Сообщить("Компонента PAUT1CObjNotify не загружена!", СтатусСообщения.Внимание); КонецПопытки
|
После успешной загрузки компоненты можно регистрироваться в качестве слушателя сообщений и посылать другим слушателям сообщения. Далее представлены все функции компоненты и аргументы этих функций.
Регистрирует клиента на определенное сообщение.
ЗарегистрироватьНаХосте(НаименованиеСобытия, НаименованиеХоста, "");
|
НаименованиеСобытия – строка определяющая на какое событие следует зарегистрироваться в службе событий.
НаименованиеХоста – строка определяющая имя компьютера или его IP адрес на котором будет осуществлена регистрация на событие. Если значение будет пустой строкой, то регистрация будет выполнена на локальном компьютере.
Третий параметр зарезервирован для будущего использования, и его следует указывать в виде пустой строки.
Разрегистрирует клиента с указанного наименования сообщения.
РазрегистрироватьНаХосте(НаименованиеСобытия, НаименованиеХоста);
|
Параметры данной функции аналогичны параметрам выше, только в данном случае будет выполнена разрегистрация.
Генерирует сообщение, которое должны получить ранее зарегистрированные на него слушатели.
СгенерироватьСобытиеНаХосте(НаименованиеСобытия, ДанныеСобытия, НаименованиеХоста);
|
ДанныеСобытия – это строка представляющая собой любые данные которые будут переданы зарегистрированным слушателям на указанное НаименованиеСобытия.
НаименованиеХоста – строка определяющая имя компьютера или его IP адрес на котором будет осуществлена генерация событие. Если значение будет пустой строкой, то событие будет сгенерировано на локальном компьютере.
Для того чтобы в 1С реагировать на сгенерированные события, нужно выполнить ряд действий которые различны в разных версиях 1С.
В версии 1С 7.7
Нужно воспользоваться глобальной процедурой ОбработкаВнешнегоСобытия
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные) Экспорт Перем Инфо; Сообщить("ВнешнееСобытие: Источник=" + Источник + "; Событие=" + Событие + "; Данные=" + Данные); Если (Источник = "PAUTMessageService") Тогда Данные = СтрЗаменить(Данные, "|", РазделительСтрок); // Идентификатор службы того кто послал событие Инфо = СтрПолучитьСтроку(Данные, 1); // Идентификатор мессанжера того кто послал событие Инфо = СтрПолучитьСтроку(Данные, 2); // Наименование хоста того кто послал событие Инфо = СтрПолучитьСтроку(Данные, 3); // IP адреса того кто послал событие Инфо = СтрПолучитьСтроку(Данные, 4); // Наименование события Инфо = Событие; // Данные события Инфо = СтрПолучитьСтроку(Данные, 5); КонецЕсли КонецПроцедуры
|
В версии 1С 8.х
Можно воспользоваться глобальной процедурой ОбработкаВнешнегоСобытия в глобальном модуле приложения или процедурой ВнешнееСобытие формы.
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные) Экспорт Сообщить("ОбработкаВнешнегоСобытия: Источник=" + Источник + "; Событие=" + Событие + "; Данные=" + Данные); КонецПроцедуры
Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт Перем Инфо; Сообщить("ВнешнееСобытие: Источник=" + Источник + "; Событие=" + Событие + "; Данные=" + Данные); Если (Источник = "PAUTMessageService") Тогда Данные = СтрЗаменить(Данные, "|", Символы.ПС); // Идентификатор службы того кто послал событие Инфо = СтрПолучитьСтроку(Данные, 1); // Идентификатор мессанжера того кто послал событие Инфо = СтрПолучитьСтроку(Данные, 2); // Наименование хоста того кто послал событие Инфо = СтрПолучитьСтроку(Данные, 3); // IP адреса того кто послал событие Инфо = СтрПолучитьСтроку(Данные, 4); // Наименование события Инфо = Событие; // Данные события Инфо = СтрПолучитьСтроку(Данные, 5); КонецЕсли КонецПроцедуры
|
Источник – При вызове указанных процедур во всех версиях 1С, этот параметр всегда равен строке "PAUTMessageService".
Событие – Строка равная значению строки НаименованиеСобытия на которое было выполнена регистрация события.
Данные – Строка содержащая в себе информацию о компьютере который сгенерировал событие и данные которые он передал в строке ДанныеСобытия во время вызова функции СгенерироватьСобытиеНаХосте. Вся эта информация разделена вертикальной чертой "|". Из примеров видно как можно ее распарсить.
Для получения оповещений об изменении информации в базах данных 1С, развёрнутых с использованием СУБД MSSQL, разработана библиотека, реализующая расширенную хранимую процедуру. Эта хранимая процедура, используя службу очередей сообщений PAUTMessageService, может оповещать зарегистрированных слушателей об изменении информации в базе данных MSSQL. Исполняемые файлы для этой хранимой процедуры входят в инсталляционный пакет «PAUT Core 1.3.msi», который необходимо развернуть на сервере MSSQL. Так как на компьютере, являющемся сервером баз данных может быть несколько экземпляров серверов MSSQL, процесс регистрации расширенной хранимой процедуры необходимо выполнить вручную. Для этого в папке «%CommonProgramFiles%\PAUT\1.3\udf_mssql» расположено приложение «MSUDFNotifyInstaller.exe». При его запуске будет предложен выбор экземпляра сервера и после прохождения аутентификации произведена регистрация.
Вызывать эту хранимую процедуру можно из триггеров, срабатывающих на изменение данных в необходимых таблицах. Код этих триггеров можно писать вручную, а можно воспользоваться специально разработанным приложением «Менеджер нотификации объектов 1С» для их автоматической генерации. Сначала рассмотрим хранимую процедуру и пример кода триггеров для тестовой таблицы «TestTable».
Синтаксис вызова расширенной хранимой процедуры
exec master.dbo.PAUTNotify @NotifyName, @NotifyData;
|
@NotifyName – Строка содержащая наименование сообщения;
@NotifyData – Строка содержащая данные которые будут переданы слушателям зарегистрированные на сообщение @NotifyName.
Код создания таблицы «TestTable»
/*Создание тестовой таблицы для демонстрации оповещения изменений*/ create table [dbo].[TestTable] ( [ID] bigint identity(1,1) NOT NULL, [Data] varchar(100), primary key (ID) ) go
|
Код трёх триггеров: на удаление, вставку и обновление данных в таблице «TestTable»
/*Создание триггера на удаление из таблицы*/ create trigger [dbo].[TestTableDel] on [dbo].[TestTable] after delete as begin set nocount on; declare @IDStr varchar(1024); select @IDStr = cast(ID as varchar(100)) from deleted exec master.dbo.PAUTNotify 'TestTable_delete', @IDStr; end go
/*Создание триггера на вставку в таблицу*/ create trigger [dbo].[TestTableIns] on [dbo].[TestTable] after insert as begin set nocount on; declare @IDStr varchar(1024); select @IDStr = cast(ID as varchar(100)) from inserted exec master.dbo.PAUTNotify 'TestTable_insert', @IDStr; end go
/*Создание триггера на обновление в талице*/ create trigger [dbo].[TestTableUpd] on [dbo].[TestTable] after update as begin set nocount on; declare @IDStr varchar(1024); select @IDStr = cast(ID as varchar(100)) from inserted exec master.dbo.PAUTNotify 'TestTable_update', @IDStr; end go
|
Эти триггеры будут выполняться при удалении, вставки и изменении данных в таблице. Размещённый в них код вызова расширенной хранимой процедуры произведёт генерацию события на локальном компьютере. Таким образом, удалённые приложения, которые зарегистрируются на компьютере сервере баз данных на события 'TestTable_delete', 'TestTable_insert', 'TestTable_update' будут получать оповещения, когда кто-либо внесет изменения в таблицу [TestTable]. И в качестве данных передаваемых клиенту будут значения поля [ID] той записи, с которой произвели изменения. По этому идентификатору клиентские приложения смогут обновить всю необходимую информацию.
В инсталляционный пакет входит приложение (Рис. 1), упрощающее выполнение всех описанных выше операций для разработчиков 1С конфигураций. Это приложение может подключается к базам данных 1С различных версий, расположенных на MSSQL серверах. Оно отображает объекты 1С, в привычном для 1С программистов виде и соответствующие им таблицы в базе данных.
Рис. 1. Внешний вид приложения «Менеджер нотификации объектов 1С».
Слева отображен список алиасов для подключения к SQL базам данных 1С. На данном рисунке в приложении зарегистрировано два алиаса для 1С версии 7.7 и версии 8.1. Сверху над списком находится панель инструментов, с помощью которой можно выполнять редактирование списка алиасов, устанавливать и разрывать соединения для соответствующего алиаса и открывать редактор триггеров для какого-либо объекта 1С.
На рисунке 2 показан вид приложения после установления подключения к алиасу «Тестовая база данных 1С версии 8.1».
Рис. 2. Внешний вид приложения после подключения к базе данных.
В правой части окна отображается дерево объектов 1С с соответствующей таблицей хранения. В данном случае в тестовой базе создан только один объект «СправочникАвтоОбновления». По двойному клику на любом из объектов будет предложено создать для таблицы этого объекта три триггера подобные тому, как описаны выше для тестовой таблицы, по необходимости тело триггера можно отредактировать под свои нужды. Не рекомендуется изменять наименования триггеров.
Как видно на рисунке напротив имени этого справочника стоит галочка, это означает что для соответствующей таблицы хранения, в нашем случае «_Reference1» уже созданы три триггера на удаление, добавление и изменение.
Для того что бы выставить эту галочку достаточно сделать двойной клик указателем мыши, после чего откроется диалог на создание необходимых триггеров (Рис. 3). Стоит обратить внимание на то, что наименование сообщения генерируемое в триггерах складывается из наименования базы данных, наименования объекта 1С и действия выполняемого над таблицей этого объекта. Для того чтобы получать оповещения обо всех изменениях объекта «СправочникАвтоОбновления», нужно зарегистрироваться на все три события:
1. Test01_СправочникАвтоОбновления_добавление;
2. Test01_СправочникАвтоОбновления_изменение;
3. Test01_СправочникАвтоОбновления_удаление.
Рис. 3. Создание триггеров для объекта «СправочникАвтоОбновления».
В качестве данных, при генерации события, будет посылаться «Код», соответствующей записи в справочнике, для того чтобы в коде 1С можно было выполнить необходимые манипуляции с этой записью. Для разных типов объектов 1С будут посылаться различные данные. Детально это описано в таблице №1.
Тип объекта 1С |
Поле таблицы хранения |
1С версии 7.7 |
|
Системные |
Первичный ключ |
Справочник |
Code |
Документ |
IDDoc |
Регистр |
Первичный ключ |
Календарь |
Первичный ключ |
Журнал расчетов |
Первичный ключ |
1C версии 8.х |
|
Системные |
Первичный ключ |
Справочники |
_Code |
Документы |
_Number |
Регистры |
Первичный ключ |
Календари |
Первичный ключ |
Журналы расчетов |
Первичный ключ |
Планы обмена |
_Code |
Последовательности |
Первичный ключ |
Журналы документов |
Первичный ключ |
Перечисления |
Первичный ключ |
Планы видов характеристик |
_Code |
Планы счетов |
_Code |
Регистр сведений |
Первичный ключ |
Регистр накопления |
Первичный ключ |
Регистр бухгалтерии |
Первичный ключ |
Регистр расчета |
Первичный ключ |
План видов расчета |
_Code |
Бизнес процесс |
_Number |
Задача |
_Number |
Таблица №1. Соответствия объектов 1С и данных посылаемых при генерации событий.
Если в приложении сделать двойной клик по объекту напротив которого уже стоит галочка, то откроется диалог, предлагающий удалить эти три триггера у соответствующей таблицы объекта (Рис. 4).
Рис.4. Удаление триггеров для объекта «СправочникАвтоОбновления».
В приложении так же есть возможность отредактировать уже созданные триггеры. Для этого нужно выделить объект с галочкой и нажать на кнопку в панели инструментов. После этого откроется редактор SQL кода триггеров (Рис. 5). В помощь разработчику, в левой части окна расположен список таблиц с их полями, которые можно использовать при редактировании триггеров. Можно внести любые необходимые изменения в этот код и при нажатии кнопки «Применить» будет осуществлена попытка внести изменения в метаданные базы. Сообщения об ошибках выдаваемых серверам баз данных отображаются в области «Сообщения».
Рис. 5. Редактирование триггеров объекта «СправочникАвтоОбновления».
В комплект поставки включены примеры, демонстрирующие возможности продукта:
1. Примеры позволяющие взаимодействовать нескольким экземплярам конфигураций 1С различных версий между собой и с приложениями, написанными на других языках программирования;
2. Пример конфигурации 1С 8.1 с автоматическим обновлением справочника по сигналу от сервера баз данных;
3. Пример конфигурации 1С 7.7 с автоматическим обновлением справочника по сигналу от сервера баз данных;
Первый пример состоит из двух конфигураций 1С расположенных по пути «%CommonAppDataFolder%\PAUT\Manager1CObjNotify\1.0\Demo» в каталоге «Demo1C8File» и в каталоге «Demo1C7File». Это файловые варианты конфигураций, не требующие сервера баз данных. Конфигурации загружают внешнюю компоненту «PAUT1CObjNotify.dll» и обе могут выступать как в роли подписчика на сообщения, так и в роли отправителя сообщений. На панели инструментов обеих конфигураций есть кнопка «Демонстрация службы сообщений». При её нажатии отобразится форма (Рис. 6). При открытии формы будет произведена попытка загрузки внешней компоненты. При успехе в окне «Служебные сообщения» появится строка «Компонента PAUT1CObjNotify загружена», в случае ошибки появится строка «Компонента PAUT1CObjNotify не загружена!».
Рис. 6. Пример 1С «Демонстрация службы сообщений».
Предлагается следующий алгоритм демонстрации работы службы сообщений:
1. Установите дистрибутив с примерами на двух компьютерах;
2. На первом компьютере запустите приложения 1С 7 и 8 с демонстрационными конфигурациями. Далее нажмите кнопку «Зарегистрировать» в обоих приложениях не изменяя другие настройки;
3. На втором компьютере также запустите две демонстрационные конфигурации, но укажите в поле «Наименование хоста» имя или IP адрес первого компьютера. Далее также нажмите кнопку «Зарегистрировать»;
4. Теперь можно нажать кнопку «Сгенерировать событие» в любой конфигурации на любом компьютере. Сообщение появится в поле «Информация событий» всех конфигураций которые ранее зарегистрировались в качестве слушателей.
Также в дистрибутив службы сообщений «PAUT Core 1.3.msi» включены примеры, аналогичные данному и реализованные на языках программирования: Delphi XE2, Builder XE2, VisualStudio 2010 C#. Если запустить любой из этих примеров, то он тоже будет способен получать события от 1С:Предприятия и так же оповещать зарегистрированных слушателей. Это покажет использование службы сообщений для взаимодействия программ разработанных на различных языках программирования.
Необходимо отметить следующее:
1. Можно запустить неограниченное кол-во конфигураций на неограниченном количестве хостов;
2. Для взаимодействия в реальных сетях необходимо чтобы сетевые узлы корректно «разрешали» указанные NETBIOS или DNS имена в IP адреса и по необходимости были выполнены дополнительные настройки службы сообщений;
3. Во всех примерах, в поле «Наименование события» указано идентичное значение. При разработке реальных приложений программист может использовать любое количество произвольных имен сообщений, производя их регистрацию и выполняя генерацию оповещений;
4. Поле «Данные события» является произвольной строкой служащей для передачи необходимой информации между приложениями;
5. Поле «Идентификатор службы» не используется и служит в отладочных целях.
Следующие два примера размещённые в каталогах «Demo1C7MSSQL» и «Demo1C8MSSQL» идентичны и показывают получение оповещения от сервера баз данных об изменении информации в объектах 1С. Рассмотрим пример для 1С 8. Для успешной демонстрации этого примера необходимо выполнить следующие условия:
1. необходим MSSQL сервер, на котором установлен инсталляционный пакет «PAUT Core 1.3.msi»;
2. Необходимо зарегистрировать, в системной базе «Master», расширенную хранимую процедуру «PAUTNotify», для этого в папке «%CommonProgramFiles%\PAUT\1.3\udf_mssql» расположено приложение «MSUDFNotifyInstaller.exe»;
3. Базу данных на MSSQL сервере, в которой будет храниться конфигурация, необходимо называть «Test01», так как это внесено в исходный код;
4. Пример необходимо запускать с компьютера сервера баз данных или менять исходный код примера указывая IP адрес хоста в необходимом параметре функции «РазрегистрироватьНаХосте» описанной выше.
Рис. 7. Демонстрация второго примера «Справочник автоматического обновления».
В конфигурации этого примера создан объект «СправочникАвтоОбновления». При открытии этого справочника в 1С:Предприятии загружается внешняя компонента «PAUT1CObjNotify.dll» и выполняет регистрации на локальном компьютере на три события:
1. Test01_СправочникАвтоОбновления_добавление;
2. Test01_СправочникАвтоОбновления_изменение;
3. Test01_СправочникАвтоОбновления_удаление.
Этот пример следует запускать в двух экземплярах. При внесении изменений в справочник в первом экземпляре приложения 1С:Предприятия, все изменения так же будут отображаться во втором экземпляре 1С:Предприятия. На рисунке 7 отображен запущенный пример 1С:Предприятия с открытым справочником «СправочникАвтоОбновления».
Любые информационные сообщения поступающие от сервера баз данных протоколируются в стандартное окно «Служебные сообщения».
Разработанный продукт является достаточно простым в установке и развёртывании, предлагает разработчикам понятный API, являющийся в тоже время очень гибким. С его помощью можно строить распределённые программные системы работающие в реальном времени. Для интеграции разработанных конфигураций 1С с другими информационными системами, исходный код которых не доступен для модификации, можно использовать возможности продукта VisualBatch. Он также базируется на службе очередей сообщений PAUTMessageService и является свободно распространяемым.