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