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