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

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

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

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

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

Создание проекта в «1С:Шине»

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

  • Откройте панель управления.
  • Нажмите Приложения > + Новое приложение;

  • Убедитесь, что выбраны варианты Из проекта и Новый проект;

  • Задайте имя проекта — ОбменAMQP и нажмите Tab. «1С:Шина» заполнит остальные поля и включит режим разработки для создаваемого приложения;

  • Выберите тип СУБД (в примере это будет Файловая СУБД) и нажмите Создать;

  • Новое приложение появится в списке со статусом Создается. Через некоторое время статус приложения изменится на Работает;

Добавление элемента проекта вида «Процесс Интеграции»

На этом этапе вы откроете приложение в среде разработки и добавите в него элемент проекта — процесс интеграции.

  • Чтобы открыть проект в среде разработки, нажмите Разработать... в конце строки;

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

  • «1С:Шина» подготовит рабочую область, построит проект и откроет его в среде разработки;

  • Добавьте новый элемент проекта — процесс интеграции. Для этого в представлении НАВИГАТОР ПРОЕКТА нажмите правой кнопкой мыши Основной, затем в контекстном меню выберите Новый > Элемент проекта;

  • Выберите вид добавляемого элемента проекта — Процесс Интеграции;

  • Задайте имя создаваемого элемента — ОбменТиповой — и нажмите Ввод;

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

Создание схемы процесса интеграции

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

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

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

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

Чтобы создать схему интеграции, выполните следующие шаги:

  • Добавьте на схему группу участников. Для этого прокрутите палитру узлов, выберите ГруппаУчастников и кликните в верхней части схемы, чтобы разместить там группу;

  • Выделите группу и в представлении СВОЙСТВА задайте ее имя — Приложения;

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

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

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

Следующим шагом следует обозначить на схеме маршруты и связи.

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

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

Следующим шагом зададим свойства для узлов ФайлИсточник и ФайлНазначение.

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

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

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

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

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

После того как проект готов, его следует опубликовать на сервере.

  • Чтобы опубликовать проект на сервере, нажмите F9

    Подробнее о том, как опубликовать проект

  • За ходом обновления проекта вы можете наблюдать в левом нижнем углу, в строке состояния среды разработки. Статус updating изменится на статус running. Это говорит о том, что приложение было обновлено и запущено заново;

  • Откройте опубликованное приложение. Для этого нажмите на имя приложения в строке состояния слева. В открывшемся меню выберите Открыть приложение...

    Подробнее о том, как открыть приложение

  • Сервер запросит имя пользователя и пароль. Для аутентификации используйте учетную запись администратора и пароль, который вы создали при установке сервера;

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

Настройка приложения в панели управления «1С:Шины»

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

  • Откройте приложение, если вдруг оно у вас закрыто;
  • Нажмите Инфосистемы > Добавить систему;

Добавим участника Приложение.
  • Задайте код системы — П1 и наименование — Приложение. Нажмите Добавить;

  • В справочнике Информационные системы отобразится созданный участник:

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

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

Следующим шагом добавим участников процесса интеграции в группы участников.
  • Перейдите на вкладку Процессы и нажмите на процесс Основной::ОбменТиповой;

  • Вы увидите схему процесса интеграции и панель, позволяющую задавать свойства узлов этой схемы. На схеме выберите группу Приложения, а затем нажмите Состав группы в правом нижнем углу;

  • Вы увидите список информационных систем, входящих в группу Приложения. Сейчас в группе нет ни одной информационной системы. Установите флажок у информационной системы Приложение и нажмите Добавить в группу;

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

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

Подключение к «1С:Шине» по протоколу AMQP.

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

let application = НАЗВАНИЕ_ПРИЛОЖЕНИЯ;
let id_key = ИДЕНТИФИКАТОР_КЛЮЧА;
let client_secret = СЕКРЕТ_КЛИЕНТА;
let hostname = ИМЯ_ХОСТА;
let port = ПОРТ; // Впишите имя порта
let protocol = ПРОТОКОЛ; // Впишите протокол
Примечание: Название приложения вы можете найти в URL-адресе самого приложения. URL-адрес приложения выглядит следующим образом: ПРОТОКОЛ://ИМЯ_ХОСТА:ПОРТ/applications/НАЗВАНИЕ_ПРИЛОЖЕНИЯ

Далее следует аутентифицировать информационную систему и получить токен, после чего с полученным токеном обратиться к серверу «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 receiver = parsed_body.items[0].destination
      const sender = parsed_body.items[1].destination

      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'; // Впишите протокол

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

После этого откройте командную строку и перейдите в папку, в которой содержатся файлы package.json и application.js:
 cd amqp
Затем следует установить все необходимые библиотеки, которые будут использоваться для запуска скрипта application.js. Чтобы их установить, выполните в командной строке следующую команду:
npm install

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

node application.js

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

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

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

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

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

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