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