gifts2017

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

Опубликовал Осипов Сергей (fixin) в раздел Программирование - Практика программирования

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

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

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

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

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

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

 

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

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

 

 

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

 

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

 

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

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

 

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

 

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

 

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

 

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

       

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

 

 

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

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

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

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

 

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

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

 

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Юрий Былинкин (ardn) 29.09.15 16:45
Регистр "РезультатыОбменаДанными" предназначен для вывода ошибок обмена и их дальнейшей обработки.
Ситуацию с вылетевшим обменом и документами, оставшимися непроведенными, сложно считать ошибкой - ведь обмен так и не завершился, в следующую попытку обмена те же самые документы опять загрузятся.
Zhilyakovdr; +1 Ответить 1
2. Осипов Сергей (fixin) 29.09.15 16:48
(1) в комплексе воспринимайте статью, в комплексе. При передаче через СОМ я сразу же удаляю регистрацию объекта, чтобы он повторно не передавался. Отсюда и необходимость запоминать проведенные документы.
3. Антон Акименко (drkhaired) 29.09.15 16:58
Что то не пойму пользу от этого решения...
4. Осипов Сергей (fixin) 29.09.15 17:19
(3) значит, оно вам не нужно. Представьте, что в плане обмена зарегистрировано 20 000 объектов и понимание снизойдет на вас.
5. Anatolii Karasev (KapasMordorov) 29.09.15 18:46
Гений на новой работе начал со старых велокостылей?
"Мастерство" не пропьешь.
Ждем повторных статей о том "откуда при обмене битые ссылки".
6. Осипов Сергей (fixin) 30.09.15 00:25
(5) ты просто не вкуриваешь, как работают планы обмена.
7. Дмитрий Жиляков (Zhilyakovdr) 30.09.15 10:05
(6) fixin, Может для Вас это неплохое решение, но это решение частного случая, а что вы будите делать с кодом в глобальном обработчике после загрузки данных? В типовых довольно много в документах допиливается именно оттуда.... Ваш метод применим только при ситуации когда документы к Вам в принимающую систему придут полностью готовыми и им будет требоваться только проведение, но в таком случае откуда взяться ошибке? Вы ссылаетесь на большое количество объектов, с этой неприятностью можно бороться просто задав максимальное количество элементов на один сеанс обмена, кодом разумеется, это будет более корректно. На сколько я понимаю Вы используете COM обмен, с какой периодичностью вы его делаете? Например у меня обмены идут с периодикой в час, если обмен по каким то причинам не работал в течении суток или же требуется повторно передать данные из одной системы в другую, то количество объектов легко может превысить Ваши, но таких проблем почему то не возникает....
8. Виктор Левченко (lvictor58) 30.09.15 15:37
Годы идут десятками а fixin не меняется: "Создадим себе трудности, что бы потом было чего героически преодолевать!". Зачем вообще обмены через КОМ-соединение юзать, если это столь проблематично?!
9. Anatolii Karasev (KapasMordorov) 30.09.15 17:40
Ну да, если обмен слетел из-за ошибки проведения документа, то документы можно провести вручную(!), предварительно записав их в отдельный регистр. А если и эти документы не проводятся, то их нужно в попытку.
Так их можно и сразу в попытку и не устраивать ИБД с проведением вручную.
Только нафига такой кривой обмен?
10. Осипов Сергей (fixin) 30.09.15 21:06
(7) где в обмене настраивается обьем порции. Имхо этого нет, т.к. ломает всю 1совсуую логику обмена. Но буду рад, если не прав.

Не путать с количеством обьектов в транзакции
11. Осипов Сергей (fixin) 30.09.15 21:07
(9) в чем кривизна то? Это 1с кривит, отказавшись от отложенного проведения, надежного механизма
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа