Как в 1С:Конвертации данных отменить выгрузку реквизита или отфильтровать документы по условию

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

При настройке правил обмена в конфигурации «1С:Конвертация данных 2.0» часто возникают задачи выборочной переноски данных. Например, необходимо сохранить оригинальное наименование конкретного элемента справочника в базе-приемнике или выгрузить только те документы, которые относятся к определенному контрагенту. Рассмотрим по шагам, как правильно написать условия в обработчиках правил конвертации.

Условная отмена выгрузки реквизита в ПКС

Для того чтобы не переносить конкретный реквизит (например, Наименование) у определенного элемента справочника, используют обработчик ПередВыгрузкой в Правиле Конвертации Свойства (ПКС).

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


Если Источник.Код = "000000001" Тогда
    Отказ = Истина;
КонецЕсли;

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

Важные ограничения при отмене выгрузки реквизита:

  1. Флаг поиска: Убедимся, что у данного ПКС не установлен флажок «Поиск». Если реквизит участвует в поиске объекта в базе-приемнике, отмена его выгрузки приведет к невозможности идентификации элемента.
  2. Создание новых объектов: Если объекта в информационной базе-приемнике еще нет и он создается с нуля, то при Отказ = Истина данное поле останется незаполненным.

Управление сохранением данных на стороне приемника

Если требуется сохранить наименование у уже существующего объекта в базе-приемнике, но при этом корректно заполнить его у новых элементов, перенесем логику обработки на этап загрузки данных в ПКО (обработчики ПриЗагрузке или ПослеЗагрузки).

Рассмотрим использование служебных переменных платформы ОбъектНайден и СсылкаНаНайденныйОбъект:


Если ОбъектНайден Тогда
    Объект.Наименование = СсылкаНаНайденныйОбъект.Наименование;
КонецЕсли;

В случае когда при совпадении условия весь объект в приемнике не должен обновляться, в обработчике ПриЗагрузке можно установить специальный флаг:


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

Фильтрация выгрузки документов в ПКО по ссылочным реквизитам

Разберем другую распространенную ситуацию: необходимо выгружать документы (например, РеализацияТоваровУслуг) только по конкретному контрагенту.

Частая ошибка разработчиков — прямое сравнение ссылочного реквизита со строковым представлением кода:


// НЕВЕРНО: Контрагент является ссылкой на справочник, а не строкой
Если Источник.Контрагент <> "ЦНТ010086" Тогда
    Отказ = Истина;
КонецЕсли;

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


Если ЗначениеЗаполнено(Источник.Контрагент) Тогда
    Если Источник.Контрагент.Код <> "ЦНТ010086" Тогда
        Отказ = Истина;
    КонецЕсли;
Иначе
    Отказ = Истина;
КонецЕсли;

Рекомендации по повышению надежности и производительности:

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