Как ограничить доступ к регистру «Документы физических лиц», если типовые роли дают полные права

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

В типовых конфигурациях 1С, таких как Управление нашей фирмой (УНФ), ERP или Комплексная автоматизация, часто возникает ситуация, когда права на чтение персональных данных (паспортных данных) распределены по множеству базовых ролей. Например, роли БазовыеПраваУНФ, ЧтениеДанныхУНФ или ОператорОтправкиОтчетности могут содержать право на чтение регистра сведений ДокументыФизическихЛиц. Попытка создать новую роль с ограничением не принесет результата, так как в модели безопасности 1С права суммируются: если хотя бы одна роль разрешает чтение, доступ будет предоставлен.

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

Почему стандартное редактирование ролей в расширении не работает

Разберем типичную ошибку начинающих разработчиков. При попытке добавить роль в расширение для ограничения прав, вы обнаружите, что расширение позволяет только добавлять новые права, но не отнимать существующие у типовых ролей. Если роль БазовыеПраваУНФ в основной конфигурации разрешает чтение регистра, то никакая роль в расширении не сможет это запретить. Именно поэтому нам придется использовать альтернативные методы управления доступом.

Способ 1. Использование механизма RLS (Row Level Security)

Самый правильный и «чистый» с точки зрения архитектуры способ — это ограничение доступа на уровне записей. Если в системе включено использование RLS, данные будут фильтроваться на уровне СУБД, и пользователь просто не увидит записи в регистре, даже имея роль на чтение.

Рассмотрим шаги по настройке RLS для персональных данных:

  1. Перейдем в раздел Администрирование — Настройки пользователей и прав.
  2. Установим флаг Ограничивать доступ на уровне записей.
  3. В профилях групп доступа найдем настройки, связанные с физическими лицами. В типовых решениях часто предусмотрено разделение по Группам доступа физических лиц.
  4. Создадим группу доступа (например, «Сотрудники с доступом к ПДн») и включим в нее только нужных пользователей.
  5. Для всех остальных пользователей записи в регистре ДокументыФизическихЛиц будут отображаться пустыми или не будут отображаться вовсе, так как они не пройдут проверку условий RLS.

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

Если настройка RLS кажется слишком громоздкой или она замедляет работу системы, мы можем прибегнуть к программным методам. Разберем ситуацию, когда данные регистра видны из справочника ФизическиеЛица.

Проанализируем, почему данные «просачиваются». Регистр ДокументыФизическихЛиц имеет ведущее измерение Физлицо. Это означает, что данные регистра неразрывно связаны с объектом справочника и часто выводятся в его форме списка или форме элемента через динамические списки или связанные панели.

Рассмотрим пример кода в расширении для формы элемента справочника ФизическиеЛица. Нам нужно проверить наличие специальной роли у пользователя и, если ее нет, скрыть элементы интерфейса, отвечающие за паспортные данные.

Для начала создадим в расширении свою роль РазрешитьЧтениеПаспортныхДанных (без прав на объекты, просто как маркер).

Затем в модуле формы справочника ФизическиеЛица добавим следующий код:


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

Способ 3. Перехват события «ПриЧтенииНаСервере»

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

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


&НаСервере
Процедура Расш1_ПриОткрытииПосле(Отказ, СтандартнаяОбработка)
    Если Не РольДоступна("РазрешитьЧтениеПаспортныхДанных") Тогда
        // Сообщаем пользователю о нехватке прав и закрываем форму
        ТекстСообщения = "У вас недостаточно прав для просмотра паспортных данных.";
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Важно помнить, что проверка РольДоступна() должна учитывать и администраторов системы. Обычно проверку делают так: Если Не (РольДоступна("ИмяРоли") Или РольДоступна("ПолныеПрава")) Тогда...

Анализ связи справочника и регистра

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

Рекомендуется выполнить поиск ссылок на объект РегистрСведений.ДокументыФизическихЛиц в конфигураторе. Проанализируем результат:

Для каждого из этих мест в расширении необходимо добавить проверку прав.

Дополнительные настройки БСП

В современных версиях УНФ на базе БСП существует подсистема Защита персональных данных. Проанализируем настройки этой подсистемы:

  1. Проверьте константу ИспользоватьУчетДоступаКПерсональнымДанным.
  2. Используйте регистр НастройкиРегистрацииСобытийДоступаКПерсональнымДанным. Это позволит не только ограничивать доступ, но и протоколировать, кто и когда просматривал паспортные данные.

Подведем итог: Поскольку права в 1С работают по принципу объединения (ИЛИ), вы не можете просто «выключить» чтение в одной роли, если оно включено в другой. Используйте либо RLS для жесткого ограничения на уровне БД, либо расширение форм для программного скрытия элементов интерфейса от пользователей без специальной роли-маркера.

← На главную