Перенос помеченных на удаление объектов. Конвертация 2.1






Иногда при переносе данных возникает задача: не переносить помеченные на удаление документы, а те документы, которые были ранее перенесены в базу приемник и теперь в приемнике стали помеченными на удаления — переносить так, чтобы в базу приемник не тянулись связанные с объектом ссылки, но искомый объект помечался на удаление. В данной статье будет рассказано, как это можно сделать достаточно просто, используя конфигурацию «Конвертация 2.1».

В статье описывается способ переноса таких объектов в контексте конфигурации "Конвертация 2.1". Во всех остальных случаях, когда используются прочие механизмы обменов — данная задача имеет различное множество решений, которые в данной статье не рассматриваются.

Итак, в правилах обмена мы будем использовать алгоритмы и обработчики событий объектов. В алгоритмах мы создадим 3 элемента, которые будем размещать в одноименных обработчиках документов и справочников. Пример реализации я буду приводить только для документов, так как для справочников подход будет аналогичным. 

Алгоритм "ПередВыгрузкой":

ПометкаУдаления = Источник.ПометкаУдаления;
НеСоздаватьЕслиНеНайден = ПометкаУдаления;
ПередатьОдинПараметрВПриемник("_ПометкаУдаления", ПометкаУдаления);

Получение пометки удаления для ссылки производится через точку. Все потому, что далее, перед исполнением кода обработчика объекта "ПриВыгрузке", будет производится чтение ссылки со всеми реквизитами и табличными частями, поэтому использовать получение значения реквизита ссылки с помощью запроса или БСП функции ОбщегоНазначения.ПолучитьЗначениеРеквизита() будет являться лишним. Мы прочитаем все реквизиты в обработчике "ПередВыгрузкой", закэшируя тем самым объект.

пример трассировки MS SQL Profiler

(пример трассировки в MSSQL Profiler для процедуры "ПередВыгрузкой")

 

(пример трассировки перед выполнением кода внутри процедуры "ПриВыгрузке")

Если объект выгружается впервые, то нет смысла загружать помеченный на удаление объект в приемник. Конечно, в некоторых случаях может потребоваться переносить такие объекты, например, в случае, когда переносится набор записей регистра и наш документ содержится в измерении набора. В таком случае нужно понимать — насколько действительно в базе приемнике нужны такие записи. В моей статье я не рассматриваю такие случаи. Далее, передаем параметр конкретного объекта, который будет содержать информацию о пометке удаления.

Алгоритм "ПриВыгрузке":

ПКО.НеВыгружатьОбъектыСвойствПоСсылкам = Источник.ПометкаУдаления;

Самый интересный момент статьи. Такой строчкой кода мы указываем, что связанные ссылки не будут тянуться с искомым объектом в файл выгрузки, если он помечен на удаление. Все дело в том, что данное свойство не так очевидно указано в справке к обработчикам. А в настройках правила свойство устанавливается на все объекты выгрузки по такому правилу. 

Используя данное свойство мы сокращаем размер файла выгрузки, а так же избавляемся от проверки при загрузке и прописывания кода, который бы исключал при загрузке связанные ссылки (весьма не тривиальный алгоритм). В случае, если мы не используем файлы, а осуществляем обмен с помощью веб-сервисов или com-подключений — мы сокращаем объем передаваемых данных.

Алгоритм "ПриЗагрузке":

ЕстьПараметрПометкаУдаления = (Параметры.Свойство("_ПометкаУдаления") И Параметры._ПометкаУдаления);

ЕстьРучнаяКорректировка = ложь;
Если ОбщегоНазначения.ЕстьРеквизитОбъекта("РучнаяКорректировка", Объект.Метаданные()) Тогда
ЕстьРучнаяКорректировка = Объект.РучнаяКорректировка;
КонецЕсли;

НеЗамещатьОбъект = ЕстьРучнаяКорректировка ИЛИ ЕстьПараметрПометкаУдаления;

Если НЕ ЕстьРучнаяКорректировка И ЕстьПараметрПометкаУдаления Тогда
Объект.ПометкаУдаления = истина;
Объект.ОбменДанными.Загрузка = истина;
Объект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;

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

Осталось разместить вызовы данных алгоритмов в обработчиках объектов: "ПередВыгрузкой", "ПриВыгрузке", "ПриЗагрузке".

Конечно, пример, приведенный в моей статье, является не единственным вариантом решения задачи. Вариантов, возможно, масса. Например, можно в базе приемнике сделать веб-сервис, к которому мы могли бы обращаться из базы источника, передавая информацию об выгружаемых объектах — как вариант идентификаторы ссылок. А в ответ веб-сервис возвращал информацию — нужно ли вообще выгружать такие объекты. 

С данной задачей я столкнулся "вживую", на достаточно большом объеме данных. И такой подход оказался вполне эффективным. 

Надеюсь, что пример, описанный в статье, окажется полезным!

2 Comments

  1. Stim213

    Для автообмена настройкой унив обмена xml вы не поиграетесь.

    Если список документов ограничен, то можно сделать проще:

    в дополнение к основному ПКО документа создается ПКО с парочкой свойств Дата+Номер и настройкой «не создавать новый объект».

    в пвд перед выгрузкой пишите:

    Если Объект.ПометкаУдаления Тогда
    ИмяПКО = «ПКОМойДокумент_ПомеченныйНаУдаление»;
    КонецЕсли;

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

    Reply
  2. Shmell

    (1)

    Да, Ваш вариант вполне подойдет для правил с небольшим количеством объектов.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *