1С:Шина
03.06.22
В данной статье будет показан пример использования "1С:Шины" для синхронизации данных между информационными базами на платформе "1С:Предприятие". В качестве исходных данных будет использован уже настроенный обмен между демонстрационными базами 1С:ERP Управление предприятием 2 (2.4.14.176) и 1С:Розница редакция 2.3 (2.3.11.29), который необходимо перенести в "1С:Шину".
В среде разработки "1С:Шины" необходимо:
В настройках приложения "1С:Шины":
Для создания проекта нужно открыть панель управление сервером "1С:Шины", выбрать пункт меню "Приложения", далее "+ Новое приложение":
В открывшемся окне указать "Новый проект", заполнить ключевые поля, такие как:
Указать режим разработки и выбрать тип СУБД (в нашем примере это будет Microsoft SQL Server) и нажать кнопку "Создать". Пример настройки приложения:
Новое приложение появится в списке со статусом "Создается". Через некоторое время статус приложения изменится на "Работает":
Для настройки процесса интеграции необходимо открыть приложение в среде разработки, для этого нужно в списке приложений нажать на кнопку "Редактировать":
Откроется новая вкладка браузера для среды разработки, в ней необходимо повторно ввести пароль администратора, который был указан при установке сервера "1С:Шины", и нажать "Войти":
Откроется редактор среды разработки:
Далее необходимо добавить новый элемент проекта — процесс интеграции.
Для этого нужно выбрать подсистему "Основной", далее нажать правую кнопку мыши, откроется контекстное меню, в котором нужно выбрать "New", далее "Project Element".
Откроется меню выбора для добавления элемента проекта, в нем нужно выбрать вид добавляемого элемента проекта — "Процесс интеграции", задать имя и нажать "Ввод".
"1С:Шина" создаст в проекте новый процесс интеграции и откроет редактор для создания его схемы.
В тестовом примере, имя процесса интеграции – "ОбменМагазиныТиповой".
Для тестового примера необходимо создать следующую схему:
Для создания соединения узлов "Магазины" и "из_Магазины_в_ЦБ" нужно использовать элемент "Связь". Для создания соединения узлов "из_Магазины_в_ЦБ" и "в_ЦБ из_Магазины" необходимо использовать элемент "Маршрут". Аналогично для узлов "ЦентральнаяБаза", "из_ЦБ_в_Магазины", "в_Магазины_из_ЦБ".
Сообщения поступают в шину через узлы вида "Канал1СИсточник" (узлы "из_Магазины_в_ЦБ" и "из_ЦБ_в_Магазины") и доставляются в узлы вида "Канал1СНазначение" (узлы "в_ЦБ из_Магазины" и "в_Магазины_из_ЦБ").
Информационные системы – участники процесса интеграции (в роли которых выступают информационные базы "1С:Предприятия") объединяются в группы участников (в нашем примере –"Магазины" и "ЦентральнаяБаза"), которые, в свою очередь, связываются с каналами. Отправлять сообщения в каналы вида "Канал1СИсточник" и получать сообщения из каналов вида "Канал1СНазначение" будут только те информационные системы, которые включены в группы участников, связанные с соответствующим каналом.
Какие именно информационные системы будут участвовать во взаимодействии, их названия, параметры подключения и в какие группы участников они будут входить – определяется позднее, уже после публикации процесса интеграции на сервере, с помощью веб-интерфейса сервера шины.
После настройки схемы интеграции ее необходимо опубликовать, для этого нужно нажать клавишу F9, либо в контекстном меню процесса интеграции выбрать пункт "Publish Project":
В левом углу строки состояния среды разработки появится статус публикации. Если статус "updating" изменился на "running", значит приложение обновлено и запущено;
Для того, что открыть опубликованное приложение из среды разработки нужно, нажав правой кнопкой мыши, открыть контекстное меню процесса и выбрать пункт "Open Application":
Сервер "1С:Шины" запросит имя пользователя и пароль. Для аутентификации используйте учетную запись администратора и пароль, который был задан при установке сервера "1С:Шины".
После успешной авторизации откроется вкладка приложения "1С:Шины", на ней будет отображен список процессов интеграции, существующих в приложении. В тестовом примере будет единственный процесс интеграции "Основной::ОбменМагазиныТиповой":
В адресной строке браузера можно увидеть адрес публикации приложения, он понадобится при дальнейшей настройке подключения информационных баз к "1С:Шине".
Для добавления информационных баз в приложении "1С:Шины" необходимо перейти на вкладку "Инфосистемы" и нажать на кнопку "+Добавить систему":
Откроется окно добавления информационной системы:
Идентификация получателя в "1С:Шине" осуществляется с использованием кода информационной системы – это буквенно-цифровой код, который указывается в свойстве "Код" в процессе регистрации информационной системы на сервере "1С:Шины".
Для удобства в тестовом примере при добавлении информационных систем будут использованы префиксы информационных баз: 1С:ERP и 1С:Розница:
- Центральная база (код "ЦБ") – информационная база 1С:ERP.
- Магазин 1 (код "М1") – информационная база 1С:Розница.
Посмотреть префикс информационной базы можно на вкладке "Синхронизация данных" (раздел "НСИ и Администрирование" - "Синхронизация данных" для 1С:ERP и раздел "Администрирование" - "Синхронизация данных" для 1С:Розница):
После добавления информационных систем необходимо получить ключ, который они будут использовать при подключении к серверу "1С:Шины". Чтобы получить ключ, нужно выбрать информационную систему, а затем нажать кнопку "Выдать ключ API":
Скопируйте и сохраните идентификатор ключа и секрет клиента. Позднее эти настройки будут использоваться при подключении информационной базы к серверу "1С:Шины".
Для включения информационной системы в состав приложения необходимо перейти на вкладку "Процессы" и выбрать процесс "Основной::ОбменМагазиныТиповой":
После настройки состава групп необходимо запустить процесс интеграции:
На этом настройки в "1С:Шине" завершены, далее можно переходить к настройке информационных баз.
Необходимо выполнить следующие доработки:
В тестовом примере рассматривается переключение существующего двустороннего обмена между демонстрационными базами 1С:ERP и 1С:Розница, который настроен через универсальный формат EnterpriseData. Роль центральной базы выполняет 1С:ERP, роль базы магазина выполняется 1С:Розница.
Перед выполнением настроек на стороне информационных баз необходимо отключить регламентные задания существующего обмена, чтобы в ходе запуска обмена через "1С:Шину" не возникло коллизий, когда сформированное сообщение для обмена будет отправлено и через "1С:Шину", и через настроенный транспорт существующего обмена.
Далее можно переходить к настройкам в конфигураторе, для этого откроем конфигуратор информационной базы 1С:ERP и создадим расширение, в котором выполним необходимые доработки для взаимодействия с "1С:Шиной".
В тестовом примере необходимо задать следующие параметры:
В созданном расширении необходимо добавить сервис интеграции, именно этот объект отвечает за взаимодействие с "1С:Шиной", в нем задаются параметры подключения к серверу "1С:Шины". Для создания нового сервиса интеграции нужно раскрыть ветку "Общие", выбрать "Сервисы интеграции" и добавить новый объект. В тестовом примере его название будет "Интеграция_ОбменМагазиныТиповой".
Далее требуется загрузить информацию о доступных каналах интеграции из опубликованного приложения шины. Для этого в меню "Действия" внизу формы сервиса интеграции необходимо выбрать пункт "Загрузить каналы":
В открывшейся форме требуется указать:
Затем нажать кнопку "Получить каналы сервиса".
Список заполнится каналами вида "Канал1СИсточник" и "Канал1СНазначение", созданными на этапе настройки конфигурации шины (см. раздел 1.1 "Создание проекта"):
В списке необходимо установить отметки только для тех каналов, которые относятся к узлу "ЦентральнаяБаза". Далее нажать на кнопку "Загрузить" и перейти на вкладку "Каналы" – в список должны добавиться те каналы, которые были выбраны:
Для удобства можно переименовать название канала, при этом имя канала внешнего сервиса интеграции необходимо оставить прежним:
Одновременно при загрузке входящего канала в модуле сервиса интеграции будет создан обработчики получения сообщений из каналов:
Для реализации обработчиков отправки и получения сообщений необходимо создать в расширении общий серверный модуль "Интеграция_Обработчики":
Далее добавить в общий модуль:
Процедура ОбработатьВходящееСообщение(Сообщение, Отказ) Экспорт СобытиеЖурналаРегистрации = "Сервисы интеграции.Обработка"; ТекстСообщения = "Обрабатывается сообщение ID:" + Сообщение.Идентификатор + Символы.ВК + " От : " + Сообщение.КодОтправителя; ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Информация, , , ТекстСообщения); Попытка РазмерСообщения = Сообщение.Параметры.Получить("РазмерСообщения"); Если РазмерСообщения <> Неопределено Тогда РазмерБуфера = Число(РазмерСообщения); Иначе РазмерБуфера = 1024; КонецЕсли; Тело = Новый БуферДвоичныхДанных(0); Буфер = Новый БуферДвоичныхДанных(РазмерБуфера); Поток = Сообщение.ПолучитьТелоКакПоток(); Пока Истина Цикл Прочитано = Поток.Прочитать(Буфер, 0, РазмерБуфера); Если Прочитано > 0 Тогда Тело = Тело.Соединить(Буфер); КонецЕсли; Если Прочитано < РазмерБуфера Тогда Прервать; КонецЕсли; КонецЦикла; ВходящееСообщение = ПолучитьСтрокуИзБуфераДвоичныхДанных(Тело); ОбменДаннымиСервер.ВыполнитьЗагрузкуДляУзлаИнформационнойБазыЧерезСтроку("СинхронизацияДанныхЧерезУниверсальныйФормат", Сообщение.КодОтправителя, ВходящееСообщение); Исключение Отказ = Истина; СобытиеЖурналаРегистрации = "Сервисы интеграции.Обработка"; ТекстСообщения = ОписаниеОшибки() + ". Не удалось обработать сообщение ID:" + Сообщение.Идентификатор + " от : " + Сообщение.КодОтправителя; ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщения); КонецПопытки; КонецПроцедуры
Процедура СформироватьИсходящееСообщенияДляУзлаОбмена(СервисИнтеграции, КаналИнтеграции, УзелОбмена) Экспорт СобытиеЖурналаРегистрации = "Сервисы интеграции.Обработка"; ТекстСообщения = "Формирование сообщений шины."; ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Информация, , , ТекстСообщения); Попытка АдресХраненияРезультата = ""; ОбменДаннымиСервер.ВыполнитьВыгрузкуДляУзлаИнформационнойБазыВоВременноеХранилище("СинхронизацияДанныхЧерезУниверсальныйФормат", УзелОбмена, АдресХраненияРезультата); Если АдресХраненияРезультата <> "" Тогда Сообщение = СервисыИнтеграции[СервисИнтеграции].СоздатьСообщение(); Сообщение.КодПолучателя = УзелОбмена; Тело = Сообщение.ПолучитьТелоКакПоток(); Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьИзВременногоХранилища(АдресХраненияРезультата)); Тело.Записать(Буфер, 0, Буфер.Размер); Тело.Закрыть(); Сообщение.Параметры.Вставить("РазмерСообщения", Буфер.Размер); СервисыИнтеграции[СервисИнтеграции][КаналИнтеграции].ОтправитьСообщение(Сообщение); КонецЕсли; Исключение СобытиеЖурналаРегистрации = "Сервисы интеграции.Обработка"; ТекстСообщения = ОписаниеОшибки() + ". Не удалось сформировать сообщение для узла:" + УзелОбмена; ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщения); КонецПопытки; КонецПроцедуры
При получении сообщения в целевой информационной базе запускается фоновое задание, которое вызывает обработчик соответствующего канала, по этому необходимо в модуле сервиса интеграции "Интеграция_ОбменМагазиныТиповой" указать обработчик входящего сообщения.
В момент загрузки канала "в_ЦБ_из_Магазины" в пункте 2.2 "Создание сервиса интеграции в расширении" был создан пустой обработчик "ОбменМагазиныТиповой_ОбработкаПолученияСообщения", в него необходимо добавить вызов созданной процедуры "ОбработатьВходящееСообщение" из модуля "Интеграция_Обработчики":
Копировать в буфер обменаПроцедура ОбменМагазиныТиповой_ОбработкаПолученияСообщения(Сообщение, Отказ) Интеграция_Обработчики.ОбработатьВходящееСообщение(Сообщение, Отказ); КонецПроцедуры
После выполнения настроек в информационной базе 1С:ERP расширение необходимо будет сохранить и подключить в информационной базе 1С:Розница. После подключения расширения в информационной базе 1С:Розница каналы интеграции из информационной базы 1С:ERP необходимо будет заменить на каналы интеграции для узла "Магазины".
Для этого каналы, которые относятся к 1С:ERP нужно удалить и выполнить загрузку каналов также, как описано в пункте 2.2 "Создание сервиса интеграции в расширении", только указать идентификатор ключа и секрет клиента, полученные на этапе создания информационной системы "Магазины" (см. раздел 1.3.1 "Добавление информационных систем в приложение"):
Чтобы сформировать регламентные задания без доработки конфигурации необходимо создать внешнюю обработку, в модуле которой будет реализован вызов серверных методов.
В тестовом примере обработка будет называться "ИнтеграцияСШиной.epf", ниже приведен код ее модуля:
Копировать в буфер обмена#Область СведенияОВнешнейОбработке
Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); ПараметрыРегистрации.Вставить("Назначение", ПолучитьНазначениеОбработки()); ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = 'Интеграция с шиной'")); ПараметрыРегистрации.Вставить("Версия", "1.0"); ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); ПараметрыРегистрации.Вставить("Информация", НСтр("ru = 'Интеграция с шиной'")); ТаблицаКоманд = ПолучитьТаблицуКоманд(); ДобавитьКоманду(ТаблицаКоманд, НСтр("ru = 'Формирование сообщений шины (Регламентный запуск)'"), "ФормированиеСообщений", "ВызовСерверногоМетода", Истина, ""); ДобавитьКоманду(ТаблицаКоманд, НСтр("ru = 'Выполнить обработку сообщений шины (Регламентный запуск)'"), "ОбработкаСообщений", "ВызовСерверногоМетода", Истина, ""); ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); Возврат ПараметрыРегистрации; КонецФункции Функция ПолучитьНазначениеОбработки() Назначение = Новый Массив; Возврат Назначение; КонецФункции Функция ПолучитьТаблицуКоманд() Команды = Новый ТаблицаЗначений; Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); Возврат Команды; КонецФункции Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда.Представление = Представление; НоваяКоманда.Идентификатор = Идентификатор; НоваяКоманда.Использование = Использование; НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; НоваяКоманда.Модификатор = Модификатор; КонецПроцедуры #КонецОбласти #Область СлужебныеОбработчики Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт Если ИдентификаторКоманды = "ФормированиеСообщений" Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СинхронизацияДанныхЧерезУниверсальныйФормат.Код КАК Код |ИЗ | ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат КАК СинхронизацияДанныхЧерезУниверсальныйФормат |ГДЕ | НЕ СинхронизацияДанныхЧерезУниверсальныйФормат.ЭтотУзел | И НЕ СинхронизацияДанныхЧерезУниверсальныйФормат.ПометкаУдаления"; РезультатЗапроса = Запрос.Выполнить(); Если Не РезультатЗапроса.Пустой() Тогда Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Интеграция_Обработчики.СформироватьИсходящееСообщенияДляУзлаОбмена("Интеграция_ОбменМагазиныТиповой", "из_ЦБ_в_Магазины", Выборка.Код); КонецЦикла; КонецЕсли; ИначеЕсли ИдентификаторКоманды = "ОбработкаСообщений" Тогда Попытка СервисыИнтеграции.ВыполнитьОбработку(); Исключение СобытиеЖурналаРегистрации = "Сервисы интеграции.Обработка"; ТекстСообщения = "Ошибка обработки сообщений шины; " + ОписаниеОшибки(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщения); КонецПопытки; КонецЕсли; КонецПроцедуры
2.6 Подключение информационных баз к серверу "1С:Шины".
После настройки конфигураций 1С:ERP и 1С:Розница необходимо задать настройки подключения этих баз к сервису интеграции в режиме "1С:Предприятие".
Для этого необходимо:
Откроется список доступных сервисов интеграции:
Чтобы настроить подключение к серверу "1С:Шины" необходимо нажать "Редактировать". В группе "Настройки внешнего сервиса интеграции" задайте свойства:
Для сохранения настроек нужно нажать "ОК".
Чтобы запустить обмен сообщениями нужно в форме списка сервисов интеграции установить флаг "Активность" у выбранного сервиса:
Чтобы обмен выполнялся в автоматическом режиме, необходимо подключить созданную обработку в разделе 2.5 в информационных базах 1С:ERP и 1С:Розница.
В информационной базе 1С:ERP нужно выбрать раздел "НСИ и Администрирование", далее выбрать "Печатные формы, отчеты и обработки", "Дополнительные отчеты и обработки", в открывшемся окне нажать на кнопку "Добавить из файла":
В информационной базе 1С:Розница нужно выбрать раздел "Администрирование", далее выбрать "Печатные формы, отчеты и обработки", "Дополнительные отчеты и обработки", в открывшемся окне нажать на кнопку "Добавить из файла":
Далее необходимо выбрать обработку "ИнтеграцияСШиной.epf", созданную в разделе 2.5, после этого откроется форма:
В форме подключения внешней обработки необходимо задать расписание для выполнения команд, для этого нужно указать флажок в колонке "Выполнять команду по расписанию".
При установке флажка "Выполнять команду по расписанию" откроется форма настройки расписания, для тестового примера указываются следующие настройки:
После того, как расписание будет задано нужно нажать на кнопку "Записать и закрыть". После записи дополнительной обработки автоматически будут созданы соответствующие регламентные задания.
Чтобы убедиться, что регламентные задания созданы и функционируют:
Для проверки настроенных обменов через "1С:Шину" необходимо зарегистрировать произвольный объект для обмена, для этого можно воспользоваться обработкой "Регистрация изменений для обмена данными".
В информационной базе 1С:ERP необходимо открыть форму списка настроенных обменов ("НСИ и Администрирование" - "Синхронизация данных" - "Настройки синхронизации данных"), в правом верхнем углу формы щелкнуть на кнопку "Еще", откроется меню, в котором нужно выбрать пункт "Состав отправляемых данных":
Откроется форма "Регистрация изменений для обмена данными". В качестве тестового примера зарегистрируем номенклатуру "Ассорти (конфеты)":
Если при выполнении регламентного задания "Формирование сообщения шины" номер отправленного сообщения в обработке должен изменился, значит сформировалось исходящее сообщение с объектом, зарегистрированным к обмену:
При выполнении регламентного задания "Выполнить обработку сообщений шины" в информационной базе 1С:ERP, исходящее сообщение будет передано в "1С:Шину" для обмена, счетчики каналов в приложении должны измениться.
Чтобы просмотреть счетчики каналов необходимо в приложении "1С:Шины" щелкнуть на процессе интеграции "Основной::ОбменМагазиныТиповой", далее перейти на вкладку "Каналы":
В журнале сообщений колонка "В канале" в приложении 1С:Шина показывает, что сообщение ожидает доставки в узел:
При выполнении регламентного задания "Выполнить обработку сообщений шины" в информационной базе 1С:Розница счетчик сообщений "В канале" в журнале сообщений 1С:Шины должен обнулиться, а счетчик "Доставлено" увеличиться:
Таким образом, можно сделать вывод, что доставленное сообщение успешно доставлено в узел получатель.