Задача:
Разделение права доступа на записи в справочнике Валют
Вводная:
Есть много офисов компании, например Московскому офису совершенно не интересно каждый раз выбирать валюту UAH, DKK и.т.д. следовательно логично разграничить доступ на валюты

Решение:
1. tbl_Currency -> поставить галочку Is Administrated By Records
2. wnd_CurrencyDictionary
a) Добавить pgAccessDetail
б) wndAccessDetail -> Window = wnd_AccessGridArea
в) Pages -> определить событие PagesOnChangeActivePage

3.wnd_CurrencyDictionaryScript
a) Use Scripts -> scr_WorkspaceUtils
Код самого скрипта нужно поменять следующим образом :

//------------------------------------------------------------------------------
// wnd_CurrencyDictionaryScript
//------------------------------------------------------------------------------

var CurrencyDictionary = new Object();
var BaseWorkspace = new Object();

function InitializeGridData() {
        CurrencyDictionary.CurrencyWindow = wndCurrency.Window;
        CurrencyDictionary.CurrencyWindow.Prepare();   
}

function InitializeCurrencyRateDetail() {
        CurrencyDictionary.CurrencyRateWindow = wndCurrencyRateDetail.Window;
        CurrencyDictionary.CurrencyRateWindow.Prepare();
}

function InitializeGlobalVariables() {
        CurrencyDictionary.CurrencyDataset = GetDatasetFromWindow(
                CurrencyDictionary.CurrencyWindow, DefDatasetLinkName);
        CurrencyDictionary.CurrencyRateDataset = GetDatasetFromWindow(
                CurrencyDictionary.CurrencyRateWindow, DefDatasetLinkName);
}

function InitializeGlobalDatalinks() {
        dlCurrency.Dataset = CurrencyDictionary.CurrencyDataset;
        dlCurrencyRate.Dataset = CurrencyDictionary.CurrencyRateDataset;
}

function OpenCurrencyDataset() {
        CurrencyDictionary.CurrencyDataset.Open();
}

function Initialize(Window) {
        InitializeGridData();
        InitializeCurrencyRateDetail();
        InitializeGlobalVariables();
        InitializeGlobalDatalinks();
        OpenCurrencyDataset();
}

function RefreshCurrencyRate() {
    CurrencyDictionary.CurrencyDataset.Open();
        var CurrencyID = CurrencyDictionary.CurrencyDataset.Values('ID');
        if (CurrencyID == null) {
                return;
        }
        SetAttribute(CurrencyDictionary.CurrencyRateWindow, 'ParentItemID',
                CurrencyID);
        RefreshDetailData(CurrencyDictionary.CurrencyDataset, 'ID',
                CurrencyDictionary.CurrencyRateDataset, 'CurrencyID');
}

// ----------------------------------------------------------------------------
// Event handlers
// ----------------------------------------------------------------------------

function wnd_CurrencyDictionaryOnPrepare(Window) {
        Initialize(Window);
}

function dlCurrencyOnDatasetAfterOpen(Dataset) {
//      RefreshCurrencyRate();
RefreshDetails()
}

function dlCurrencyOnDatasetAfterPositionChange(Dataset) {
//      RefreshCurrencyRate();
RefreshDetails()
}

function dlCurrencyOnDatasetRefreshRecord(Dataset, KeyValue, AddNewRecordOnPage) {
        if (AddNewRecordOnPage) {
//              RefreshCurrencyRate();
        RefreshDetails()
        }
}

function wnd_CurrencyDictionaryOnNotify(ScriptableService, Sender, Message, Data) {
        if (Message == MSG_CLOSE) {
                CloseWindow(Self);
        }
}


function PagesOnChangeActivePage(Pages) {
        RefreshDetails();
}

function RefreshDetails() {
        if (Pages.ActivePage.Name == pgCurrencyRate.Name) {
                RefreshCurrencyRate();
        } else
        if (Pages.ActivePage.Name == pgAccessDetail.Name) {

        //26.06 Create BaseWorkspace
        var Grid = wndCurrency.Window.ComponentsByName('grdData');     
        BaseWorkspace.GridDataset = CurrencyDictionary.CurrencyDataset;
        BaseWorkspace.Grid = Grid

        RefreshAccessDetail(BaseWorkspace, wndAccessDetail, 'tbl_CurrencyRight');
        }
}

Нравится

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

Мне кажется, как раз не логично решать задачу доступом - если Московскому офису все-таки понадобятся закрытые от них валюты?
Имхо лучше сделать какую-нибудь детальку типа CurrencyInDepartment и фильтровать справочник валют по данным оттуда. Хотя, такая реализация немного сложнее

Дмитрий совсем Вас не понял. Права доступа разделяются на группы All Users -> Moscow -> Managers Moscow, All Users -> Moscow -> Accountant Moscow и.т.д. и как раз на группы и раздаются права.
При таком подходе Московский офис не видит не нужные им валюты, а если например бухгалтеру необходимо видеть что то дополнительно, ему раздаются права доступа (на группу Accountant Moscow)

А то что вы предлагаете очень лихо в силу того что Валюты - это очень базовый справочник

"Яворский Алексей" написал: то что вы предлагаете очень лихо в силу того что Валюты - это очень базовый справочник

С этим не поспоришь, хотя и не "очень"
Разница есть только в том, что в вашем варианте нужен кто-то сверху, кто будет права раздавать, а в моем - пользователи сами смогут этим заниматься

Даже проще можно сделать:
*добавить таблицу CurrencyInUser
*в датасет справочника валют добавить булево поле подзапроса "Показывать мне"

(select 
....
(select ShowForMe from tbl_CurrencyInUser where CurrencyID = tbl_Currency.ID and UserID = :CurrentUserContactID)
....
from tbl_Currency)

*создать логику автозаполнения tbl_CurrencyInUser при создании нового пользователя и валюты
*наложить на датасет валют фильтр where ShowForMe = 1
*для грида справочника отключать фильтр

Алексей, спасибо за пример реализации. Так держать! :)

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