Передача пометки удаления в обмене EnterpriseData — это классическая задача, с которой сталкиваются разработчики при настройке интеграции между конфигурациями 1С. Основная сложность заключается в том, что формат EnterpriseData (ED) не предусматривает прямого реквизита «Пометка удаления». Если вы попробуете просто перенести этот флаг в дополнительных реквизитах, то на стороне приемника механизм ОбменДаннымиXDTOСервер принудительно сбросит этот статус, считая объект «живым». Рассмотрим, как обойти это ограничение и корректно выполнить задачу.
Разработчики БСП намеренно ушли от передачи статуса «Пометка удаления» как реквизита объекта. Причина кроется в универсальности формата: разные конфигурации могут по-разному интерпретировать состояние удаления. Вместо этого в стандарте EnterpriseData используется механизм «Удаление объекта» (сообщение Delete). Когда приемник получает такой пакет, он не просто меняет статус реквизита, а инициирует стандартную процедуру удаления или пометки объекта. Поэтому правильный путь — не «переносить» статус, а отправить команду на удаление объекта.
Самый простой способ, не требующий глубокой доработки типовых модулей, заключается в манипуляции правилами конвертации (ПКО). Если у вас справочник делится на элементы и группы, вы можете использовать этот факт для активации механизма удаления.
ПКО (например, отдельно для элементов и отдельно для групп).ПриОтправкеДанных добавьте логику, которая отключает использование ПКО, если объект помечен на удаление.Пример реализации в обработчике ПриОтправкеДанных:
Если ДанныеИБ.ПометкаУдаления Тогда
ИспользованиеПКО.Справочник_Номенклатура_Отправка = Ложь;
ИспользованиеПКО.Справочник_НоменклатураГруппа_Отправка = Ложь;
Иначе
ИспользованиеПКО.Справочник_Номенклатура_Отправка = Не ДанныеИБ.ЭтоГруппа;
ИспользованиеПКО.Справочник_НоменклатураГруппа_Отправка = ДанныеИБ.ЭтоГруппа;
КонецЕсли;
В этом случае система сама сгенерирует команду на удаление в файл обмена, так как ПКО для объекта не выбрано, но объект зарегистрирован в обмене.
Более гибкий и надежный способ — принудительный вызов функций БСП. Для реализации этого решения нам потребуется модифицировать или заимствовать функции из общего модуля ОбменДаннымиXDTOСервер.
Разберем по шагам, как настроить отправку:
ВыгрузитьУдаление в общем модуле ОбменДаннымиXDTOСервер. Если она не является экспортной, сделайте ее таковой или скопируйте нужный код в собственный расширяющий модуль.ПриОбработке (ПОД_ИмяОбъекта_Отправка_ПриОбработке) добавьте условие проверки пометки удаления.Пример кода для реализации внутри обработчика:
Если ДанныеИБ.ПометкаУдаления Тогда
// Отключаем все ПКО, чтобы объект не выгрузился как обычные данные
Для Каждого ТекущееПКО Из ИспользованиеПКО Цикл
ИспользованиеПКО[ТекущееПКО.Ключ] = Ложь;
КонецЦикла;
// Выгружаем команду удаления
ОбменДаннымиXDTOСервер.ВыгрузитьУдаление(КомпонентыОбмена, ДанныеИБ.Ссылка);
КонецЕсли;
Чтобы описанные методы сработали, необходимо учесть несколько критических моментов:
ОбменДаннымиXDTOСервер, будьте готовы к тому, что при обновлении конфигурации эти изменения могут быть затерты. Используйте заимствование или перенос логики в собственный общий модуль.Подводя итог, можно сказать, что передача пометки удаления в EnterpriseData — это не про «передачу статуса», а про «информирование об удалении». Используя приведенные выше методы, вы сможете добиться корректного синхронного удаления объектов в распределенных информационных базах 1С.