EnterpriseData. Как перенести пометку удаления справочника?

1. MariusUrsus 30.03.18 11:38 Сейчас в теме
Если засунуть пометку удаления в AdditionalInfo или в ДополнительныеРеквизиты и на стороне приемника восстановить её в ПолученныеДанные, то ничего не происходит (пометка удаления не встает).

Единственный рабочий способ, который мне удалось найти, следующий:
1. Указать в ПОД несколько ПКО.
К примеру, для справочника Номенклатура элементы выгружаются по одному ПКО, а группы по другому. Т.е. ПКО в данном случае всегда два.
2. Установить флаг "Выгружать очистку данных по неиспользуемым ПКО" .
Если ПКО одно, то данный флаг уже недоступен. Поэтом приходится придумывать еще одно "левое" ПКО для его включения.
3. В обработчике ПОД ПриОтправкеДанных для элементов, помеченных на удаление, принудительно отключать использование ПКО.
Например, для справочника Номенклатура так
Если ДанныеИБ.ПометкаУдаления Тогда
	ИспользованиеПКО.Справочник_Номенклатура_Отправка       = Ложь;
	ИспользованиеПКО.Справочник_НоменклатураГруппа_Отправка = Ложь;
Иначе
	ИспользованиеПКО.Справочник_Номенклатура_Отправка       = Не ДанныеИБ.ЭтоГруппа;
	ИспользованиеПКО.Справочник_НоменклатураГруппа_Отправка = ДанныеИБ.ЭтоГруппа;
КонецЕсли;

В таком случае в файл обмена выгружается УдалениеОбъекта по ссылке и в приемнике данный объект (если будет найден по этой ссылке) помечается на удаление.

Вопрос: существует ли более простой/правильный/элегантный способ переноса пометки удаления?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. PiotrLoginov 30.03.18 15:25 Сейчас в теме
смотреть надо XDTO-пакеты ED разных версий. Подозреваю, что там уже предусмотрена передача пометки удаления без особых плясок и бубнов
3. MaxS 3101 30.03.18 17:26 Сейчас в теме
Реквизит пометка удаления не предусмотрен в ED.
Можно выгружать команду удаления объекта - это штатный функционал. В конечной базе элемент будет помечен на удаление.
Наверное нужно в 2 приёма действовать - передать элемент справочника, потом передать удаление объекта.
4. MariusUrsus 30.03.18 23:06 Сейчас в теме
(3)Команду удаления, без физического удаления объекта в источнике, передать не представляется возможным.
А так пока пользую указанный в шапке способ в два этапа - первая синхронизация без пометок удаления, а потом обмены уже при помощи данного суррогата.
5. MaxS 3101 31.03.18 06:26 Сейчас в теме
(4) Всё можно передать при желании. ;) В общем модуле ОбменДаннымиXDTOСервер
есть Процедура ВыгрузитьУдаление(КомпонентыОбмена, Ссылка, ПравилоКонвертации = Неопределено)
или
Процедура ЗаписатьУдалениеОбъектаXDTO(КомпонентыОбмена, Ссылка, ТипСсылкиXDTO)
она не экспортная, но код можно позаимствовать.
или
если в ПОД справочника несколько ПКО (для элемента и для группы), то делаем ИспользованиеПКО.НашеПКО = Ложь
в этом варианте БСП само генерирует команду удаления.
Эти способы не требует доработки правил на стороне приемника.
pavelzdv; MariusUrsus; +2 Ответить
6. MariusUrsus 06.04.18 12:36 Сейчас в теме
Небольшое дополнение. Переносить пометку удаления любого ссылочного объекта оказывается не имеет смысла. Дело в том, что при загрузке объекта в приемник выполняется метод ОбменДаннымиXDTOСервер.СтруктураОбъектаXDTOВДанныеИБ содержащий интересный код:
Если ПравилоКонвертации.ЭтоСсылочныйТип И ДанныеДляЗаписиВИБ.ПометкаУдаления Тогда
	ДанныеДляЗаписиВИБ.ПометкаУдаления = Ложь;
КонецЕсли;

В принципе этот код объясняет, почему ни в одной версии стандарта EnterpriseData (вплоть до текущей 1.5.2) нет пометки удаления. Осталось выяснить зачем)
pyrkin_vanya; NoRazum; +2 Ответить
7. NoRazum 31 22.12.20 16:02 Сейчас в теме
Уже есть формат 1.8.3.
Там её так и нету.
Есть решение?
8. AlexiyI 13.04.22 14:35 Сейчас в теме
(7) Нужно обратить внимание на подписку СинхронизацияДанныхЧерезУниверсальныйФорматРегистрацияУдален­ия.
Она обрабатывает непосредственное удаление, но там вызывается код, регистрирующий удаление объекта.
Может, стоит его вызвать в подписке записи, проверив объект на пометку удаления?
Тогда есть вероятность, что в ED будет записано УдалениеОбъекта, а в приемнике установится пометка удаления.
9. NoRazum 31 14.04.22 10:23 Сейчас в теме
(8) Может и сработает.
Прошло два года. Надо проверять. В текущий момент не актуально.
10. vechiy 35 14.05.23 13:55 Сейчас в теме
Ну т.е. выглядит всё так, что у автора топика более удобное в итоге решение)
11. gybson 6 14.05.23 14:20 Сейчас в теме
В пакете XDTO объект так и называется - УдалениеОбъекта, четвертый в списке типов.

ОбменДаннымиXDTOСервер.ЗаписатьУдалениеОбъектаXDTO
12. TeMochkiN 17.01.25 17:44 Сейчас в теме
По-идее, такой код в ПОД должен сработать:
Если ДанныеИБ.ПометкаУдаления Тогда
	Для Каждого ТекущееПКО Из ИспользованиеПКО Цикл
		ИспользованиеПКО[ТекущееПКО.Ключ] = Ложь;
	КонецЦикла;
	ВыгрузитьУдаление(КомпонентыОбмена, ДанныеИБ.Ссылка);
КонецЕсли;
13. dbetsik 29.05.25 20:22 Сейчас в теме
(12)
ВыгрузитьУдаление
А можно по подробней про выгрузить удаление?
15. dodonov 18.11.25 21:54 Сейчас в теме
(13)
Имеется ввиду функция ВыгрузитьУдаление общего модуля ОбменДаннымиXDTOСервер
14. dbetsik 29.05.25 21:46 Сейчас в теме
Интересен момент как организовать объект удаления при отправке или при обработке.
16. dodonov 18.11.25 22:07 Сейчас в теме
На примере расходной накладной можно предложить следующее:

1. Выгрузить стандартные правила регистрации в файл, открыть их конвертацией 2.0 и убрать оттуда условие регистрации только НЕ помеченных на удаление документов. Иначе документ просто не зарегистрируется к обмену.
2. В конфигурации источнике в общем модуле "МенеджерОбменаЧерезУниверсальныйФормат" в конце функции
ПОД_Документ_РасходнаяНакладная_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)

вставить код

Если ДанныеИБ.ПометкаУдаления Тогда
Для Каждого ТекущееПКО Из ИспользованиеПКО Цикл
ИспользованиеПКО[ТекущееПКО.Ключ] = Ложь;
КонецЦикла;
ОбменДаннымиXDTOСервер.ВыгрузитьУдаление(КомпонентыОбмена, ДанныеИБ.Ссылка);
КонецЕсли;

Функция ВыгрузитьУдаление находится в общем модуле ОбменДаннымиXDTOСервер, она не экспортная, поэтому нужно сделать ее таковой.

Если решили заимствовать, то придется также забрать
Функция ПОДПоОбъектуМетаданных(КомпонентыОбмена, ОбъектМетаданных)
Функция ОбъектФорматаПроходитПоФильтруXDTO(КомпонентыОбмена, ОбъектФормата)
Процедура ЗаписатьУдалениеОбъектаXDTO(КомпонентыОбмена, Ссылка, ТипСсылкиXDTO)

После этого пометка на удаление документа приведет к его регистрации и передаче этой пометки в другую базу.

Можно по аналогии сделать со справочником.
Для отправки сообщения требуется регистрация/авторизация

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот