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