Оглавление
Описание продукта «1С:Шина»
1С:Шина — это продукт, который позволяет обеспечить асинхронный обмен между различными информационными системами. «1С:Шина» содержит интерфейсы для взаимодействия с разными информационными системами по различным протоколам (например, FTP, HTTP, JMS, RabbitMQ), в том числе и с системами «1С:Предприятие». Системы, которые позволяют создавать приложения данного класса называются «Сервисной шиной предприятия» (в английской интерпретации Enterprise Service Bus, ESB).
«1С:Шина» обеспечивает маршрутизацию, трансформацию и гарантированную доставку сообщений. Рассмотрим общую схему передачи сообщений при помощи интеграционной шины:
- Сообщение интеграции на стороне отправителя буферизируется и далее, при условии что интеграционная шина доступна, отправляет его в канал передачи сообщений.
- Интеграционная шина получает сообщение интеграции, проводит его маршрутизацию и направляет в канал передачи получателю.
- Получатель сообщения считывает сообщение интеграции, помещает его в буфер и вызывает обработчики, которые содержат математику приемки сообщения.
Стоит отметить, что сообщения интеграции отправляются и считываются в асинхронном режиме, когда их отправка из системы-отправителя и доставка в систему-получатель происходит не одновременно, и это в том числе обеспечивает гарантированную доставку сообщений. Сообщение не будет отправлено до тех пор, пока интеграционная шина не будет доступна. Точно также, до тех пор, пока не будет получено подтверждение от 1С:Шины, что сообщение получено, будут выполняться повторные попытки отправить сообщение.
Удобнее всего рассматривать 1С:Шину и задачи, которые она способна решить на практическом примере, что мы и сделаем далее.
Постановка задачи с описанием бизнес‑кейса
Сеть ресторанов осуществляет прием, приготовление, выдачу и доставку заказов. Формирование заказов в информационной системе может происходить несколькими способами:
- Непосредственно в ресторане через фронтовую систему «1С:Предприятие 8. Фастфуд. Фронт-офис».
- Часть точек принимают заказы в сторонней информационной базе 1С, которая использовалась на предприятии ранее.
- Заказы также могут поступать из бота в мессенджере Telegram, данные сериализуются и отправляются по протоколу http.
- На предприятии для маршрутизации сообщений уже использовался брокер сообщений RabbitMQ (сообщения передаются в формате AMQP 0.9.1), а также другой брокер, осуществляющий отправку сообщений в формате AMQP 1.0. Необходимо обеспечить считывание и транспортировку сообщений из вышеуказанных брокеров.
В результате наличия большого количества информационных систем, обменивающихся данными о заказах, которые появились на предприятии в разное время, используются два разных формата сообщения, описывающего заказ: старый формат (в виде json) и новый (в виде xml). Отметим, что термины «старый» и «новый» это условность, т. к. в нашем примере на предприятии использовался сначала json, а потом xml.
Пример сообщения в формате json:
{
"timestamp": 1631693068,
"source": "jmeters",
"active": true,
"type": "ЗаказФронта",
"guest_id": "BF5F7F00-001C-11EC-B048-0050560A1F78",
"status": "received_delivery",
"delivery_address": ",,,Москва,,Профсоюзная улица,65 к1,,,,,,,,55.6533,37.538,",
"total_sum": 518,
"origin": "delivery",
"payment_info": {
"pay_type": "CARD",
"sum": 518,
"back_sum": 0,
"total_sum": 518,
"paid": "true",
"rrn_code": "41d4d4ae-bd71-752e-8650-5b730242a51e"
},
"delivery_info": "",
"delivery_address_comment": "",
"items": [
{
"id": 1,
"product_id": "88851C16-3872-11EB-A060-7085C286679E",
"price": 116,
"count": 1,
"total_sum": 116,
"menu_id": "2ED2CBA1-5A56-11EB-A062-7085C286679E",
"status_int": 1
},
"seats": 2
}
В поле type указывается назначение заказа: «ЗаказФронта» или «ЗаказБэка». Аналогично в новом формате xml:
<data>
<timestamp>1631693068</timestamp>
<source>rabbit</source>
<doc_id>1895de51-bf34-46a8-922d-a4c3d2b9d2e8</doc_id>
<active>true</active>
<type>ЗаказБэка</type>
<guest_id>BF5F7F00-001C-11EC-B048-0050560A1F78</guest_id>
<status>received_delivery</status>
<delivery_address>,,,Москва,,Профсоюзная улица,65 к1,,,,,,,,55.6533,37.538,</delivery_address>
<total_sum>518</total_sum>
<origin>delivery</origin>
<payment_info>
<pay_type>CARD</pay_type>
<sum>518</sum>
<back_sum>0</back_sum>
<total_sum>518</total_sum>
<paid>true</paid>
<rrn_code>41d4d4ae-bd71-752e-8650-5b730242a51e</rrn_code>
</payment_info>
<delivery_info/>
<delivery_address_comment/>
<items>
<item>
<id>1</id>
<product_id>1895de51-bf34-46a8-922d-a4c3d2b9d2e8</product_id>
<price>116</price>
<count>1</count>
<total_sum>116</total_sum>
<menu_id>2ED2CBA1-5A56-11EB-A062-7085C286679E</menu_id>
<status_int>1</status_int>
</item>
</items>
<seats>2</seats>
</data>
Приемниками сообщений выступают информационные базы бэка (1С:УНФ 8. Управление предприятием общепита) и фронта (1С:Предприятие 8. Фастфуд. Фронт-офис) в зависимости от типа заказа, указанного в тексте сообщения интеграции.
Обработка сообщений происходит только в новом формате, то есть, интеграционная шина данных должна обеспечить смену формата в случае необходимости.
При считывании сообщений обмена из сторонних брокеров, в базах-приемниках сообщений идентификаторы товаров в составе заказа могут отличаться от идентификаторов в информационных системах отправителях. Существует база данных, развернутая на СУБД MSSQL, которая содержит таблицу соответствия идентификаторов в различных информационных системах. Необходимо обеспечить преобразование идентификаторов товаров в заказе в случае необходимости, используя данные вышеописанной базы.
Уникальный идентификатор, который необходимо преобразовать содержится в поле product_id.
Также, сторонняя информационная база 1С, ожидает обратную квитанцию об обработке сообщения базой-получателем, необходимо обеспечить ее доставку.
В итоге, предполагаемая схема, описывающая интеграционные процессы на предприятии будет иметь следующий вид:
Отметим, что данная схема спроектирована отдельно от ее реализации в какой-либо интеграционной шине данных и к продукту «1С:Шина» пока не имеет отношения.
Как видно из схемы, интеграционная шина данных должна обеспечивать преобразование сообщений из старого формата в новый, а также замену идентификаторов товаров в случае, если это требуется. Также она должна маршрутизировать заказ в правильную базу-получатель, в зависимости от его вида, и отправлять обратную квитанцию, если заказ пришел из информационной базы 1С.
Именно на эту схему будем опираться при проектировании и разработке схемы интеграции в продукте «1С:Шина».
Установка и настройка 1С:Шины
Используемая инфраструктура
Схему интеграции будем реализовывать на сервере с процессором Intel® Xeon® Gold 6242R CPU @ 3.10GHz и объемом оперативной памяти 320 GB под управлением Microsoft Windows Server 2012 R2.
Отметим, что объем оперативной памяти на нашем сервере избыточен, т. к. за все время тестов, сервер 1С:Шины не занимал места более 15 гигабайт.
Сервер 1С:Шины будет размещаться на одной физической машине с 64 разрядным сервером 1С 8.3.20.1710 и СУБД PostgreSQL 14 для исключения сетевой нагрузки при передаче данных.
Установка и настройка
Новые дистрибутивы 1С:Шины регулярно выходят на портале releases.1c.ru. На данный момент (конец октября 2022 года) доступна версия 2.0.1 (releases.1c.ru/version_files?nick=esb&ver=2.0.1).
Доступны версии как со средой разработки, так и без. Так как мы собираемся разрабатывать схему интеграции с нуля, а не использовать существующую, то скачиваем именно версию со встроенной IDE. Возможность установки дистрибутива без среды разработки может быть использована, например, для того, чтобы выделить отдельно продуктивный сервер 1С:Шины. На нем среда разработки нам будет не нужна, а обновлять приложения мы будем при помощи стандартного механизма импорта, встроенного в консоль управления сервером.
Стоит отметить, что для работы сервера «1С:Шина» необходимо также установить java, как и при установке 1С:EDT. Использование java делает «1С:Шина» кроссплатформенным приложением, поэтому процесс установки, настройки и непосредственной работы сервера с точки зрения конечного пользователя будет идентичен как на ОС Linux, так и на OS Windows.
После установки сервера «1С:Шина» создастся служба 1c-enterprise-esb-with-ide.
Перед запуском службы стоит поговорить о настройках сервера. По умолчанию директория с конфигурационными файлами находится по пути «c:\ProgramData\1C\1CE\instances\
1c-enterprise-esb-with-ide\config».
Подробное описания всех настроек сервера можно посмотреть в документации (its.1c.ru/db/esbdoc
#content:40083:hdoc). Отметим лишь, что для нас самыми полезными настройками оказался файл debug.yaml с настройками сервера отладки, порт для которого по умолчанию был установлен на 8080. Данный порт был занят и служба сервера 1С:Шины не стартовала. После установки порта в настройках на доступный сервер стал работать корректно:
debug:
enabled: true
port: 8088
Управление сервером и разработка схем интеграции происходит через веб-интерфейс. По умолчанию для доступа к веб-интерфейсу используется порт 9090. После запуска службы сервера проверяем его работоспособность вбив в строке браузера http://localhost:9090/maintenance
/server/v1/heartbeat.
Далее можно переходить в консоль управления сервером по адресу http://127.0.0.1:9090/console и создавать схемы интеграции. Здесь и в дальнейшем будет использоваться локальный адрес сервера 127.0.0.1, т. к. эксперименты проводились непосредственно на сервере, где установлена «1С:Шина».
В процессе установки и настройки сервера, а также разработки новых схем нам понадобится документация к продукту, которая есть на сайте ИТС (its.1c.ru/db/esbdoc), или же доступна непосредственно из веб-интерфейса 1С:Шины по адресу http://127.0.0.1:9090/docs/
help/index.html
Описание сущностей и терминология
В тексте статьи мы будем оперировать различными сущностями, которые используются в «1С:Шине». Поэтому, давайте разберемся, что они из себя представляют. С полным глоссарием можно ознакомиться в документации (its.1c.ru/db/esbdoc
#content:40033:hdoc), здесь же приведем только самые важные, используемые в статье.
«1С:Шина» предоставляет модель построения приложения. Эта модель основана на том, что вы описываете логику приложения в виде проекта.
Проект — это описание логики приложения, которое может быть исполнено сервером. Создать проект и посмотреть список существующих можно в специальной вкладке в консоли управления сервером.
Приложение — это совокупность проекта и пользовательских данных, исполняемая сервером. Для хранения пользовательских данных приложение использует СУБД. Один и тот же проект может содержать несколько приложений.
Приложение является основной сущностью, которой оперируют пользователи в «1С:Шина». Список приложений можно увидеть на отдельной вкладке в консоли кластера. По каждому приложению можно увидеть его статус, дату создания и последнего обновления, а также перейти в консоль управления конкретным приложением или же в среду разработки:
В консоли кластера существует возможность при создании приложения сразу же создать и новый проект:
Чтобы описать логику приложения, вы добавляете в проект элементы того или иного вида, а также подсистемы, пакеты, модули и ресурсы. Каждый из элементов проекта решает определенный круг задач. Со всеми элементами проекта можно ознакомиться в документации (its.1c.ru/db/
esbdoc/content/40163/
hdoc).
Наиболее часто используемые из элементов:
- http-сервис,
- общий модуль,
- процесс интеграции.
В рамках конкретного приложения необходимо определить и настроить информационные системы — это участники обмена сообщениями, которые подключаются к приложению «1С:Шины» и с его помощью взаимодействуют с другими информационными системами, обмениваясь с ними сообщениями в рамках процесса интеграции.
Вести список информационных систем можно на специальной вкладке в консоли управления приложением:
У каждой информационной системы есть код, наименование и описание. Код должен быть уникальным, по нему отправители сообщений интеграции смогут отфильтровать список получателей:
К серверу 1С:Шины существует возможность подключения внешних СУБД, список которых хранится и настаивается на соответствующей вкладке в консоли сервера:
В качестве СУБД могут выступать такие системы как PostgreSQL и MSSQL Server.
Создание приложения
Для того, чтобы начать разработку, сначала необходимо создать новое приложение, в котором будет настраиваться схема интеграции. Меню создания доступно из консоли управления сервером. Приложение может быть привязано к проекту или же загружено из выгрузки (при условии, что мы предварительно экспортировали созданное приложение):
Также предлагается выбрать СУБД, в которой будут храниться данные создаваемого приложения:
Если мы хотим использовать СУБД отличную от файловой, то сначала необходимо настроить ее параметры, перейдя в соответствующий подраздел из меню консоли сервера:
В нашем случае будем использовать СУБД PostgreSQL. Имя созданной базы данных можно посмотреть в свойствах приложения.
По нему, например, при помощи pgadmin, можем следить за текущей нагрузкой на СУБД:
После того как приложение создано и находится в статусе «работает», что видно из консоли управления сервером, можно приступить к разработке схемы интеграции:
Работа в среде разработки «1С:Шина»
Описание среды разработки
Если мы установили сервер «1С:Шина» со средой разработки, то напротив каждого приложения в консоли сервера мы увидим гиперссылку с переходом в режим разработки:
Разработка приложения на «1С:Шина» устроена таким образом:
- Из предопределенных объектов, список которых мы видим в палитре, предлагается описать бизнес-процесс интеграции различных информационных систем в виде специальной схемы.
- Для этого в дереве объектов, которое располагается в левой части окна среды разработки, необходимо добавить новую подсистему, а в нее объект «Процесс интеграции»:
- Далее, при помощи палитры объектов, необходимо описать источники и приемники сообщений, а также настроить связи между ними:
- В качестве источников и приемников сообщений для схемы интеграции «1С:Шины» могут выступать узлы FTP, JMS, RabbitMQ, Канал 1С, Файл:
- Также сообщения на вход схемы интеграции можно генерировать программно в обработчиках на языке похожем на «1С:Исполнитель», который использует «1С:Шина». Точкой входа для таких сообщений будет узел «Программный источник».
- Для каждого источника и приемника сообщений могут задаваться их свойства. Например, для узла «RabbitMQ источник» задается имя канала, хост, порт и т. д.
- В качестве источников и приемников сообщений для схемы интеграции «1С:Шины» могут выступать узлы FTP, JMS, RabbitMQ, Канал 1С, Файл:
- При необходимости, также используются связующие элементы 1С:Шины, предназначенные для трансляции, маршрутизации сообщений, а также подключения внешних источников данных в зависимости от бизнес-процесса интеграции.
- В качестве связующих узлов схемы интеграции могут выступать транслятор, маршрутизатор по содержимому, узел sql, узел http:
- Для связующих узлов также при необходимости задаются свойства и описываются обработчики событий, которые срабатывают при прохождении сообщения интеграции через узел:
- Значения свойств также можно описывать специальными объектами-параметрами для более удобного группового редактирования однотипных свойств:
- В обработчиках сообщений пишутся скрипты на языке похожем на 1С:Исполнитель, реализующие специфическую логику работы узла, если того требует бизнес-процесс интеграции. Пример скрипта в обработчике узла транслятор:
- В процессе написания скриптов во встроенной среде разработки 1С:Шины выполняется синтаксический контроль «на лету», что ускоряет процесс разработки и исправления ошибок.
- Подробней о языке 1С:Исполнитель и его отличиях от встроенного языка 1С:Предприятия можно прочитать в документации (its.1c.ru/db/
execdoc). Также, существует справочник по объектной модели встроенного языка, который можно посмотреть по этой же ссылке.
- В качестве связующих узлов схемы интеграции могут выступать транслятор, маршрутизатор по содержимому, узел sql, узел http:
- Для узлов, предназначенных для обмена с 1С (или систем, которые умеют работать по протоколу AMQP 1.0), предусмотрен дополнительный объект «Группа участников», позволяющий в режиме работы приложения настроить список информационных баз, которые имеют доступ к конкретному каналу источнику или приемнику.
- Движение сообщений интеграции через узлы 1С:Шины описывается элементами «Маршрут» (для связей источников и приемников между собой, а также со связующими узлами 1С:Шины) и «Связь» (для связи группы участников с каналом-источником или каналом-приемником сообщений).
- Для удобства организации кода есть возможность выносить процедуры и функции в общие модули:
- Также на сервере «1С:Шины» могут быть опубликованы http-сервисы, на которые могут посылать запросы внешние информационные системы, и далее при помощи программной обработки этих запросов на встроенном языке можно генерировать сообщений интеграции в узлах вида «Программный источник»:
- Для публикации разрабатываемого проекта необходимо выполнить соответствующую команду из подменю, которое откроется по нажатию на название проекта в панели управления сервера:
- Если проект содержит ошибки, то публикация не состоится до их исправления, список ошибок и предупреждений можно увидеть в специальной панели:
Более подробное описание каждого элемента из палитры схемы интеграции, а также описание среды разработки и сценария работы в ней можно посмотреть в документации (its.1c.ru/db/esbdoc
#content:40195:hdoc).
Групповая разработка
При разработке приложения в 1С:Шине может возникнуть необходимость использования системы контроля версии, например, когда схем интеграции несколько и каждая из них разрабатывается параллельно.
Вариантов тут несколько:
- Во-первых, так как среда разработки 1С:Шины открывается из веб-интерфейса и предоставляет облачное редактирование файлов проекта, групповую разработку можно вести непосредственно в одном и том же приложении из разных сессий. Процесс примерно похож на редактирование облачных документов. Однако, стоит быть аккуратным и четко разграничивать работу внутри одного приложения, чтобы не возникло рассинхронизации при редактировании одного и того же объекта.
- Во-вторых, можно использовать стороннюю систему контроля версий, например, git. Проект в «1С:Шина» физически располагается в файлах на компьютере, на котором установлен сервер интеграционной шины. Для Windows путь будет приблизительно следующий «c:\ProgramData\1C\1CE\
instances\1c-enterprise-esb-with-ide\data\i
demanager\ides\<уникальный идентификатор приложения>\workspace\src\», где <уникальный идентификатор приложения> можно посмотреть в адресной строке браузера в режиме редактирования в среде разработки:
Исходные файлы приложения «1С:Шина» обычно представлены описанием объектов и его свойств в файлах формата yaml:
При этом схемы интеграции, которые описываются в ide графически также преобразуются в данный формат:
Тексты модулей объектов и общих модулей сохраняются в приложении в формате xbsl. Директория с исходными файлами приложения может выглядеть следующим образом:
Далее, если мы хотим вести версионирование приложения, например, в git, достаточно инициализировать новый репозиторий git при помощи команды git init. Дальнейшие действия ничем не отличаются от версионирования любых проектов на git. Их можно выполнять как в графическом интерфейсе, например, через Github Desktop и другие клиенты, или же в командной строке.
Реализация практического бизнес‑кейса
Обзор схемы разузловки и маршрутизации внутри 1С:Шины
Исходя из постановки задачи и описания бизнес-процессов интеграции с требованиями к интеграционной шине данных было разработано несколько схем интеграций:
- Основная схема интеграции с заказной системой, которая принимает сообщения с информацией о заказах в узлах-источниках, выполняет смену формата и замену идентификаторов в зависимости от ситуации, а также осуществляет маршрутизацию заказа исходя из его содержимого в узлы-получатели.
- Схема интеграции, описывающая взаимодействие с телеграм-ботом, принимающим заказы и отправляющий сообщения интеграции в канал для программных источников сообщений в основной схеме интеграции.
- Схема интеграции, описывающая передачу обратной квитанции в базу 1С-источник заказа, доставку которой интеграционная шина должна обеспечить исходя из требований.
Основная схема маршрутизации заказов
Основная схема обмена с заказной системой выглядит следующим образом:
Рассмотрим подробней каждый из реализованных узлов:
- Элемент «Из1С» — это узел вида «Канал1СИсточник», предназначен для приема сообщений интеграций от баз 1С источников заказов. Далее будет показано, как настроить процесс интеграции с 1С:Шиной на стороне базы 1С.
- Элемент «Базы1СИсточники» — это узел вида «ГруппаУчастников», который предназначен для определения списка информационных систем, которые смогут посылать сообщения в узел-источник сообщений «Из1С». Состав группы определяется из консоли приложения:
- Элемент «ИзHTTP» — это узел вида «Программный источник». Предназначен для программной генерации сообщений интеграций при поступлении запросов с заказами на http-сервис.
- У http-сервиса добавлен всего один метод «sendOrder», обработчик которого принимает http запрос и генерирует сообщение интеграции:
Код обработчика http-запроса, реализующий вышеописанный алгоритм на языке 1С:Исполнитель:
метод ОбработкаЗапроса(Запрос: HttpСервисЗапрос)
пер НужныйУзелСхемы = ОбменСЗаказнойСистемой.Схема.Узлы.ИзHttp
пер индWS = 1
знч ПотокЗаписиХттп = Запрос.Ответ.ОткрытьПотокЗаписиТела()
ПотокЗаписиХттп.Записать("Сообщение получено!")
знч Сообщение = новый СообщениеИнтеграции({"ИзХТТП%индWS":Истина}, Запрос.Тело)
ОбменСЗаказнойСистемой.ОтправитьСообщениеВУзлы(Сообщение, НужныйУзелСхемы)
; - Элемент «ИзКролика» — это узел вида «RabbitMQ источник», который предназначен для чтения сообщений из очереди, указанной в свойстве «Имя канала»:
- Элемент «fromAMQP» — это также узел вида «Канал 1С источник», т. к. именно данный тип узла обеспечивает обмен по протоколу AMQP 1.0. В нашем бизнес-процессе мы отдельно выделили данный элемент как для логического разделения информационных баз 1С и стороннего брокера сообщений, так и по причине того, что для сообщений из данного узла нет необходимости производить смену формата. Состав информационных систем, которые имеют возможность отправить сообщения в канал определяются группой участников «ПриложенияAMQP».
- Элемент «СменаФормата» — это узел вида «Транслятор», который предназначен для конвертации тела сообщения из формата json в формат xml. Обработчик преобразования на языке 1С:Исполнитель будет следующий:
метод Преобразование(Контекст: КонтекстВызова, Сообщение: ОбменСЗаказнойСистемой.Сообщение): СообщениеИнтеграции
исп СтароеТело = Сообщение.ПолучитьТелоКакПоток()
исп Поток = новый ВременныйПотокЗаписи()
КонвертацияСообщений.Json2Xml(СтароеТело, Поток)
исп НовоеТело = Поток.ОткрытьПотокЧтения()
возврат Сообщение.УстановитьТелоИзПотока(НовоеТело)
;Здесь, мы считываем тело сообщения интеграции, передаем его в процедуру преобразования в общем модуле «КонвертацияСообщений», а затем устанавливаем полученное новое тело сообщения. Код конвертации из json в xml приведен ниже:
@проект
метод Json2Xml(ПотокЖсон: ПотокЧтения, ПотокХмл: ПотокЗаписи)
пер ВыходнойХмл = новый ЗаписьXml(ПотокХмл)
знч ДанныеКакОбъект = СериализацияJson.ПрочитатьСоответствие(ПотокЖсон)
ВыходнойХмл.ЗаписатьНачалоЭлемента("data")
Xml2JsonРекурсивно(ДанныеКакОбъект, ВыходнойХмл)
ВыходнойХмл.ЗаписатьКонецЭлемента()
;
метод Xml2JsonРекурсивно(ОбъектЖсон: Обходимое<любой>, ВыходнойХмл: ЗаписьXml)
для Элемент из ОбъектЖсон
пер ЗначениеЭлемента: любой
пер КлючЭлемента: любой
если Элемент это КлючИЗначение
КлючЭлемента = Элемент.Ключ
ЗначениеЭлемента = Элемент.Значение
ВыходнойХмл.ЗаписатьНачалоЭлемента(КлючЭлемента)
иначе
ВыходнойХмл.ЗаписатьНачалоЭлемента("item") ЗначениеЭлемента = Элемент ;
выбор ЗначениеЭлемента
когда это Соответствие
Xml2JsonРекурсивно(ЗначениеЭлемента, ВыходнойХмл)
когда это Массив<любой>
Xml2JsonРекурсивно(ЗначениеЭлемента, ВыходнойХмл)
иначе
ВыходнойХмл.ЗаписатьТекст(ЗначениеЭлемента.ВСтроку())
;
ВыходнойХмл.ЗаписатьКонецЭлемента()
;
; - Элемент «ЗаменаИдентификаторов» предназначен для замены идентификаторов продукции в товарной части заказа исходя из данных внешней базы соответствия идентификаторов информационных баз, которая располагается на сервере MSSQL. Строку подключения к внешней базе данных задаем как отдельный параметр схемы интеграции:
Подключение к базе данных будет происходить через jdbc connector, строка подключения будет выглядеть следующим образом:
jdbc:sqlserver://server_name;databaseName=base_name;user=user_name;password=user_password
Здесь server_name — имя сервера СУБД MSSQL, base_name — имя базы данных, user_name и user_password — логин и пароль от пользователя базы данных соответственно.
Далее реализуем обработчик «Обработка сообщения», в котором и будет произведено преобразование:
метод ЗаменаИдентификаторовОбработкаСообщения(Контекст: ОбменСЗаказнойСистемой.КонтекстВызова, Сообщение: ОбменСЗаказнойСистемой.Сообщение, Соединение: СоединениеSql): СообщениеИнтеграции
исп СтароеТело = Сообщение.ПолучитьТелоКакПоток()
исп Поток = новый ВременныйПотокЗаписи()
КонвертацияСообщений.ЗаменитьГуидыТоваровХмл(СтароеТело, Поток, Соединение)
исп НовоеТело = Поток.ОткрытьПотокЧтения()
возврат Сообщение.УстановитьТелоИзПотока(НовоеТело)
;Алгоритм схож с обработчиком транслятора сообщения с той разницей, что в данном обработчике доступно соединение с базой данных, которое мы передаем в качестве параметра в функцию “ЗаменитьГуидыТоваровХмл” в общем модуле “КонвертацияСообщений”:
@проект
метод ЗаменитьГуидыТоваровХмл(ВходнойПоток: ПотокЧтения, ВыходнойПоток: ПотокЗаписи, Соединение: СоединениеSql)
пер ВыходнойХмл = новый ЗаписьXml(ВыходнойПоток)
пер ВходнойХмл = новый ЧтениеXml(ВходнойПоток)
пер ТекущееИмя = ""
пер ЗначениеЭлемента = ""
пер ТекПространствоИмен = ""
пока ВходнойХмл.Следующий()
выбор ВходнойХмл.ВидУзла
когда ВидУзлаXml.НачалоЭлемента
ТекущееИмя = ВходнойХмл.Имя
ТекПространствоИмен = ВходнойХмл.ПространствоИмен
ВыходнойХмл.ЗаписатьНачалоЭлемента(ТекущееИмя, ТекПространствоИмен)
когда ВидУзлаXml.КонецЭлемента
ВыходнойХмл.ЗаписатьКонецЭлемента()
когда ВидУзлаXml.Текст
ЗначениеЭлемента = ВходнойХмл.Значение
если ТекущееИмя == "product_id"
ЗначениеЭлемента = КоннекторSQL.ИдентификаторПолучателя(Соединение, ВходнойХмл.Значение)
иначе если ТекущееИмя == "product_name"
ЗначениеЭлемента = КоннекторSQL.ИдентификаторПолучателя(Соединение, ВходнойХмл.Значение, "ITEM")
ТекущееИмя = "product_id"
иначе
ЗначениеЭлемента = ВходнойХмл.Значение
;
ВыходнойХмл.ЗаписатьТекст(ЗначениеЭлемента)
;
;
;Функция «КоннекторSQL.ИдентификаторПолучателя» и будет обращаться к базе данных для получения идентификатора продукции в базе-получателе:
@проект
метод ИдентификаторПолучателя(Соединение: СоединениеSql, ИдентификаторИсточника: Строка, ИмяПоля: Строка = "IDSOURCE"): Строка
пер ТекстЗапроса = "SELECT [IDSOURCE],[IDRECEIVER],[ITEM] FROM [sergav_BaseMappingSQL].[dbo].[Mapping] where [" + ИмяПоля + "] = &id"
пер ВыборкаIDRECEIVER = Соединение.СоздатьЗапросСВыборкой(ТекстЗапроса)
ВыборкаIDRECEIVER.УстановитьЗначениеПараметра("id", ИдентификаторИсточника)
пер ИдентификаторПолучателя: Строка
ИдентификаторПолучателя = ""
область
исп Рез = ВыборкаIDRECEIVER.Выполнить()
если Рез.Следующий()
ИдентификаторПолучателя = Рез.Получить("IDRECEIVER") как Строка
;
;
возврат ИдентификаторПолучателя
; - Элемент «Маршрутизатор
ПоТипуЗаказа» — это узел вида «Маршрутизатор
ПоСодержимому», который реализует логику выбора узла-получателя в зависимости от типа заказа, указанного в свойстве «type» в теле сообщения. Обработчик определения получателей будет следующим:метод ВыборПолучателей(Контекст: КонтекстВызова, Сообщение: ОбменСЗаказнойСистемой.Сообщение): Коллекция<УзелСхемы>
пер Результат = новый Массив<УзелСхемы>()
пер ВидЗаказа = РаботаСДаннымиСообщений.ВидЗаказаВСообщении(Сообщение)
выбор ВидЗаказа
когда РаботаСДаннымиСообщений.ВидыЗаказов.ЗаказБэка
Результат.Добавить(ОбменСЗаказнойСистемой.Схема.Узлы.ВУпо)
когда РаботаСДаннымиСообщений.ВидыЗаказов.ЗаказФронта
Результат.Добавить(ОбменСЗаказнойСистемой.Схема.Узлы.ВФастФуд)
когда РаботаСДаннымиСообщений.ВидыЗаказов.ОбщийЗаказ
Результат.Добавить(ОбменСЗаказнойСистемой.Схема.Узлы.ВУпо)
Результат.Добавить(ОбменСЗаказнойСистемой.Схема.Узлы.ВФастФуд)
;
возврат Результат
;Вид заказа определяется функцией «ВидЗаказа
ВСообщении» в общем модуле «РаботаСДанными
Сообщений». Также, в этом модуле определяется перечисление «ВидыЗаказов»:@проект
перечисление ВидыЗаказов
ЗаказБэка,
ЗаказФронта,
ОбщийЗаказ
;
конст ИМЯ_ТЕГА_ТИП_ЗАКАЗА = "type"
@проект
метод ВидЗаказаВСообщении(Сообщение: СообщениеИнтеграции): ВидыЗаказов?
исп ПотокХмл = Сообщение.ПолучитьТелоКакПоток()
пер ЧтениеСообщения = новый ЧтениеXml(ПотокХмл)
пока ЧтениеСообщения.Следующий()
если ЧтениеСообщения.ВидУзла == ВидУзлаXml.НачалоЭлемента и ЧтениеСообщения.Имя == ИМЯ_ТЕГА_ТИП_ЗАКАЗА
ЧтениеСообщения.Следующий()
попытка
возврат ВидыЗаказов.ПоИмени(ЧтениеСообщения.Значение)
поймать Искл: Исключение
возврат Неопределено
;
;
;
возврат Неопределено
; - Элементы «В УПО» и «В ФастФуд» — это узлы вида «Канал 1С назначение», которые предназначены для отправки сообщений интеграции в базы получатели. Состав информационных баз определяется группами участников «Базы УПО» и «Базы ФастФуд» соответственно.
Интеграция с ботом Telegram
Схема интеграции, описывающая взаимодействие с телеграм-ботом выглядит следующим образом:
В данной схеме, логикой чтения сообщений из чата Telegram и построения сообщения с данными о заказе занимается непосредственно «1С:Шина». Для этого точкой входа в данной схеме интеграции будет таймер, который по заданному интервалу времени будет инициализировать сообщение интеграции.
Далее в узле «Транслятор» будет произведено:
- Подключение к Telegram API по протоколу HTTP и считывание последних непрочитанных сообщений:
- Формирование заказов и их программную отправку в виде сообщений интеграций в узел «ИзHTTP» в основной схеме интеграции обмена заказами:
- Идентификатор последнего считанного из Telegram сообщения будем хранить в файле update_id, который добавлен в проект в качестве ресурса:
Содержимое файла в формате json хранит единственное свойство с идентификатором:
Отметим также, что элемент «Заземление» — это узел вида «Файл назначение», который необходим для фиксации сообщения интеграции, сгенерированного таймером. Данное сообщение является служебным и необходимо для активации алгоритма обработки сообщений из Telegram. Для того, чтобы такое сообщение достигло назначения и добавлен узел заземления.
Схема обратной квитанции
Схема интеграции, описывающая передачу обратной квитанции в базу 1С, являющейся источником заказа, выглядит следующим образом:
Схема реализует простую передачу сообщений из канала-источника в канал-получатель без дополнительной маршрутизации. В группах участников «Отдающие обратную квитанцию» будут те же информационные базы, которые являются получателями сообщений на основной схеме интеграции, а в группе «Получающие обратную квитанцию» будут информационные базы, которые являются также источником сообщений на основной схеме.
Настройка обработки и отправки сообщений на стороне информационных баз 1С
Для обмена сообщениями с 1С:Шиной в платформе «1С:Предприятие» предусмотрены специальные объекты метаданных — «Сервисы интеграции».
В нашем случае, необходимо создать и настроить работу с сообщениями:
- Отправку сообщений в информационной базе 1С источнике данных о заказах.
- Получение и обработку сообщений в информационных базах получателях.
- Отправку обратной квитанций.
- Ролучение и обработку обратной квитанции.
Отправка сообщений из базы-источника заказов
Итак, в базе-источнике данных о заказах добавляем новый сервис интеграции. Сделать это можно как непосредственно в конфигурации информационной базы, так и в расширении. В свойствах объекта необходимо указать адрес внешнего сервиса интеграции — то есть адрес приложения на сервере 1С:Шины. Копируем его из адресной строки браузера находясь в консоли сервера:
Далее, необходимо загрузить список каналов, доступных для взаимодействия с данным приложением 1С:Шины. Для этого в подменю действий выбираем команду «Загрузить каналы»:
И здесь, для загрузки каналов нам потребуется логин и пароль от приложения:
Чтобы его сгенерировать, переместимся в консоль управления приложением на сервере 1С:Шины на вкладку «Инфосистемы»:
Здесь нам необходимо добавить новую систему, задав ей код, наименование и описание:
Далее необходимо включить только что созданную систему в группу участников. Для этого, на вкладке «Процессы» необходимо выбрать процесс «Основной::ОбменСЗаказной
Системой» и на схеме интеграции выбрать группу «Базы1СИсточники» и отредактировать состав группы:
После этого, возвращаемся на вкладку «Инфосистемы» и для созданной информационной системы выполняем команду «Выдать ключ API». В открывшемся окне запоминаем данные из полей «Идентификатор ключа» и «Секрет клиента». Это и будут логин и пароль от информационной системы, который необходимо будет ввести для загрузки каналов в сервисе интеграции в конфигураторе:
После загрузки каналов выбираем те, с которыми будем взаимодействовать и добавляем их. В нашем случае, выберем каналы «Из1С» и «ПриемникОбратной
Квитанции»:
Для отправки сообщения интеграции, когда оно будет сформировано на встроенном языке исходя из логики работы программы, необходимо записать его в поток как двоичные данные и при помощи метода «ОтправитьСообщение» объектной модели сервисов интеграции записать сообщение в хранилище сообщений:
БуферСтроки = ПолучитьБуферДвоичныхДанныхИзСтроки(Заказ, КодировкаТекста.UTF8);
НовоеСообщение = СервисыИнтеграции.ШинаЗаказы.СоздатьСообщение();
ПотокТела = НовоеСообщение.ПолучитьТелоКакПоток();
ПотокТела.Записать(БуферСтроки, 0, БуферСтроки.Размер);
ПотокТела.СброситьБуферы();
ПотокТела.Закрыть();
СервисыИнтеграции.ШинаЗаказы.Основной_ОбменСЗаказнойСистемой_Из1С.ОтправитьСообщение(НовоеСообщение);
На данном этапе сообщение еще не отправлено в 1С:Шину. Оно находится в специальном хранилище, из которого отправка обычно происходит пакетно, например, регламентным заданием по расписанию. Сделать это можно вызвав обработку сообщений при помощи объектной модели сервисов интеграции следующим образом:
Для того, чтобы определить, с какими сервисами менеджер сервисов интеграции должен взаимодействовать, в режиме 1С:Предприятия необходимо вызвать форму «Управление сервисами интеграции» через функции для технического специалиста.
Далее отредактировать сервис интеграции, установив логин и пароль, полученный в консоли сервера 1С:Шины для текущей информационной системы:
Выполнение метода «ВыполнитьОбработку» запускает соединение информационной базы 1С с каналом в 1С:Шине и дальнейшую передачу накопленных сообщений интеграции. По умолчанию данное соединение длится 120 секунд, что можно увидеть по логам технологического журнала 1С.
Для этого было добавлено новое событие SINTEG, которое фиксируется при взаимодействии с сервисами интеграции.
Для проверки напишем небольшую обработку, где в поле ввода можно будет ввести тело сообщения и по нажатию на кнопку «Отправить» оно будет отправлено в канал и вызван метод «ВыполнитьОбработку»:
Также, настроим сбор логов технологического журнала на сбор событий SINTEG:</p>
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log history="1"
location="e:\chesdm\work\esb_1c_logs\">
<property name="all"/>
<event>
<eq property="name" value="SINTEG"/>
</event>
</log>
</config>
Выполним отправку сообщения и взглянем на логи. Последовательность событий будет следующая:
- Сначала при выполнении метода «ОтправитьСообщение» фиксируется событие SINTEG с функцией «insertMessage
IntoSendingQueue». То есть, происходит добавление сообщения в очередь на отправку:38:46.105046-29,SINTEG,3,process=rphost,p:processName=chesdm_esb_bp_corp,OSThread=601476,t:clientID=274970,t:applicationName=1CV8C,t:computerName=ORTRSRV,t:connectID=278734,SessionID=115,Usr=АбрамовГС (директор),AppID=1CV8C,SrvcName=ШинаЗаказы,ChannelName=Основной_ОбменСЗаказнойСистемой_Из1С,ExtSrvcURL=http://172.20.128.24:9090/applications/orders-dev,ExtSrvcUsr='c92LKqd_MJ5AsDz6tBP59LyjHW2DGhkY_xnAUdZpcqQ=',Func=insertMessageIntoSendingQueue,MessageId=5c8dec38-c787-4b25-bb43-0a82df14533d,BodySize=1550,Context='Форма.Вызов : ВнешняяОбработка.ШинаОтправкаЗаказа.Форма.Форма.Модуль.ОтправитьНаСервере - Далее, когда выполняется метод «ВыполнитьОбработку» менеджера сервисов интеграции в логи фиксируется событие SINTEG с функцией «Connect», что означает установку соединения с приложением 1С:Шины:
38:46.199014-32005,SINTEG,2,process=rphost,p:processName=chesdm_esb_bp_corp,OSThread=766748,t:clientID=281651,t:applicationName=BackgroundJob,t:computerName=ORTRSRV,t:connectID=286907,SessionID=1166,Usr=АбрамовГС (директор),Func=connect,SrvcName=ШинаЗаказы,ExtSrvcURL=http://172.20.128.24:9090/applications/orders-dev,ExtSrvcUsr='c92LKqd_MJ5AsDz6tBP59LyjHW2DGhkY_xnAUdZpcqQ='
- Следующим шагом будет отправка сообщения на сторону 1С:Шины (событие SINTEG с функцией «sendMessage»)
38:46.199025-16019,SINTEG,3,process=rphost,p:processName=chesdm_esb_bp_corp,OSThread=766748,t:clientID=281651,t:applicationName=BackgroundJob,t:computerName=ORTRSRV,t:connectID=286907,SessionID=1166,Usr=АбрамовГС (директор),SrvcName=ШинаЗаказы,ChannelName=Основной_ОбменСЗаказнойСистемой_Из1С,ExtSrvcURL=http://172.20.128.24:9090/applications/orders-dev,ExtSrvcUsr='c92LKqd_MJ5AsDz6tBP59LyjHW2DGhkY_xnAUdZpcqQ=',Func=sendMessage,MessageId=5c8dec38-c787-4b25-bb43-0a82df14533d,BodySize=1550
- Ровно через 2 минуты фиксируется еще одно событие, которое означает окончание соединения с сервером 1С:Шины (SINTEG с функцией «disconnect»):
40:46.349004-15992,SINTEG,0,process=rphost,p:processName=chesdm_esb_bp_corp,OSThread=1017768,Func=disconnect,SrvcName=ШинаЗаказы,ExtSrvcURL=http://172.20.128.24:9090/applications/orders-dev,ExtSrvcUsr='c92LKqd_MJ5AsDz6tBP59LyjHW2DGhkY_xnAUdZpcqQ='
Аналогичным образом происходит и чтение сообщений из 1С:Шины:
- Установку соединения фиксирует событие с функцией connect.
- Получение сообщения из 1С:Шины фиксирует событие с функцией receiveMessage.
- Помещение сообщения в очередь на обработку фиксируется событием с функцией insertMessageInto
SendingQueue. - Закрытие соединения фиксируется событием с функцией disconnect.
Получение сообщений в базе-приемнике
По аналогии с информационными системами источниками заказов, для получения и обработки сообщений интеграции необходимо добавить сервис интеграции и загрузить в него каналы-получатели сообщений, предварительно описав информационные системы в консоли сервера 1С:Шины и получив ключ API. Например, для информационной системы «1С:УНФ 8. Управление предприятием общепита» загрузим каналы «ВУПО» и «ИсточникОбратной
Квитанции»:
Обработка получения сообщений интеграции также срабатывает при выполнении метода «ВыполнитьОбработку» менеджера сервисов интеграции. Обработчик конкретного сообщения интеграции можно задать в свойствах канала получателя сообщений:
В обработчике получения сообщения тело сообщения считывается из потока и преобразуется из двоичных данных. Также, в случае возникновения каких-либо ошибок, можно взвести флаг «Отказ» в значение «Истина», таким образом текущее сообщение интеграции будет считаться необработанным:
Поток = Сообщение.ПолучитьТелоКакПоток();
РазмерБуфера = 1024;
Тело = Новый БуферДвоичныхДанных(0);
Буфер = Новый БуферДвоичныхДанных(РазмерБуфера);
Поток = Сообщение.ПолучитьТелоКакПоток();
Позиция = 0;
Пока Истина Цикл
Буфер = Новый БуферДвоичныхДанных(РазмерБуфера);
Прочитано = Поток.Прочитать(Буфер, 0, РазмерБуфера);
Позиция = Позиция + Прочитано;
Если Прочитано > 0 Тогда
Тело = Тело.Соединить(Буфер);
КонецЕсли;
Если Прочитано < РазмерБуфера Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ПолученноеСообщение = ПолучитьСтрокуИзБуфераДвоичныхДанных(Тело);
Отправка и получение обратной квитанции
Для получения обратной квитанции на стороне базы-отправителя заказа нам необходим объект метаданных, который будет хранить информацию об отправленных сообщениях.
Для упрощения задачи реализуем хранение сообщений в независимом периодическом регистре сведений.
metod8dev#content:
5998:hdoc.
Регистр будет иметь следующие измерения и ресурсы:
В единственном измерении «ИдентификаторСообщения» будем хранить уникальный идентификатор, который генерирует сервис интеграции при отправке сообщения. Он доступен в свойстве «Идентификатор» объекта «СообщениеСервиса
Интеграции».
В ресурсе «Сообщение» будем хранить текст сообщения, в ресурсе «ОбратнаяКвитанция» будет находиться текст обратной квитанции, а «ДатаОтправки» и «ДатаПолучения» будут фиксироваться в момент отправки сообщения и получения обратной квитанции соответственно.
Далее в алгоритм отправки сообщения интеграции допишем фиксацию отправленного сообщения в регистр сведений:
НЗ = РегистрыСведений.ишдОбменСообщениями.СоздатьНаборЗаписей();
НЗ.Отбор.ИдентификаторСообщения.Установить(НовоеСообщение.Идентификатор);
НовСтрока = НЗ.Добавить();
НовСтрока.ИдентификаторСообщения = НовоеСообщение.Идентификатор;
НовСтрока.Сообщение = Заказ;
НовСтрока.ДатаОтправки = НовоеСообщение.ДатаОтправки;
НЗ.Записать();
Идентификатор сообщения здесь берем из объекта «СообщениеСервисаИнтеграции» и он будет также совпадать с идентификатором сообщения, который фиксируется в логах технологического журнала 1С:
38:46.199025-16019,SINTEG,3,process=rphost,p:processName=chesdm_esb_bp_corp,OSThread=766748,t:clientID=281651,t:applicationName=BackgroundJob,t:computerName=ORTRSRV,t:connectID=286907,SessionID=1166,Usr=АбрамовГС (директор),SrvcName=ШинаЗаказы,ChannelName=Основной_ОбменСЗаказнойСистемой_Из1С,ExtSrvcURL=http://172.20.128.24:9090/applications/orders-dev,ExtSrvcUsr='c92LKqd_MJ5AsDz6tBP59LyjHW2DGhkY_xnAUdZpcqQ=',Func=sendMessage,MessageId=5c8dec38-c787-4b25-bb43-0a82df14533d,BodySize=1550
По этому же идентификатору мы сможем сопоставить сообщение интеграции во время его обработки в 1С:Шине.
Далее, на стороне базы-получателя заказа при получении сообщения интеграции необходимо формировать ответное сообщение с обратной квитанцией, если источником сообщения была база 1С. Для этого производим парсинг принятого сообщения и, если требуется, выполняем отправку обратной квитанции в канал «Источник обратной квитанции»:
Если ИсточникСообщения = "bp_corp" Тогда
ОбратнаяКвитанция = "{""result"": ""ok""}";
БуферСтроки = ПолучитьБуферДвоичныхДанныхИзСтроки(ОбратнаяКвитанция, КодировкаТекста.UTF8);
НовоеСообщение = СервисыИнтеграции.ШинаЗаказы.СоздатьСообщение();
НовоеСообщение.ИдентификаторСообщенияЗапроса = Сообщение.Идентификатор;
ПотокТела = НовоеСообщение.ПолучитьТелоКакПоток();
ПотокТела.Записать(БуферСтроки, 0, БуферСтроки.Размер);
ПотокТела.СброситьБуферы();
ПотокТела.Закрыть();
СервисыИнтеграции.ШинаЗаказы.Основной_ОбратнаяКвитанция_ИсточникОбратнойКвитанции.ОтправитьСообщение(НовоеСообщение);
СервисыИнтеграции.ВыполнитьОбработку();
КонецЕсли;
Обратите внимание, что в объекте «СообщениеСервисаИнтеграции» предусмотрено свойство «ИдентификаторСообщения
Запроса», который как раз необходим в случае, когда мы отправляем ответ на полученное сообщение.
Для фиксации принятых сообщений на стороне базы-получателя также создадим регистр сведений для хранения принятых сообщений и напишем код для фиксации сообщения при его приемке:
// Запись сообщения в специальный регистр.
НЗ = РегистрыСведений.ишдПолученныеСообщения.СоздатьМенеджерЗаписи();
НЗ.УниверсальнаяДата = ТекущаяУниверсальнаяДатаВМиллисекундах();
НЗ.Сообщение = ПолученноеСообщение;
НЗ.Источник = ИсточникСообщения;
Попытка
НЗ.Записать();
Исключение
ЗаписьЖурналаРегистрации("ШинаДанных", УровеньЖурналаРегистрации.Ошибка, ,,ОписаниеОшибки());
Отказ = Истина;
КонецПопытки;
После этого, в обработчике получения сообщений из канала «ПриемникОбратной
Квитанции» по идентификатору исходного сообщения дописываем обратную квитанцию в регистр сведений:
ПолученноеСообщение = ПолучитьСтрокуИзБуфераДвоичныхДанных(Тело);
// Запись сообщения в специальный регистр.
НЗ = РегистрыСведений.ишдОбменСообщениями.СоздатьМенеджерЗаписи();
НЗ.ИдентификаторСообщения = Сообщение.ИдентификаторСообщенияЗапроса;
НЗ.Прочитать();
Если НЗ.Выбран() Тогда
НЗ.ОбратнаяКвитанция = ПолученноеСообщение;
НЗ.ДатаОтвета = Сообщение.ДатаОтправки;
Попытка
НЗ.Записать();
Исключение
ЗаписьЖурналаРегистрации("ШинаДанных", УровеньЖурналаРегистрации.Ошибка, ,,ОписаниеОшибки());
Отказ = Истина;
КонецПопытки;
КонецЕсли;
Таким образом, при помощи обмена с использованием 1С:Шины и сервисов интеграции можно реализовать обмен с подтверждением в виде обратной квитанции.
Тесты и нагрузка на сервер
Проверка работоспособности процессов интеграции
Для проверки работоспособности приложения, после его публикации пробуем отправить сообщения из разных узлов-отправителей и принять их в базе-получателе.
- Для начала, попробуем передать сообщение из базы 1С источника сообщений и получить обратную квитанцию. Для этого на стороне базы-отправителя воспользуемся обработкой для отправки сообщений, написанной ранее в рамках разработки сервиса интеграции, и отправим сообщение в базу УПО:
В регистр обмена сообщениями записался идентификатор и дата отправки:
На стороне 1С:Шины можем наблюдать, что сообщение прошло через канал-источник сообщений и дошло до канала получателя. Видим это по счетчикам сообщений в каналах:
Далее, на стороне базы-приемника запускаем обработку сообщений от сервисов интеграции. В регистр принятых сообщений записались данные, а также в канале получателе сообщений в процессе интеграции доставки обратной квитанции видим наше сообщение:
Принимаем сообщение интеграции с обратной квитанцией на стороне базы-источника заказов и в регистре сообщений видим фиксацию даты ответа и его текст:
- Также, попробуем отправить заказ в телеграм-бота, обработку которого производим непосредственно в «1С:Шине»:
Текст сообщения должен иметь определенный формат, далее он преобразуется в json формат заказа в соответствующем процессе интеграции на стороне 1С:Шины, после чего сообщение отправляется в канал «Из Http» основного процесса интеграции, проходит через преобразование и маршрутизацию и оказывается в канале-получателе:
- Еще одним источником сообщений может быть очередь в брокере RabbitMQ, зайдем консоль управления брокера и отправим сообщение с данными о заказе вручную:
Видим, что сообщение интеграции поступает в канал «Из Кролика», проходит по процессу интеграции и оказывается в канале назначения:
Нагрузочный тест
Перед проведением нагрузочного тестирования необходимо настроить сбор счетчиков производительности на сервере. Для этого в группу сборщиков данных в performance monitor добавим счетчики, основными из которых будут:
- \Process(esb*)\% Processor Time — для отслеживания процессорного времени, которое занимает процесс 1С:Шины.
- \PhysicalDisk(0 C:)\Avg. Disk Queue Length — очередь к диску.
- \Memory\Available MBytes — объем доступной оперативной памяти.
Нагрузочное тестирование приложения проведем при помощи утилиты apache-jmeter, которая позволяет отправлять http-запросы с определенной периодичностью в многопоточном режиме. Для приема сообщений с данными о заказах будем использовать http-сервис приложения.
В настройках jmeter добавим группу потоков и укажем отправку 8 000 сообщений за 120 секунд:
В созданной группе добавим http-запрос на сервис в опубликованном приложении 1С:Шины:
Запускаем тест, и наблюдаем за поведением системы. В процессе приема сообщений через http-сервис видим, что сообщения интеграции не задерживаются на узлах трансляции, маршрутизации и в канале назначения, т. к. счетчики сообщений показывают их доставку в базу-получатель:
Важно, что база-приемник сообщений должна работать в клиент-серверном режиме работы для многопоточной обработки сообщений интеграции во время выполнения метода «ВыполнитьОбработку» менеджеров сервисов интеграции. В файловом варианте работы обработка происходит в один поток и большая часть сообщений долго ожидает в канале назначения на стороне 1С:Шины пока не будет произведено их чтение и обработка на стороне базы приемника.
После выполнения нагрузочного теста останавливаем счетчики производительности и взглянем на результат. Как видно из графиков, объем оперативной памяти за время теста практически не меняется (фиолетовый график), а вот процессорное время (черный график) и общий процент загрузки процессора можно условно поделить на 3 этапа:
- В начале, в момент считывания сообщений в канале-приемнике мы видим максимальную загрузку процессора (65% общая и в районе 45% из них занимает процесс 1С:Шины).
- Далее загрузка процессора значительно снижается (до 20% общая и 10% из них занимает процесс 1С:Шины), в этот момент все сообщения считаны и проходят через узлы процесса интеграции 1С:Шины, а также происходит их приемка и обработка на стороне базы получателя.
- Через примерно 2 минуты все сообщения интеграции обработаны и доставлены на сторону базы-получателя.
Таким образом, можно сделать вывод, что сервер 1С:Шины справляется с нагрузкой благодаря многопоточной обработке сообщений, но не стоит злоупотреблять не оптимальными алгоритмами преобразования и маршрутизации сообщений, а также их обработки на стороне базы-приемника.
Логирование действий и анализ проблем
Для логирования сообщений, которые проходят от баз-источников через 1С:Шину и фиксируются в базах-получателях существуют различные механизмы.
Во-первых, в консоли управления приложением 1С:Шины мы можем наблюдать за счетчиками сообщений, как общими по всему процессу интеграции, так и частными по конкретным каналам:
Также, в конкретном процессе интеграции можно посмотреть различные метрики, такие как счетчик недоставленных сообщений в узлах схемы, счетчик измененных сообщений в трансляторе и т. д.:
Если же нам нужна более сложная аналитика, например, мы хотим отслеживать путь сообщения по узлам трансляции, маршрутизации и фиксировать длительность, то стандартными формами со статистикой нам не обойтись.
Так как сообщения внутри 1С:Шины проходят в виде двоичных данных, шина не предоставляет интерфейса, где мы можем увидеть содержимое конкретного сообщения интеграции.
Однако, при прохождении сообщения через узлы, у нас есть возможность в качестве побочного действия программно считать, как его содержимое, так и идентификатор, и зафиксировать эту информацию. Для фиксации можно использовать, например, файловые ресурсы проекта.
При помощи идентификатора сообщения интеграции можно проводить сквозное его отслеживание при прохождении через информационные системы и в частности через узлы в схеме интеграции.
Дальнейший анализ логов ничем не отличается от любых других логов системы и зависит от конкретной реализации. Например, можно загружать их в различные аналитические СУБД, такие как Clickhouse. При этом, соответствующие скрипты могут быть написаны непосредственно в 1С:Шине с использование встроенного языка, подобного языку 1С:Исполнитель.
Во-вторых, не стоит забывать про логирование отправки и чтения сообщений на стороне источников и получателей сообщений. При этом, как уже упоминалось выше, существует событие в логах технологического журнала 1С, которое фиксирует весь путь прохождения сообщения по сервисам интеграции по его идентификатору.
В-третьих, иногда для расследования различных проблем, нам необходимо смотреть не на логирование сообщений интеграции, а на логи самого сервера 1С:Шины.
Настройки логирования находятся в конфигурационном файле logging.yaml. Больше всего нас будут интересовать логи сервера 1С:Шины, по умолчанию путь к файлу лога указан как <корневая папка экземпляра шины>/logs/server.log.
В логах сервера в первую очередь стоит обращаться внимание на строки, в которых указано «E!» и «W!», таким образом обозначаются ошибки и предупреждения. Например, если служба 1С:Шины не запускается, то в логах может быть указана причина.
Более подробно про анализа проблем интеграции с 1С:Шиной можно почитать в статье на ИТС (its.1c.ru/db/metod8dev/
content/5997/hdoc/_top/
1сшина), также там приведен чек-лист для проверки настроек сервера 1С:Шины (its.1c.ru/db/metod8dev/
content/5996/hdoc).
Выводы
Сделаем первые выводы по возможности эксплуатации программного продукта «1С:Шина».
- Продукт более, чем возможно использовать для реализации самых сложных схем обмена в гетерогенной информационной среде.
- Есть несколько «подкупающих» приятных моментов:
- Развитая среда разработки, в том числе с возможностью графической отрисовки архитектуры обмена.
- Собственный скриптовый язык.
- Нативные объекты интеграции в дереве объекта метаданных.
- Наличие практически любого типа узла интеграции внутри Шины.
- Способность справиться с очень высокой нагрузкой.
- Программный продукт весьма легок в установке и изучении.
- Весьма неплохая документация как встроенная, так и на ИТС.
Далее мы планируем еще поговорить о Шине в рамках публикаций «От экспертов 1С:Рарус»:
- об использовании в среде Linux;
- о каталогах внутри Шины;
- о новых возможностях редакции 2.0.
От экспертов «1С-Рарус»