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

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

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

В наличии

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

Категория:

Описание

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

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

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

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

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

 

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

Если ЗаписатьОбъект
       И Объект <> Неопределено
       И Объект.Ссылка <> Неопределено Тогда
      
       СтрокаТаблицы = ДокументыДляОтложенногоПроведения().Добавить();
                                                      СтрокаТаблицы.ДокументСсылка = Объект.Ссылка;
                                                      СтрокаТаблицы.ДатаДокумента  = Объект.Дата;
                                                     
       ДополнительныеСвойстваДляОтложенногоПроведения().Вставить(Объект.Ссылка, Объект.ДополнительныеСвойства);
                                                     
       //Производим сразу отложенное проведение документов...
       ОбменДаннымиСервер.ЗарегистрироватьОшибкуПроведенияДокумента(Объект, УзелОбменаЗагрузкаДанных, "Сохранение отложенных в обмене документов");
КонецЕсли;

 

 

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

 

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

 

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

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

 

&НаСервере
Процедура ПровестиДокументы(Знач ВыделенныеСтроки)
      
...         
             Если ДокументОбъект.ПроверитьЗаполнение() Тогда
                   
        
                    //Продолжаем проведение, если ошибка
                    Попытка
                           ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
                    Исключение
                    КонецПопытки;
      
            
             КонецЕсли;
      
...
      
КонецПроцедуры

 

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

 

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

 

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

       

//Добавляем из регистра
       ТЗДО = ДокументыДляОтложенногоПроведения();
       З = Новый Запрос(
       "ВЫБРАТЬ
       |      РезультатыОбменаДанными.ПроблемныйОбъект КАК ДокументСсылка,
       |      РезультатыОбменаДанными.Причина,
       |      РезультатыОбменаДанными.ДатаДокумента КАК ДатаДокумента
       |ИЗ
       |      РегистрСведений.РезультатыОбменаДанными КАК РезультатыОбменаДанными
       |      ГДЕ ПОДСТРОКА(РезультатыОбменаДанными.Причина, 1, 1024) = &Причина");
       З.УстановитьПараметр("Причина", "Сохранение отложенных в обмене документов");
       ТЗ = З.Выполнить().Выгрузить();
      
       Для Каждого Строка ИЗ ТЗ Цикл
             НСтр = ТЗДО.Добавить();
             ЗаполнитьЗначенияСвойств(НСтр, Строка);
       КонецЦикла;

 

 

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

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

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

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

 

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

Процедура ВыполнитьВыгрузкуЗарегистрированныхДанных(ЗаписьСообщения, СтрокаСообщенияОбОшибке, ТаблицаПравилВыгрузкиИспользуемые)
             Пока ВыборкаИзменений.Следующий() Цикл
 
             Если ЭтоОбменЧерезВнешнееСоединение Тогда
                   
                    Если ЗагрузкаДанныхВыполняетсяВоВнешнемСоединении Тогда
                          
                           Если ОбработкаДляЗагрузкиДанных().ИспользоватьТранзакции
                                  И ОбработкаДляЗагрузкиДанных().КоличествоОбъектовНаТранзакцию > 0
                                  И ОбработкаДляЗагрузкиДанных().СчетчикЗагруженныхОбъектов() % ОбработкаДляЗагрузкиДанных().КоличествоОбъектовНаТранзакцию = 0 Тогда
                                 
                                  //ВСТАВКА Сразу удаляем, если обмен прошел удачно...
                                  ПланыОбмена.УдалитьРегистрациюИзменений(УзелДляОбмена, Данные);
                                 
                                 
                                  ...                              
                           КонецЕсли;
                          
                          
                    Иначе
                          
                                 ...                       
                    КонецЕсли;
                   
             КонецЕсли;
            
       КонецЦикла;
       ...
КонецПроцедуры

 

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

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

has been added to your cart:
Оформление заказа