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

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

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

Способ 1. Настройка проверки в Правилах конвертации объектов (ПКО)

Разберем самый простой вариант. Если требуется предотвратить выгрузку конкретного справочника (например, Номенклатура), помеченного на удаление, программную проверку можно прописать непосредственно в самом ПКО.

Перейдем в ПКО нужного справочника и в обработчике события «Перед выгрузкой» укажем следующий код:

Отказ = Объект.ПометкаУдаления;

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

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

Способ 2. Установка отбора в Правилах выгрузки данных (ПВД)

Чтобы избежать ситуации с частичной выгрузкой данных и не нарушать логику явного отбора, фильтрацию рекомендуется делать на уровне Правил выгрузки данных (ПВД).

Разберем, чем отличается этот подход:

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

Выгрузка через ПВД гарантирует, что список первичных объектов будет отфильтрован еще до начала формирования пакета. Если же помеченный объект будет подтягиваться «по ссылке» из другого документа, ПКО выгрузит его, предотвратив тем самым битые ссылки в базе-приемнике.

Решение проблемы ссылочной целостности и битых ссылок

Проанализируем ситуацию, когда номенклатура была выбрана в документ, затем помечена на удаление в источнике, а сам документ выгружается в приемник. Рассмотренный выше запрет выгрузки может привести к неполным данным.

Для корректной работы с такими объектами применяются следующие механизмы:

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

Способ 3. Использование Глобального обработчика правил

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

Выясним, как это настроить в КД 2.1:

  1. Перейдем на закладку «Обработчики событий» правил конвертации.
  2. Найдем глобальный обработчик «Перед выгрузкой объекта».
  3. Добавим проверку наличия свойства у выгружаемого источника:

Если НайтиСвойствоПоИмени(Источник, "ПометкаУдаления") <> Неопределено Тогда
    Если Источник.ПометкаУдаления Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

Синхронизация удаленных объектов и очистка данных

Посмотрим на ситуацию, когда объект ранее уже выгружался в базу-приемник, а затем в источнике его пометили на удаление. Если мы просто исключим его из выгрузки, в базе-приемнике объект останется проведенным или активным.

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

Также, если обмен настроен с использованием Библиотеки Стандартных Подсистем (БСП) и Планов Обмена, правильнее всего снимать регистрацию объектов с узла обмена в момент установки пометки на удаление, либо настраивать интерактивные отборы непосредственно на самом узле обмена без изменения логики правил конвертации.

← На главную