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