При настройке обменов данными с помощью конфигурации «Конвертация данных 2.1» разработчики нередко сталкиваются с ситуацией: в правиле конвертации объекта (ПКО) в обработчике Перед выгрузкой прописывается условие с установкой флага Отказ = Истина;, однако в базе-приемнике документ все равно появляется, но оказывается совершенно пустым (не заполнены реквизиты и табличные части). При этом стандартная выгрузка через обработку «Универсальный обмен данными в формате XML» может отрабатывать корректно, а при типовом обмене по планам обмена проблема воспроизводится стабильно. Разберем по шагам, почему так происходит и как правильно настроить фильтрацию объектов.
Проанализируем механику работы правил конвертации и выгрузки по планам обмена:
Перед выгрузкой срабатывает Отказ = Истина;, движок обмена отменяет выгрузку тела конкретного объекта. Однако если на этот документ есть ссылка в другом выгружаемом объекте (например, в связанном документе, договоре, строке табличной части или в движениях регистров), механизм КД 2.1 формирует узел ссылки <Ссылка> для обеспечения целостности данных. При загрузке в базу-приемник обработка пытается найти объект по полям поиска или УИД. Не найдя его, система создает новый пустой элемент с этим идентификатором.ПланыОбмена.ВыбратьИзменения). Если объект зарегистрирован к обмену, но в ПКО выгрузка отменена, ссылка все равно может попасть в XML-пакет как зависимость.Источник передается как ДокументСсылка, а не как объект. Обращение через точку вызывает неявный запрос к базе. При возникновении исключения или обращении к несуществующему реквизиту логика условия может сработать не так, как ожидалось.Если задача заключается в том, чтобы отфильтрованные документы ни при каких обстоятельствах не создавались в базе-приемнике пустыми, настроим соответствующее поведение в ПКО приемника.
Если Не ОбъектНайден Тогда
НеЗамещатьОбъект = Истина;
Отказ = Истина;
КонецЕсли;
В этом случае, даже если ссылка на документ попадет в XML-файл как зависимость из другого объекта, база-приемник пропустит создание пустого документа.
Выясним причину попадания лишних данных в обмен: если объект изначально не должен передаваться в другую базу (например, снят признак отражения в налоговом учете), его не следует регистрировать на узле плана обмена. В конфигурациях поколения КА 1.1 и УПП 1.3 нет отдельных правил регистрации объектов (ПРО), поэтому фильтрацию настраивают в коде:
ПриЗаписи... перед регистрацией проверяем значение реквизита. Если флаг ОтражатьВНалоговомУчете равен Ложь, регистрацию изменений через ПланыОбмена.ЗарегистрироватьИзменения() не выполняем.ПланыОбмена.УдалитьРегистрациюИзменений(), выполнив предварительную выборку нужных документов запросом.Если документ выгружается по ссылке из другого объекта (например, через реквизит ДокументОснование), очистим это значение перед выгрузкой в правиле конвертации свойств (ПКС):
Если ЗначениеЗаполнено(Источник.ДокументОснование)
И НЕ Источник.ДокументОснование.ОтражатьВНалоговомУчете Тогда
Значение = Неопределено;
КонецЕсли;
Таким образом, ссылка на неотраженный в налоговом учете документ не попадет в выгрузку связанных данных.
Рассмотрим сопутствующую задачу: когда документы прошлых периодов должны загружаться в приемник для сверки, но не должны проводиться. Изменение свойства Источник.Проведен в обработчике ПКО Перед выгрузкой не даст результата, так как значение реквизита переопределяется правилами конвертации свойств (ПКС).
Для решения этой задачи применим один из двух вариантов:
Если Источник.Дата < '20160101' Тогда
Значение = Ложь;
КонецЕсли;
Если Объект.Дата < '20160101' Тогда
РежимЗаписи = РежимЗаписиДокумента.Запись;
КонецЕсли;
Использование связки запрета создания ненайденных объектов в ПКО и контроля регистрации изменений позволяет полностью исключить появление «пустышек» и гарантирует корректность переносимых данных.