Как ограничить доступ к справочнику «Сотрудники» по подразделению в 1С:ЗУП 3.1?

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

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

Разберем по шагам, почему типовые отборы динамических списков могут сбрасываться при редактировании запроса в конструкторе и какими способами можно реализовать ограничение прав доступа через расширение конфигурации или подписки на события.

Причина, почему не работает прямая правка текста запроса динамического списка

Рассмотрим распространенную ситуацию: разработчик добавляет форму списка справочника Сотрудники в расширение и меняет текст запроса динамического списка Список (например, накладывает секцию ГДЕ ВТ.Подразделение = &Подразделение). Однако в режиме «1С:Предприятие» в списке всё равно выводятся все сотрудники.

Проанализируем причину такого поведения:

  1. Программное формирование запроса при открытии: В ЗУП 3.1 текст запроса динамического списка формируется программно в обработчике ПриСозданииНаСервере с помощью встроенных механизмов библиотеки стандартных подсистем (БСП). Изменения, внесенные в визуальном конструкторе формы или метаданных расширения, перезаписываются типовым кодом во время запуска формы.
  2. Ограничения платформы с временными таблицами: Запрос динамического списка справочника Сотрудники использует конструкцию ПОМЕСТИТЬ ВТ из регистра сведений ДанныеДляПодбораСотрудников. Наложение условий на конечную выборку из временной таблицы в запросе динамического списка может некорректно обрабатываться платформой при автоматической подстановке пользовательских настроек.

Способ 1. Программная установка отбора в динамическом списке через расширение

Чтобы отбор по подразделению гарантированно применился и не сбрасывался типовым кодом, настроим его программно в модуле формы списка сотрудников с помощью расширения конфигурации.

Разберем порядок действий:

  1. Добавляем форму списка справочника Сотрудники в расширение.
  2. В модуле формы создаем аннотацию &После("ПриСозданииНаСервере").
  3. Программно добавляем элемент отбора в Список.КомпоновщикНастроек.Настройки.Отбор и делаем его недоступным для отключения пользователем.

Посмотрим на пример реализации кода в модуле формы списка:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Получаем доступные текущему пользователю подразделения (например, из параметров сеанса или настроек)
    ДоступноеПодразделение = ЭлементыСеанса.ТекущийПользователь.Подразделение;
    
    // Находим или создаем элемент отбора
    ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Подразделение");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = ДоступноеПодразделение;
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

КонецПроцедуры

Способ 2. Проверка прав при открытии карточки сотрудника

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

Разберем алгоритм проверки:

  1. Добавляем форму элемента справочника Сотрудники в расширение.
  2. В обработчике ПриОткрытии (или ПриСозданииНаСервере) получаем текущее подразделение сотрудника.
  3. Сравниваем подразделение сотрудника с разрешенными подразделениями текущего пользователя. Если доступ запрещен, выдаем предупреждение и устанавливаем Отказ = Истина.

Рассмотрим пример кода в форме элемента справочника:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
        Возврат; // Новый элемент
    КонецЕсли;

    // Получаем актуальное подразделение сотрудника
    ПодразделениеСотрудника = Объект.Подразделение;
    
    Если НЕ РазрешеноРаботатьСПодразделением(ПодразделениеСотрудника) Тогда
        ВызватьИсключение "У вас недостаточно прав для просмотра карточки сотрудника из данного подразделения!";
    КонецЕсли;

КонецПроцедуры

Способ 3. Ограничение через подписки на события

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

Схема работы подписки на событие:

  1. В подписке получаем текущего пользователя системы через Пользователи.АвторизованныйПользователь().
  2. Определяем физическое лицо и сотрудника, а также его текущее кадровое подразделение по сведениям регистров сведений (например, КадроваяИсторияСотрудников или ТекущиеКадровыеДанныеСотрудников).
  3. При несоответствии подразделения вызываем отмену действия или исключение прав доступа.

Такой подход обеспечивает комплексную защиту данных, не требуя открытия основной конфигурации на изменение.

← На главную