В практике разработки и администрирования зарплатных решений на платформе 1С часто возникает задача гибкого разграничения прав доступа. Например, требуется разрешить сотрудникам кадровой службы или HR просматривать и редактировать начисления позиций штатного расписания и сотрудников только для категории должности «Рабочие», полностью закрыв доступ к окладам и надбавкам руководящего и инженерно-технического состава. Разберем, почему штатный механизм RLS не всегда подходит для такой задачи и какими практическими методами ее можно решить.
Проанализируем сначала возможность реализации этой задачи через встроенный механизм ограничений на уровне записей (RLS). Попытка настроить строгий отбор строк табличной части штатными шаблонами RLS сталкивается со следующими ограничениями платформы 1С:
Объект. Обращение формы к закрытому по RLS полю немедленно вызовет системное исключение «Нарушение прав доступа».Выясним причину, по которой вендор рекомендует решать подобные задачи организационной структурой. Если категории персонала можно разнести по разным подразделениям (например, выделив цеха или отдельные группы должностей в обособленные подразделения), отпадает необходимость в нетиповых доработках.
В таком случае достаточно включить типовое ограничение доступа на уровне записей Библиотеки стандартных подсистем (БСП) по видам доступа Подразделения или Группы физических лиц. Пользователю HR назначаются права только на те подразделения, где числятся рабочие. Это наиболее надежный, оптимизированный и устойчивый к обновлениям конфигурации способ.
Если организационно разделить данные невозможно, а пользователи должны работать в общих документах, разберем по шагам гибридную схему защиты, сочетающую серверный контроль и интерфейсные доработки через расширение конфигурации.
Шаг 1. Контроль записи на стороне сервера
Любая защита интерфейса бессмысленна без серверного контроля. Чтобы пользователь с ограниченными правами не мог изменить оклады и начисления запрещенных категорий должностей, создадим подписку на событие ПередЗаписью для целевых документов и справочников.
Посмотрим на пример логики в модуле подписки:
Процедура ПроверитьПраваНаИзменениеНачисленийПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Отказ ИЛИ Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем наличие специальной роли у текущего пользователя
Если РольДоступна("КадровикБезДоступаКРуководству") Тогда
Для Каждого Стр Из Источник.Начисления Цикл
Если Стр.Должность.КатегорияДолжности <> Перечисления.КатегорииДолжностей.Рабочие Тогда
// Проверяем, менялись ли данные по запрещенной строке
Отказ = Истина;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
"У вас нет прав на изменение начислений для категории должности: " + Стр.Должность.КатегорияДолжности,
Источник,
"Начисления[" + Формат(Стр.НомерСтроки - 1, "ЧГ=0") + "].Размер"
);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Шаг 2. Сокрытие данных в интерфейсе форм
Рассмотрим подробнее визуальную часть. Чтобы скрыть суммы начислений в формах документов и позиций штатного расписания, подключим расширение конфигурации. В обработчиках форм ПриСозданииНаСервере или ПриЧтенииСозданииНаСервере наложим условное оформление или очистим отображаемые данные для пользователей с ограниченной ролью.
Посмотрим на пример программной настройки условного оформления для таблицы формы:
&НаСервере
Процедура СкрытьНачисленияДляНеРабочих()
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Устанавливаем скрытие текста ячеек с суммами
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", "***");
// Задаем условие: Категория должности не равна "Рабочие"
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Начисления.Должность.КатегорияДолжности");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ЭлементУсловия.ПравоеЗначение = Перечисления.КатегорииДолжностей.Рабочие;
ЭлементУсловия.Использование = Истина;
// Указываем оформляемые поля формы
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("НачисленияРазмер");
ПолеОформления.Использование = Истина;
КонецПроцедуры
Шаг 3. Блокировка обходных путей в отчетах
Скрытие полей в форме не защищает от считывания данных через отчеты. Разберем обязательные действия по закрытию прямого доступа:
АдминистраторСистемы и роли РежимВсеФункции (Режим технического специалиста), чтобы исключить открытие консолей запросов.УниверсальныйОтчет.В крупных компаниях с повышенными требованиями к безопасности зарплатных данных руководства лучшей практикой является физическое разделение баз данных. Создается закрытая информационная база для топ-менеджмента и выделенного круга расчетчиков, а в общую базу передаются только сводные проводки или данные рядового состава. Это полностью исключает риск случайной утечки информации через ошибки в доработках форм или произвольные отчеты.