Здравствуйте.
Есть ли в XRM возможность менять права доступа на запись при попадании её в динамическую группу?
Мне нужно реализовать следующее:
Если поле "Статус" = "Завершено", то ограничивать доступ.
Нравится
Штатно нет такой возможности.
Чтоб быстро работало - сделать хранимую процедуру для изменения прав доступа и вызывать ее на AfterPost нужного датасета.
Привязывать к функционалу динамических групп довольно сложно, но если условие только одно, можно поступить следующим образом:
Если поле Статус = Завершено, то делать карточку нередактируемой для всех, кроме супервизора. Для этого на OnPrepare карточки вызывать функцию
IsArchive(DataFieldName, DataFieldValue);
где
DataFieldName - название поля Завершено в датасете
DataFieldValue - значение, при котором карточка доступна только на чтение
Тело функции:
function IsArchive(DataFieldName, DataFieldValue){ if((!Connector.CurrentUser.IsAdmin) &&(dlData.Dataset(DataFieldName) == DataFieldValue)){ SetIsReadOnlyFields(Self, false); return; } SetIsReadOnlyFields(Self, true); } function SetIsReadOnlyFields(Window, IsEnabled) { for (var i = 0; i < Window.ComponentCount; i++) { var DataField = Window.Components(i).DataField; if(!IsUndefined(DataField)) { var Component = Window.Components(i); Component.IsEnabled = IsEnabled; } } }
Спасибо за ответы.
А можно сделать то же самое с обычными группами? (Если, например, пользователи будут сами перемещать заявки в группу "Архив")
Тут будет нужно немного больше кода. Физически информация о вхождении контрагента в группу находится в ds_AccountInGroup.
Т.е. нам нужно будет фильтровать датасет контакт в группе и по результатам применять атрибут "только чтение".
function IsArchive(GroupID){ var dsAccInGroup = Services.GetSingleItemByUSI('ds_AccountInGroup'); //проверяем вхождение в группу ApplyDatasetFilter(dsAccInGroup, 'AccountID', dlData.Dataset('ID'),true); //фильтруем по текущей записи в карточке ApplyDatasetFilter(dsAccInGroup, 'GroupID', GroupID,true); if((!Connector.CurrentUser.IsAdmin) &&(IsEmptyValue(dsAccInGroup)){ //если датасет пустой - не входит в группу SetIsReadOnlyFields(Self, false); return; } SetIsReadOnlyFields(Self, true); }
Естественно, вызывать функцию тогда нужно будет так:
IsArchive('{6BC9D098-6C64-4142-8615-321E56714C2F}');
Почему бы не воспользоваться стандартным функционалом "Запрет изменения данных"?
Такой вопрос ещё возник.
Допустим, есть запись, на которую ни у кого нет прав.
И есть группа, на которую у всех есть полный доступ.
Если запись переносится в эту группу, она всё равно остаётся без доступа?
Получается, права доступа группы - это права изменять собственно группу, а не записи в ней?
Здравствуйте, Ринат.
Да, Вы абсолютно правы. Права на группы раздаются отдельно, на записи - отдельно.
Запись будет видна пользователю (безразлично, в группе или нет) только если у пользователя есть права на эту запись.
Права доступа на группы регулируют только видимость самих групп в дереве групп слева.