Коллеги, добрый день!

Можно ли скрыть для просмотра данные в определенных колонках реестра, для пользователей не являющихся ответственными за запись?

Нравится

5 комментариев

Штатными средствами такое сделать нельзя: есть отдельно права по колонкам, отдельно — по записям. Возможно, как-то с помощью программных доработок.

Возможно у кого-то был подобный опыт?

Возможно.
Если бы мне было нужно сделать что-то подобное, сделал бы веб-сервис, который проверяет текущего пользователя, сравнивает со значением ответственного и если совпадает — возвращает или записывает в базу значение нужного поля. Затем в карточке записи при открытии и сохранении использовал этот сервис. На странице реестра — в том же духе.
А на уровне прав доступа эти колонки бы запретил всем.

Спасибо!

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

Всем добрый день!
Столкнулись с такой проблемой: При импорте данных в карточку контактов, права по умолчанию про ставились только для человека, кто делал импорт. В поле "Ответственный" стоит ФИО другого человека, вариант отрывать карточку, заново вручную вводить ответственного, сохранять и использовать после сохранения GiveRightsToRecordOwner(Dataset); очень долгая работа, учитывай что контактов бывает уж очень много.

Подскажите как можно реализовать раздачу прав на чтение и редактирование через программный код, при нажатии на кнопку.

Нравится

5 комментариев

если конфигурация 3.4.1, то можно раздавать права одновременно на несколько (много) выделенных записей
если нет - придется написать скрипт
можно попробовать воспользоваться этим (только осторожно :cool:) http://www.community.terrasoft.ru/blogs/9611

Здравствуйте, Николай.

Для раздачи прав доступа ответственным на импортированные контакты, можете воспользоваться следующим скриптом:

insert into tbl_ContactRight (RecordID, AdminUnitID, CanRead, CanWrite, CanDelete, CanChangeAccess)
select c.ID, au.ID, 1, 1, 0, 0 -- 1 - разрешение, 0 - запрет
from tbl_Contact c inner join tbl_AdminUnit au on c.OwnerID = au.UserContactID
where c.CreatedOn > '2013-12-06 14:05' -- Дата и время импорта контактов

тогда уж

INSERT INTO tbl_ContactRight (RecordID, AdminUnitID, CanRead, CanWrite, CanDelete, CanChangeAccess)
SELECT c.ID, au.ID, 1, 1, 0, 0 -- 1 - разрешение, 0 - запрет
FROM tbl_Contact c INNER JOIN tbl_AdminUnit au ON c.OwnerID = au.UserContactID
WHERE c.CreatedOn > '2013-12-06 14:05' -- Дата и время импорта контактов
 
-- чтобы права там, где они есть, не продублировались
and not exists (select ID from tbl_ContactRight as CR where CR.RecordID = c.ID and CR.AdminUnitID = (select ID from tbl_AdminUnit where UserContactID = c.OwnerID))

Тоже верно. Спасибо, Дмитрий.

Всем большое спасибо за ответы!!)

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

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

Как известно, для создаваемых задач реализована функциональность выдачи прав доступа по умолчанию, запрещающих ответственному удалить задачу: функция 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 не вызывается для администраторов? Им не надо создавать права по умолчанию?

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