Top.Mail.Ru

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

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

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

1.jpg

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

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

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

2.jpg

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

3.jpg

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

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

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

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

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

4.jpg

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

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

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

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

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

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

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

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

5.jpg

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

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

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

Источник // infostart.ru