Доступ к Файлам в детали Файлы раздела Документы

Доброго времени суток.
Есть раздел Документы в нем есть различные статусы, сам документ формируется в другом разделе и в его деталь Файлы записывается pdf файл отчета FR (Экспорт отчета FastReport в деталь Файлы в формате PDF для выделенных записей в реестре), так вот задача в том что бы пользователи не видели этот прикрепленный к Документу файл до тех пор пока не установлен статус Утверждено (статус Документа).
Таблица tbl_Files администрируется по записям, следовательно можно ограничить доступ всем группам и пользователям после самой записи документа в деталь, проще всего сделать это через UpdateQuery

var UpdateQuery = Services.GetNewItemByUSI('uq_FileRightInDocument');
                    UpdateQuery.ColumnsValues.ItemsByName('CanRead').Value = 0;
                        UpdateQuery.ColumnsValues.ItemsByName('CanWrite').Value = 0;
                        UpdateQuery.ColumnsValues.ItemsByName('CanDelete').Value = 0;                  
                        UpdateQuery.ColumnsValues.ItemsByName('CanChangeAccess').Value = 0;
                        var Parameters = UpdateQuery.Parameters;
                        SetParameterValue(Parameters, 'RecordID', FileID);
                        UpdateQuery.Execute();

UpdateQuery:

UPDATE [dbo].[tbl_FilesRight]
        SET [CanRead] = :CanRead,
        [CanWrite] = :CanWrite,
        [CanDelete] = :CanDelete,
        [CanChangeAccess] = :CanChangeAccess
WHERE([tbl_FilesRight].[RecordID] = :RecordID)

Так вот если мы зайдем под пользователем не админом, посмотрим в детали Файлы -> Операции -> Права доступа, увидим что прав как бы и нет (не стоят галочки), а файл пользователь все равно видит и может открыть. Подскажите что делать.

Конфигурация 3.4.0.87
SQL Server 2008

Нравится

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

Решение:
Убивать с tbl_FilesRight записи которые сгенерились триггером tbl_Files
DeleteQuery

DELETE FROM [dbo].[tbl_FilesRight]
WHERE([tbl_FilesRight].[RecordID] = :RecordID)
	var DeleteQuery = Services.GetNewItemByUSI('dq_FileRightInDoc');
	SetParameterValue(DeleteQuery.Parameters, 'RecordID', FileID);
	DeleteQuery.Filters.ItemsByCode('RecordID').IsEnabled = true;
	DeleteQuery.Execute();

По изменению, писать раздавать досуп
iq_GiveRightToFile:

INSERT INTO [dbo].[tbl_FilesRight] ([ID], [RecordID], [CanRead], [CanWrite], [CanDelete], [AdminUnitID])
VALUES (:ID, :RecordID, :CanRead, :CanWrite, :CanDelete, :AdminUnitID)
function dlDataOnDatasetAfterPost(Dataset) {
...
	var FileInDocByIdSq = Services.GetNewItemByUSI('sq_FileInDocById');
	FileInDocByIdSq.Parameters.ItemsByName('DocumentID').Value  = Dataset('ID');
 
	var DatasetFileInDocById = FileInDocByIdSq.Open();	 
 
	var SelectQuery = Services.GetNewItemByUSI('sq_FileRightInDoc');	
	SelectQuery.Parameters('RecordID').Value  =	 DatasetFileInDocById('FileID');
 
	var DatasetSq = SelectQuery.Open();
 
	if (Dataset('StateID') == '{670FDB86-A5EB-4AC0-9CCF-E303C5A8016E}' && (DatasetSq.RecordsCount == 0) )
	{
	var DocumentInsertQuery =  Services.GetNewItemByUSI('iq_GiveRightToFile');
    var ColumnsValues = DocumentInsertQuery.ColumnsValues;
    ColumnsValues.Items(0).Value = Connector.GenGUID();
    ColumnsValues.Items(1).Value = DatasetFileInDocById('FileID');
    ColumnsValues.Items(2).Value = 1;
    ColumnsValues.Items(3).Value = 1;
    ColumnsValues.Items(4).Value = 1;
    ColumnsValues.Items(5).Value = '{97490F89-2943-480D-9AFE-B1C95DE00010}'; //Все пользователи
	DocumentInsertQuery.Execute();			
	}
 
	DatasetFileInDocById.Close()
	DatasetSq.Close();
}

Тут нужно дописать цикл что бы пройтись по всему датасету FileInDocByIdSq (т.е для всех файлов в детали)

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