При настройке обмена данными в 1С с помощью "Конвертации данных 2.0" часто возникает ситуация, когда документы, которые не должны выгружаться согласно заданным правилам отбора, все равно попадают в файл обмена. Обычно они выгружаются пустыми, что приводит к созданию "документов-пустышек" в базе-приемнике. Это происходит из-за механизма выгрузки объектов по ссылкам.
Рассмотрим подробно, почему это происходит и как настроить правила, чтобы полностью исключить выгрузку ненужных документов.
Основная причина проблемы кроется в том, что в "Конвертации данных" существует два механизма выгрузки объектов:
ОтражатьВБухгалтерскомУчете.ДокументОснование). Чтобы в базе-приемнике не было "битых" ссылок, механизм конвертации автоматически добавляет в файл обмена и этот связанный "Заказ покупателя".Ключевой момент: при выгрузке по ссылке правила отбора из ПВД для связанного объекта не применяются. Система уже приняла решение выгрузить основной документ ("Реализация"), и ее задача — просто обеспечить целостность данных, добавив все связанные объекты. В результате в файл обмена попадает "Заказ покупателя" без флага ОтражатьВБухгалтерскомУчете, и в базе-приемнике создается пустой документ.
В ходе поиска решения можно столкнуться с несколькими подходами, которые либо слишком трудоемки, либо приводят к другим ошибкам. Разберем их, чтобы понимать ограничения.
Первая мысль, которая приходит в голову, — это добавить проверку в правило конвертации того свойства, где находится ссылка. Например, для документа "Реализация товаров и услуг" (РТУ) найти ПКС для реквизита Сделка или ДокументОснование и в его обработчиках написать код.
Например, в обработчике Перед выгрузкой для ПКС Сделка можно написать:
Если ТипЗнч(Источник.Сделка) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
// Проверяем флаг у связанного заказа
Если Не Источник.Сделка.ОтражатьВБухгалтерскомУчете Тогда
// Если флаг не установлен, не выгружаем значение этого свойства
НеВыгружать = Истина;
КонецЕсли;
КонецЕсли;
Недостатки этого подхода:
Сделка, ЗаказПокупателя, ЗаказСписания и т.д.). Придется найти абсолютно все такие ПКС и в каждом прописать подобную логику. Это долго и легко что-то упустить.Сделка может хранить ссылки не только на заказ, но и, например, на "Счет на оплату", у которого нет реквизита ОтражатьВБухгалтерскомУчете. Код придется усложнять проверками типов, как в примере ниже.
// Более сложный вариант для ПКС
Если ТипЗнч(Источник.Сделка) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
// Проверяем БУ у документа заказ, если не установлено, то не выгружаем
Если Не Источник.Сделка.ОтражатьВБухгалтерскомУчете Тогда
НеВыгружать = Истина;
КонецЕсли;
КонецЕсли;
Этот подход решает проблему точечно, но не является универсальным и надежным.
В настройках Правила конвертации объекта (ПКО) для "Заказа покупателя" есть флаг "При переносе объекта по ссылке НЕ создавать новый объект, а только переносить ссылку". Кажется, это именно то, что нужно.
Однако при его использовании часто возникает ошибка во время загрузки данных:
Ошибка при загрузке данных: {Обработка.ОбменДаннымиXML.МодульОбъекта(4376)}: Получение элемента по индексу для значения не определено
Почему так происходит? Система, следуя правилу, не создает полноценный объект в приемнике, а оставляет "пустую" ссылку. Но дальнейшая логика обмена (например, код в обработчиках После загрузки или поиск по реквизитам) может попытаться обратиться к данным этого несуществующего объекта, что и вызывает ошибку. Этот флаг полезен, но требует очень аккуратной настройки всех связанных правил, что делает его применение рискованным.
Самый надежный, простой и централизованный способ решить нашу задачу — это добавить проверку в само правило конвертации объекта (ПКО) для "Заказа покупателя".
Для этого найдем обработчик события Перед выгрузкой. Этот обработчик имеет ключевое преимущество: он вызывается для каждого объекта данного типа непосредственно перед его записью в XML-файл, независимо от того, выгружается ли объект напрямую (через ПВД) или по ссылке из другого документа.
Выполним следующие шаги:
// Проверяем условие. Если оно не выполняется, отменяем выгрузку объекта.
Если НЕ Источник.ОтражатьВБухгалтерскомУчете Тогда
Отказ = Истина;
КонецЕсли;
Как это работает?
Переменная Отказ в этом обработчике управляет процессом выгрузки. Установка Отказ = Истина полностью прекращает дальнейшую обработку и сериализацию текущего объекта. Он просто не будет добавлен в файл обмена. Соответственно, в базе-приемнике не будет создано ни пустого объекта, ни даже "битой" ссылки.
Преимущества этого решения:
После загрузки.Таким образом, вместо того чтобы "латать дыры" в каждом месте, где может встретиться ссылка на проблемный объект, мы ставим единый фильтр на "выходе" для самого этого объекта. Это является лучшей практикой при настройке сложных правил обмена в "Конвертации данных 2.0".