При работе в конфигурации 1С:Зарплата и Управление Персоналом 3.1 часто возникает задача разграничения прав доступа на уровне записей (RLS). Типичная ситуация: в базе ведется учет по нескольким организациям, и доступ рядовых сотрудников ограничен их филиалами. Однако для администраторов или главных бухгалтеров требуется настроить доступ ко всем юридическим лицам сразу. Рассмотрим, какой архитектурный подход является наиболее верным и как это влияет на производительность системы.
Предположим, в информационной базе созданы три организации. Для ограничения доступа настроены три группы доступа, в каждой из которых разрешена только одна «своя» организация. Нам нужно предоставить пользователю доступ ко всем трем организациям. Разберем два основных сценария:
На первый взгляд результат кажется идентичным: и в том, и в другом случае пользователь увидит данные по всем компаниям. Однако с точки зрения внутренних механизмов платформы 1С и Библиотеки стандартных подсистем (БСП) разница между ними существенна.
Для начала проанализируем, как работает современный «производительный режим» ограничения доступа, который используется в ЗуП 3.1. В отличие от старых версий, где условия RLS при каждом запросе динамически формировали сложные условия ГДЕ, в новом режиме используются вспомогательные таблицы — Ключи доступа.
Разберем, что происходит в базе данных при выборе первого варианта (несколько групп доступа):
Когда пользователь включен в три группы, система при расчете его прав суммирует разрешенные значения по принципу ИЛИ. В служебных регистрах сведений (таких как КлючиДоступаПользователей) для этого пользователя будет создана запись, объединяющая идентификаторы ключей всех трех организаций. При выполнении любого запроса к документам или справочникам СУБД будет вынуждена выполнять соединение с таблицей ключей доступа или использовать оператор IN в SQL-запросе:
SELECT ...
FROM Document.ПриемНаРаботу
WHERE OrganizationID IN (ID_Организация1, ID_Организация2, ID_Организация3)
Рассмотрим ситуацию во втором варианте (одна группа с доступом «Все разрешены»):
Если в настройках группы доступа для вида доступа Организации выбрано значение Все разрешены (без исключений), БСП интерпретирует это как отсутствие необходимости фильтрации по данному измерению. В служебных таблицах прав для такого пользователя прописывается специальный пустой ключ, который сигнализирует системе: «фильтр не нужен». В итоге SQL-запрос становится максимально простым, аналогичным запросу пользователя с полными правами, что существенно повышает скорость работы динамических списков и отчетов.
Проанализируем основные причины, по которым второй вариант (создание одной группы с полным доступом по организации) является предпочтительным:
Выполним настройку вместе, следуя шагам в интерфейсе программы:
Организации.Важный нюанс: если этот пользователь уже включен в другие группы доступа, где организации ограничены, не стоит переживать о конфликтах. В системе 1С права работают на дополнение. Если хотя бы в одной группе доступа пользователю разрешены все организации, это право станет приоритетным и «перекроет» ограничения из других групп.
Посмотрим на пример работы динамического списка. Когда мы открываем список документов «Начисления зарплаты», платформа должна быстро отобразить первые 30–50 записей. При использовании множества групп доступа (Вариант 1) СУБД тратит время на проверку каждой записи по списку разрешенных организаций. На больших объемах данных (десятки тысяч сотрудников) это может приводить к заметным задержкам в отрисовке интерфейса. Вариант «Все разрешены» исключает эти проверки на уровне SQL-условия, что делает работу пользователя максимально комфортной.
Подводя итог, можно однозначно утверждать, что вариант с созданием отдельной группы доступа (или профиля) с настройкой Все разрешены является наиболее правильным. Это решение гарантирует:
Всегда старайтесь избегать «нагромождения» мелких групп доступа для одного пользователя, если их можно заменить одной более широкой настройкой.