Установка прав доступа по умолчанию на создаваемые записи в Terrasoft

Доброго времени суток всем!

Как известно, для создаваемых задач реализована функциональность выдачи прав доступа по умолчанию, запрещающих ответственному удалить задачу: функция GiveRightsToRecordOwner(Dataset).

Но, возникает необходимость, некоторым пользователям ограничить доступ и на другие записи, какого-либо раздела конфигурации, а это происходит на уровне СУБД, хранимыми процедурами.

Предлагаю вариант, позволяющий переназначить права доступа к записи пользователю, в момент когда он ее создает. Для этого, в сервис scr_Access добавим новую функцию :

function UpdateRightsToRecordOwner(Dataset) {

         var OwnerIDDataField = Dataset.DataFields('OwnerID');
     
     if (!OwnerIDDataField || !OwnerIDDataField.IsEnabled) {
          var OwnerID = Connector.CurrentUser.ContactID;
     }  else {
          var OwnerID = OwnerIDDataField.Value;
     }
                   
     var RightsDataset = GetItemRightsDatasetByItemDataset(Dataset);
     var RecordID = Dataset.KeyDataField.Value;
     var AdminUnitID = GetAdminUnitIDByUserContactID(OwnerID);
     
     ApplyDatasetFilter(RightsDataset, 'RecordID', RecordID, true);
     ApplyDatasetFilter(RightsDataset, 'UserContactID', OwnerID, true);
     EnableDatasetFields(RightsDataset, false); // Disable all datafields
     EnableDatasetFields(RightsDataset, true, ['ID']); // Enable the only one
     RightsDataset.Open();
     
          try {
              if (!RightsDataset.IsEmptyPage) {
                            RightsDataset.Edit();
                            RightsDataset.ValAsBool('CanDelete') = false;
                            RightsDataset.ValAsBool('CanChangeAccess') = false;
                            RightsDataset.Post();
              }
         } finally {
                   RightsDataset.Close();
         }

}

В разделе, к примеру, Контрагенты, в сервисе scr_Account на событие в обработчик события function SelfOnDatasetAfterPost(Dataset) вставьте вызов новой функции.

Рекомендую также сделать проверку на принадлежность пользователя к группе администраторв, перед вызовом функции ;)

        if (!Connector.CurrentUser.IsAdmin) {
                UpdateRightsToRecordOwner(Dataset);    
        }

На зебудьте подключить сервис scr_Access к scr_Account :wink:

Нравится

Поделиться

1 комментарий

Павел, есть вопросы:
1. Как используется эта строчка:

var AdminUnitID = GetAdminUnitIDByUserContactID(OwnerID);

2. Зачем проверка, что RightsDataset.IsEmptyPage не пустой?
3. Почему такая логика:

                            RightsDataset.ValAsBool('CanDelete') = false;
                            RightsDataset.ValAsBool('CanChangeAccess') = false;

4. Почему функция UpdateRightsToRecordOwner не вызывается для администраторов? Им не надо создавать права по умолчанию?

Показать все комментарии