Как в Конвертации данных 2.0 запретить выгрузку пустых документов, которые попадают в обмен по ссылке?

Программист 1С v8.3 (Обычные формы)
← На главную

При настройке обмена данными в 1С с помощью "Конвертации данных 2.0" часто возникает ситуация, когда документы, которые не должны выгружаться согласно заданным правилам отбора, все равно попадают в файл обмена. Обычно они выгружаются пустыми, что приводит к созданию "документов-пустышек" в базе-приемнике. Это происходит из-за механизма выгрузки объектов по ссылкам.

Рассмотрим подробно, почему это происходит и как настроить правила, чтобы полностью исключить выгрузку ненужных документов.

Анализ проблемы: прямая выгрузка и выгрузка по ссылке

Основная причина проблемы кроется в том, что в "Конвертации данных" существует два механизма выгрузки объектов:

  1. Прямая выгрузка. Это основной способ, который регулируется Правилами выгрузки данных (ПВД). Здесь мы можем задать произвольный запрос или алгоритм, чтобы отобрать только те объекты, которые нам нужны. Например, выбрать только документы "Заказ покупателя" с установленным флагом ОтражатьВБухгалтерскомУчете.
  2. Выгрузка по ссылке. Этот механизм срабатывает, когда объект, отобранный для прямой выгрузки (например, документ "Реализация товаров и услуг"), содержит в своих реквизитах ссылку на другой объект (например, на "Заказ покупателя" в поле ДокументОснование). Чтобы в базе-приемнике не было "битых" ссылок, механизм конвертации автоматически добавляет в файл обмена и этот связанный "Заказ покупателя".

Ключевой момент: при выгрузке по ссылке правила отбора из ПВД для связанного объекта не применяются. Система уже приняла решение выгрузить основной документ ("Реализация"), и ее задача — просто обеспечить целостность данных, добавив все связанные объекты. В результате в файл обмена попадает "Заказ покупателя" без флага ОтражатьВБухгалтерскомУчете, и в базе-приемнике создается пустой документ.

Разбор сложных и неоптимальных решений

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

Подход 1: Настройка каждого правила конвертации свойств (ПКС)

Первая мысль, которая приходит в голову, — это добавить проверку в правило конвертации того свойства, где находится ссылка. Например, для документа "Реализация товаров и услуг" (РТУ) найти ПКС для реквизита Сделка или ДокументОснование и в его обработчиках написать код.

Например, в обработчике Перед выгрузкой для ПКС Сделка можно написать:


Если ТипЗнч(Источник.Сделка) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
    // Проверяем флаг у связанного заказа
    Если Не Источник.Сделка.ОтражатьВБухгалтерскомУчете Тогда
        // Если флаг не установлен, не выгружаем значение этого свойства
        НеВыгружать = Истина;
    КонецЕсли;
КонецЕсли;

Недостатки этого подхода:


// Более сложный вариант для ПКС
Если ТипЗнч(Источник.Сделка) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
    // Проверяем БУ у документа заказ, если не установлено, то не выгружаем
    Если Не Источник.Сделка.ОтражатьВБухгалтерскомУчете Тогда
        НеВыгружать = Истина;
    КонецЕсли;
КонецЕсли;

Этот подход решает проблему точечно, но не является универсальным и надежным.

Подход 2: Использование флага "Не создавать новый объект по ссылке"

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

Однако при его использовании часто возникает ошибка во время загрузки данных:

Ошибка при загрузке данных: {Обработка.ОбменДаннымиXML.МодульОбъекта(4376)}: Получение элемента по индексу для значения не определено

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

Правильное решение: обработчик "Перед выгрузкой" в ПКО

Самый надежный, простой и централизованный способ решить нашу задачу — это добавить проверку в само правило конвертации объекта (ПКО) для "Заказа покупателя".

Для этого найдем обработчик события Перед выгрузкой. Этот обработчик имеет ключевое преимущество: он вызывается для каждого объекта данного типа непосредственно перед его записью в XML-файл, независимо от того, выгружается ли объект напрямую (через ПВД) или по ссылке из другого документа.

Выполним следующие шаги:

  1. Откроем правила обмена в конфигурации "Конвертация данных 2.0".
  2. Найдем ПКО для документа "Заказ покупателя".
  3. Перейдем на вкладку "Обработчики событий" и найдем событие "Перед выгрузкой".
  4. В поле для кода напишем простой алгоритм:

// Проверяем условие. Если оно не выполняется, отменяем выгрузку объекта.
Если НЕ Источник.ОтражатьВБухгалтерскомУчете Тогда
    Отказ = Истина;
КонецЕсли;

Как это работает?

Переменная Отказ в этом обработчике управляет процессом выгрузки. Установка Отказ = Истина полностью прекращает дальнейшую обработку и сериализацию текущего объекта. Он просто не будет добавлен в файл обмена. Соответственно, в базе-приемнике не будет создано ни пустого объекта, ни даже "битой" ссылки.

Преимущества этого решения:

Таким образом, вместо того чтобы "латать дыры" в каждом месте, где может встретиться ссылка на проблемный объект, мы ставим единый фильтр на "выходе" для самого этого объекта. Это является лучшей практикой при настройке сложных правил обмена в "Конвертации данных 2.0".

← На главную