Несколько слов о контексте выполнения правил обмена на примере обмена УТ 10.3 — БП 2.0

Использование контекста выполнения правил обмена на примере решения одной задачи фонового обмена

В клиент-серверном варианте настроен односторонний обмен данными УТ 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 последней версии

1 Comment

  1. Гость
    А как же условие выполнить это при выведенном количестве объектов в 0?

    Йода, блин! 🙂

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *