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