Имя: Пароль:
1C
1С v8
Типовая обработка КонвертацияОбъектовИнформационныхБаз, потери изменений
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) Второе. Разве первое когда-то так сокращалось?