1С 8.x Управляемое приложение 1С 7.7. Бухучет Статьи Ссылки
1С 8.x arrow 1С 8.x arrow Узелки на память arrow Фильтрация данных по узлам распределенной информационной базы.
Фильтрация данных по узлам распределенной информационной базы. Печать

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

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

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

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