Оптимизация новой схемы обмена через синхронизацию

В новых типовых конфигурациях УТ11 и БП3 вместо прошлой схемы обмена данными используется синхронизация данных. Однако у неё есть свои недостатки. В статье - краткое описание некоторых нюансов новой схемы и приемы для оптимизации работы с ней.

 

Код синхронизации содержится в обработке "КонвертацияОбъектовИнформационныхБаз".

Отложенное проведение документов

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

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

 

Я нашел обходной вариант этой проблемы - дублирую помещение в таблицу значений записью в типовой регистр " РезультатыОбменаДанными", синоним которого называется "Предупреждения при синхронизации данных".

 

Для этого в процедуру "ПрочитатьОбъект" нужно вставить запись в этот регистр:

Если ЗаписатьОбъект

       И Объект <> Неопределено

       И Объект.Ссылка <> Неопределено Тогда

      

       СтрокаТаблицы = ДокументыДляОтложенногоПроведения().Добавить();

                                                      СтрокаТаблицы.ДокументСсылка = Объект.Ссылка;

                                                      СтрокаТаблицы.ДатаДокумента  = Объект.Дата;

                                                     

       ДополнительныеСвойстваДляОтложенногоПроведения().Вставить(Объект.Ссылка, Объект.ДополнительныеСвойства);

                                                     

       //Производим сразу отложенное проведение документов...

       ОбменДаннымиСервер.ЗарегистрироватьОшибкуПроведенияДокумента(Объект, УзелОбменаЗагрузкаДанных, "Сохранение отложенных в обмене документов");

КонецЕсли;

 

 

Если обмен закончится нормально, то записи этого регистра очистятся.

 

Если будет ошибка, можно провести документы из этого регистра, открыв форму регистра и нажимая кнопку "Провести":

 

Правда, если выделить несколько строк и нажать "Провести", то при первой же ошибке проведения проведение останавливается.

 

Можно взять код проведения в попытку-исключение:

 

&НаСервере

Процедура ПровестиДокументы(Знач ВыделенныеСтроки)

      

...         

             Если ДокументОбъект.ПроверитьЗаполнение() Тогда

                   

        

                    //Продолжаем проведение, если ошибка

                    Попытка

                           ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

                    Исключение

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

      

            

             КонецЕсли;

      

...

      

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

 

Или написать свою обработку проведения документов.

 

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

 

В начало процедуры "ВыполнитьОтложенноеПроведениеДокументов" добавить код:

       //Добавляем из регистра

       ТЗДО = ДокументыДляОтложенногоПроведения();

       З = Новый Запрос(

       "ВЫБРАТЬ

       |      РезультатыОбменаДанными.ПроблемныйОбъект КАК ДокументСсылка,

       |      РезультатыОбменаДанными.Причина,

       |      РезультатыОбменаДанными.ДатаДокумента КАК ДатаДокумента

       |ИЗ

       |      РегистрСведений.РезультатыОбменаДанными КАК РезультатыОбменаДанными

       |      ГДЕ ПОДСТРОКА(РезультатыОбменаДанными.Причина, 1, 1024) = &Причина");

       З.УстановитьПараметр("Причина", "Сохранение отложенных в обмене документов");

       ТЗ = З.Выполнить().Выгрузить();

      

       Для Каждого Строка ИЗ ТЗ Цикл

             НСтр = ТЗДО.Добавить();

             ЗаполнитьЗначенияСвойств(НСтр, Строка);

       КонецЦикла;

 

Очистка регистрации изменений при обмене через COM

Часто настраивается обмен через внешнее соединение.

При этом хотелось бы, чтобы как только объект был передан в базу-приемник, очищалась регистрация по нему.

Вероятность того, что объект как раз в этот момент поменяется, крайне мала, поэтому схема приемлема.

 

Для этого достаточно вставить удаление регистрации изменений:

Процедура ВыполнитьВыгрузкуЗарегистрированныхДанных(ЗаписьСообщения, СтрокаСообщенияОбОшибке, ТаблицаПравилВыгрузкиИспользуемые)

             Пока ВыборкаИзменений.Следующий() Цикл

 

             Если ЭтоОбменЧерезВнешнееСоединение Тогда

                   

                    Если ЗагрузкаДанныхВыполняетсяВоВнешнемСоединении Тогда

                          

                           Если ОбработкаДляЗагрузкиДанных().ИспользоватьТранзакции

                                  И ОбработкаДляЗагрузкиДанных().КоличествоОбъектовНаТранзакцию > 0

                                  И ОбработкаДляЗагрузкиДанных().СчетчикЗагруженныхОбъектов() % ОбработкаДляЗагрузкиДанных().КоличествоОбъектовНаТранзакцию = 0 Тогда

                                 

                                  //ВСТАВКА Сразу удаляем, если обмен прошел удачно...

                                  ПланыОбмена.УдалитьРегистрациюИзменений(УзелДляОбмена, Данные);

                                 

                                 

                                  ...                              

                           КонецЕсли;

                          

                          

                    Иначе

                          

                                 ...                       

                    КонецЕсли;

                   

             КонецЕсли;

            

       КонецЦикла;

       ...

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

 

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

 

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