Установить права в детали такие же, как у основной записи

Добрый день!

Каким образом в БП (используя элемент Edit access rights желательно) установить права на таблицу с деталями такими же, как у основной записи?
Например, на адреса контрагента такие же, как у самого контрагента (может, не лучший пример, но он далеко не единственный)

Нравится

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

Здравствуйте!

Процессом не получится. Давайте рассмотрим на Вашем примере. Предположим объект "Контрагент" администрируется по записям. Вся информация о правах хранится в таблице SysAccountRights.

Для реализации Вашей задачи Вам необходимо включить администрирование по записям для объекта "Средство связи контрагента".

Далее, Вам необходимо на событие "после сохранения записи" (процесс на объекте) либо на событие "после добавления записи"/"после изменения записи" создать бизнес процесс, который:

1) Удалит данные из таблицы SysAccountCommunicationRights для записей из таблицы AccountCommunication, у которых в поле AccountId содержится Id добавленной/измененной записи
2) Скопирует права из таблицы SysAccountRights для измененной/созданной записи в таблицу SysAccountCommunicationRights.

Элементом "Изменить права доступа" решить данную задачу не получится.

"Демьяник Алексей" написал:1) Удалит данные из таблицы SysAccountCommunicationRights для записей из таблицы AccountCommunication, у которых в поле AccountId содержится Id добавленной/измененной записи
2) Скопирует права из таблицы SysAccountRights для измененной/созданной записи в таблицу SysAccountCommunicationRights.

Как я понимаю, эти таблицы в AddData и DeleteData недоступны, и необходимо писать скриптом это всё? Может, есть готовый пример? Не верю, что ни у кого не возникало такой задачи.

И еще вопрос - как отследить, что изменились права на запись Контрагента, если это сделано вручную через Actions / Set up access rights? Чтобы сразу же изменить на подчиненные детали

Добрый день!

Раздавать права следует скриптом. Пример можно посмотреть в схеме RightsHelper (методы GetRecordRights, SetRecordRight).
Отследить изменение прав доступа в Account можно используя триггер в базе данных, при помощи sql запроса изменить права доступа на запись в детали.

Пример триггеров, на которых реализовали данную логику:

ALTER TRIGGER [dbo].[SysAccountRight_AI]
ON [dbo].[SysAccountRight]
AFTER INSERT
AS 
BEGIN
SET NOCOUNT ON;
DECLARE @SysAdminUnitId UNIQUEIDENTIFIER
SELECT @SysAdminUnitId = SysAdminUnitId FROM inserted
INSERT INTO [dbo].[SysAccountAddressRight]
( 
[RecordId]
,[SysAdminUnitId]
,[Operation]
,[RightLevel]
,[Position]
,[SourceId])
SELECT [det].[Id], [mast].[SysAdminUnitId], [mast].[Operation], [mast].[RightLevel], [mast].[Position], [mast].[SourceId] 
FROM [SysAccountRight] as [mast]
JOIN [AccountAddress] AS [det] ON [det].[AccountId] = [mast].[RecordId]
WHERE [mast].[SysAdminUnitId] = @SysAdminUnitId
INSERT INTO [dbo].[SysAccountBillingInfoRight]
( 
[RecordId]
,[SysAdminUnitId]
,[Operation]
,[RightLevel]
,[Position]
,[SourceId])
SELECT [det].[Id], [mast].[SysAdminUnitId], [mast].[Operation], [mast].[RightLevel], [mast].[Position], [mast].[SourceId] 
FROM [SysAccountRight] as [mast]
JOIN [AccountBillingInfo] AS [det] ON [det].[AccountId] = [mast].[RecordId]	
WHERE [mast].[SysAdminUnitId] = @SysAdminUnitId
END
ALTER TRIGGER [dbo].[SysAccountRight_FD]
ON [dbo].[SysAccountRight]
FOR DELETE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @AccountID UNIQUEIDENTIFIER
DECLARE @SysAdminUnitUD UNIQUEIDENTIFIER
DECLARE @Operation INT
SELECT @AccountID = [RecordId] FROM deleted
SELECT @SysAdminUnitUD UNIQUEIDENTIFIER
SELECT @Operation = [Operation] FROM deleted
SELECT @SysAdminUnitUD = [SysAdminUnitId] FROM deleted
DELETE
FROM [dbo].[SysAccountAddressRight]
WHERE [RecordId] IN (SELECT [det].[Id]
FROM [AccountAddress] AS [det]
WHERE [det].[AccountId] = @AccountID)
AND [Operation] = @Operation AND [SysAdminUnitId] = @SysAdminUnitUD
DELETE
FROM [dbo].[SysAccountBillingInfoRight]
WHERE [RecordId] IN (SELECT [det].[Id]
FROM [AccountBillingInfo] AS [det]
WHERE [det].[AccountId] = @AccountID)
AND [Operation] = @Operation AND [SysAdminUnitId] = @SysAdminUnitUD
END
ALTER TRIGGER [dbo].[AccountAddress_AI]
ON [dbo].[AccountAddress]
AFTER INSERT
AS 
BEGIN
SET NOCOUNT ON;
DECLARE @RecordId UNIQUEIDENTIFIER
SELECT @RecordId = Id FROM inserted
DECLARE @SysAdminUnitId UNIQUEIDENTIFIER
SELECT @SysAdminUnitId = Id FROM SysAdminUnit WHERE ContactId = (select CreatedById FROM inserted)
INSERT INTO [dbo].[SysAccountAddressRight]
( 
[RecordId]
,[SysAdminUnitId]
,[Operation]
,[RightLevel]
,[Position]
,[SourceId])
SELECT [mast].[Id], [det].[SysAdminUnitId], [det].[Operation], [det].[RightLevel], [det].[Position], [det].[SourceId] 
FROM [AccountAddress] AS [mast]
JOIN [SysAccountRight] AS [det] ON [det].[RecordId] = [mast].[AccountId]
WHERE [det].[SysAdminUnitId] <> @SysAdminUnitId AND [mast].[Id] = @RecordId
END
Показать все комментарии