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