Настройка синхронизации данных между информационными базами на платформе "1С:Предприятие" через "1С:Шину".

В данной статье будет показан пример использования "1С:Шины" для синхронизации данных между информационными базами на платформе "1С:Предприятие". В качестве исходных данных будет использован уже настроенный обмен между демонстрационными базами 1С:ERP Управление предприятием 2 (2.4.14.176) и 1С:Розница редакция 2.3 (2.3.11.29), который необходимо перенести в "1С:Шину".

1.      Настройки в "1С:Шине".

В среде разработки "1С:Шины" необходимо:

В настройках приложения "1С:Шины":

1.1 Создание проекта.

Для создания проекта нужно открыть панель управление сервером "1С:Шины", выбрать пункт меню "Приложения", далее "+ Новое приложение":

В открывшемся окне указать "Новый проект", заполнить ключевые поля, такие как:

Указать режим разработки и выбрать тип СУБД (в нашем примере это будет Microsoft SQL Server) и нажать кнопку "Создать". Пример настройки приложения:

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

        

Для настройки процесса интеграции необходимо открыть приложение в среде разработки, для этого нужно в списке приложений нажать на кнопку "Редактировать":

Откроется новая вкладка браузера для среды разработки, в ней необходимо повторно ввести пароль администратора, который был указан при установке сервера "1С:Шины", и нажать "Войти":

Откроется редактор среды разработки:

Далее необходимо добавить новый элемент проекта — процесс интеграции.

Для этого нужно выбрать подсистему "Основной", далее нажать правую кнопку мыши, откроется контекстное меню, в котором нужно выбрать "New", далее "Project Element".

Откроется меню выбора для добавления элемента проекта, в нем нужно выбрать вид добавляемого элемента проекта — "Процесс интеграции", задать имя и нажать "Ввод".

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

            В тестовом примере, имя процесса интеграции – "ОбменМагазиныТиповой".

Для тестового примера необходимо создать следующую схему:

Для создания соединения узлов "Магазины" и "из_Магазины_в_ЦБ" нужно использовать элемент "Связь". Для создания соединения узлов "из_Магазины_в_ЦБ" и "в_ЦБ из_Магазины" необходимо использовать элемент "Маршрут". Аналогично для узлов "ЦентральнаяБаза", "из_ЦБ_в_Магазины", "в_Магазины_из_ЦБ".

Сообщения поступают в шину через узлы вида "Канал1СИсточник" (узлы "из_Магазины_в_ЦБ" и "из_ЦБ_в_Магазины") и доставляются в узлы вида "Канал1СНазначение" (узлы "в_ЦБ из_Магазины" и "в_Магазины_из_ЦБ").

Информационные системы – участники процесса интеграции (в роли которых выступают информационные базы "1С:Предприятия") объединяются в группы участников (в нашем примере –"Магазины" и "ЦентральнаяБаза"), которые, в свою очередь, связываются с каналами. Отправлять сообщения в каналы вида "Канал1СИсточник" и получать сообщения из каналов вида "Канал1СНазначение" будут только те информационные системы, которые включены в группы участников, связанные с соответствующим каналом.

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

1.2 Публикация проекта.

После настройки схемы интеграции ее необходимо опубликовать, для этого нужно нажать клавишу F9, либо в контекстном меню процесса интеграции выбрать пункт "Publish Project":

В левом углу строки состояния среды разработки появится статус публикации. Если статус "updating" изменился на "running", значит приложение обновлено и запущено;

1.3 Настройка приложения.

Для того, что открыть опубликованное приложение из среды разработки нужно, нажав правой кнопкой мыши, открыть контекстное меню процесса и выбрать пункт "Open Application":

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

После успешной авторизации откроется вкладка приложения "1С:Шины", на ней будет отображен список процессов интеграции, существующих в приложении. В тестовом примере будет единственный процесс интеграции "Основной::ОбменМагазиныТиповой":

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

1.3.1 Добавление информационных систем в приложение.

Для добавления информационных баз в приложении "1С:Шины" необходимо перейти на вкладку "Инфосистемы" и нажать на кнопку "+Добавить систему":

Откроется окно добавления информационной системы:

Идентификация получателя в "1С:Шине" осуществляется с использованием кода информационной системы – это буквенно-цифровой код, который указывается в свойстве "Код" в процессе регистрации информационной системы на сервере "1С:Шины".

Для удобства в тестовом примере при добавлении информационных систем будут использованы префиксы информационных баз: 1С:ERP и 1С:Розница:

- Центральная база (код "ЦБ") – информационная база 1С:ERP.

- Магазин 1 (код "М1") – информационная база 1С:Розница.

Посмотреть префикс информационной базы можно на вкладке "Синхронизация данных" (раздел "НСИ и Администрирование" - "Синхронизация данных" для 1С:ERP и раздел "Администрирование" - "Синхронизация данных" для 1С:Розница):

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

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

1.3.2        Включение информационных систем в состав приложения.

Для включения информационной системы в состав приложения необходимо перейти на вкладку "Процессы" и выбрать процесс "Основной::ОбменМагазиныТиповой":

После настройки состава групп необходимо запустить процесс интеграции:

      На этом настройки в "1С:Шине" завершены, далее можно переходить к настройке информационных баз.

2.      Настройка информационных баз.

Необходимо выполнить следующие доработки:

В тестовом примере рассматривается переключение существующего двустороннего обмена между демонстрационными базами 1С:ERP и 1С:Розница, который настроен через универсальный формат EnterpriseData. Роль центральной базы выполняет 1С:ERP, роль базы магазина выполняется 1С:Розница.   

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

2.1 Создание расширения.

Далее можно переходить к настройкам в конфигураторе, для этого откроем конфигуратор информационной базы 1С:ERP и создадим расширение, в котором выполним необходимые доработки для взаимодействия с "1С:Шиной".

В тестовом примере необходимо задать следующие параметры:

2.2 Создание сервиса интеграции в расширении.

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

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

 

В открывшейся форме требуется указать:

Затем нажать кнопку "Получить каналы сервиса".

Список заполнится каналами вида "Канал1СИсточник" и "Канал1СНазначение", созданными на этапе настройки конфигурации шины (см. раздел 1.1 "Создание проекта"):

В списке необходимо установить отметки только для тех каналов, которые относятся к узлу "ЦентральнаяБаза". Далее нажать на кнопку "Загрузить" и перейти на вкладку "Каналы" – в список должны добавиться те каналы, которые были выбраны:

Для удобства можно переименовать название канала, при этом имя канала внешнего сервиса интеграции необходимо оставить прежним:

Одновременно при загрузке входящего канала в модуле сервиса интеграции будет создан обработчики получения сообщений из каналов:

2.3 Реализация кода отправки и получения сообщений.

            Для реализации обработчиков отправки и получения сообщений необходимо создать в расширении общий серверный модуль "Интеграция_Обработчики":

Далее добавить в общий модуль:

Копировать в буфер обмена
Процедура ОбработатьВходящееСообщение(Сообщение, Отказ) Экспорт

               

                СобытиеЖурналаРегистрации = "Сервисы интеграции.Обработка";

                ТекстСообщения = "Обрабатывается сообщение ID:" + Сообщение.Идентификатор + Символы.ВК + "  От : " + Сообщение.КодОтправителя;

                ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Информация, , , ТекстСообщения);

 

                Попытка

               

                               РазмерСообщения = Сообщение.Параметры.Получить("РазмерСообщения");

                               Если РазмерСообщения <> Неопределено Тогда

                                               РазмерБуфера = Число(РазмерСообщения);

                               Иначе

                                               РазмерБуфера = 1024;

                                КонецЕсли;

                               Тело = Новый БуферДвоичныхДанных(0);

                               Буфер = Новый БуферДвоичныхДанных(РазмерБуфера);

                               Поток = Сообщение.ПолучитьТелоКакПоток();

                               Пока Истина Цикл

                                               Прочитано = Поток.Прочитать(Буфер, 0, РазмерБуфера);

                                               Если Прочитано > 0 Тогда

                                                               Тело = Тело.Соединить(Буфер);

                                               КонецЕсли;

                                               Если Прочитано < РазмерБуфера Тогда

                                                               Прервать;

                                               КонецЕсли;

                               КонецЦикла;                                                   

                              

                               ВходящееСообщение = ПолучитьСтрокуИзБуфераДвоичныхДанных(Тело); 

                                ОбменДаннымиСервер.ВыполнитьЗагрузкуДляУзлаИнформационнойБазыЧерезСтроку("СинхронизацияДанныхЧерезУниверсальныйФормат", Сообщение.КодОтправителя, ВходящееСообщение);

 

                Исключение

                              

                               Отказ = Истина;

                               СобытиеЖурналаРегистрации = "Сервисы интеграции.Обработка";

                               ТекстСообщения = ОписаниеОшибки() + ". Не удалось обработать сообщение ID:" + Сообщение.Идентификатор + " от : " + Сообщение.КодОтправителя;

                               ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщения);

               

                КонецПопытки;

               

КонецПроцедуры

Копировать в буфер обмена
Процедура СформироватьИсходящееСообщенияДляУзлаОбмена(СервисИнтеграции, КаналИнтеграции, УзелОбмена) Экспорт

               

                СобытиеЖурналаРегистрации = "Сервисы интеграции.Обработка";

                ТекстСообщения = "Формирование сообщений шины.";

                ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Информация, , , ТекстСообщения);

 

                Попытка 

                              

                               АдресХраненияРезультата = "";

                                ОбменДаннымиСервер.ВыполнитьВыгрузкуДляУзлаИнформационнойБазыВоВременноеХранилище("СинхронизацияДанныхЧерезУниверсальныйФормат", УзелОбмена, АдресХраненияРезультата);

                              

                               Если АдресХраненияРезультата <> "" Тогда

                                               Сообщение = СервисыИнтеграции[СервисИнтеграции].СоздатьСообщение();

                                               Сообщение.КодПолучателя = УзелОбмена;

                                               Тело = Сообщение.ПолучитьТелоКакПоток();

                                               Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьИзВременногоХранилища(АдресХраненияРезультата));

                                               Тело.Записать(Буфер, 0, Буфер.Размер);

                                               Тело.Закрыть();

                                               Сообщение.Параметры.Вставить("РазмерСообщения", Буфер.Размер);

                                               СервисыИнтеграции[СервисИнтеграции][КаналИнтеграции].ОтправитьСообщение(Сообщение);

                               КонецЕсли;

 

                Исключение

                              

                               СобытиеЖурналаРегистрации = "Сервисы интеграции.Обработка";

                               ТекстСообщения = ОписаниеОшибки() + ". Не удалось сформировать сообщение для узла:" + УзелОбмена;

                               ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщения);

               

                КонецПопытки;

               

КонецПроцедуры

При получении сообщения в целевой информационной базе запускается фоновое задание, которое вызывает обработчик соответствующего канала, по этому необходимо в модуле сервиса интеграции "Интеграция_ОбменМагазиныТиповой" указать обработчик входящего сообщения.

В момент загрузки канала "в_ЦБ_из_Магазины" в пункте 2.2 "Создание сервиса интеграции в расширении" был создан пустой обработчик "ОбменМагазиныТиповой_ОбработкаПолученияСообщения", в него необходимо добавить вызов созданной процедуры "ОбработатьВходящееСообщение" из модуля "Интеграция_Обработчики":

Копировать в буфер обмена
Процедура ОбменМагазиныТиповой_ОбработкаПолученияСообщения(Сообщение, Отказ)

                Интеграция_Обработчики.ОбработатьВходящееСообщение(Сообщение, Отказ);         

КонецПроцедуры

2.4 Подключение созданного расширения во второй информационной базе.

После выполнения настроек в информационной базе 1С:ERP расширение необходимо будет сохранить и подключить в информационной базе 1С:Розница. После подключения расширения в информационной базе 1С:Розница каналы интеграции из информационной базы 1С:ERP необходимо будет заменить на каналы интеграции для узла "Магазины".

Для этого каналы, которые относятся к 1С:ERP нужно удалить и выполнить загрузку каналов также, как описано в пункте 2.2 "Создание сервиса интеграции в расширении", только указать идентификатор ключа и секрет клиента, полученные на этапе создания информационной системы "Магазины" (см. раздел 1.3.1 "Добавление информационных систем в приложение"):

2.5 Регламентные задания для формирования и обработки сообщений.

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

В тестовом примере обработка будет называться "ИнтеграцияСШиной.epf", ниже приведен код ее модуля:

Копировать в буфер обмена

#Область СведенияОВнешнейОбработке

Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); ПараметрыРегистрации.Вставить("Назначение", ПолучитьНазначениеОбработки()); ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = 'Интеграция с шиной'")); ПараметрыРегистрации.Вставить("Версия", "1.0"); ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); ПараметрыРегистрации.Вставить("Информация", НСтр("ru = 'Интеграция с шиной'")); ТаблицаКоманд = ПолучитьТаблицуКоманд(); ДобавитьКоманду(ТаблицаКоманд, НСтр("ru = 'Формирование сообщений шины (Регламентный запуск)'"), "ФормированиеСообщений", "ВызовСерверногоМетода", Истина, ""); ДобавитьКоманду(ТаблицаКоманд, НСтр("ru = 'Выполнить обработку сообщений шины (Регламентный запуск)'"), "ОбработкаСообщений", "ВызовСерверногоМетода", Истина, ""); ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); Возврат ПараметрыРегистрации; КонецФункции Функция ПолучитьНазначениеОбработки() Назначение = Новый Массив; Возврат Назначение; КонецФункции Функция ПолучитьТаблицуКоманд() Команды = Новый ТаблицаЗначений; Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); Возврат Команды; КонецФункции Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда.Представление = Представление; НоваяКоманда.Идентификатор = Идентификатор; НоваяКоманда.Использование = Использование; НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; НоваяКоманда.Модификатор = Модификатор; КонецПроцедуры #КонецОбласти #Область СлужебныеОбработчики Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт Если ИдентификаторКоманды = "ФормированиеСообщений" Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СинхронизацияДанныхЧерезУниверсальныйФормат.Код КАК Код |ИЗ | ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат КАК СинхронизацияДанныхЧерезУниверсальныйФормат |ГДЕ | НЕ СинхронизацияДанныхЧерезУниверсальныйФормат.ЭтотУзел | И НЕ СинхронизацияДанныхЧерезУниверсальныйФормат.ПометкаУдаления"; РезультатЗапроса = Запрос.Выполнить(); Если Не РезультатЗапроса.Пустой() Тогда Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Интеграция_Обработчики.СформироватьИсходящееСообщенияДляУзлаОбмена("Интеграция_ОбменМагазиныТиповой", "из_ЦБ_в_Магазины", Выборка.Код); КонецЦикла; КонецЕсли; ИначеЕсли ИдентификаторКоманды = "ОбработкаСообщений" Тогда Попытка СервисыИнтеграции.ВыполнитьОбработку(); Исключение СобытиеЖурналаРегистрации = "Сервисы интеграции.Обработка"; ТекстСообщения = "Ошибка обработки сообщений шины; " + ОписаниеОшибки(); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщения); КонецПопытки; КонецЕсли; КонецПроцедуры

2.6 Подключение информационных баз к серверу "1С:Шины".

После настройки конфигураций 1С:ERP и 1С:Розница необходимо задать настройки подключения этих баз к сервису интеграции в режиме "1С:Предприятие".

Для этого необходимо:

Откроется список доступных сервисов интеграции:

Чтобы настроить подключение к серверу "1С:Шины" необходимо нажать "Редактировать". В группе "Настройки внешнего сервиса интеграции" задайте свойства:

Для сохранения настроек нужно нажать "ОК".

Чтобы запустить обмен сообщениями нужно в форме списка сервисов интеграции установить флаг "Активность" у выбранного сервиса:

2.7 Запуск регламентных заданий для формирования и обработки сообщений.

Чтобы обмен выполнялся в автоматическом режиме, необходимо подключить созданную обработку в разделе 2.5 в информационных базах 1С:ERP и 1С:Розница.

В информационной базе 1С:ERP нужно выбрать раздел "НСИ и Администрирование", далее выбрать "Печатные формы, отчеты и обработки",  "Дополнительные отчеты и обработки", в открывшемся окне нажать на кнопку "Добавить из файла":


В информационной базе 1С:Розница нужно выбрать раздел "Администрирование", далее выбрать "Печатные формы, отчеты и обработки",  "Дополнительные отчеты и обработки", в открывшемся окне нажать на кнопку "Добавить из файла":


Далее необходимо выбрать обработку "ИнтеграцияСШиной.epf", созданную в разделе 2.5, после этого откроется форма:

В форме подключения внешней обработки необходимо задать расписание для выполнения команд, для этого нужно указать флажок в колонке "Выполнять команду по расписанию".

При установке флажка "Выполнять команду по расписанию" откроется форма настройки расписания, для тестового примера указываются следующие настройки:

После того, как расписание будет задано нужно нажать на кнопку "Записать и закрыть". После записи дополнительной обработки автоматически будут созданы соответствующие регламентные задания.

Чтобы убедиться, что регламентные задания созданы и функционируют:

2.8 Проверка работы обменов через "1С:Шину".

Для проверки настроенных обменов через "1С:Шину" необходимо зарегистрировать произвольный объект для обмена, для этого можно воспользоваться обработкой "Регистрация изменений для обмена данными".

В информационной базе 1С:ERP необходимо открыть форму списка настроенных обменов ("НСИ и Администрирование" - "Синхронизация данных" - "Настройки синхронизации данных"), в правом верхнем углу формы щелкнуть на кнопку "Еще", откроется меню, в котором нужно выбрать пункт "Состав отправляемых данных":

Откроется форма "Регистрация изменений для обмена данными". В качестве тестового примера зарегистрируем номенклатуру "Ассорти (конфеты)":

Если при выполнении регламентного задания "Формирование сообщения шины" номер отправленного сообщения в обработке должен изменился, значит сформировалось исходящее сообщение с объектом, зарегистрированным к обмену:

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

Чтобы просмотреть счетчики каналов необходимо в приложении "1С:Шины" щелкнуть на процессе интеграции "Основной::ОбменМагазиныТиповой", далее перейти на вкладку "Каналы":

 

В журнале сообщений колонка "В канале" в приложении 1С:Шина показывает, что сообщение ожидает доставки в узел:

При выполнении регламентного задания "Выполнить обработку сообщений шины" в информационной базе 1С:Розница счетчик сообщений "В канале" в журнале сообщений 1С:Шины должен обнулиться, а счетчик "Доставлено" увеличиться:

Таким образом, можно сделать вывод, что доставленное сообщение успешно доставлено в узел получатель.