Почему при отказе от выгрузки документа в КД 2.1 в приемнике создается пустой объект и как это исправить?

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

При настройке обменов данными с помощью конфигурации «Конвертация данных 2.1» разработчики нередко сталкиваются с ситуацией: в правиле конвертации объекта (ПКО) в обработчике Перед выгрузкой прописывается условие с установкой флага Отказ = Истина;, однако в базе-приемнике документ все равно появляется, но оказывается совершенно пустым (не заполнены реквизиты и табличные части). При этом стандартная выгрузка через обработку «Универсальный обмен данными в формате XML» может отрабатывать корректно, а при типовом обмене по планам обмена проблема воспроизводится стабильно. Разберем по шагам, почему так происходит и как правильно настроить фильтрацию объектов.

Причины появления пустых объектов в базе-приемнике

Проанализируем механику работы правил конвертации и выгрузки по планам обмена:

  1. Выгрузка по ссылочной целостности: Когда в ПКО в обработчике Перед выгрузкой срабатывает Отказ = Истина;, движок обмена отменяет выгрузку тела конкретного объекта. Однако если на этот документ есть ссылка в другом выгружаемом объекте (например, в связанном документе, договоре, строке табличной части или в движениях регистров), механизм КД 2.1 формирует узел ссылки <Ссылка> для обеспечения целостности данных. При загрузке в базу-приемник обработка пытается найти объект по полям поиска или УИД. Не найдя его, система создает новый пустой элемент с этим идентификатором.
  2. Особенности планов обмена: В типовом обмене выгрузка опирается на зарегистрированные изменения (механизм ПланыОбмена.ВыбратьИзменения). Если объект зарегистрирован к обмену, но в ПКО выгрузка отменена, ссылка все равно может попасть в XML-пакет как зависимость.
  3. Обращение к реквизитам через ссылку: При выгрузке по ссылке параметр Источник передается как ДокументСсылка, а не как объект. Обращение через точку вызывает неявный запрос к базе. При возникновении исключения или обращении к несуществующему реквизиту логика условия может сработать не так, как ожидалось.

Способ 1. Запрет создания новых объектов в правилах конвертации (ПКО)

Если задача заключается в том, чтобы отфильтрованные документы ни при каких обстоятельствах не создавались в базе-приемнике пустыми, настроим соответствующее поведение в ПКО приемника.

  1. В настройках самого ПКО включим флаг «Не создавать новый объект в приемнике, если он не найден».
  2. Либо в обработчике «При загрузке» правила конвертации объекта пропишем программный отказ:

Если Не ОбъектНайден Тогда
    НеЗамещатьОбъект = Истина;
    Отказ = Истина;
КонецЕсли;

В этом случае, даже если ссылка на документ попадет в XML-файл как зависимость из другого объекта, база-приемник пропустит создание пустого документа.

Способ 2. Фильтрация на этапе регистрации изменений

Выясним причину попадания лишних данных в обмен: если объект изначально не должен передаваться в другую базу (например, снят признак отражения в налоговом учете), его не следует регистрировать на узле плана обмена. В конфигурациях поколения КА 1.1 и УПП 1.3 нет отдельных правил регистрации объектов (ПРО), поэтому фильтрацию настраивают в коде:

  1. В подписках на события: В подписке на событие ПриЗаписи... перед регистрацией проверяем значение реквизита. Если флаг ОтражатьВНалоговомУчете равен Ложь, регистрацию изменений через ПланыОбмена.ЗарегистрироватьИзменения() не выполняем.
  2. Очистка перед сеансом обмена: Если регистрацию нужно отменить для уже измененных документов, используем метод ПланыОбмена.УдалитьРегистрациюИзменений(), выполнив предварительную выборку нужных документов запросом.

Способ 3. Очистка ссылок в зависимых объектах

Если документ выгружается по ссылке из другого объекта (например, через реквизит ДокументОснование), очистим это значение перед выгрузкой в правиле конвертации свойств (ПКС):


Если ЗначениеЗаполнено(Источник.ДокументОснование) 
   И НЕ Источник.ДокументОснование.ОтражатьВНалоговомУчете Тогда
    Значение = Неопределено;
КонецЕсли;

Таким образом, ссылка на неотраженный в налоговом учете документ не попадет в выгрузку связанных данных.

Способ 4. Управление проведением старых документов при загрузке

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

Для решения этой задачи применим один из двух вариантов:

  1. В ПКС реквизита «Проведен» (обработчик «Перед выгрузкой»):

Если Источник.Дата < '20160101' Тогда
    Значение = Ложь;
КонецЕсли;
  1. В ПКО базы-приемника (обработчик «Перед записью объекта»): Если при загрузке включено автоматическое проведение документов, переопределим режим записи:

Если Объект.Дата < '20160101' Тогда
    РежимЗаписи = РежимЗаписиДокумента.Запись;
КонецЕсли;

Использование связки запрета создания ненайденных объектов в ПКО и контроля регистрации изменений позволяет полностью исключить появление «пустышек» и гарантирует корректность переносимых данных.

← На главную