Изтриване на обект в възел за обмен на данни

Понякога при обмен на данни се оказва ситуация, когато е необходимо да се изтрият определени обекти от отдалечен възел и директно да се направи това е много проблематично. Възможните решения на този проблем са обсъдени в тази статия. Трябва да се отбележи, че като цяло се разглежда ситуацията с разпределените информационни бази (RIB).

Специфична ситуация: по някаква причина е необходимо обменът (и ако имаше директен или отдалечен достъп до отдалечената база данни, тогава въпросът просто би отсъствал) да изтрие някакъв обект от отдалечената база данни (DB).

Опция 1. Използване на обект Изтриване на обект. Изводът е, че намираме връзка към обекта и го изпращаме на отдалечена база чрез размяна. Нещо такова:

Node = ExchangePlans.Name на необходимияExchangePlan.FindByCode ("02");
Връзка = Directories.Nomenclature.FindByCode ("000000026");
Deletion = Нов DeletionObject (Връзка);
Delete.Write ();
Exchange Plans.RegisterChanges (Node, Delete);

Но при този код ще възникне следният проблем - ако има ред Изтриване Write (); обектът в текущата база ще бъде изтрит (и това не е необходимо). Ако няма ред Delete.Write (); данните ще останат в отдалечената база данни, тоест задачата няма да бъде решена.

Сега, ако в текущата база данни няма такъв обект, тогава можете да използвате следното:

Node = ExchangePlans.Name на необходимияExchangePlan.FindByCode ("02");
Ref = Directories.Nomenclature.GetLink (New UniqueIdentifier ("de18c53b-c3a7-11e2-acf9-001966ee0859"));
Deletion = Нов DeletionObject (Връзка);
Delete.Write ();
Exchange Plans.RegisterChanges (Node, Delete);

Забележка: в 1C8 трябва да се прави разлика между уникален идентификатор (UUID) и глобално уникален идентификатор (GUID). Ако е необходимо, в мрежата можете да намерите кода за конвертиране на UUID в GUID и обратно.

В резултат получаваме, че тази опция е подходяща за случаи, когато в отдалечен възел е необходимо да се изтрият обекти, които липсват в текущия възел.

Необходимо е да се вземе предвид ситуацията, че в отдалечения възел обектът присъства в други обекти (т.е. елементът "Valenki" е изтрит и този елемент присъства в документите на отдалечения възел). Тук вече е необходимо да се мисли или за възстановяване на елемента в текущата база, или предвиждане на замяна на изтрития елемент с друг елемент.

//Infostart.ru/public/173851/ е много подходящ за задачата за изтриване на обекти, които липсват в текущата база данни (Регистрация на обменни възли или пререгистрация на връзки.)

Но често се изисква да изтриете обект в отдалечена база данни, но той трябва да остане в текущата база данни.

Вариант 2. Тъмно и не е вярно.

Използвайте опция 1, изпращане чрез размяна, получаване на потвърждение, възстановяване на елементи и предотвратяване изпращането на възстановени елементи до отдалечения сайт.

Вариант 3. Изискват се промени в конфигуратора.

В модула за план за обмен в манипулатора При изпращане на данни на подчиненото и/или при изпращане на данни на главния, ние хващаме необходимите обекти и за тях предаваме Delete.
Например:

Процедура за изпращане на данни на подчинен (Елемент от данни, Изпращане на елемент, Създаване на първоначално изображение)
Ако това е правилният обект тогава
ItemSend = DataItemSend.Remove;
EndIf;
Край на процедурата

Забележка: тази опция е възможна за гъвкавост. В плана за обмен въведете атрибута ExecutableCode, типът е низ с неограничена дължина. Необходимият програмен код бързо се вмъква в този атрибут. Отново трябва да се отбележи, че процедурата При изпращане на данни на подчиненото и при изпращане на данни до главния се задейства за ВСЕКИ изпратен елемент.

Процедура за изпращане на данни на подчинен (Елемент от данни, Изпращане на елемент, Създаване на първоначално изображение)
Опит
Изпълнение (ExecutableCode);
Изключение
Край на опитите;
Край на процедурата

Вариант 4. Генерирайте XML файл сами.

Използвам плана за обмен само за регистриране на промени, след което с моята обработка разтоварвам селекцията в XML, използвайки алгоритъма от книгата на Радченко „Практическо ръководство за разработчици“ (той е доста прост и гъвкав).

За да прехвърлите изтриването на обект, не е необходимо да го регистрирате - просто разтоварвайте съответната "команда" в XML.

Ако не е обект, който не може да се изтегли. Помислете в счетоводството след това

. и след това самото разтоварване

А сега клопки.

Ако искате да изтриете някакъв обект, не забравяйте, че други обекти в базата данни могат да бъдат свързани към този обект. Например - подчинени директории, движения на документи, независими регистри на информация и т.н., тоест тези обекти, които нямат значение при липса на изтрит обект. Някои от обектите могат да бъдат намерени съвсем просто (подчинени директории, движения на документи, информационни регистри, където обектът е водещото измерение), но някои са доста проблематични, тъй като е необходимо да видите всеки обект и да погледнете в кода какви промени прави той към базата данни при запис и/или дирижиране.

И последен съвет. Ако несъответствията в отдалечената база данни са достатъчно големи в сравнение с текущата база данни, тогава е много по-бързо и лесно да се пресъздаде базата данни на отдалечения възел.