Введение
1С:Шина — это программный продукт класса «Сервисная шина предприятия» (Enterprise Service Bus, ESB), обеспечивающий обмен данными между различными информационными системами, работающими как на платформе «1С:Предприятие», так и с системами на других платформах.
Изначально для интеграции информационных систем между собой надо было прописывать правила обмена в каждой системе отдельно. До определенного "критического" количества интеграций между системами это либо НЕ критично, либо терпимо, но когда число интеграций на предприятии превышает это количество - возникает все больше проблем.
Когда на предприятии появляется "критичное" количество интеграций между информационными системами - возникает потребность в неком едином механизме, через который по единому стандарту обменивались бы все эти информационные системы. Этими механизмами стали шины данных (ESB) и брокеры сообщений.
Появление единого механизма обменов дает следующие преимущества:
1. Удешевляет управление интеграциями на предприятии - все (или большая часть) интеграции собраны в одном месте;
2. Упрощает "втягивание" новых сотрудников на проект - все сотрудники знают единый стандарт. НЕ надо каждый раз повторять одно и то же новым сотрудникам, НЕ надо давать время на ознакомление с километрами кода, который написан в разных стилях
3. Удешевляет работу с интеграциями - НЕ надо сопровождать код, который отвечает за транспортировку сообщений - это уже. Все служебные функции, которые требует интеграция, уже прописаны в едином механизме и уже поставляются с ним. Разработчикам требуется прописать только бизнес-логику обменов и минимально какие-то технические моменты, связанные с транспортом, преобразованием и маршрутизацией сообщений.
В среде 1С-программистов, когда появилась возможность использовать брокеры и шины, появились следующие проблемы:
1. Разнообразие различных шин и брокеров. Если на проекте используется несколько таких приложений - нужно поддерживать разные правила обмена с разными шинами/брокерами;
2. Первая проблема усугубляется тем, что платформа 1С НЕ имеет встроенных средств для обмена с существующими шинами/брокерами. Все также надо реализовывать транспорт сообщения, но уже НЕ в сторонние системы, а в шину/брокер. Нужно поддерживать код, который написан в разном стиле разными людьми.
Получается, частично проблемы, которые были решены с появлением шин/брокеров, в среде 1С остались.
Для решения оставшихся проблем уже конкретно в среде 1С была создана 1С:Шина. В платформе 1С появились встроенные средства для обмена сообщениями между сервисом интеграции и информационными системами.
1С Шина позволяет обмениваться сообщениями со следующими инфосистемами:
При всем вышеописанном следует помнить: если количество уже работающих интеграций на предприятии ниже того самого "критического" количества интеграций, когда проблемы начинают расти лавинообразно - внедрение 1С:Шины или шин/брокеров и их сопровождение может выйти дороже, чем сопровождение уже существующих интеграций, без единого механизма.
Процесс установки 1С:Шины я НЕ буду описывать в данной публикации, т.к. это подробно описано в статье. Проблема, с которой я столкнулся при установке, и ее решение, описаны в разделе 3. Проблемы, с которыми я столкнулся, и пути их решения
1. Описание процесса реализации интеграции для информационных баз 1С
В данном разделе описаны шаги, которые требуются для реализации интеграции на 1С:Шине для двух баз данных 1С, одна из которых выступает источником сообщений, а другая - приемником.
Задача: когда в базе-источнике создается, или изменяется номенклатура - в базе-приемнике такая же номенклатура должна создаться/обновиться. Сопоставление номенклатуры будет осуществляться по коду и наименованию.
1.1. Настроить 1С:Шину
a. Войти в панель управления 1С:Шины.
В браузере перейти по адресу хоста, на котором установлена 1С:Шина и указать порт 9090:
Ввести учетные данные администратора панели (по умолчанию логин и пароль - admin).
b. Создать приложение
Создать новый проект с именем "ProducerConsumer". В приложении будет один отправитель и один получатель:
Остальные настройки заполнятся автоматически. Нажать кнопку "Создать".
Надо подождать минуту, пока создастся приложение:
Когда статус приложения установлен в "Работает" - можно переходить к интеграции.
c. Нарисовать блок-схему обмена данными
Открыть среду разработки приложения (возможно повторно придется ввести логин и пароль):
В открывшемся редакторе добавить процесс интеграции:
Указать имя процесса интеграции:
Далее надо составить следующую блок-схему в добавленном процессе интеграции:
Отправители и получатели - это элемент "Группа участников". Канал1СИсточник и Канал1СНазначение - это одноименные элементы из палитры элементов. Синие стрелки из элемента "Отправители" в "Канал1СИсточник" и из элемента "Канал1СНазначение" в "Получатели" - это элементы "Связь", а между элементами "Канал1СИсточник" и "Канал1СНазначение" - элемент "Маршрут".
d. Опубликовать приложение и запустить его
После составления блок-схемы надо опубликовать приложение. Для этого в левом нижнем углу нажать на имя приложения и выбрать в выпавшем вверху списке пункт "Опубликовать проект":
После этого в панели управления у приложения будет статус "Обновляется":
e. Заполнить список ИС-корреспондентов
Открыть приложение и перейти в список ИС
Добавить инфосистемы отправителя и получателя:
f. Добавить инфосистемы-корреспонденты в группы участников на закладке "Схема" приложения
В приложении перейти на закладку "Процессы", открыть основной процесс интеграции:
Выбрать группу участников "Отправители", перейти в состав группы:
Поместить в состав отправителя сообщений:
В результате должно получиться так:
Таким же образом добавить инфосистему-получателя в группу участников "Получатели":
g. Зафиксировать http-адрес приложения и ключи API для каждой инфосистемы.
Для того, чтобы инфосистемы обменивались с 1С:Шиной - им нужно знать адрес приложения в сети, а также идентифицировать себя, чтобы 1С:Шина понимала: от кого и куда направляется сообщение.
Для этих целей надо сохранить для себя URL приложения и ключи каждой ИС.
URL приложения можно взять из списка приложений:
Ключ для инфосистемы можно взять из списка информационных систем.
ВАЖНО: ключи безопасности при каждом получении обновляются, поэтому крайне важно их сохранять. Если получить ключ еще раз - придется заново настраивать сервисы интеграции в инфосистеме-источнике и приемнике - в конфигураторе и в режиме "1С:Предприятие".
Для того, чтобы получить ключи инфосистем - надо перейти в список приложений, выбрать инфосистему, для которой надо получить ключ и нажать "Выдать ключ API". Можно попутно обратить внимание, что инфосистема добавлена в процесс, в группу "Отправители".
Скопировать выведенные ключи туда, где потом можно будет их посмотреть повторно:
Те же действия произвести и для инфосистемы-получателя.
В результате должна быть сохранена для дальнейшего использования следующая информация:
h. Запустить процесс интеграции:
После запуска у процесса установлен статус "Запущен".
1.2. Настроить инфосистемы-корреспонденты.
a. Сконфигурировать информационные базы, для которых реализуется интеграция.
Создать базы для обмена:
В базе "Producer" создать справочник "Номенклатура". В справочнике для приглядности сделать форму. Метаданные и форма справочника приведены на скриншоте ниже:
Реквизит "ЭтоЭлектронныйТовар" - типа Булево, "Цена" - число, все остальные реквизиты - строковые.
В базе "Consumer" создать справочник такого же вида.
b. Добавить сервисы интеграции в дерево метаданных. Загрузить в сервисы интеграции каналы, в которых участвует инфосистема (отправляет или принимает сообщения).
Добавить сервис интеграции в базу "Producer" и задать имя с синонимом:
На закладке "Каналы" выбрать пункт "Загрузить каналы":
При загрузке каналов надо указать учетные данные, которые были сохранены ранее.
Далее выбрать канал, в который система будет отправлять сообщения и нажать кнопку "Загрузить":
В результате платформа автоматически добавила канал сервиса интеграции:
Те же действия выполнить для базы "Consumer", но указать уже учетные данные инфосистемы "Consumer" и загрузить канал "Канал1СНазначение" с направлением "Получение":
Результат в базе "Consumer". Платформа создала канал для получения сообщений из 1С:Шины и обработчик получения сообщений в модуле сервиса интеграции:
c. Настроить сервисы интеграции в пользовательском режиме
В базе "Producer" в пользовательском режиме перейти в стандартную обработку "Управление сервисами интеграции":
Заполнить учетные данные также, как это делалось при загрузке каналов в сервисе интеграции. Включить сервис интеграции.
Результат:
Таким же образом заполнить учетные данные и включить сервис интеграции в базе "Consumer":
d. Разработать механизмы отправки сообщений в очередь для отправки в канал 1С:Шины (если система отправляет сообщения)
В модуле объекта справочника "Номенклатура" в базе "Producer" разместить следующий код:
Процедура ПриЗаписи(Отказ)
ОтправитьТоварВКаналСервисаИнтеграции();
КонецПроцедуры
// Описание:
// Формирует сообщение и отправляет его в канал сервиса интеграции, где оно будет храниться до отправки в 1С:Шину
//
Процедура ОтправитьТоварВКаналСервисаИнтеграции()
Сообщение = СервисыИнтеграции.ProducerConsumer_dev.СоздатьСообщение();
Сообщение.КодПолучателя = "Consumer";
Тело = Сообщение.ПолучитьТелоКакПоток();
Товар = ПолучитьТоварJSON();
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки(Товар);
Тело.Записать(Буфер, 0, Буфер.Размер);
Тело.Закрыть();
Сообщение.Параметры.Вставить("РазмерСообщения", Буфер.Размер);
СервисыИнтеграции.ProducerConsumer_dev.Основной_ПроцессИнтеграции_Канал1СИсточник.ОтправитьСообщение(Сообщение);
КонецПроцедуры
Функция ПолучитьТоварJSON()
Структура = Новый Структура("Код, Наименование, ЭтоЭлектронныйТовар, ISBN, Цена, ДополнительныеРеквизиты");
ЗаполнитьЗначенияСвойств(Структура, ЭтотОбъект, "Код, Наименование, ЭтоЭлектронныйТовар, ISBN, Цена");
ДополнительныеРеквизиты_ = Новый Массив;
Для Каждого Строка Из ДополнительныеРеквизиты Цикл
Свойство = Новый Структура("Свойство, Значение");
ЗаполнитьЗначенияСвойств(Свойство, Строка);
ДополнительныеРеквизиты_.Добавить(Свойство);
КонецЦикла;
Структура.Вставить("ДополнительныеРеквизиты", ДополнительныеРеквизиты_);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Структура);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
e. Разработать механизмы обработки входящих сообщений (если система принимает сообщения)
В базе "Consumer", в модуле сервиса интеграции "ProducerConsumer_dev", разместить следующий код:
Процедура Основной_ПроцессИнтеграции_Канал1СНазначениеОбработкаПолученияСообщения(Сообщение, Отказ)
ТекстСообщения = СтрШаблон("Начало получения сообщения %1 от %2", Сообщение.Идентификатор, Сообщение.КодОтправителя);
ЗаписьЖурналаРегистрации("Сервисы интеграции.Обработка", УровеньЖурналаРегистрации.Информация, , ТекстСообщения);
Попытка
РазмерСообщения = Сообщение.Параметры.Получить("РазмерСообщения");
Если РазмерСообщения = Неопределено Тогда
РазмерБуфера = 1024;
Иначе
РазмерБуфера = Число(РазмерСообщения);
КонецЕсли;
Тело = Новый БуферДвоичныхДанных(0);
Буфер = Новый БуферДвоичныхДанных(РазмерБуфера);
Поток = Сообщение.ПолучитьТелоКакПоток();
Пока Истина Цикл
Прочитано = Поток.Прочитать(Буфер, 0, РазмерБуфера);
Если Прочитано > 0 Тогда
Тело = Тело.Соединить(Буфер);
КонецЕсли;
Если Прочитано < РазмерБуфера Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ВходящееСообщение = ПолучитьСтрокуИзБуфераДвоичныхДанных(Тело);
Если ВходящееСообщение <> "" Тогда
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(ВходящееСообщение);
СтруктураНоменклатуры = ПрочитатьJSON(ЧтениеJSON);
ОбновитьНоменклатуру(СтруктураНоменклатуры);
КонецЕсли;
ТекстСообщения = СтрШаблон("Сообщение %1 от %2 успешно обработано.", Сообщение.Идентификатор, Сообщение.КодОтправителя);
ЗаписьЖурналаРегистрации("Сервисы интеграции.Обработка", УровеньЖурналаРегистрации.Информация, , ТекстСообщения);
Исключение
Отказ = Истина;
ТекстСообщения = СтрШаблон("%1. Не удалось обработать сообщение ID: %2 от %3", ОписаниеОшибки(), Сообщение.Идентификатор, Сообщение.КодОтправителя);
ЗаписьЖурналаРегистрации("Сервисы интеграции.Обработка", УровеньЖурналаРегистрации.Ошибка, , ТекстСообщения);
КонецПопытки;
КонецПроцедуры
Процедура ОбновитьНоменклатуру(СтруктураНоменклатуры)
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Код = &Код И Наименование = &Наименование");
Запрос.УстановитьПараметр("Код", СтруктураНоменклатуры.Код);
Запрос.УстановитьПараметр("Наименование", СтруктураНоменклатуры.Наименование);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
НоменклатураОбъект = Выборка.Ссылка.ПолучитьОбъект();
Иначе
НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();
КонецЕсли;
ЗаполнитьЗначенияСвойств(НоменклатураОбъект, СтруктураНоменклатуры);
НоменклатураОбъект.ДополнительныеРеквизиты.Очистить();
Для Каждого СтруктураСоСвойством Из СтруктураНоменклатуры.ДополнительныеРеквизиты Цикл
ЗаполнитьЗначенияСвойств(НоменклатураОбъект.ДополнительныеРеквизиты.Добавить(), СтруктураСоСвойством);
КонецЦикла;
НоменклатураОбъект.Записать();
КонецПроцедуры
f. Разработать механизм, который отправляет сообщения из внутренней очереди в каналы 1С:Шины и который принимает сообщения из каналов 1С:Шины.
В базе "Producer" создать инструмент, который позволит просмотреть количество сообщений в канале сервиса интеграции И отправить сообщения в 1С:Шину. В данном случае это будет обработка:
Написать следующий код в форме обработки (с привязкой обработчиков событий к командам):
&НаКлиенте
Процедура ПроверитьКанал(Команда)
ПроверитьКаналНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьКаналНаСервере()
МассивСообщений = СервисыИнтеграции.ProducerConsumer_dev.Основной_ПроцессИнтеграции_Канал1СИсточник.ВыбратьСообщения();
Если МассивСообщений.Количество() > 0 Тогда
Сообщить(СтрШаблон("Количество сообщений в канале интеграции ""Producer consumer-dev"": %1", МассивСообщений.Количество()));
Иначе
Сообщить("Нет сообщений в канале.");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтправитьСообщения(Команда)
ОтправитьСообщенияНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ОтправитьСообщенияНаСервере()
СервисыИнтеграции.ВыполнитьОбработку();
КонецПроцедуры
В базе "Consumer" создать инструмент, который позволит получить сообщения из 1С:Шины. В данном случае это также будет обработка:
В форме обработки разместить следующий код:
&НаКлиенте
Процедура ЗагрузитьСообщения(Команда)
ЗагрузитьСообщенияНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗагрузитьСообщенияНаСервере()
СервисыИнтеграции.ВыполнитьОбработку();
КонецПроцедуры
g. Проверить, что сообщения отправляются по назначению и приходят к получателю.
Сценарий тестирования:
Действие: создать несколько карточек номенклатуры в базе "Producer"
Проверка: сообщения по каждой карточке попали в канал сервиса интеграции в базе "Producer"
Действие: отправить сообщения в 1С:Шину из канала
Проверка 1: сообщения доставлены в 1С:Шину в канал "Канал1СИсточник"
Проверка 2: И остались в канале "Канал1СНазначение".
Действие: запустить получение сообщений в базе "Consumer"
Проверка 1: сообщения прибыли в базу "Consumer";
Проверка 2: сообщения прочитались и была создана номенклатура, идентичная созданным товарам в базе "Producer"
Проверка 3: в канале "Канал1СНазначение" сообщения стали доставленными.
Проверка 4: в журнале регистрации базы "Consumer" отразилась успешная загрузка сообщений
Действие: изменить одну из карточек номенклатуры в базе "Producer" (все, кроме наименования и кода - по ним идет сопоставление номенклатуры в данном конкретном случае)
Действие: выполнить обмен с 1С:Шиной
Действие: запустить получение сообщений из 1С:Шины в базе "Consumer"
Проверка: номенклатура, которая была изменена в базе "Producer", идентична той, что находится в базе "Consumer".
Тест-лист:
Создать 3 карточки номенклатуры в базе "Producer:
В канале 3 сообщения, соответствующие 3 созданным карточкам номенклатуры:
Отправил сообщения в 1С:Шину - нажал кнопку "Отправить сообщения" в обработке.
Сообщения доставлены в канал "Канал1СИсточник" и находятся в канале "Канал1СНазначение":
В базе "Consumer" запустить обработку "Загрузка сообщений из шины" и нажать кнопку "Загрузить сообщения":
В журнале регистрации отразился факт прибытия сообщений И отобразилась успешная обработка всех сообщений и запись номенклатуры:
В канале "Канал1СНазначение" сообщения стали доставленными:
Вся созданная номенклатура идентична номенклатуре из базы "Producer":
Проверить синхронизацию изменений уже существующей карточки номенклатуры:
В карточке "Номенклатура 2" добавил строку в табличной части и цену:
Проверил количество сообщений в канале, отправил сообщения в 1С:Шину:
Сообщение прошло канал "Канал1СИсточник" и попало в канал "Канал1СНазначение":
На базе "Consumer" была запущена загрузка сообщений. Карточки номенклатуры в базах "Consumer" и "Producer идентичны:
Сценарий тестирования пройден.
Для автоматизации обмена сообщений нужно создать регламентное задание в ИС-источнике и приемнике и по определенному расписанию выполнять обмен с 1С:Шиной.
2. Пример преобразования сообщения и отладка
В примере ниже НЕ будут подробно расписываться шаги реализации. Будут приведены скриншоты ключевых моментов реализации интеграции. Подробно реализация описана в этом разделе.
Задачи:
a. Привести пример преобразования сообщения средствами 1С:Шины. В данном примере будет база-источник, которая высылает сообщение с содержимым в формате "JSON". Далее на диск сохраняется исходное сообщение в формате "JSON", а также происходит преобразование JSON в формат "XML" и далее XML складывается на диск рядом с файлом JSON.
b. Показать, как работает отладка
Реализация:
a. Создать приложение "Transformation-dev" в 1С:Шине.
b. Нарисовать в приложении следующую схему:
На схеме есть элементы, которые НЕ были описаны в разделе с подробной реализацией:
i. "Транслятор" - на схеме "JSON_В_XML" - принимает сообщение на вход и выдает преобразованное сообщение на выходе.
ii. "ФайлНазначение" - на схеме "СохранитьJSONВФайл" и "СохранитьXMLВФайл" - предназначено для сохранения сообщений в файл произвольного формата. Надо заполнить свойства "Каталог" и "Имя файла", чтобы система понимала, куда складывать содержимое сообщений:
iii. "МаршрутизаторПоСодержимому" - аналогичное название на схеме - служит для определения, куда перенаправить сообщение. В его модуле может быть кодом прописана маршрутизация. Если просто добавлен маршрутизатор, как здесь, сообщение рассылается во все приемники, к которым проложен маршрут. В данном случае сообщение от источника будет направлено и в элемент "СохранитьJSONВФайл", и в транслятор "JSON_В_XML".
c. В модуль транслятора "JSON_В_XML" вставить следующий код:
структура ДопСвойство
пер Свойство = ""
пер Значение = ""
;
структура Номенклатура
пер Код = ""
пер Наименование = ""
пер ЭтоЭлектронныйТовар = Истина
пер ISBN = ""
пер Цена = 0
пер ДополнительныеРеквизиты: Массив<ДопСвойство>?
;
метод ЧитатьНоменклатуру(Сообщение: ПроцессИнтеграции.Сообщение): Номенклатура
исп Тело = Сообщение.ПолучитьТелоКакПоток()
пер Соответствие = СериализацияJson.ПрочитатьОбъект(Тело) как Соответствие<Строка, Объект?>
пер Код = Соответствие.Получить("Код") как Строка
пер Наименование = Соответствие.Получить("Наименование") как Строка
пер ЭтоЭлектронныйТовар = Соответствие.Получить("ЭтоЭлектронныйТовар") как Булево
пер ISBN = Соответствие.Получить("ISBN") как Строка
пер Цена = Соответствие.Получить("Цена") как Число
пер Реквизиты = Соответствие.Получить("ДополнительныеРеквизиты") как ЧитаемыйМассив<Объект?>
пер ДополнительныеРеквизиты = новый Массив<ДопСвойство>()
для Реквизит из Реквизиты
пер СоответствиеРеквизита = Реквизит как Соответствие<Строка, Объект?>
ДополнительныеРеквизиты.Добавить(новый ДопСвойство(СоответствиеРеквизита.Получить("Свойство") как Строка,
СоответствиеРеквизита.Получить("Значение") как Строка))
;
возврат новый Номенклатура(Код, Наименование, ЭтоЭлектронныйТовар, ISBN, Цена, ДополнительныеРеквизиты)
;
метод Преобразование(Контекст: КонтекстВызова, Сообщение: ПроцессИнтеграции.Сообщение): СообщениеИнтеграции
пер Номенклатура = ЧитатьНоменклатуру(Сообщение)
исп НовоеТело = новый ВременныйПотокЗаписи()
пер ЗаписьXml = новый ЗаписьXml(НовоеТело)
ЗаписьXml.ЗаписатьНачалоДокумента()
ЗаписьXml.ЗаписатьНачалоЭлемента("Номенклатура")
ЗаписьXml.ЗаписатьНачалоЭлемента("Код")
ЗаписьXml.ЗаписатьТекст(Номенклатура.Код)
ЗаписьXml.ЗаписатьКонецЭлемента()
ЗаписьXml.ЗаписатьНачалоЭлемента("Наименование")
ЗаписьXml.ЗаписатьТекст(Номенклатура.Наименование)
ЗаписьXml.ЗаписатьКонецЭлемента()
ЗаписьXml.ЗаписатьНачалоЭлемента("ЭтоЭлектронныйТовар")
ЗаписьXml.ЗаписатьТекст(Номенклатура.ЭтоЭлектронныйТовар ? "true" : "false")
ЗаписьXml.ЗаписатьКонецЭлемента()
ЗаписьXml.ЗаписатьНачалоЭлемента("ISBN")
ЗаписьXml.ЗаписатьТекст(Номенклатура.ISBN)
ЗаписьXml.ЗаписатьКонецЭлемента()
ЗаписьXml.ЗаписатьНачалоЭлемента("Цена")
ЗаписьXml.ЗаписатьТекст(Номенклатура.Цена.ВСтроку())
ЗаписьXml.ЗаписатьКонецЭлемента()
ЗаписьXml.ЗаписатьНачалоЭлемента("ДополнительныеРеквизиты")
для Реквизит из Номенклатура.ДополнительныеРеквизиты
ЗаписьXml.ЗаписатьНачалоЭлемента("ДополнительныйРеквизит")
ЗаписьXml.ЗаписатьНачалоЭлемента("Свойство")
ЗаписьXml.ЗаписатьТекст(Реквизит.Свойство)
ЗаписьXml.ЗаписатьКонецЭлемента()
ЗаписьXml.ЗаписатьНачалоЭлемента("Значение")
ЗаписьXml.ЗаписатьТекст(Реквизит.Значение)
ЗаписьXml.ЗаписатьКонецЭлемента()
ЗаписьXml.ЗаписатьКонецЭлемента()
;
ЗаписьXml.ЗаписатьКонецЭлемента()
ЗаписьXml.ЗаписатьКонецЭлемента()
ЗаписьXml.ЗаписатьКонецДокумента()
возврат новый СообщениеИнтеграции({:}, НовоеТело.ОткрытьПотокЧтения())
;
d. Добавить инфосистему в приложение, которая будет высылать сообщения в 1С:Шину. Дополнить список группы участников "Отправитель" на схеме, запустить процесс интеграции.
e. Скопировать из первого примера базу "Producer". Логика работы будет такая же: при записи номенклатуры формируется сообщение. Отправка в 1С:Шину выполняется также кнопкой обработки. В базе-отправителе надо настроить сервис интеграции под новое приложение, доработать код, чтобы обращения были к новому сервису и настроить сервис интеграции в пользовательском режиме. После этого можно приступать к тестированию.
Тестирование:
Проверка: количество доставленных сообщений до отправки:
Действие: записать номенклатуру
Действие: отправить сообщения в 1С:Шину
Проверка 1: после отправки количество доставленных сообщений в канале увеличилось на 1:
Проверка 2: в каталог (у меня это "C:\Maliy\1С.ESB\tests") попали файлы xml и json
Проверка 3: в файлах идентичный набор свойств и значения свойств
2.2. Отладка
Для отладки можно использовать отладчик и сохранение промежуточных вариантов в файлы.
Сохранение в файлы уже было рассмотрено. Оно полезно, если надо определить, до какого этапа на схеме доходит сообщение (до того, как случится какая-то ошибка), или если надо проверить, в каком состоянии находится сообщение в определенном месте схемы.
Отладчик полезен, если надо определить причину исключения в работе кода. Чтобы воспользоваться отладчиком, надо открыть приложение в режиме разработки, перейти в нужный модуль, установить точки останова и запустить отладку:
Если отладка запускается в первый раз И в браузере НЕ установлено расширение "Отладчик 1С:Предприятие.Элемент" - это расширение будет установлено автоматически после разрешения от пользователя. Далее откроется новая закладка для работы расширения отладчика и можно будет запустить сообщение в канал процесса интеграции.
После запуска отладки процесса интеграции запустить сообщение из канала в базе данных в 1С:Шину - исполнение остановилось на точке останова:
Локальные переменные, перечень точек останова, стек вызовов и другие показатели, можно посмотреть на панели слева. Значения выражений без помещения в переменную можно отлаживать на закладке "Консоль отладки":
3. Проблемы, с которыми я столкнулся, и пути их решения
3.1. Сразу после установки служба 1С:ESB некоторое время выполняется и затем выключается.
Описание и решение проблемы есть в этой статье в разделе про установку и настройку. В файле с настройками отладки ("C:\ProgramData\1C\1CE\instances\1c-enterprise-esb-with-ide\config\debug.yml" для Windows) есть настройки порта отладки. По умолчанию порт отладки - 8080. Он был занят. После замены на 8080 служба запустилась и получилось в браузере зайти в панель управления 1С:Шиной.
3.2. Иногда редактор схемы проекта ведет себя непредсказуемо
В некоторых случаях (непонятно, как именно воспроизвести проблему) в блок-схеме НЕ удаляются элементы. Тогда в системе выводятся ошибки что обнаружено входных/выходных элементов, чем должно быть, например:
Данную ошибку я воспроизвел, несколько раз быстро удалив/добавив одни и те же элементы. Вообще же сценарий воспроизведения неясен - иногда глючит. Увидеть, где проблема, можно в yaml-файле, который описывает схему:
В данном случае из канала "Канал1СИсточник" в канал "Канал1СНазначение" продублировался маршрут (черная стрелочка), хотя я сначала удалил старый маршрут, а затем провел новый между этими схемами.
Данную конкретную проблему можно исправить, убрав лишний маршрут вручную из yaml файла, или попытавшись убрать ненужный маршрут на схеме (в yaml, на мой взгляд, удобнее, т.к. сразу идет подсветка блоков с ошибкой). НЕ всегда помогает редактирование текста в yaml файле. Иногда приходится начинать процесс рисования схемы заново.
Также мне помогло отслеживать корректность изменений, сравнивая текст из yaml последней корректной схемы и текст yaml схемы с новыми изменениями. Для этого я пользуюсь плагином "compareit" в Visual Studio Code:
Тут можно увидеть различие между последним корректным вариантом схемы (слева) и измененной схемой с ошибками (справа).
3.3. НЕ выгружаются сообщения в 1С:Шину из канала базы "Producer":
Проблема выглядела следующим образом: вызывается метод "СервисыИнтеграции.ВыполнитьОбработку()". Исключений НЕ генерируется. При этом до выполнения метода в очереди были сообщения, а после отправки сообщений нет.
Я настроил технологический журнал на логирование исключений EXCP.
В ТЖ после отправки выводилось следующее:
51:45.779013-0,EXCP,
0,
process=ragent,
OSThread=12644,
Exception=c496436a-abe1-482f-964e-4269b1e46f75, Descr='src\rserver\src\RMngrCalls.cpp(410):
c496436a-abe1-482f-964e-4269b1e46f75: IDS_LICENSE_DATABASECOPY
Использование этой функции возможно только при наличии лицензии на платформу уровня КОРП или лицензии на запуск клиентских приложений системы 1С:Аналитика. Обратитесь к администратору для решения вопросов получения и установки лицензий.
На момент освоения 1С:Шины у меня стояла версия платформы "8.3.20.1838".
Начал гуглить, наткнулся на эту статью. Последовал советам - НЕ помогло. На каком-то форуме (адрес потерял, к сожалению) по этому же исключению, но немного другой ситуации, посоветовали поставить платформу выше 8.3.22.опять же НЕ помню точно, про какой конкретно релиз говорилось. По итогу установил платформу версии "8.3.23.1688".
Конкретно эта ошибка пропала, но сообщения в 1С:Шину все равно НЕ отправлялись - в ТЖ появились другие исключения:
1. 22:07.277000-0, EXCP, 1, process=rphost, p:processName=1C_ESB, OSThread=3240, Exception=7d02ef7a-683a-4481-9cbe-d13d8c612f3d,
Descr='src\integ\src\QpidConnectionStore.cpp(1148):
7d02ef7a-683a-4481-9cbe-d13d8c612f3d: Ошибка при подключении к каналу сервиса интеграции : ProducerConsumer_dev.Основной_ПроцессИнтеграции_Канал1СИсточник: http://localhost:9090/applications/Torgovlya-dev : Основной::ИнтеграцияТорговля.Источник1С
c329df92-3ba7-4d5d-937b-951d91ac0ac0: Недопустимое состояние объекта
not found channel in esb rutime metadata [integ - src\integ\src\QpidConnectionStore.cpp (175)]'
2. 57:23.707001-0, EXCP, 1, process=rphost, p:processName=1C_ESB, OSThread=2224, Exception=d0d66e66-0683-4e52-badb-34d56034dba7, Descr='src\integ\src\QpidConnectionStore.cpp(1312):
d0d66e66-0683-4e52-badb-34d56034dba7: Ошибка при подключении к сервису интеграции : ProducerConsumer_dev : http://localhost:9090/applications/Torgovlya
a021fe2a-72c9-4b2f-aca2-0c9963035617: Исключение при использовании QPID: ProducerConsumer_dev: amqp:unauthorized-access: Authentication failed [mech=PLAIN]'
Тут достаточно было пересмотреть кусок вебинара, где рассказывалось про настройку схемы процесса интеграции. У меня были недонастроены ИС в приложении и канал-источник (в статье приведена уже корректная настройка, тут я просто описываю, какие исключения встретил и как устранил ошибки).
Заключение
На этом пока что все. Публикация получилась объемной и, надеюсь, что полезной. Если будут замечания, дополнения или пожелания - прошу в комментарии. Спасибо за внимание.
Полезные ссылки:
2. DevCon.3 11. Пример интеграции информационных систем через 1С:Шину - YouTube
3. 1С:Шина: презентация продукта, примеры интеграции - YouTube
4. От экспертов «1СR09;Рарус»: 1С:Шина — от установки до использования на реальном проекте (rarus.ru)
5. 1С:Шина. Руководство разработчика. Издание 3 (1c.ru)
Внедрение 1С:Шина
Внедрение и настройка решения для интеграции между различными информационными системами