Скрыть представление для определенной группы пользователей.
Добрый день!
Как Вы знаете, в карточке редактирования может быть представлено несколько представлений. Иногда требуется ограничить доступ к этому представлению некоторой группе пользователей. Этот функционал можно дополнительно реализовать средствами Terrasoft Administrator. Ниже приведу сам алгоритм, на примере карточки редактирования раздела "Продукты", в которой существует представление "Движение по складу", доступ к которому мы ограничим.
Итак, прежде всего необходимо открыть скрипт wnd_OfferingEditScript и в конец скрипта добавить следующую функцию:
{
var Dataset = Services.GetSingleItemByUSI('ds_AdminUnit');
ApplyDatasetFilter(Dataset, 'UserContactID', Connector.CurrentUser.ContactID, true);
Dataset.Open();
var UserID = Dataset.ValAsGUID(IDFieldName);
Dataset.Close();
var Dataset = Services.GetSingleItemByUSI('ds_UserInGroup');
ApplyDatasetFilter(Dataset, 'GroupID', GroupID, true);
ApplyDatasetFilter(Dataset, 'UserID', UserID, true);
Dataset.Open();
var Is = (Dataset.RecordsCount > 0);
Dataset.Close();
return Is;
}
Приведенная выше функция, в случае если текущий пользователь системы входит в указанную нами группу пользователей, возвращает значение true, в ином случае - false.
Далее необходимо отредактировать функцию function wnd_OfferingEditOnPrepare(Window). В ней добавим следующую проверку:
scr_BaseDBEdit.wnd_BaseDBEditOnPrepare(Window);
Initialize(Window);
if(!Connector.CurrentUser.IsAdmin)
{
var UsrDataset = Services.GetSingleItemByUSI('ds_UserInGroup');
var GroupName = 'Название';
//где 'Название' - имя группы пользователей, для которых нужно ограничить доступ к представлению
ApplyDatasetFilter(UsrDataset, 'GroupName', GroupName, true);
//тут следует не забыть создать фильтр сравнения в сервисе sq_UserInGroup (см. скриншот ниже)
UsrDataset.Open();
var GroupID = UsrDataset.Values('GroupID');
if(IsUserInGroup(GroupID))
{
//скрываем само представление, установив свойству IsVisible значение false
pgOfferingAnalytic.IsVisible = false;
}
UsrDataset.Close();
}
}
Так же, перед тестированием результатов, следует создать фильтр сравнения в сервисе sq_UserInGroup:
После этого не забудьте сохранить изменения и перезапустить клиентское приложение Terrasoft.
Воспользовался вашим примером переработав функцию получения группы пользователя, у меня она выглядит так:
var GroupDataset = Services.GetSingleItemByUSI('ds_UserInGroup'); ApplyDatasetFilter(GroupDataset, 'UserID', UserID, true); GroupDataset.Open(); GroupDataset.GotoNext(); //берем второе значение, так как первая по порядку группа 'Все пользователи' var GroupID = GroupDataset.ValAsStr('GroupID'); GroupDataset.Close();
Большое спасибо за Ваш пример, очень пригодился!
В принципе есть базовая функция в scr_Access называется GetIsUserInGroup, делает примерно тоже самое только немного написана по другому
function GetIsUserInGroup(UserName, GroupID) { var sqGetIsUserInGroup = GetSingleItemByCode('sq_GetIsUserInGroup'); SetParameterValue(sqGetIsUserInGroup.Parameters, 'GroupID', GroupID); SetParameterValue(sqGetIsUserInGroup.Parameters, 'UserName', UserName); var dsRes = sqGetIsUserInGroup.Open(); try { return dsRes('IsExists') != 0; } finally { dsRes.Close(); } }