gifts2017

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

Опубликовал Даниил Матвеев (cargobird) в раздел Обмен - Перенос данных из 1C8 в 1C8

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

В клиент-серверном варианте настроен односторонний обмен данными УТ 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. Гость 23.09.15 10:50
А как же условие выполнить это при выведенном количестве объектов в 0?

Йода, блин! :)
0rb; cargobird; +2 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа