Перейти к основному содержимому

Пример 5. Отправка и получение сообщений по протоколу AMQP из стороннего приложения

Внешние информационные системы могут подключаться к «1С:Шине» по протоколу AMQP. В данном примере рассмотрим, каким образом внешняя система может подключаться к каналам «1С:Шины» и отправлять в них сообщение.

совет

В информационных системах на платформе «1С:Предприятие» для подключения к каналам «1С:Шины» предусмотрен объект «СервисыИнтеграции».

Далее рассматривается пример настройки обмена данными между приложением на платформе «Node.js» и «1С:Шиной». Подключение к очереди «1С:Шины» и отправка в нее сообщений будет осуществляться программно на языке JavaScript.

В ходе этого примера вы:

  • В среде разработки «1С:Шины»:
    • создадите проект и настроите в нем процесс интеграции;
    • опубликуете проект на сервере.
  • В панели управления «1С:Шины»:
    • создадите информационные системы, которые будут принимать участие в обмене;
    • включите информационные системы в состав участников процесса интеграции;
    • запустите процесс интеграции.
  • Напишете скрипт на языке JavaScript и выполните программную отправку и получение сообщений в «1С:Шина».
  • Проверите обмен сообщениями.

Создание приложения и процесса интеграции

На этом этапе вы создадите в среде разработки «1С:Шины» приложение и добавите в него процесс интеграции.

  1. Создайте новое приложение с файловой СУБД и откройте его в режиме разработки.
  2. Добавьте новый элемент проекта — процесс интеграции. Назовите его ОбменТиповой и установите для его свойства СправочникУчастников значение ИнформационныеСистемы.

«1С:Шина» создаст в проекте новый процесс интеграции и откроет редактор для создания его схемы.

Редактирование схемы процесса интеграции

На этом этапе вы создадите схему процесса интеграции, которая описывает взаимодействие информационных систем. Схема интеграции в данном примере будет выглядеть следующим образом:

Данная схема включает в себя одну группу участников: «Приложения». В эту группу позже, после публикации проекта, будет добавлена одна информационная система, написанная на языке JavaScript.

Для участника из группы, связанной с узлами вида Канал1СНазначение («ВПриложение») и Канал1СИсточник («ИзПриложения»), в «1С:Шине» создаются две индивидуальные очереди: в одну очередь приложение сможет отправлять сообщения, из другой — получать. Приложение подключается к очередям по протоколу AMQP. В данном примере приложение-отправитель будет подключаться к очередям сообщений программно, при помощи специального скрипта, написанного на языке JavaScript. После того как сообщение отправлено приложением, оно попадает в узел Канал1СНазначение, после чего, дойдя до узла ФайлНазначение, записывается в файл.

В левой части схемы отображен процесс, в ходе которого внешнее приложение получает сообщение из «1С:Шины». Сообщение генерируется из содержимого файлов, которые появляются в каталоге отправителя. После этого сообщение попадает в Канал1СИсточник, где сохраняется в очереди сообщений. Из этой очереди приложение получает сообщение.

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

Пример YAML-файла процесса интеграции
ВидЭлемента: ПроцессИнтеграции
ОбластьВидимости: ВПодсистеме
Ид: 124de3fd-b9e4-4272-a70e-e6078de2b819
Имя: ОбменТиповой
СправочникУчастников: e1c::ОбменAMQP::Основной::ИнформационныеСистемы
Схема:
ГруппыУчастников:
-
Ид: dd844c40-08d5-4069-9fca-667c4297c7a1
Имя: Приложения
X: 214
Y: 106
Высота: 60
Ширина: 138
Маршруты:
-
Ид: f5429b14-80df-4624-ba1f-8c66ac093444
В: ВПриложение
Из: ФайлИсточник
Точки:
-
X: 130
Y: 308
-
X: 130
Y: 308
-
Ид: 13526c32-2096-4d1b-9007-c1701b786042
В: ФайлНазначение
Из: ИзПриложения
Точки:
-
X: 442
Y: 310
-
X: 442
Y: 310
Связи:
-
Ид: 961f3a7a-6a03-4a0b-a8f6-672b217f28c1
Группа: Приложения
НаправлениеСвязи: ИзУзлаВГруппу
Узел: ВПриложение
Точки:
-
X: 130
Y: 200
-
X: 284
Y: 200
-
Ид: c5d1e661-1cc7-4a4e-9e3c-08219eebe400
Группа: Приложения
НаправлениеСвязи: ИзГруппыВУзел
Узел: ИзПриложения
Точки:
-
X: 283
Y: 199
-
X: 442
Y: 199
Узлы:
-
Вид: Канал1СИсточник
Ид: 60b6a793-af30-4e64-8582-24215b0237fe
Имя: ИзПриложения
X: 367
Y: 219
Высота: 62
Ширина: 150
-
Вид: ФайлНазначение
Ид: 863a0dc8-0c17-4cb1-98d7-d10f1ff7884d
Имя: ФайлНазначение
X: 364
Y: 336
Высота: 64
ДействиеНадСуществующимФайлом: Дописывать
ИмяФайла: СообщенияИзШины
Каталог: C:\Users\into
Ширина: 157
-
Вид: Канал1СНазначение
Ид: 54643b4e-0976-4ccc-8e80-26c311bf59a9
Имя: ВПриложение
X: 58
Y: 221
Высота: 62
Ширина: 145
-
Вид: ФайлИсточник
Ид: 27efe99c-fb97-489b-8463-d45612171bfb
Имя: ФайлИсточник
X: 58
Y: 334
Высота: 64
ИмяФайла: СообщениеВШину.txt
Каталог: C:\Users\from
Ширина: 144
  1. Добавьте на схему группу участников. Для этого прокрутите палитру узлов, выберите ГруппаУчастников и кликните в верхней части схемы, чтобы разместить там группу. Кликните два раза по узлу и задайте имя — Приложения:

    Создание группы участников

  2. Добавьте на схему узел Канал1СИсточник и задайте имя — ИзПриложения:

    Добавление узла «Канал1СИсточник»

  3. Добавьте на схему узел ФайлНазначение:

    Добавление узла «ФайлНазначение»

  4. Аналогичным образом добавьте на схему узлы Канал1СНазначение и ФайлИсточник. Задайте узлу Канал1СНазначение имя ВПриложение:

    Добавление узлов «Канал1СНазначение» и «ФайлИсточник»

  5. Следующим шагом следует обозначить на схеме маршруты и связи. Свяжите группу участников Приложение с узлами ИзПриложения и ВПриложение элементом вида Связь. Для этого прокрутите палитру узлов, выберите Связь, а затем кликните последовательно группу участников Приложение и на узел ИзПриложения. После этого снова выберите Связь и кликните последовательно на узел ВПриложение и группу участников Приложения:

    Добавление связей

  6. Соедините маршрутом узел ИзПриложения с узлом ФайлНазначение, а также ФайлИсточник с узлом ВПриложение. Для этого выберите в палитре элемент вида Маршрут и кликните последовательно на узлы ИзПриложения и ФайлНазначение. После этого снова выберите Маршрут и кликните последовательно на узлы ФайлИсточник и ВПриложение:

    Добавление маршрутов

  7. Для узла ФайлИсточник зададим свойства Каталог и Имя файла.

    • В поле Каталог укажите адрес каталога, который будет просматриваться «1С:Шиной» на предмет появления новых файлов.

    • В поле Имя файла укажите имя файла, из содержимого которого будет формироваться тело сообщения:

      Задание свойств для узла «ФайлИсточник»

  8. Для узла ФайлНазначение зададим свойства Каталог и Имя файла.

    • В поле Каталог укажите адрес каталога, в котором будет создан файл с телом сообщения, полученного из «1С:Шины».

    • В поле Имя файла укажите имя файла с расширением (в примере: СообщенияИзШины.txt), в который будут записываться сообщения, полученные из «1С:Шины»:

      Задание свойств для узла «ФайлНазначение»

  9. Для узла ФайлНазначение в поле ДействиеНадСуществующимФайлом кликните на значок выпадающего списка и выберите значение Дописывать. Таким образом, «1С:Шина» будет дописывать новые сообщения в конец файла. Такой файл будет содержать тела нескольких сообщений:

    Задание действия над существующим файлом

Публикация и открытие приложения

Чтобы опубликовать и открыть приложение, выполните следующие действия:

  1. Нажмите Ctrl+F5. Сервер запросит имя пользователя и пароль. Для аутентификации используйте учетную запись администратора и пароль, который вы создали при установке сервера.

  2. После успешной авторизации вы увидите приложение, а в нем — список существующих процессов интеграции. В примере это будет единственный процесс интеграции ОбменТиповой:

    Приложение с процессом интеграции

Настройка приложения в панели управления

На данном этапе мы создадим участников процесса интеграции, а также добавим участников в соответствующие группы.

  1. Откройте приложение, если оно у вас закрыто.

  2. Создайте инфосистему с кодом П1 и наименованием Приложение.

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

  4. Перейдите на вкладку Процессы и нажмите на процесс ОбменТиповой. Вы увидите схему процесса интеграции и панель свойств схемы. На схеме выберите группу Приложения. Добавьте в нее информационную систему Приложение. Закройте окно Состав группы Приложения.

  5. Запустите созданный процесс интеграции. Для этого нажмите Запустить в правом верхнем углу:

    Запуск процесса интеграции

  6. Закройте окно Состав группы Приложения.

Следующим шагом создадим скрипт для подключения приложения, написанного на языке JavaScript, к серверу «1С:Шины».

Подключение по протоколу AMQP

Сохраним название приложения, а также идентификатор ключа и секрет клиента, полученные на этапе создания информационной системы, в переменные. Помимо этого, сохраним в переменные хост и порт, на котором работает сервер «1С:Шины», а также протокол передачи данных (http или https):

let application = `НАЗВАНИЕ_ПРИЛОЖЕНИЯ`;
let id_key = `ИДЕНТИФИКАТОР_КЛЮЧА`;
let client_secret = `СЕКРЕТ_КЛИЕНТА`;
let hostname = `ИМЯ_ХОСТА`;
let port = `ПОРТ`; // Впишите имя порта
let protocol = `ПРОТОКОЛ`; // Впишите протокол
let node_name_sender = 'Канал1СИсточник'; // Впишите имя узла-источника, как на схеме процесса интеграции
let node_name_receiver = 'Канал1СНазначение'; // Впишите имя узла-назначения, как на схеме процесса интеграции
примечание

Название приложения вы можете найти в URL-адресе самого приложения. URL-адрес приложения выглядит следующим образом: ПРОТОКОЛ://ИМЯ_ХОСТА:ПОРТ/applications/НАЗВАНИЕ_ПРИЛОЖЕНИЯ

Отображение названия приложения в URL-адресе

Далее следует аутентифицировать информационную систему и получить токен, после чего с полученным токеном обратиться к серверу «1С:Шины» и подключиться к очереди, в которую приложение будет отправлять сообщения:

//  Отправка запроса к серверу на получение токена
let request = require('request');
let cookie_jar = request.jar();
let request1с = request.defaults({ jar: cookie_jar });

const base64data = Buffer.from(`${id_key}:${client_secret}`, 'utf8').toString('base64');

request1с.post({
url: `${protocol}://${hostname}:${port}/auth/oidc/token`,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": "Basic " + base64data
},
body: 'grant_type=client_credentials',
json: false
}, authenticationHandler);

// Обработка результатов аутентификации, получение имени очереди для подключения
function authenticationHandler(_err, _httpResponse, body) {

const jbody = JSON.parse(body);
const id_token = jbody.id_token;

request1с.get({
url: `${protocol}://${hostname}:${port}/applications/${application}/sys/esb/runtime/channels`,
headers: {
'Authorization': 'Bearer ' + id_token
},
body: '',
json: false,
},
function (_err, _httpResponse, body) {
const parsed_body = JSON.parse(body)

const sender = parsed_body.items.find((e) => e.channel == node_name_sender).destination
console.log('senderDestination:', sender)
const receiver = parsed_body.items.find((e) => e.channel == node_name_receiver).destination
console.log('receiverDestination:', receiver)

connectQueue(id_token, sender, receiver)
}
)
}

Следующим шагом подключимся к очереди, настроим обработчики входящих сообщений (в примере входящие сообщения будут выводиться в консоль), а также напишем код для отправки сообщений (в примере сообщения будут генерироваться и отправляться каждые 10 секунд):

// Подключение к очереди
function connectQueue(id_token, senderDestination, receiverDestination) {
const amqpuri = require('amqpuri');
// Формирование URI для подключения к очереди
const uri = amqpuri.format({
hostname: hostname,
port: 6698,
vhost: `/applications/${application}`,
username: id_token,
password: id_token,
frameMax: 1000000,
channelMax: 7000,
heartbeat: 6000,
locale: 'en_EN'
});

let AMQPClient = require('amqp10').Client;
const activeMQPolicy = require("amqp10").Policy;
let queueClient = new AMQPClient(activeMQPolicy.ActiveMQ); // Uses PolicyBase default policy

// Данную строку следует раскомментировать, если возникнут ошибки, связанные со spread
// Promise = require('bluebird')

// Переменная-счетчик
let count = 0;

// Создание соединения с очередями сообщений
queueClient.connect(uri, { 'saslMechanism': 'PLAIN' })
.then(function () {
return Promise.all([
queueClient.createReceiver(receiverDestination),
queueClient.createSender(senderDestination)

]);
})
// Обработка полученных сообщений
.spread(function (receiver, sender) {
receiver.on('message', function (message) {
console.log('Message received: ', message.body.toString('utf8'));
});
receiver.on('errorReceived', function (err) {
console.log('errorReceived:', err);
});
receiver.on('error', function (error) {
console.log('Error: ', error);
});

// Отправка сообщений с интервалом в 10 секунд
setInterval(() => {
count++
let request = {
body: new Buffer.from(`Сообщение номер: ${count} \n`),
header: { durable: true }
};
sender.send(request);
}, 10000);

}
)
.error(function (err) {
console.log("Error: ", err);
});
}

Проверка обмена сообщениями

совет

Архив с проектом, в котором содержится скрипт для отправки и получения сообщений application.js, а также список библиотек (файл package.json), необходимых для его запуска, вы можете скачать по ссылке.

Для запуска скрипта предварительно необходимо установить программную платформу Node.js. Вы можете загрузить ее с официального сайта.

Запустите процесс интеграции. Для этого перейдите на страницу приложения и на карточке процесса интеграции нажмите на иконку запуска:

Запуск процесса интеграции

Теперь мы можем отправить сообщение в «1С:Шина». Скачайте архив с проектом и извлеките его.

Откройте файл application.js. Для этого вы можете использовать текстовый редактор (например Блокнот) либо интегрированную среду разработки (например VS Code). Впишите значения переменных:

let application = 'APPLICATION_NAME'; // Впишите имя приложения
let id_key = 'ID_KEY'; // Впишите идентификатор ключа
let client_secret = 'CLIENT_SECRET'; // Впишите секрет клиента
let hostname = 'HOST_NAME'; // Впишите имя хоста
let port = 'PORT'; // Впишите имя порта
let protocol = 'PROTOCOL'; // Впишите протокол
let node_name_sender = 'SOURCE_CHANNEL'; // Впишите имя узла-источника, как на схеме процесса интеграции
let node_name_receiver = 'DESTINATION_CHANNEL'; // Впишите имя узла-назначения, как на схеме процесса интеграции

Сохраните файл.

После этого откройте командную строку и перейдите в папку, в которой содержатся файлы package.json и application.js:

cd amqp

Затем следует установить все необходимые библиотеки, которые будут использоваться для запуска скрипта application.js. Чтобы их установить, выполните в командной строке следующую команду:

npm install

Затем запустите сам скрипт:

node application.js

Откройте приложение «1С:Шины». Вы увидите, что счетчик сообщений увеличился:

Увеличение счетчика сообщений

Кликните на карточку процесса интеграции и перейдите на вкладку Каналы 1С. Вы увидите, что два сообщения, которые были отправлены из скрипта в канал ИзПриложения, были доставлены к получателю (в примере — сохранены в файл СообщенияИзШины.txt):

Отображение счетчика сообщений в каналах

Чтобы в этом удостовериться, откройте файл СообщенияИзШины.txt. Вы увидите эти сообщения:

Сообщения из шины

Теперь отправим сообщение в наше приложение. Для этого следует создать файл с сообщением, назвать его СообщениеВШину.txt, после чего следует перенести его в папку, которую вы указали в свойствах узла ФайлИсточник. В карточке процесса интеграции, на вкладке Каналы 1С вы увидите, что одно сообщение попало в канал ВПриложение, после чего было доставлено получателю:

Отображение счетчика входящих сообщений

Откройте вновь командную строку, в которой вы запустили скрипт, и нажмите Ввод, чтобы увидеть полученное сообщение:

Отображение полученного сообщения

Вы также можете остановить скрипт, после чего вновь осуществить отправку сообщения из файла. Данное сообщение не будет потеряно — вы увидите его сразу же после повторного запуска скрипта. Так происходит потому, что «1С:Шина» обеспечивает гарантированную доставку сообщений. В случае если система-получатель выключена (как в случае с остановленным скриптом), «1С:Шина» будет повторять попытки доставить сообщение до тех пор, пока сообщение не устареет либо не будет достигнут лимит максимального количества повторных доставок (по умолчанию — бесконечное количество попыток). Подробнее про принцип гарантированной доставки можно прочитать здесь.