В новых типовых конфигурациях УТ11 и БП3 вместо прошлой схемы обмена данными используется синхронизация данных. Однако у неё есть свои недостатки. В статье - краткое описание некоторых нюансов новой схемы и приемы для оптимизации работы с ней.
Код синхронизации содержится в обработке "КонвертацияОбъектовИнформационныхБаз".
Синхронизация не использует регистр "Отложенные движения документов". Вместо этого она сохраняет документы к проведению в таблице значений в памяти.
Недостаток такого решения очевиден - если обмен слетает, то загруженные документы остаются, а информации о том, какие документы надо провести нет.
Я нашел обходной вариант этой проблемы - дублирую помещение в таблицу значений записью в типовой регистр " РезультатыОбменаДанными", синоним которого называется "Предупреждения при синхронизации данных".
Для этого в процедуру "ПрочитатьОбъект" нужно вставить запись в этот регистр:
Если ЗаписатьОбъект
И Объект <> Неопределено
И Объект.Ссылка <> Неопределено Тогда
СтрокаТаблицы = ДокументыДляОтложенногоПроведения().Добавить();
СтрокаТаблицы.ДокументСсылка = Объект.Ссылка;
СтрокаТаблицы.ДатаДокумента = Объект.Дата;
ДополнительныеСвойстваДляОтложенногоПроведения().Вставить(Объект.Ссылка, Объект.ДополнительныеСвойства);
//Производим сразу отложенное проведение документов...
ОбменДаннымиСервер.ЗарегистрироватьОшибкуПроведенияДокумента(Объект, УзелОбменаЗагрузкаДанных, "Сохранение отложенных в обмене документов");
КонецЕсли;
Если обмен закончится нормально, то записи этого регистра очистятся.
Если будет ошибка, можно провести документы из этого регистра, открыв форму регистра и нажимая кнопку "Провести":
Правда, если выделить несколько строк и нажать "Провести", то при первой же ошибке проведения проведение останавливается.
Можно взять код проведения в попытку-исключение:
&НаСервере
Процедура ПровестиДокументы(Знач ВыделенныеСтроки)
...
Если ДокументОбъект.ПроверитьЗаполнение() Тогда
//Продолжаем проведение, если ошибка
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
КонецПопытки;
КонецЕсли;
...
КонецПроцедуры
Или написать свою обработку проведения документов.
Также нужно добавить в процедуру проведения отложенных движений документов забор для проведения зафиксированных в регистре документов, чтобы они провелись отложенно.
В начало процедуры "ВыполнитьОтложенноеПроведениеДокументов" добавить код:
//Добавляем из регистра
ТЗДО = ДокументыДляОтложенногоПроведения();
З = Новый Запрос(
"ВЫБРАТЬ
| РезультатыОбменаДанными.ПроблемныйОбъект КАК ДокументСсылка,
| РезультатыОбменаДанными.Причина,
| РезультатыОбменаДанными.ДатаДокумента КАК ДатаДокумента
|ИЗ
| РегистрСведений.РезультатыОбменаДанными КАК РезультатыОбменаДанными
| ГДЕ ПОДСТРОКА(РезультатыОбменаДанными.Причина, 1, 1024) = &Причина");
З.УстановитьПараметр("Причина", "Сохранение отложенных в обмене документов");
ТЗ = З.Выполнить().Выгрузить();
Для Каждого Строка ИЗ ТЗ Цикл
НСтр = ТЗДО.Добавить();
ЗаполнитьЗначенияСвойств(НСтр, Строка);
КонецЦикла;
Часто настраивается обмен через внешнее соединение.
При этом хотелось бы, чтобы как только объект был передан в базу-приемник, очищалась регистрация по нему.
Вероятность того, что объект как раз в этот момент поменяется, крайне мала, поэтому схема приемлема.
Для этого достаточно вставить удаление регистрации изменений:
Процедура ВыполнитьВыгрузкуЗарегистрированныхДанных(ЗаписьСообщения, СтрокаСообщенияОбОшибке, ТаблицаПравилВыгрузкиИспользуемые)
Пока ВыборкаИзменений.Следующий() Цикл
Если ЭтоОбменЧерезВнешнееСоединение Тогда
Если ЗагрузкаДанныхВыполняетсяВоВнешнемСоединении Тогда
Если ОбработкаДляЗагрузкиДанных().ИспользоватьТранзакции
И ОбработкаДляЗагрузкиДанных().КоличествоОбъектовНаТранзакцию > 0
И ОбработкаДляЗагрузкиДанных().СчетчикЗагруженныхОбъектов() % ОбработкаДляЗагрузкиДанных().КоличествоОбъектовНаТранзакцию = 0 Тогда
//ВСТАВКА Сразу удаляем, если обмен прошел удачно...
ПланыОбмена.УдалитьРегистрациюИзменений(УзелДляОбмена, Данные);
...
КонецЕсли;
Иначе
...
КонецЕсли;
КонецЕсли;
КонецЦикла;
...
КонецПроцедуры
Однако такое изменение надо сочетать с описанной выше схемой проведения отложенных документов. Иначе регистрацию удалим, документ уйдет в базу получателя не проведенным, и если обмен слетит, то уже никогда автоматом не проведется.
В процессе обмена можно просматривать изменения плана обмена и по уменьшающемуся количеству зарегистрированных бъектов понимать, что процесс идет.