Каталог решений - Конвертация данных 2.* + Планы обмена — метод передачи в сообщении удаления независимых регистров

Конвертация данных 2.* + Планы обмена — метод передачи в сообщении удаления независимых регистров

Конвертация данных 2.* + Планы обмена — метод передачи в сообщении удаления независимых регистров

В наличии

Описывается метод передачи в сообщениях информации для удаления независимых регистров в узлах приемниках при использовании планов обменов в связке с конвертацией данных и обработкой «Универсальный обмен данными в формате XML» из поставки «Конвертация данных 2.x».

Категория:

Описание

Механизм "конвертация данных версии 2.x" с использованием обработки "Универсальный обмен данными в формате XML" не предоставляет "из коробки"  возможность передавать в сообщениях информации о непосредственном удалении объектов или записей регистров, сообщения типа "Удаление объетка" и удаления из независимого регистра просто пропускаются. В случае ссылочных объектов, проблем обычно не возникает, так как информация о пометке на удаление чаще всего уже передается в другой узел, до того как объект будет удален. Но когда удаляется независимый регистр, в узел приемник информация об этом никак не попадает.

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

Делюсь со всеми знакомыми с механизмами КД своей реализацией решения этой задачи, надеюсь кому нибудь это сэкономит пару часов работы:

1. В правило конвертации объекта нашего регистра я добавил свойство передаваемое в  параметр "ЭтоУдаление" :

И неболшой код проверяющий есть ли входящие данные и такое свойство в них.

 

2. В коде перед вызовом метода "ОбработкаОбмена.ВыполнитьВыгрузку()" я добавил строчку кода:

    ОбработкаОбмена.Параметры.Вставить("УзелПолучатель",УзелПолучатель);

 Без этот я никак не смог решить эту задачу .

Важно — чтобы параметра с таким именем не было в параметрах определенных в самих правилах в XML файле, иначе он будет затерт при инициализации обработки.

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

МетаРег = Метаданные.РегистрыСведений.НАШ_РЕГИСТР;
Узел =  Параметры.УзелПолучатель;
Выборка = ПланыОбмена.ВыбратьИзменения(Узел,Узел.НомерОтправленного,МетаРег);

УдаляемыеЗаписи = Новый ТаблицаЗначений;
УдаляемыеЗаписи.Колонки.Добавить("Активность");
УдаляемыеЗаписи.Колонки.Добавить("Период",Новый ОписаниеТипов("Дата"));    

Для Каждого Рекв Из МетаРег.Измерения Цикл
    УдаляемыеЗаписи.Колонки.Добавить(Рекв.Имя,Рекв.Тип);
КонецЦикла;
Для Каждого Рекв Из МетаРег.Ресурсы Цикл
    УдаляемыеЗаписи.Колонки.Добавить(Рекв.Имя,Рекв.Тип);
КонецЦикла;
Для Каждого Рекв Из МетаРег.Реквизиты Цикл
    УдаляемыеЗаписи.Колонки.Добавить(Рекв.Имя,Рекв.Тип);
КонецЦикла;

УдаляемаяЗапись = УдаляемыеЗаписи.Добавить();
УдаляемаяЗапись.Активность = Ложь;
Параметры = Новый СТруктура("Удаление",Истина);
Пока Выборка.Следующий() Цикл
    Запись = Выборка.Получить();                
    
    Для Каждого ЭлОтб Из Запись.Отбор Цикл
        Имя = ЭлОтб.Имя;
        УдаляемаяЗапись[Имя] = ЭлОтб.Значение;
    КОнецЦикла;  

    Запись.Прочитать();
    Если Запись.Количество()=0 Тогда // Это удаление
        ВыгрузитьПоПравилу(УдаляемаяЗапись,,Параметры,,"НАШ_РЕГИСТР");
    КОнецЕсли;
КонецЦикла;   

4. В ПКО нашего регистра добавил обработчик "После загрузки"

Если ПараметрыОбъекта <> Undefined Тогда
    ЭтоУдаление = ПараметрыОбъекта.ПОлучить("ЭтоУдаление");
    Если ЭтоУдаление=Истина Тогда
        Отказ = Истина;
        НЗ = РегистрыСведений.ТоварыВАкции.СоздатьМенеджерЗаписи();
        ЗаполнитьЗначенияСвойств(НЗ,Объект);        
        НЗ.Прочитать();        
        Если НЗ.Выбран() Тогда
            НЗ.Удалить();
        КонецЕсли;    
    КонецЕсли;        
КонецЕсли;    

и НАШ_РЕГИСТР успешно начал удалятся в узле приемнике вместе с удалением в узле источнике.

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

has been added to your cart:
Оформление заказа