В клиент-серверном варианте настроен односторонний обмен данными УТ 10.3 — БП 2.0 при помощи обычного файлового обмена, выполняющегося вручную.
Выполнили выгрузку из УТ, выполнили загрузку в БП, выгрузили обратно xml с сообщением об успешной загрузке, сделали таким образом несколько раз, чтобы вывести количество выгружаемых объектов в 0, выполнили отложенные движения в БП и сохранили полученный результат обмена в виде документа mxl.
Перевести такой обмен в фоновые задания несложно, вопрос лишь в том, как выполнить последний этап, отложенные движения с фиксацией результата, да еще и чтобы вывести количество объектов в 0.
Обратим внимание на сами правила обмена, а именно на обработчик «После загрузки данных». То, что обмен «добрался» до исполнения кода этого обработчика, как раз говорит о том, что все данные загружены успешно.
Сюда и вставим обработку выполнения отложенных движений с фиксацией результата:
1. Запомним, что было в регистре сведений «Отложенные движения документов».
// получение документов перед проведением
Запрос = Новый Запрос("ВЫБРАТЬ
| ОтложенныеДвиженияДокументов.Документ
|ИЗ
| РегистрСведений.ОтложенныеДвиженияДокументов КАК ОтложенныеДвиженияДокументов
|ГДЕ
| ОтложенныеДвиженияДокументов.УзелОбмена = &УзелОбмена");
Запрос.УстановитьПараметр("УзелОбмена", УзелОбмена);
ТЗКПроведению = Запрос.Выполнить().Выгрузить();
ТЗКПроведению.Индексы.Добавить("Документ");
2. Выполним отложенные движения:
СтрокаСообщенияОбОшибкеОтложенногоДвиженияДокументов = ПроцедурыОбменаДаннымиПолныеПрава.ВыполнитьОтложенныеДвиженияПоПараметрамПодПолнымиПравамиНаСервере(УзелОбмена,
ПрекратитьПроведениеДокументовВСлучаеОшибки, КоличествоОшибокОбменаДляПрекращенияПроведения);
3. Проанализируем состояние регистра «Отложенные движения документов» после проведения:
// получение документов после проведения
Запрос = Новый Запрос("ВЫБРАТЬ
| ОтложенныеДвиженияДокументов.Документ
|ИЗ
| РегистрСведений.ОтложенныеДвиженияДокументов КАК ОтложенныеДвиженияДокументов
|ГДЕ
| ОтложенныеДвиженияДокументов.УзелОбмена = &УзелОбмена");
Запрос.УстановитьПараметр("УзелОбмена", УзелОбмена);
ТЗПослеПроведения = Запрос.Выполнить().Выгрузить();
ТЗПослеПроведения.Индексы.Добавить("Документ");
4. Выполним простое сравнение таблиц документов до и после проведения и выведем результат в файл:
ТЗОбщая = ТЗКПроведению.СкопироватьКолонки();
ТЗОбщая.Колонки.Добавить("Проведен", Новый ОписаниеТипов("Булево"));
Для Каждого СтрокаТЗ Из ТЗКПроведению Цикл
СтрокаТЗО = ТЗОбщая.Добавить();
СтрокаТЗО.Документ = СтрокаТЗ.Документ;
Если ТЗПослеПроведения.Найти(СтрокаТЗ.Документ, "Документ") = Неопределено Тогда
//Пока ВыборкаУзлов.Следующий() Цикл
// ПланыОбмена.УдалитьРегистрациюИзменений(ВыборкаУзлов.Ссылка, СтрокаТЗ.Документ);
//КонецЦикла;
СтрокаТЗО.Проведен = Истина;
Иначе
СтрокаТЗО.Проведен = Ложь;
КонецЕсли;
КонецЦикла;
ТабДок = Новый ТабличныйДокумент;
КолСтр = 0;
Для Каждого СтрокаТЗ Из ТЗОбщая Цикл
КолСтр = КолСтр + 1;
ТабДок.Область(КолСтр, 1).Текст = Строка(СтрокаТЗ.Документ);
ТабДок.Область(КолСтр, 2).Текст = Строка(СтрокаТЗ.Проведен);
КонецЦикла;
ТабДок.Записать(ИмяФайлаЛога);
И напоследок самое интересное. А как же условие выполнить это при выведенном количестве объектов в 0?
Дело в том, что правила обмена выполняются в контексте встроенной в конфигурацию БП 2.0 обработки ОбменДаннымиXML.
То есть, нам доступны все экспортные переменные этой обработки.
Для решения этой задачи понадобится всего одна: мСчетчикЗагруженныхОбъектов.
Обрамляем код в условие, и задача решена:
Если мСчетчикЗагруженныхОбъектов = 0 Тогда
...
КонецЕсли;
Вот, пожалуй, и всё, спасибо за внимание. Возможно, кому-то пригодится, а себе — для памяти.
P.S. Еще одна публикация об обмене данными:
Быстрое создание обмена между нетиповой УТ 10.3 и типовой БП 2.0 последней версии
Йода, блин! 🙂