Действия на стороне 1С:Шина
Для начала создадим проект, в моем случае это "Тест3". Не забудьте активировать поле "Создать приложение для разработки".
После создания проекта, переходим во вкладку "Приложения". Там мы увидим, созданное нами приложение с названием схожим с нашим проектом, а приложение для разработки будет иметь окончание -dev.
Для начала разработки необходимо перейти в среду разработки 1с:Шина, для этого откройте наше приложение и нажмите кнопку "Разработка".
После авторизации нам станет доступна внутренняя среда разработки 1С:Шина. Чтобы добавить процесс интеграции, необходимо нажать правой кнопкой мыши по вкладке "Основной" в дереве и в выпадающем списке выбрать пункт "Новый"->"Элемент проекта".
После выполнения данных действий необходимо выбрать в выпадающем списке "Процесс интеграции" и придумать для него название. В моем случае это "TestToTest.yaml".
Далее необходимо нарисовать схему интеграции (ниже указал свою). Для данного примера были использованы "Группа пользователей", "Канал1СИсточник" и "Канал1СНазначение".
После того, как мы создали нашу схему интеграции, нам необходимо опубликовать наше приложение, нажав клавишу F9 или нажав "Опубликовать приложение". Сразу после публикации, нам необходимо открыть наше приложение.
В нашем приложении мы увидим новый процесс*. (*моё приложение уже работает, поэтому у него уже имеются входящие и исходящие сообщения)
На данном этапе переходим в "Инфосистемы" и добавляем двух участников нашего процесса (для каждого из них, необходимо нажатием на клавишу, получить ключи API и сохранить их в отдельное место, например блокноте).
Теперь мы должны добавить информационные системы в группы пользователей. Для этого переходим обратно в процессы, нажимаем на наш процесс, далее поочередно выбираем группы пользователей на схеме и, нажав на кнопку "Состав группы", добавляем наши системы в группы (рис. ниже).
Действия в конфигурациях наших баз
После всех выполненных действий мы можем запустить наш процесс и переходить к самим конфигурациям.
В обоих конфигурациях следует сделать аналогичные операции:
- Создадим расширение, в котором будем тестировать наш обмен. Необходимо поставить галочки, как указано ниже.
- Далее добавляем в "Общее"->"Сервисы интеграции" необходимо добавить новый сервис интеграции (для понимания процесса я создал 2, чтобы разделить отправку и получение).
- Далее с помощью наших ключей API для данной базы, получим каналы, как на скриншоте ниже. Для сервиса Интеграции, который мы будем использовать для получения, необходимо оставить галочку только на том канале, который связан с данной базой. Аналогично для сервиса по отправке сообщений.
- Создадим Справочник *ИмяРасширения*_Справочник1, который и будет синхронизовывать.
- Создадим общий модуль, где опишем обработку получения сообщений:
Процедура ОбработкаПолученияСообщений(Сообщение, Отказ) Экспорт ЗаписьЖурналаРегистрации("СервисыИнтегацииОбработка", УровеньЖурналаРегистрации.Информация, , , "Обработка сообщений"); Попытка РазмерСообщения = Сообщение.Параметры.Получить("РазмерСообщения"); Если РазмерСообщения <> Неопределено тогда РазмерБуфера = Число(РазмерСообщения); Иначе РазмерБуфер = 1024; КонецЕсли; Тело = Новый БуферДвоичныхДанных(0); Буфер = Новый БуферДвоичныхДанных(РазмерБуфера); Поток = Сообщение.ПолучитьТелоКакПоток(); Пока Истина Цикл Прочитано = Поток.Прочитать(Буфер, 0, РазмерБуфера); Если Прочитано > 0 тогда Тело = Тело.Соединить(Буфер); КонецЕсли; Если Прочитано < РазмерБуфера тогда Прервать; КонецЕсли; КонецЦикла; ВходящееСообщение = ПолучитьСтрокуИзБуфераДвоичныхДанных(Тело); Если ВходящееСообщение <> "" тогда ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(ВходящееСообщение); СтруктураДанных = СчитатьДанныеВСтруктуру(ЧтениеXML); ЧтениеXML.Закрыть(); ЗагрузитьИзмененияОбъекта(СтруктураДанных); КонецЕсли; Исключение Отказ = Истина; ЗаписьЖурналаРегистрации("СервисыИнтегацииОбработкаОшибка", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки()); КонецПопытки; КонецПроцедуры Функция СчитатьДанныеВСтруктуру(ЧтениеXML) Результат = Новый Структура; Ключ = ""; Пока ЧтениеXML.Прочитать() Цикл Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента тогда Ключ = ЧтениеXML.Имя; КонецЕсли; Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст и Ключ <> "" тогда Результат.Вставить(Ключ, ЧтениеXML.Значение); КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции Процедура ЗагрузитьИзмененияОбъекта(СтруктураДанных) Попытка СправОбъект = Справочники.Сергей_Справочник1.СоздатьЭлемент(); ЗаполнитьЗначенияСвойств(СправОбъект, СтруктураДанных); СправОб = Справочники.Сергей_Справочник1.НайтиПоНаименованию(СправОбъект.Наименование); Попытка СправОбъект = СправОб.ПолучитьОбъект(); ЗаполнитьЗначенияСвойств(СправОбъект, СтруктураДанных); Исключение КонецПопытки; СправОбъект.Записать(); Исключение ЗаписьЖурналаРегистрации("СервисыИнтегацииОбработка", УровеньЖурналаРегистрации.Информация, , , "Не вышло: "+ОписаниеОшибки() ); КонецПопытки; //удаление обработанных сообщений позволит не обрабатывать их каждый раз, с новым сообщением СервисыИнтеграции.Сергей_СервисИнтеграции1.Основной_TestToTest_Канал1СНазначение.УдалитьСообщения(); КонецПроцедуры
- Далее укажем в свойствах сервиса интеграции обработчик, где сошлемся на наш модуль:
- Следующим шагом создадим аналогично предыдущему сервис интеграции для отправки сообщений, создадим общий модуль, где опишем алгоритм.
Процедура ОтправкаСообщенияПриЗаписиСправочника(Источник, Отказ) Экспорт Если Источник.ОбменДанными.Загрузка тогда Возврат; КонецЕсли; Если ТипЗнч(Источник) = Тип("СправочникОбъект.Сергей_Справочник1") тогда Сообщение = СервисыИнтеграции.Сергей_СервисИнтеграции2.СоздатьСообщение(); Сообщение.КодПолучателя = "t0"; Тело = Сообщение.ПолучитьТелоКакПоток(); ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Источник); СтрокаXML = ЗаписьXML.Закрыть(); Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки(СтрокаXML); Тело.Записать(Буфер, 0, Буфер.Размер); Тело.Закрыть(); Сообщение.Параметры.Вставить("РазмерСообщения", Буфер.Размер); СервисыИнтеграции.Сергей_СервисИнтеграции2.Основной_TestToTest_Канал1СИсточник2.ОтправитьСообщение(Сообщение); СервисыИнтеграции.ВыполнитьОбработку(); КонецЕсли; КонецПроцедуры
- Добавим ПодпискуНаСобытие, при которой будем посылаться сообщение
- Последним шагом будет создание обработки, которая будет запускать обработку сообщений
- Все данные действия необходимо повторить во второй конфигурации.
- После этого необходимо на клиенте активировать сервисы интеграции. Для этого воспользуемся стандартной обработкой "Управление сервисами интеграции"
Пример отправки и получения сообщений
Теперь, после активации сервисов, можем протестировать Отправку и получение в обеих базах, просто создаём в одной из них элемент справочника и записываем его, во второй базе запускаем нашу обработку и после новый элемент отобразиться в двух справочниках. При изменении уже имеющегося элемента и записи, при запуске обработки во второй базе изменения также применятся и в этой базе.
Начальное состояние шины
Состояние справочника в двух базах
Создание элемента справочника
Запуск обработки во второй базе
Элемент в обеих базах
Отредактируем элемент во второй базе и увидим его изменения в первой
Состояние шины после обмена сообщениями
Заключение
Очень надеюсь, что данный пример будет кому-то полезен и сэкономит для кого-то большую, а для кого-то, может, и небольшую часть рабочего времени ;)