Установить права в детали такие же, как у основной записи
Добрый день!
Каким образом в БП (используя элемент Edit access rights желательно) установить права на таблицу с деталями такими же, как у основной записи?
Например, на адреса контрагента такие же, как у самого контрагента (может, не лучший пример, но он далеко не единственный)
Нравится
Здравствуйте!
Процессом не получится. Давайте рассмотрим на Вашем примере. Предположим объект "Контрагент" администрируется по записям. Вся информация о правах хранится в таблице 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