|
Типовая обработка КонвертацияОбъектовИнформационныхБаз, потери изменений | ☑ | ||
---|---|---|---|---|
0
baboon
18.12.19
✎
16:11
|
Всем привет!
Сразу оговорюсь, я вплотную 1С как разработчик занялся недавно, хотя и интенсивно. Недавно вылезла проблема - настроен обмен штатными средствами между двумя БД - УТ и самописка на базе БП 2. Настроены планы обмена, работает через типовую обработку КонвертацияОбъектовИнформационныхБаз. Недавно пару раз возникал инцидент с потерей нескольких изменений при обмене. Провозившись почти неделю, смог на резервных копиях воспроизвести инцидент. Суть - отправитель сформировал файл и выложил в каталог, номер отправленного сообщения Х. После этого накоплены следующие изменения, с помощью типовой функции "Состав отправляемых данных" наблюдаю, что у этих еще не выгружавшихся в обмен изменений номер отправленного пакета - пусто. Получатель файл принял, зафиксил у себя номер последней загруженной посылки (Х), выложил ответный файл. ОТправитель его принял...и в типовой обработке КонвертацияОбъектовИнформационныхБаз, в процедуре ПрочитатьДанныеПоОбмену сделал вызов: РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.СнятьПризнакНачальнойВыгрузкиДанных(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого); в результате чего все не вошедшие в пакет Х измненения получили номер отправления = Х, то есть последний успешно обработанный получателем пакет. А дальше...сделал новую выгрузку в файл обмена, и этот файл оказался физически удален еще до того, как был обработан получателем. Получатель по расписанию провел обмен, не нашел входящего пакета, и сгенерил новый исходящий, в котором по-прежнему НомерВходящегоСообщения = Х. Отправитель это ответный файл принял и...успешно удалил все изменения, которые были в утраченном пакете, и при прежней загрузке получили номер отправления Х, хотя на самом деле никогда в пакет Х не выгружались. Выгрузил пустой файл. Подумав, я все-таки счел это скорее багом, чем фичей. И решил, что присваивать этим "необработанным" изменениям номер отправления, которое успешно последний раз принял получатель, как-то совсем неверно. Но в типовых КонвертацияОбъектовИнформационныхБаз разных версий этот код неизменен. Припомнил, что до того, как ушел наш прог, такие инциденты тоже бывали, но он просто вручную регистрил транзакции за период, и снова запускал в обмен. Я же решил попробовать заменить на РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.СнятьПризнакНачальнойВыгрузкиДанных(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого+1) и пока изъянов при тестировании по разным сценариям не нашел, из вычитки кода тоже не увидел, чтобы это дало проблемы...но боюсь, что я что-то тут неверно понимаю. Может кто сталкивался? |
|||
1
baboon
19.12.19
✎
11:29
|
Все-таки не зря я ачковал и сомневался. Решил все же отловить, когда прописывается в невыгруженные записи номер отправления.
Прог решил не заморачиваться с правилами регистрации в УТ 11, править конф и разделение между узлами по организациям сделал в обработчике "ПередВыгрузкойДанных" путем обработки списка изменений и анализа реквизита Организация. Для чего ввернул в этот обработчик вызов: ВыборкаДанных = ПланыОбмена.ВыбратьИзменения(УзелДляОбмена, УзелДляОбмена.НомерОтправленного); ну и дальше циклом по выборке и если значение реквизита [организация] не входит в ТЧ ОРганизации узла обмена: ПланыОбмена.УдалитьРегистрациюИзменений(УзелДляОбмена.Ссылка, Объект.Ссылка); но вот это ПланыОбмена.ВыбратьИзменения(УзелДляОбмена, УзелДляОбмена.НомерОтправленного) прописывало в ранее не выгруженные в сообщения изменения номер УЖЕ отправленного сообщения. Хитро, конечно, придумано...решил не менять, чуток поправить, и взял из типовой НомерОтправленного_ = УзелДляОбмена.НомерОтправленного + ?(ВыгрузитьИнформациюСопоставления, 2, 1); вроде все стало корректно. Ну и засел за изучение "правильного" встраивания своего плана обмена, с правилами регистрации и прочими БСП-стайл...хотя как-то мне не нравится на первый взгляд та реализация. Кстати, я так понял, что кроме ПланыОбмена.ВыбратьИзменения() другого способа одним вызовом получить все предназначенные для отправки изменения по всем объектам в составе плана нет? Только свои запросы к таблицам изменений объектов в составе плана писать? |
|||
2
Cyberhawk
19.12.19
✎
11:31
|
"свои запросы к таблицам изменений объектов в составе плана писать?" // Ага. Или взять из ИР готовый.
|
|||
3
baboon
19.12.19
✎
12:06
|
(2)Спасибо за уточнение! ИР - это типовая БСП, инструментарий разработчика? Или "Инструменты разработчика написаны супер профессиональным программистом Сергеем Старых"?
|
|||
4
Cyberhawk
19.12.19
✎
12:32
|
(3) Второе. Разве первое когда-то так сокращалось?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |