Как правильно передать пометку удаления объекта при обмене через EnterpriseData?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Передача пометки удаления в обмене EnterpriseData — это классическая задача, с которой сталкиваются разработчики при настройке интеграции между конфигурациями 1С. Основная сложность заключается в том, что формат EnterpriseData (ED) не предусматривает прямого реквизита «Пометка удаления». Если вы попробуете просто перенести этот флаг в дополнительных реквизитах, то на стороне приемника механизм ОбменДаннымиXDTOСервер принудительно сбросит этот статус, считая объект «живым». Рассмотрим, как обойти это ограничение и корректно выполнить задачу.

Понимание архитектуры обмена

Разработчики БСП намеренно ушли от передачи статуса «Пометка удаления» как реквизита объекта. Причина кроется в универсальности формата: разные конфигурации могут по-разному интерпретировать состояние удаления. Вместо этого в стандарте EnterpriseData используется механизм «Удаление объекта» (сообщение Delete). Когда приемник получает такой пакет, он не просто меняет статус реквизита, а инициирует стандартную процедуру удаления или пометки объекта. Поэтому правильный путь — не «переносить» статус, а отправить команду на удаление объекта.

Метод 1: Использование нескольких ПКО

Самый простой способ, не требующий глубокой доработки типовых модулей, заключается в манипуляции правилами конвертации (ПКО). Если у вас справочник делится на элементы и группы, вы можете использовать этот факт для активации механизма удаления.

  1. Создайте в правилах конвертации несколько ПКО (например, отдельно для элементов и отдельно для групп).
  2. В настройках обмена установите флаг «Выгружать очистку данных по неиспользуемым ПКО».
  3. В обработчике ПриОтправкеДанных добавьте логику, которая отключает использование ПКО, если объект помечен на удаление.

Пример реализации в обработчике ПриОтправкеДанных:


Если ДанныеИБ.ПометкаУдаления Тогда
    ИспользованиеПКО.Справочник_Номенклатура_Отправка = Ложь;
    ИспользованиеПКО.Справочник_НоменклатураГруппа_Отправка = Ложь;
Иначе
    ИспользованиеПКО.Справочник_Номенклатура_Отправка = Не ДанныеИБ.ЭтоГруппа;
    ИспользованиеПКО.Справочник_НоменклатураГруппа_Отправка = ДанныеИБ.ЭтоГруппа;
КонецЕсли;

В этом случае система сама сгенерирует команду на удаление в файл обмена, так как ПКО для объекта не выбрано, но объект зарегистрирован в обмене.

Метод 2: Программная отправка команды удаления

Более гибкий и надежный способ — принудительный вызов функций БСП. Для реализации этого решения нам потребуется модифицировать или заимствовать функции из общего модуля ОбменДаннымиXDTOСервер.

Разберем по шагам, как настроить отправку:

  1. Найдите функцию ВыгрузитьУдаление в общем модуле ОбменДаннымиXDTOСервер. Если она не является экспортной, сделайте ее таковой или скопируйте нужный код в собственный расширяющий модуль.
  2. В обработчике ПриОбработке (ПОД_ИмяОбъекта_Отправка_ПриОбработке) добавьте условие проверки пометки удаления.

Пример кода для реализации внутри обработчика:


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

Важные рекомендации при настройке

Чтобы описанные методы сработали, необходимо учесть несколько критических моментов:

Подводя итог, можно сказать, что передача пометки удаления в EnterpriseData — это не про «передачу статуса», а про «информирование об удалении». Используя приведенные выше методы, вы сможете добиться корректного синхронного удаления объектов в распределенных информационных базах 1С.

← На главную