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