На основе отношения «главный – подчиненный» в распределенной информационной базе организована типовая процедура разрешения коллизий, автоматически выполняемая при приеме сообщения. Считается, что изменение элемента данных, произведенное в главном узле, имеет высший приоритет по отношению к изменению, произведенному в подчиненном узле. Таким образом, если сообщение, пришедшее от подчиненного узла, содержит элемент данных, изменения которого зарегистрированы в базе главного узла для этого подчиненного узла, то никаких действий предпринято не будет, то есть этот элемент данных не будет помещен в базу данных и запись регистрации изменений не будет удалена.
Если сообщение, пришедшее от главного узла, содержит элемент данных, изменения которого зарегистрированы в базе подчиненного узла для главного узла, то элемент данных будет записан в базу данных, а запись регистрация изменения будет удалена.
В случае если данный сценарий не устраивает, можно реализовать прямо противоположный сценарий – при котором, например, принимаются изменения из нижестоящей базы.
Данный сценарий подразумевает, что для некоторых элементов данных, для которых он реализуется, выполняется следующее:
Для рассмотрения данного случая воспользуемся приведенным выше примером с документом РасходнаяНакладная и планом обмена Магазины.
В данном случае требуется определить обработчики событий ПриПолученииДанныхОтПодчиненного и ПриПолученииДанныхОтГлавного в модуле плана обмена. Обработчик ПриПолученииДанныхОтПодчиненного будет иметь следующий вид (листинг 3.28).
Листинг 3.28. Процедура «ПриПолученииДанныхОтПодчиненного()»
Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)
ТипДанных = ТипЗнч(ЭлементДанных);
Если ТипДанных = Тип("ДокументОбъект.РасходнаяНакладная") Тогда
ПолучениеЭлемента = ПолучениеЭлементаДанных.Принять;
КонецЕсли;
КонецПроцедуры
Приведенный обработчик весьма прост: проверяется тип элемента данных, и если элемент данных относится к интересующему нас типу, то параметру ПолучениеЭлемента присваивается значение Принять, что приводит к безусловному приему элемента данных, независимо от того, зарегистрированы его изменения или нет.
Обработчик события ПриПолученииДанныхОтГлавного выглядит следующим образом (листинг 3.29).
Листинг 3.29. Процедура «ПриПолученииДанныхОтГлавного()»
Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)
ТипДанных = ТипЗнч(ЭлементДанных);
Если ТипДанных = Тип("ДокументОбъект.РасходнаяНакладная") Тогда
Если ПланыОбмена.ИзменениеЗарегистрировано(Ссылка, ЭлементДанных) Тогда
ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;
КонецЕсли
КонецЕсли;
КонецПроцедуры
Этот обработчик несколько сложнее. Если элемент данных относится к интересующему нас типу, то производится проверка – зарегистрированы ли изменения элемента данных для узла-отправителя сообщения. Если изменения зарегистрированы, то параметру ПолучениеЭлемента присваивается значение Игнорировать. В результате прочитанный элемент данных не записывается в базу данных, а регистрация изменений сохраняется, что позволит поместить элемент данных в сообщение, отправляемое главному узлу.