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