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