Каталог решений - РИБ на v 8: Фильтрация данных по узлам распределенной информационной базы.

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

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

В наличии

Часто, при работе в распределенной информационной базе, существует необходимость в выборочной миграции данных по узлам, когда поведение по умолчанию (т.е. любое изменение элемента данных, произведенное в любом из узлов, стремится распространиться по всем остальным узлам) не подходит.

Категория:

Описание

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

ПриОтправкеДанныхПодчиненному

(

ЭлементДанных

,

ОтправкаЭлемента

) Если

ТипЗнч

(

ЭлементДанных

)=

Тип

(«УдалениеОбъекта») Тогда Возврат

;
  	

КонецЕсли

;
  	ОбъектМетаданных

=

ЭлементДанных

.Метаданные()

;
  	

Если Метаданные.

Документы

.

Содержит

(

ОбъектМетаданных

) Тогда Если

ЕстьРеквизитДокумента

(«Организация»,

ОбъектМетаданных

) Тогда Если

глТекущийУзел

.

ОрганизацииУзла

.

Найти

(

ЭлементДанных

.

Организация

,«Организация»)=

Неопределено 

Тогда

ОтправкаЭлемента

=

ОтправкаЭлементаДанных

.

Игнорировать;
    			

КонецЕсли

;
   		

КонецЕсли

;
  	

ИначеЕсли Метаданные.

РегистрыНакопления

.

Содержит

(

ОбъектМетаданных

) ИЛИ Метаданные.

РегистрыБухгалтерии

.

Содержит

(

ОбъектМетаданных

) Тогда

Регистратор

=

ЭлементДанных

.

Отбор

.

Регистратор

.

Значение;
   		

Если

ЕстьРеквизитДокумента

(«Организация»,

Регистратор

.Метаданные()) Тогда Если

глТекущийУзел

.

ОрганизацииУзла

.

Найти

(

Регистратор

.

Организация

,«Организация»)=

Неопределено 

Тогда

ОтправкаЭлемента

=

ОтправкаЭлементаДанных

.

Игнорировать;
    			

КонецЕсли

;
   		

КонецЕсли

;
  	

ИначеЕсли Метаданные.

РегистрыСведений

.

Содержит

(

ОбъектМетаданных

) Тогда Если

ЭлементДанных

.

Отбор

.

Найти

(«Регистратор»)<>

Неопределено 

Тогда

Регистратор

=

ЭлементДанных

.

Отбор

.

Регистратор

.

Значение;
    			

Если

ЕстьРеквизитДокумента

(«Организация»,

Регистратор

.Метаданные()) Тогда Если

глТекущийУзел

.

ОрганизацииУзла

.

Найти

(

Регистратор

.

Организация

,«Организация»)=

Неопределено 

Тогда

ОтправкаЭлемента

=

ОтправкаЭлементаДанных

.

Игнорировать;
     				

КонецЕсли

;
    			

КонецЕсли

;
   		

КонецЕсли

;
  	

КонецЕсли

;

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

has been added to your cart:
Оформление заказа