Прячем счета из плана счетов


Если некоторым пользователям нужен доступ только к определенным счетам, а видимость данных по другим счетам при этом крайне нежелательна, на помощь приходит RLS

Зачем это нужно.

Самый простой пример - в базе хранятся данные по зарплате (с разбивкой по сотрудникам, т.е. не сводно), и главный бухгалтер или руководитель хочет чтобы 70-й счет мог видеть только расчетчик. Еще пример - менеджер смотрит остатки на складах по "оборотке" только по 10-му счету или по 41.01, остальные счета для него можно скрыть. Да мало ли у кого какие запросы :)

 

Порядок действий.


1) Добавляем в конфигурацию независимый непериодический регистр сведений "НедоступныеСчета" с двумя измерениями (ведущее, отбор, запрет незаполненных значений):

  1. Пользователь - составной тип (СправочникСсылка.ГруппыПользователей, СправочникСсылка.Пользователи)
  2. Счет - тип (ПланСчетовСсылка.Хозрасчетный) или другой план счетов?

2) Пишем для пользовательских ролей для права "Чтение" примерно такое ограничение:

ТекущаяТаблица ГДЕ (НЕ ТекущаяТаблица.Ссылка В (ВЫБРАТЬ
НедоступныеСчета.Счет
ИЗ
РегистрСведений.НедоступныеСчета КАК НедоступныеСчета
ГДЕ
(НедоступныеСчета.Пользователь = &ТекущийПользователь
ИЛИ НедоступныеСчета.Пользователь В (&ГруппыТекущегоПользователя))))
И (НЕ ТекущаяТаблица.Ссылка В (ВЫБРАТЬ
ТекущаяТаблица.Ссылка
ИЗ
ПланСчетов.Хозрасчетный КАК ТекущаяТаблица ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НедоступныеСчета КАК НедоступныеСчета
ПО ТекущаяТаблица.Код ПОДОБНО "" + НедоступныеСчета.Счет.Код + ".%"
ГДЕ
(НедоступныеСчета.Пользователь = &ТекущийПользователь
ИЛИ НедоступныеСчета.Пользователь В (&ГруппыТекущегоПользователя))))
 
 

3) Приложенной обработкой или вручную добавляем в наш регистр ограничение по счетам для отдельных пользователей или для целых групп. Потом заходим под этими пользователями и смотрим план счетов. Счета добавленные в регистр должны исчезнуть. Кстати при большом количестве пользователей и групп обработка нехило подтормаживает, видимо запросик можно пооптимизировать, но лень :)


При данном подходе необходимо учитывать множество нюансов:

1) Права "складываются" для разных ролей, т.е. если пользователю доступно несколько ролей, каждой из которых в свою очередь доступно чтение плана счетов, то ограничение на чтение нужно прописывать для каждой роли, иначе если прописать ограничение только для одной роли, пользователь все равно будет видеть все счета, т.к. на другую роль ограничений не наклыдывается.

2) Принадлежность пользователя группе определяется при запуске приложения при инициализации параметров сеанса, поэтому если для группы есть ограничение по счетам, а пользователя только что поместили в эту группу, то ограничение начнет действовать только при следующем перезапуске пользователем 1С.

3) Если выбрать в качестве недоступного счета "корневой" счет, то все его субчета также становятся недоступными, хотя для своих нужд можно изменить текст запроса в соединении (ПО ТекущаяТаблица.Код ПОДОБНО "" + НедоступныеСчета.Счет.Код + ".%"). Также изменив немного текст запроса можно реализовать обратную логику "доступны только указанные счета", но мне нужно было именно так.

4) Ну и самое главное нужно осознавать, что без тщательного тестирования нельзя внедрять подобные решения, т.к. логика работы многих механизмов в различных конфигурациях может запросто нарушиться! Возможно придется во многих запросах добавить слово "РАЗРЕШЕННЫЕ" и т.д. В общем, я Вас предупредил :)


Удачи!

Файлы обработки:

-