Как реализовать ограничение доступа (RLS) по подразделениям в 1С:ЗУП 3.1?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Управленческий учет IT и автоматизация бизнеса
← На главную

В типовой конфигурации 1С:Зарплата и Управление Персоналом 3.1 (ЗУП) разработчики предусмотрели штатный механизм ограничения доступа по организациям и физическим лицам. Однако часто бизнес-заказчики требуют разграничить видимость данных именно по подразделениям организаций. На первый взгляд задача кажется простой, но она таит в себе множество методологических и технических сложностей. В этой статье мы подробно разберем, как реализовать RLS по подразделениям, какие шаблоны использовать и почему стандартные механизмы могут работать не так, как ожидается.

Анализ проблемы штатного функционала

Прежде чем приступать к доработке, проанализируем текущие возможности системы. В ЗУП 3.1 существует вид доступа Структура предприятия. Многие ошибочно полагают, что его включение в профиле групп доступа автоматически решит вопрос с подразделениями. На самом деле, этот вид доступа в типовом решении зачастую ограничивает только работу со справочником штатного расписания и управленческой структурой, но не накладывает фильтр на кадровые документы и расчетные листки по регламентированным подразделениям организаций. Для анализа действующих настроек прав пользователей подойдёт отчет по ограничениям пользователей и группам доступа.

Основная причина такого ограничения кроется в архитектуре учета: НДФЛ, страховые взносы и расчет среднего заработка ведутся в разрезе физического лица. Если жестко ограничить доступ к подразделению, пользователь может потерять доступ к истории перемещений сотрудника, что приведет к некорректным расчетам и ошибкам при формировании отчетности.

Способ 1: Использование штатного механизма Групп доступа физических лиц

Прежде чем писать код, рассмотрим наиболее стабильный метод, который рекомендуют опытные специалисты. Вместо прямого ограничения по подразделениям, воспользуемся видом доступа Группы доступа физических лиц. Этот механизм уже «прошит» в большинстве типовых ролей и запросов.

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

Этот подход позволяет избежать «тормозов» системы, так как RLS по физическим лицам оптимизирован разработчиками фирмы «1С». Для автоматизации этого процесса подойдёт обработка для установки групп доступа физическим лицам.

Способ 2: Модификация шаблона RLS в роли

Если же требования заказчика категоричны и необходимо ограничить именно справочник ПодразделенияОрганизаций и связанные документы, нам потребуется внести изменения в роли. Рассмотрим ситуацию на примере роли ЧтениеПодразделенийОрганизации.

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


#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
    #ДляОбъекта("")
#Иначе
    #ПоЗначениямРасширенный(
        "Справочник.ПодразделенияОрганизаций",
        "Чтение",
        "",
        "ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПодчиненностьПодразделенийОрганизаций КАК Т2 ПО Т2.Подразделение = Т.Ссылка",
        "",
        "ПодразделенияОрганизаций",
        "Т2.Подразделение",
        "И",
        "Организации",
        "Т.Владелец",
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
    )
#КонецЕсли

Важное замечание: При использовании этого кода мы указываем системе проверять права не только по организации (владельцу), но и по конкретному значению ссылки подразделения. Параметр ПодразделенияОрганизаций (вид доступа) должен быть предварительно зарегистрирован в системе через общий модуль УправлениеДоступомПереопределяемый.

Особенности работы шаблона #ПоЗначениям

Рассмотрим более простой вариант использования стандартного шаблона #ПоЗначениям. Если вы создали свой вид доступа, текст ограничения может выглядеть следующим образом:


#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
    #ДляОбъекта("")
#Иначе
    #ПоЗначениям(
        "Справочник.ПодразделенияОрганизаций",
        "Чтение",
        "",
        "Организации", "Владелец",
        "ПодразделенияОрганизации", "Ссылка",
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
    )
#КонецЕсли

Проанализируем параметры: здесь мы проверяем объект на соответствие двум парам: Организация (реквизит Владелец) И ПодразделенияОрганизации (реквизит Ссылка). Если в профиле доступа у пользователя указана организация и список разрешенных подразделений, система отфильтрует справочник.

Критическая проблема: Кадровые переводы и видимость документов

Выясним причину, по которой RLS по подразделениям может «сломать» работу кадровиков. Рассмотрим ситуацию: сотрудник переводится из Подразделения А (доступно кадровику) в Подразделение Б (недоступно).

В момент проведения документа Кадровый перевод возникают следующие коллизии:

  1. Потеря видимости: Как только документ проведен, кадровик Подразделения А может потерять право на его просмотр, так как реквизит Подразделение в документе теперь содержит Подразделение Б.
  2. Проблема заполнения табелей: Механизм заполнения табеля часто анализирует данные на конец периода. Если сотрудник уволился или перевелся в недоступное подразделение в середине месяца, запрос к базе может вернуть пустой результат из-за ограничений RLS, и сотрудник не попадет в документ Табель.
  3. Расчет зарплаты: Расчетчик зарплаты должен видеть все начисления сотрудника для корректного расчета НДФЛ и среднего. Ограничение по подразделениям в документах Начисление зарплаты и взносов приведет к тому, что налоги будут рассчитаны неверно, так как система «не увидит» доходы в других подразделениях.

Техническая реализация в современных версиях (БСП)

В версиях ЗУП на базе актуальной Библиотеки стандартных подсистем (БСП) используется Универсальное ограничение доступа. Это означает, что система не просто выполняет запрос с условием ГДЕ, а использует предварительно рассчитанные данные в регистре сведений Ключи доступа к объектам.

Если вы добавляете новый вид доступа по подразделениям, выполните следующие шаги:

  1. Добавьте вид доступа в процедуре ПриЗаполненииВидовДоступа модуля УправлениеДоступомПереопределяемый.
  2. В этом же модуле в процедуре ПриЗаполненииСпискаОбъектовСДистанционнымУправлениемДоступом укажите ваши документы (например, ПриемНаРаботу, КадровыйПеревод), если вы хотите, чтобы доступ к ним зависел от подразделения.
  3. После обновления конфигурации обязательно запустите обновление ключей доступа (в пользовательском режиме: Администрирование — Обслуживание — Регламентные операции — Управление доступом — Обновить ключи доступа).

Практические рекомендации

Проанализировав все «за» и «против», мы рекомендуем следующий алгоритм действий:

1. Для справочника Подразделения организаций используйте модифицированный шаблон RLS (как в примере выше), чтобы пользователи видели только «свои» ветки структуры в формах выбора.

2. Для документов и сотрудников крайне желательно использовать штатный механизм Групп доступа физических лиц. Это обеспечит целостность расчетов и высокую производительность системы.

3. Помните о функции ВЫБРАТЬ РАЗРЕШЕННЫЕ в запросах. Если вы пишете свои отчеты или обработки, обязательно используйте это ключевое слово, иначе пользователь получит ошибку нарушения прав доступа при попытке прочитать данные из ограниченных подразделений.

Рассмотрим ситуацию с быстродействием: использование глубоких вложенных запросов в шаблонах RLS (через ЛЕВОЕ СОЕДИНЕНИЕ с регистрами) может замедлить открытие списков документов в несколько раз. Если база большая (более 500 сотрудников), лучше программно накладывать фильтры в ПриСозданииНаСервере для динамических списков, чем использовать жесткий RLS в ролях.

← На главную