Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Распределение данных по подчиненным узлам
Дальше: Доработка примера обмена данными в распределенной информационной базе

Разрешение коллизий

На основе отношения «главный – подчиненный» в распределенной информационной базе организована типовая процедура разрешения коллизий, автоматически выполняемая при приеме сообщения. Считается, что изменение элемента данных, произведенное в главном узле, имеет высший приоритет по отношению к изменению, произведенному в подчиненном узле. Таким образом, если сообщение, пришедшее от подчиненного узла, содержит элемент данных, изменения которого зарегистрированы в базе главного узла для этого подчиненного узла, то никаких действий предпринято не будет, то есть этот элемент данных не будет помещен в базу данных и запись регистрации изменений не будет удалена.

Если сообщение, пришедшее от главного узла, содержит элемент данных, изменения которого зарегистрированы в базе подчиненного узла для главного узла, то элемент данных будет записан в базу данных, а запись регистрация изменения будет удалена.

В случае если данный сценарий не устраивает, можно реализовать прямо противоположный сценарий – при котором, например, принимаются изменения из нижестоящей базы.

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

Для рассмотрения данного случая воспользуемся приведенным выше примером с документом РасходнаяНакладная и планом обмена Магазины.

В данном случае требуется определить обработчики событий ПриПолученииДанныхОтПодчиненного и ПриПолученииДанныхОтГлавного в модуле плана обмена. Обработчик ПриПолученииДанныхОтПодчиненного будет иметь следующий вид (листинг 3.28).

Листинг 3.28. Процедура «ПриПолученииДанныхОтПодчиненного()»

Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)

 

ТипДанных = ТипЗнч(ЭлементДанных);

Если ТипДанных = Тип("ДокументОбъект.РасходнаяНакладная") Тогда

ПолучениеЭлемента = ПолучениеЭлементаДанных.Принять;

КонецЕсли;

 

КонецПроцедуры

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

Обработчик события ПриПолученииДанныхОтГлавного выглядит следующим образом (листинг 3.29).

Листинг 3.29. Процедура «ПриПолученииДанныхОтГлавного()»

Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)

 

ТипДанных = ТипЗнч(ЭлементДанных);

Если ТипДанных = Тип("ДокументОбъект.РасходнаяНакладная") Тогда

Если ПланыОбмена.ИзменениеЗарегистрировано(Ссылка, ЭлементДанных) Тогда

ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;

КонецЕсли

КонецЕсли;

 

КонецПроцедуры

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

Назад: Распределение данных по подчиненным узлам
Дальше: Доработка примера обмена данными в распределенной информационной базе