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