При работе с правилами обмена в Конвертации данных 2.1 часто возникает задача отфильтровать выгружаемые данные «на лету». Например, требуется не выгружать определенные документы или справочники, если они соответствуют заданному условию. Давайте разберем, как реализовать этот механизм и что делать, если код не срабатывает.
Основной инструмент для управления выгрузкой объекта — это обработчик Перед выгрузкой, который доступен в настройках Правил выгрузки данных (ПВД). В контексте этого события существует специальный параметр Отказ, который имеет тип Булево.
Для того чтобы система проигнорировала объект и не передавала его правилу конвертации (ПКО), необходимо установить значение этого параметра в Истина. Рассмотрим пример реализации такой логики:
Если Источник.ВидКонтактнойИнформации = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("000000001") Тогда
Отказ = Истина;
КонецЕсли;
Когда Отказ = Истина, процесс обработки текущего объекта прерывается, и он не попадает в итоговый файл обмена.
Если вы написали условие, но объекты все равно попадают в выгрузку, это означает, что логика не выполняется или выполняется не в том контексте. Рассмотрим шаги для поиска причины:
Сообщить(). Это позволит понять, заходит ли выполнение кода в нужную ветку условия. Если сообщение не выводится, значит, обработчик не вызывается для этого конкретного объекта.Источник может быть не заполнена, если вы случайно изменили правило или если объект выгружается не через ПВД, а как вложенный объект в рамках другого ПКО.ТипЗнч(Источник), чтобы убедиться, что в обработчик передается именно тот тип данных, который вы ожидаете.Помимо программного вмешательства в обработчиках, существуют более производительные методы управления составом выгружаемых данных:
1. Использование запроса в ПВД:
Самый эффективный способ исключить объекты — наложить фильтр непосредственно в текст запроса, который выбирает данные для обмена. Это экономит ресурсы системы, так как «лишние» объекты даже не будут попадать в обработчики событий.
2. Проверка доступности данных:
Если условие опирается на Справочники.ВидыКонтактнойИнформации.НайтиПоКоду(), помните, что поиск может вернуть пустую ссылку. В такой ситуации условие Если Источник.Вид = ... будет ложным, и отмена не произойдет. Всегда проверяйте результат поиска на пустоту:
ВидКИ = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("000000001");
Если ЗначениеЗаполнено(ВидКИ) И Источник.Вид = ВидКИ Тогда
Отказ = Истина;
КонецЕсли;
Подводя итог, можно сказать, что механизм Отказ = Истина является надежным инструментом, но требует внимательного отношения к контексту исполнения кода. Всегда начинайте отладку с проверки того, вызывается ли код вообще, и какой тип данных содержит переменная Источник на момент проверки.