При настройке обменов данными через Универсальный формат (EnterpriseData, Конвертация данных 3.0 и Библиотека Стандартных Подсистем) разработчики часто сталкиваются с нестандартным поведением документов: признак проведения по умолчанию в формате отсутствует, а попытка вручную установить пометку удаления в обработчиках загрузки вызывает исключительные ситуации. Разберем по шагам архитектуру обмена, выясним причины ошибок и рассмотрим штатные способы синхронизации статусов документов.
Проанализируем типовую ошибку, когда в обработчиках загрузки данных (например, в событии ОтложеннаяОбработка или процедурах конвертации) разработчик пытается программно пометить документ на удаление следующим образом:
Объект.УстановитьПометкуУдаления(Истина);
Вызов данного метода приводит к ошибке выполнения по следующим причинам:
УстановитьПометкуУдаления() является интерактивным серверным методом объекта, который немедленно инициирует транзакцию записи в информационную базу со сменой режима проведения.Для корректного изменения признака пометки удаления в обработчиках загрузки КД 3.0 необходимо напрямую менять реквизит и взводить флаг модификации:
Объект.ПометкаУдаления = Истина;
ОбъектМодифицирован = Истина;
В архитектуре формата EnterpriseData физическое удаление объекта и установка пометки на удаление не разделяются на уровне XML-сообщения. Механизм работает по следующим правилам:
<УдалениеОбъекта>, содержащий ключевые поля идентификации и ссылку на исходный объект.<УдалениеОбъекта> не удаляет объект физически из базы, а находит его по идентификаторам, снимает с проведения и штатно устанавливает свойство ПометкаУдаления = Истина.Посмотрим на код БСП, отвечающий за выборку и выгрузку удалений:
// Извлечение изменений на узле плана обмена
Данные = ВыборкаИзменений.Получить();
Если ТипЗнч(Данные) = Тип("УдалениеОбъекта") Тогда
ВыгрузитьУдаление(КомпонентыОбмена, Данные.Ссылка);
Иначе
// Штатная выгрузка заполненного объекта
ВыгрузитьПоПравилу(Данные, КомпонентыОбмена, ПравилоОбработки);
КонецЕсли;
Формат EnterpriseData спроектирован с упором на передачу фактических бизнес-данных, а не платформенных состояний. Статус проведения документа обрабатывается одним из двух архитектурных подходов:
Проведен = Истина. Если проведенный документ в базе-источнике распроводят или удаляют, механизм БСП автоматически фиксирует удаление объекта из выборки узла и отправляет в приемник пакет <УдалениеОбъекта>. В базе-приемнике документ автоматически распроводится и помечается на удаление.В обработчике отправки источника:
// Запись статуса в структуру дополнительных данных
ДанныеXDTO.AdditionalInfo = Новый Структура("БылПроведен", Объект.Проведен);
В обработчике ПередЗаписьюПолученныхДанных или ПриКонвертацииДанных на стороне приемника:
Если Объект.ДополнительныеСвойства.Свойство("AdditionalInfo")
И Объект.ДополнительныеСвойства.AdditionalInfo.Свойство("БылПроведен") Тогда
Если Не Объект.ДополнительныеСвойства.AdditionalInfo.БылПроведен Тогда
// Указываем режим записи без проведения
РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения;
КонецЕсли;
КонецЕсли;
Разберем важный нюанс работы подсистемы обмена в БСП при использовании нескольких правил конвертации объектов (ПКО) для одного метаданного (например, раздельные ПКО для элементов и групп справочника):
// Фрагмент типовой процедуры ВыгрузкаОбъектаВыборки в БСП:
Если НесколькоПКО Тогда
ПравилоКонвертации = КомпонентыОбмена.ПравилаКонвертацииОбъектов.Найти(ТекущееПКО.Ключ, "ИмяПКО");
ВыгрузитьУдаление(КомпонентыОбмена, Объект.Ссылка, ПравилоКонвертации);
КонецЕсли;
Если для одного объекта зарегистрировано несколько ПКО, БСП может инициировать посылку удаления объекта по неиспользуемому ПКО, если в правилах обработки не задействован флаг очистки данных. При разработке собственных правил в Конвертации данных 3.0 это необходимо учитывать, исключая лишние дублирующие ПКО для документов или корректно настраивая фильтрацию в событиях ПриОбработке.