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