Настроен обмен между самописными базами на БСП, Упр.формы,
Обмен двусторонний, настроен через обработку УниверсальныйОбменДаннымиXML, через План обмена.
данные читаются сразу в базе приемнике через COM соединение, флажок Обработка.НепосредственноеЧтениеВИБПриемнике=Истина;
На данный момент проблема такая, документы регистрируются в плане обмена, отрабатывает РЗ для обмена, документов за день регистрируются много, когда выходит ошибка при записи документа в приемнике, документы которые были выгружены успешно до ошибки с регистрации не снимаются, обмен прекращается и следующие документы после документа с ошибкой не выгружаются, когда снова отрабатывает РЗ, документы до ошибки выгружаются повторно, и так постоянно.
Опыта работы с обменами такого рода не имеется, прошу пожалуйста подсказать путь решения.
Вопрос: Возможно ли поочередная выгрузка объектов таким же методом(непосредственным чтение в приемнике, через COM), например в цикле выгружать выборку изменений, чтобы в случае ошибки при загрузке в приемнике, передача объектов продолжалась далее, а те которые успешно выгрузились снимались с регистрации? И чтобы Запись об ошибке сохранялась в ЖР, на данный момент почему то в ЖР ошибка не пишется, хотя в коде прописано.
Знаю что можно поочердно выгружать при помощи веб-сервисов(в сервисе обработка универсалынйОбменДаннымиXML), путем поочередной выборки регистрации изменений в цикле, и передавать данные xml зарегистрированного объекта в приемник, но пока от этого решили отказаться
код обмена ниже:
Узел = ПланыОбмена.ОбменДокументами.НайтиПоКоду("Doc");
Обработка=Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена="Выгрузка";
Обработка.ЗагружатьДанныеВРежимеОбмена=Истина;
Обработка.ЗаписыватьРегистрыНаборамиЗаписей=Истина;
Обработка.ЗапоминатьЗагруженныеОбъекты=Истина;
Обработка.ВыгружатьТолькоРазрешенные=Истина;
Обработка.НепосредственноеЧтениеВИБПриемнике=Истина;
Обработка.ТипИнформационнойБазыДляПодключения=Ложь;
Обработка.ПользовательИнформационнойБазыДляПодключения = "логин";
Обработка.ПарольИнформационнойБазыДляПодключения = "пароль";
Обработка.ИмяСервераИнформационнойБазыДляПодключения = "сервер";
Обработка.ИмяИнформационнойБазыНаСервереДляПодключения = "база";
Обработка.АутентификацияWindowsИнформационнойБазыДляПодключения=Ложь;
Обработка.ВерсияПлатформыИнформационнойБазыДляПодключения="V83";
Обработка.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки=1; //2;
ИмяВременногоФайлаПравилОбмена = ПолучитьИмяВременногоФайла("xml");
МакетПравилОбмена = ПолучитьОбщийМакет("ПравилаОбменаДанными");
МакетПравилОбмена.Записать(ИмяВременногоФайлаПравилОбмена);
Обработка.ЗагрузитьПравилаОбмена(ИмяВременногоФайлаПравилОбмена);
Обработка.ИмяФайлаПравилОбмена = ИмяВременногоФайлаПравилОбмена;
//ЕСЛИ НУЖНО ВЫГРУЖАТЬ ПО ПЛАНАМ ОБМЕНА, ТО ВКЛЮЧАЕМ ЭТОТ БЛОК И ПОДСТАВЛЯЕМ СВОЙ УЗЕЛ ПЛАНА ОБМЕНА
Для Каждого Стр Из Обработка.ТаблицаПравилВыгрузки.Строки Цикл
Стр.Включить=1;
Для Каждого Стр1 Из Стр.Строки Цикл
Стр1.Включить=1;
Стр1.СсылкаНаУзелОбмена=Узел;
КонецЦикла;
КонецЦикла;
Попытка
Обработка.ВыполнитьВыгрузку();
Исключение
Отказ = ИСТИНА;
Сообщение = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("Обмен данными", УровеньЖурналаРегистрации.Ошибка, , , Сообщение);
КонецПопытки;
УдалитьФайлы(ИмяВременногоФайлаПравилОбмена);
Ну так убери Отказ = Истина в Исключении. Пусть при ошибке в одном документе, выгрузка продолжается.
Суть снятия с регистрации выгруженных объектов состоит в обратном ответе противоположной базы. Т.е. отправил ты сообщение №2 в котором 100 зарегистрированных доков, из них 2 не прошло по каким-то причинам. Обмен при ошибке не прекратился (нет Отказ = Истина), противоположная база тоже что-то отправила в ответ и, главное, подтвердила, что приняла сообщение №2. Всё! 98 документов считается переданными и снимаются с регистрации, останутся два с ошибками
Сейчас же у тебя передалось куча доков и вдруг ошибка, обмен прекращается, противоположная база НЕ дает ответ. В итоге переданные доки отмечаются переданными в сообщении №2, но НЕ принятые (нет подтверждения от противоположной базы) и, значит, в след раз снова будут выгружаться тратя ресурсы и время
(5) Есть ощущение, что у вас либо в правилах обмена что-то некорректно в обработчиках ПослеЗагрузки (например принудительно вызывается запись объекта), либо в модулях объектов нет проверок в процедурах ПриЗаписи/ПередЗаписью на
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
т.к. загрузка объектов происходит в режиме ОбменДанными=Истина и типовые проверки должны пропускаться.
Спасибо за советы, решил проблему по другому.
Реализовал через веб-сервисы, то есть в цикле перебираю выборку регистрации изменений по узлу, формирую массив объектов. Далее в следующем цикле обрабатывается массив этих объектов, и по каждому объекту формирую XML типовой обработкой УниверсальныйОбменДаннымиXML,
затем выгруженный XML объекта передаю на веб сервис базы приемника, в этом веб сервисе прописан код загрузки файла xml через обработку УниверсальныйОбменДаннымиXML, далее в источнике снимается регистрация выгруженного объекта, и так по каждому объекту массива в цикле.