В статье описывается способ переноса таких объектов в контексте конфигурации "Конвертация 2.1". Во всех остальных случаях, когда используются прочие механизмы обменов — данная задача имеет различное множество решений, которые в данной статье не рассматриваются.
Итак, в правилах обмена мы будем использовать алгоритмы и обработчики событий объектов. В алгоритмах мы создадим 3 элемента, которые будем размещать в одноименных обработчиках документов и справочников. Пример реализации я буду приводить только для документов, так как для справочников подход будет аналогичным.
Алгоритм "ПередВыгрузкой":
ПометкаУдаления = Источник.ПометкаУдаления;
НеСоздаватьЕслиНеНайден = ПометкаУдаления;
ПередатьОдинПараметрВПриемник("_ПометкаУдаления", ПометкаУдаления);
Получение пометки удаления для ссылки производится через точку. Все потому, что далее, перед исполнением кода обработчика объекта "ПриВыгрузке", будет производится чтение ссылки со всеми реквизитами и табличными частями, поэтому использовать получение значения реквизита ссылки с помощью запроса или БСП функции ОбщегоНазначения.ПолучитьЗначениеРеквизита() будет являться лишним. Мы прочитаем все реквизиты в обработчике "ПередВыгрузкой", закэшируя тем самым объект.
(пример трассировки в MSSQL Profiler для процедуры "ПередВыгрузкой")
(пример трассировки перед выполнением кода внутри процедуры "ПриВыгрузке")
Если объект выгружается впервые, то нет смысла загружать помеченный на удаление объект в приемник. Конечно, в некоторых случаях может потребоваться переносить такие объекты, например, в случае, когда переносится набор записей регистра и наш документ содержится в измерении набора. В таком случае нужно понимать — насколько действительно в базе приемнике нужны такие записи. В моей статье я не рассматриваю такие случаи. Далее, передаем параметр конкретного объекта, который будет содержать информацию о пометке удаления.
Алгоритм "ПриВыгрузке":
ПКО.НеВыгружатьОбъектыСвойствПоСсылкам = Источник.ПометкаУдаления;
Самый интересный момент статьи. Такой строчкой кода мы указываем, что связанные ссылки не будут тянуться с искомым объектом в файл выгрузки, если он помечен на удаление. Все дело в том, что данное свойство не так очевидно указано в справке к обработчикам. А в настройках правила свойство устанавливается на все объекты выгрузки по такому правилу.
Используя данное свойство мы сокращаем размер файла выгрузки, а так же избавляемся от проверки при загрузке и прописывания кода, который бы исключал при загрузке связанные ссылки (весьма не тривиальный алгоритм). В случае, если мы не используем файлы, а осуществляем обмен с помощью веб-сервисов или com-подключений — мы сокращаем объем передаваемых данных.
Алгоритм "ПриЗагрузке":
ЕстьПараметрПометкаУдаления = (Параметры.Свойство("_ПометкаУдаления") И Параметры._ПометкаУдаления);
ЕстьРучнаяКорректировка = ложь;
Если ОбщегоНазначения.ЕстьРеквизитОбъекта("РучнаяКорректировка", Объект.Метаданные()) Тогда
ЕстьРучнаяКорректировка = Объект.РучнаяКорректировка;
КонецЕсли;
НеЗамещатьОбъект = ЕстьРучнаяКорректировка ИЛИ ЕстьПараметрПометкаУдаления;
Если НЕ ЕстьРучнаяКорректировка И ЕстьПараметрПометкаУдаления Тогда
Объект.ПометкаУдаления = истина;
Объект.ОбменДанными.Загрузка = истина;
Объект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
При загрузке в базу приемник нам необходимо проанализировать — был ли данный объект ранее загружен и его движения были отредактированы. Для этого обратимся к реквизиту объекта "РучнаяКорректировка", если он, конечно, существует. Так же проверим параметр, который с объектом мы передали при выгрузке процедурой "ПередатьОдинПараметрВПриемник". Если движения объекта был ранее отредактированы или объект стал помеченным на удаления — мы не замещаем значения реквизитов объекта, а пометку устанавливаем принудительно в данном обработчике.
Осталось разместить вызовы данных алгоритмов в обработчиках объектов: "ПередВыгрузкой", "ПриВыгрузке", "ПриЗагрузке".
Конечно, пример, приведенный в моей статье, является не единственным вариантом решения задачи. Вариантов, возможно, масса. Например, можно в базе приемнике сделать веб-сервис, к которому мы могли бы обращаться из базы источника, передавая информацию об выгружаемых объектах — как вариант идентификаторы ссылок. А в ответ веб-сервис возвращал информацию — нужно ли вообще выгружать такие объекты.
С данной задачей я столкнулся "вживую", на достаточно большом объеме данных. И такой подход оказался вполне эффективным.
Надеюсь, что пример, описанный в статье, окажется полезным!
Для автообмена настройкой унив обмена xml вы не поиграетесь.
Если список документов ограничен, то можно сделать проще:
в дополнение к основному ПКО документа создается ПКО с парочкой свойств Дата+Номер и настройкой «не создавать новый объект».
в пвд перед выгрузкой пишите:
и не надо писать алгоритмы и много кода. Помеченный на удаление документ будет выгружаться по правилу помеченных, данных будет там совсем немного и новый помеченный создан не будет.
(1)
Да, Ваш вариант вполне подойдет для правил с небольшим количеством объектов.