В типовой конфигурации 1С:Зарплата и Управление Персоналом 3.1 (ЗУП) разработчики предусмотрели штатный механизм ограничения доступа по организациям и физическим лицам. Однако часто бизнес-заказчики требуют разграничить видимость данных именно по подразделениям организаций. На первый взгляд задача кажется простой, но она таит в себе множество методологических и технических сложностей. В этой статье мы подробно разберем, как реализовать RLS по подразделениям, какие шаблоны использовать и почему стандартные механизмы могут работать не так, как ожидается.
Прежде чем приступать к доработке, проанализируем текущие возможности системы. В ЗУП 3.1 существует вид доступа Структура предприятия. Многие ошибочно полагают, что его включение в профиле групп доступа автоматически решит вопрос с подразделениями. На самом деле, этот вид доступа в типовом решении зачастую ограничивает только работу со справочником штатного расписания и управленческой структурой, но не накладывает фильтр на кадровые документы и расчетные листки по регламентированным подразделениям организаций. Для анализа действующих настроек прав пользователей подойдёт отчет по ограничениям пользователей и группам доступа.
Основная причина такого ограничения кроется в архитектуре учета: НДФЛ, страховые взносы и расчет среднего заработка ведутся в разрезе физического лица. Если жестко ограничить доступ к подразделению, пользователь может потерять доступ к истории перемещений сотрудника, что приведет к некорректным расчетам и ошибкам при формировании отчетности.
Прежде чем писать код, рассмотрим наиболее стабильный метод, который рекомендуют опытные специалисты. Вместо прямого ограничения по подразделениям, воспользуемся видом доступа Группы доступа физических лиц. Этот механизм уже «прошит» в большинстве типовых ролей и запросов.
Этот подход позволяет избежать «тормозов» системы, так как RLS по физическим лицам оптимизирован разработчиками фирмы «1С». Для автоматизации этого процесса подойдёт обработка для установки групп доступа физическим лицам.
Если же требования заказчика категоричны и необходимо ограничить именно справочник ПодразделенияОрганизаций и связанные документы, нам потребуется внести изменения в роли. Рассмотрим ситуацию на примере роли ЧтениеПодразделенийОрганизации.
Посмотрим на пример шаблона, который позволяет видеть пользователю только разрешенные подразделения, исключая иерархический вывод тех элементов, на которые прав нет. Разберем код, использующий регистр сведений ПодчиненностьПодразделенийОрганизаций:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениямРасширенный(
"Справочник.ПодразделенияОрганизаций",
"Чтение",
"",
"ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПодчиненностьПодразделенийОрганизаций КАК Т2 ПО Т2.Подразделение = Т.Ссылка",
"",
"ПодразделенияОрганизаций",
"Т2.Подразделение",
"И",
"Организации",
"Т.Владелец",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
)
#КонецЕсли
Важное замечание: При использовании этого кода мы указываем системе проверять права не только по организации (владельцу), но и по конкретному значению ссылки подразделения. Параметр ПодразделенияОрганизаций (вид доступа) должен быть предварительно зарегистрирован в системе через общий модуль УправлениеДоступомПереопределяемый.
Рассмотрим более простой вариант использования стандартного шаблона #ПоЗначениям. Если вы создали свой вид доступа, текст ограничения может выглядеть следующим образом:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениям(
"Справочник.ПодразделенияОрганизаций",
"Чтение",
"",
"Организации", "Владелец",
"ПодразделенияОрганизации", "Ссылка",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
)
#КонецЕсли
Проанализируем параметры: здесь мы проверяем объект на соответствие двум парам: Организация (реквизит Владелец) И ПодразделенияОрганизации (реквизит Ссылка). Если в профиле доступа у пользователя указана организация и список разрешенных подразделений, система отфильтрует справочник.
Выясним причину, по которой RLS по подразделениям может «сломать» работу кадровиков. Рассмотрим ситуацию: сотрудник переводится из Подразделения А (доступно кадровику) в Подразделение Б (недоступно).
В момент проведения документа Кадровый перевод возникают следующие коллизии:
Подразделение в документе теперь содержит Подразделение Б.RLS, и сотрудник не попадет в документ Табель.Начисление зарплаты и взносов приведет к тому, что налоги будут рассчитаны неверно, так как система «не увидит» доходы в других подразделениях.В версиях ЗУП на базе актуальной Библиотеки стандартных подсистем (БСП) используется Универсальное ограничение доступа. Это означает, что система не просто выполняет запрос с условием ГДЕ, а использует предварительно рассчитанные данные в регистре сведений Ключи доступа к объектам.
Если вы добавляете новый вид доступа по подразделениям, выполните следующие шаги:
ПриЗаполненииВидовДоступа модуля УправлениеДоступомПереопределяемый.ПриЗаполненииСпискаОбъектовСДистанционнымУправлениемДоступом укажите ваши документы (например, ПриемНаРаботу, КадровыйПеревод), если вы хотите, чтобы доступ к ним зависел от подразделения.Проанализировав все «за» и «против», мы рекомендуем следующий алгоритм действий:
1. Для справочника Подразделения организаций используйте модифицированный шаблон RLS (как в примере выше), чтобы пользователи видели только «свои» ветки структуры в формах выбора.
2. Для документов и сотрудников крайне желательно использовать штатный механизм Групп доступа физических лиц. Это обеспечит целостность расчетов и высокую производительность системы.
3. Помните о функции ВЫБРАТЬ РАЗРЕШЕННЫЕ в запросах. Если вы пишете свои отчеты или обработки, обязательно используйте это ключевое слово, иначе пользователь получит ошибку нарушения прав доступа при попытке прочитать данные из ограниченных подразделений.
Рассмотрим ситуацию с быстродействием: использование глубоких вложенных запросов в шаблонах RLS (через ЛЕВОЕ СОЕДИНЕНИЕ с регистрами) может замедлить открытие списков документов в несколько раз. Если база большая (более 500 сотрудников), лучше программно накладывать фильтры в ПриСозданииНаСервере для динамических списков, чем использовать жесткий RLS в ролях.