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