В типовых обменах, основанных на ED, не предусмотрен перенос признака ПометкаУдаления, как и признака Проведен. Переданный объект помечается на удаление только в случае, когда в источнике объект удален. В этой статье я опишу два способа, с помощью которых данный признак можно передать, если в этом возникла необходимость.
1. В правилах регистрации объекта не должно быть отбора по ПометкаУдаления = Ложь. Для документов необходимо убрать условие Проведен = Истина, при его наличие.
Способ первый
1. В КД3 для ПОД необходимо установить признак "Выгружать очистку данных по неиспользуемым ПКО". Для того, чтобы появилась возможность его установить, тумблер "Количество правил конвертации" должен находиться в положении "Несколько". При этом сколько реально ПКО, значения не имеет.
В модуле менеджера обмена добавится строка ПравилоОбработки.ОчисткаДанных = Истина; и процедура будет выглядеть так:
Процедура ДобавитьПОД_Документ_ЗаписьКнигиПродаж_Отправка(ПравилаОбработкиДанных)
ПравилоОбработки = ПравилаОбработкиДанных.Добавить();
ПравилоОбработки.Имя = "Документ_ЗаписьКнигиПродаж_Отправка";
ПравилоОбработки.ОбъектВыборкиМетаданные = Метаданные.Документы.ЗаписьКнигиПродаж;
ПравилоОбработки.ПриОбработке = "ПОД_Документ_ЗаписьКнигиПродаж_Отправка_ПриОбработке";
ПравилоОбработки.ОчисткаДанных = Истина;
ПравилоОбработки.ИспользуемыеПКО.Добавить("Документ_ЗаписьКнигиПродаж_Отправка");
КонецПроцедуры
2. В обработчике "При обработке" добавляем следующие условие:
Если ДанныеИБ.ПометкаУдаления Тогда
ИспользованиеПКО.Документ_ЗаписьКнигиПродаж_Отправка = Ложь;
ИспользованиеПКО.Вставить("ФиктивноеПКО", Ложь); // имитируем несколько ПКО для отправки команды удаления
КонецЕсли;
Добавлять строку, отмеченную комментарием, необходимо только в том случае, когда в данном ПОД только одно реальное ПКО. Если ПКО несколько добавлять данную строку не надо.
Результатом описанных манипуляций станет добавление в файл обмена команды на удаление объекта по ссылке.
Плюсами указанного способа можно считать простоту реализации и отсутствие необходимости вносить правки в модуль менеджера приемника. К минусам можно отнести невозможность передать другие изменения в объекте, а также тот факт, что команда на удаление не будет воспринята приемником, если поиск на стороне приемника производится не по УИД.
Способ второй
Доработка на стороне источника
1. В обработчик "При отправке" ПКО источника добавляем выгрузку признака ПометкаУдаления через AdditionalInfo:
Если Не ДанныеXDTO.Свойство("AdditionalInfo") Или ТипЗнч(ДанныеXDTO.AdditionalInfo) <> Тип("Структура") Тогда
ДанныеXDTO.Вставить("AdditionalInfo", Новый Структура);
КонецЕсли;
ДанныеXDTO.AdditionalInfo.Вставить("ПометкаУдаления", ДанныеИБ.ПометкаУдаления);
Доработка на стороне приемника
Если целью доработки является передача только пометки удаления, то все указанные ниже фрагменты кода необходимо вставлять в начало обработчиков. Если же пометка удаления планируется передаваться вместе с другими изменениями объекта, то место вставки кода - произвольное, при этом строки отмеченные комментарием надо удалить.
1. В обработчике "При конвертации данных XDTO" помещаем в дополнительные свойства "ПометкаУдаления", если переданный признак равно истина:
Если ДанныеXDTO.Свойство("AdditionalInfo") И ТипЗнч(ДанныеXDTO.AdditionalInfo) = Тип("Структура") Тогда
ПометкаУдаления = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДанныеXDTO.AdditionalInfo, "ПометкаУдаления", Ложь);
Если ПометкаУдаления Тогда
ПолученныеДанные.ДополнительныеСвойства.Вставить("ПометкаУдаления");
Возврат; // Если цель передать только признак "ПометкаУдаления"
КонецЕсли;
КонецЕсли;
2. В обработчике "Перед записью полученных данных" переносим свойство "ПометкаУдаления" из дополнительных свойств ПолученныеДанные в дополнительные свойства ДанныеИБ:
Если ПолученныеДанные.ДополнительныеСвойства.Свойство("ПометкаУдаления") И ДанныеИБ <> Неопределено Тогда
ДанныеИБ.ДополнительныеСвойства.Вставить("ПометкаУдаления");
ПолученныеДанные = Неопределено; // Если цель передать только признак "ПометкаУдаления"
Возврат; // Если цель передать только признак "ПометкаУдаления"
КонецЕсли;
3. Вносим изменение или добавляем алгоритм для обработчика "После загрузки всех данных":
Если Объект.ДополнительныеСвойства.Свойство("ПометкаУдаления") Тогда
Объект.ПометкаУдаления = Истина;
Возврат; // Если цель передать только признак "ПометкаУдаления"
КонецЕсли;
Данные способ лишён недостатков предыдущего способа. К его недостаткам можно отнести лишь необходимость вносить изменения в правила как источника, так и приемника.