Работа обработки «Универсальный обмен данными в формате XML» с планом обмена «Синхронизация данных через универсальный формат»
Предположим, у нас есть правила обмена и внешняя обработка, которая запускается по расписанию и выгружает документы из базы источника, а в базе приемника аналогичная обработка по расписанию эти документы загружает. В этих обработках инициализируется запуск штатной обработки «Универсальный обмен данными в формате XML» и выполняется соответственно выгрузка (загрузка) за определенный период.
Задача: доработать обмен так, чтобы выгружались (загружались) не все документы за период, а те лишь которые были изменены за последний, например, час. Для этого используем штатный план обмена «Синхронизация данных через универсальный формат». В нашем распоряжении конфигурация Бухгалтерия 3.0. Версия конвертации данных 2.1 (2.1.8.1).
Порядок настроек и доработок следующий:
-
В обеих базах включаем константу «Синхронизация данных
-
Создаем узлы в плане обмена. Делать это интерактивно руками сложно, поэтому создадим обработку. Код обработки в базе источника:
Процедура СоздатьУзлыНаСервере()
// Настраиваем текущий узел
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СинхронизацияДанныхЧерезУниверсальныйФормат.Ссылка КАК Узел
|ИЗ
| ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат КАК СинхронизацияДанныхЧерезУниверсальныйФормат
|ГДЕ
| СинхронизацияДанныхЧерезУниверсальныйФормат.ЭтотУзел = Истина";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() > 0 Тогда
Выборка.Следующий();
ТекущийУзел = Выборка.Узел.ПолучитьОбъект();
Иначе;
ТекущийУзел = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.СоздатьУзел();
ТекущийУзел.ЭтотУзел = Истина;
КонецЕсли;
ТекущийУзел.Код = "БИ";
ТекущийУзел.Наименование = "База источник";
УстанваливаемРеквизиты(ТекущийУзел);
ТекущийУзел.Записать();
// Настраиваем узел 2-й базы
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СинхронизацияДанныхЧерезУниверсальныйФормат.Ссылка КАК Узел
|ИЗ
| ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат КАК СинхронизацияДанныхЧерезУниверсальныйФормат
|ГДЕ
| СинхронизацияДанныхЧерезУниверсальныйФормат.ЭтотУзел = ЛОЖЬ
| И СинхронизацияДанныхЧерезУниверсальныйФормат.Код = ""БП""";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() > 0 Тогда
Выборка.Следующий();
ТекущийУзел = Выборка.Узел.ПолучитьОбъект();
Иначе;
ТекущийУзел = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.СоздатьУзел();
ТекущийУзел.ЭтотУзел = ЛОЖЬ;
ТекущийУзел.Код = "БП";
КонецЕсли;
ТекущийУзел.Наименование = "База приемник";
УстанваливаемРеквизиты(ТекущийУзел);
ТекущийУзел.Записать();
Сообщить("Готово");
КонецПроцедуры
&НаСервере
Процедура УстанваливаемРеквизиты(ТекущийУзел)
ТекущийУзел.ОтправлятьДокументыПокупкиПродажи = Истина;
ТекущийУзел.ОтправлятьСкладскиеДокументы = Истина;
ТекущийУзел.ОтправлятьАвансовыеОтчеты = Истина;
ТекущийУзел.РегистрироватьИзменения = Истина;
ТекущийУзел.ОтправлятьБанковскиеДокументы = Истина;
ТекущийУзел.ОтправлятьКассовыеДокументы = Истина;
ТекущийУзел.ОтправлятьВедомостиНаВыплатуЗарплаты = Истина;
ТекущийУзел.ОтправлятьРегламентированныеОтчеты = Истина;
ТекущийУзел.РегистрироватьИзменения = Истина;
КонецПроцедуры
Здесь соответственно Код БИ - База источник, БП – приемник. На стороне приемника код аналогичный. Только там «Этот узел» будет с кодом БП, а тот от которого приходят документы – БИ. Открываем план обмена Синхронизация данных через универсальный формат и видим результат.
Соответственно в базе источника «Этот узел» с кодом БИ, в базе приемника «Этот узел» - БП.
-
Теперь, когда узлы созданы, у нас будут автоматически регистрироваться измененные или новые документы и мы можем их выгружать с помощью универсального обмена. Предположим, в базу приемника выгружаем счет на оплату. Открываем Счет на оплату и жмем кнопку «Записать». Этим мы инициализировали изменения. Открываем узел приемника и смотрим состав отправляемых данных.
Туда попал наш счет пока без номера отправленного сообщения. Запускаем обработку Универсальный обмен данными, загружаем правила обмена и выбираем узел приемника.
После выгрузки в составе отправляемых данных появится номер отправляемого сообщения. Когда этот счет будет загружен в базу приемника он также зарегистрируется, соответственно, на узле источника как вновь созданный документ. Примечание: в правилах обмена в правилах выгрузки данных (ПВД) должен быть указан объект выборки, способ отбора данных – «Стандартная выборка» и заполнено правило конвертации.
Код выгрузки данных такой:
Процедура ВыгрузитьДанные()
Обмен = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обмен.ИмяФайлаПравилОбмена = "C:\ПравилаОбмена_Источник_Приемник.xml";
Обмен.ИмяФайлаОбмена = "C:\Источник_Приемник.xml";
Обмен.ЗагрузитьПравилаОбмена();
КодУзла = "БП";
Для Каждого ГруппыОбъектов Из Обмен.ТаблицаПравилВыгрузки.Строки Цикл
Для Каждого ТекОбъект Из ГруппыОбъектов.Строки Цикл
ТекОбъект.СсылкаНаУзелОбмена = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду(КодУзла);
КонецЦикла;
КонецЦикла;
Обмен.ВыполнитьВыгрузку();
КонецПроцедуры
Код загрузки такой:
Процедура ЗагрузитьДанные()
Обмен = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обмен.ЗагружатьДанныеВРежимеОбмена = Истина;
Обмен.ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина;
Обмен.ОбъектыПоСсылкеЗагружатьБезПометкиУдаления = Истина;
Обмен.ОптимизированнаяЗаписьОбъектов = Истина;
Обмен.ЗаписыватьРегистрыНаборамиЗаписей = Истина;
Обмен.РежимОбмена = "Загрузка";
Обмен.ИмяФайлаОбмена = "C:\Источник_Приемник.xml";
Обмен.ВыполнитьЗагрузку();
КонецПроцедуры
-
Теперь задача в том, чтобы удачно загруженные документы удалялись бы из регистрации изменений баз источника и приемника. Для этого база приемник должна отправлять ответ об удачно загруженном, например, счете на оплату. Для отправки таких ответов создадим правила обмена, которые будут выполняться на стороне приемника. Правила конвертации для Счета на оплату:
Поскольку мы отправляем лишь ответ, что данный счет появился в базе, то никаких свойств объекта добавлять не надо. Мы передаем пустышку, чтобы убрать регистрацию. В настройках ставим флаг «Не создавать новый объект в приемнике, если он НЕ найден», а вот флаг «Не замещать существующие объекты…» должен быть снят, так как должен отработать обработчик «После загрузки». Открываем обработчик «После выгрузки» и добавляем код.
УзелБИ = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду("БИ"); ПланыОбмена.УдалитьРегистрациюИзменений(УзелБИ, Источник);
Этот код снимает регистрацию в базе приемника. Далее в обработчик «После загрузки» добавляем код:
Если Не Параметры.Свойство("ПодтвержденияОзагрузке") Тогда Параметры.Вставить("ПодтвержденияОзагрузке", Новый Массив); КонецЕсли; Параметры.ПодтвержденияОзагрузке.Добавить(Объект.Ссылка);
Параметры – это структура, которая доступна на всех этапах выгрузки и загрузки данных. В ней создаем массив и заполняем его ссылками на документы. После того как загрузка полностью отработает снимаем регистрацию в «После загрузки данных».
УзелБП = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду("БП"); Если Параметры.Свойство("ПодтвержденияОзагрузке") Тогда Для Каждого ПодтверждениеСсылка Из Параметры.ПодтвержденияОзагрузке Цикл ПланыОбмена.УдалитьРегистрациюИзменений(УзелБП, ПодтверждениеСсылка); КонецЦикла; КонецЕсли;
Важно, чтобы в обеих базах сначала выполнялась процедура загрузки данных, а потом выгрузки. Таким образом, будут читаться ответы об уже загруженных документах и в выгрузку попадут только не загруженные данные.
На этом, в принципе, обмен готов. Стоит отметить, что если сопоставление данных идет по гуиду, то и в ответах с «пустышкой» о загрузке поиск тоже должен быть по гуиду. Если сопоставление по другим реквизитам, то и ответ должен отправляться по таким же реквизитам.
Еще одна важная деталь – это правила регистрации объектов на узле. Дело в том, что в штатном плане обмена «Синхронизация данных через универсальный формат» предусмотрена отправка многих типов документов. И они все по умолчанию будут попадать в регистрацию изменений. Если наша бизнес-логика подразумевает, например, отправку только счетов на оплату, то остальные типы документов будут «висеть» в изменениях вечно, пока администратор БД или пользователь не уберет их вручную. Чтобы ограничить список настраиваем правила регистрации объектов.
В конвертации добавляем новое правило регистрации.
Указываем конфигурацию и план обмена «Синхронизация данных через универсальный формат»
Перейти -> Правила регистрации объектов. Заполняем объект настройки и режим выгрузки документов.
В верхнем меню Правила регистрации -> Сохранить правила. Выбираем нашу регистрацию и выгружаем.
В базе источника выбираем узел базы приемника и загружаем правила регистрации.
Теперь обмен готов.