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