Фильтрация данных по узлам распределенной информационной базы.

Фильтрация данных обычно происходит по признаку «принадлежности» этих данных к организации, подразделению, складу и т.д. Таким образом, нужно при записи сообщения обмена, определить (по какому-либо из реквизитов записываемых в текущий момент данных) необходимость отправки этих данных в текущий узел «получатель». Приведу пример. Существует распределенная информационная база, имеющая один корневой узел и некоторое количество периферийных узлов, используется типовая конфигурация «Бухгалтерия предприятия». Задача заключается в реализации схемы обмена, при которой за каждым из периферийных узлов «закреплена» одна или несколько организаций, по которым в этом узле ведется учет. Соответственно, необходимо, что бы в периферийные узлы попадали данные только по определенной организации (нескольким организациям), а в центральном узле «собирались» все данные. Для решения этой задачи, в плане обмена добавим табличную часть "ОрганизацииУзла", имеющую одну колонку "Организация", тип "СправочникСсылка.Организации". Далее, в модуле плана обмена, в процедуре ПриОтправкеДанныхПодчиненному(), добавим следующий текст:

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

Что бы при записи сообщения обмена, можно было определить, для какого узла в данный момент записывается сообщение, необходимо добавить глобальную переменную или параметр сеанса, в данном случае используется переменная глТекущийУзел. В эту переменную предварительно должен быть установлен текущий узел «получатель», так как внутри процедуры ПриОтправкеДанныхПодчиненному() не предусмотрено получение текущего узла. Таким образом, осталось в режиме «Предприятие» установить организации для подчиненных узлов. Следует заметить, что иногда имеет смысл вместо ОтправкаЭлементаДанных.Игнорировать использовать ОтправкаЭлементаДанных.Удалить, что бы удалить в подчиненных узлах ошибочно попавшие туда данные. Например, если из-за ошибки оператора, в документе, изначально неверно был установлен реквизит, по которому происходит фильтрация. Аналогично можно реализовать выборочную миграцию по любому другому реквизиту или даже набору реквизитов.

По материалам сайта: http://www.coder1cv8.narod.ru/Publication4.html