Добрый день!

Как Вы знаете, в карточке редактирования может быть представлено несколько представлений. Иногда требуется ограничить доступ к этому представлению некоторой группе пользователей. Этот функционал можно дополнительно реализовать средствами Terrasoft Administrator. Ниже приведу сам алгоритм, на примере карточки редактирования раздела "Продукты", в которой существует представление "Движение по складу", доступ к которому мы ограничим.

Итак, прежде всего необходимо открыть скрипт wnd_OfferingEditScript и в конец скрипта добавить следующую функцию:

function IsUserInGroup(GroupID)
{
        var Dataset = Services.GetSingleItemByUSI('ds_AdminUnit');
        ApplyDatasetFilter(Dataset, 'UserContactID', Connector.CurrentUser.ContactID, true);
        Dataset.Open();
        var UserID = Dataset.ValAsGUID(IDFieldName);
        Dataset.Close();
        var Dataset = Services.GetSingleItemByUSI('ds_UserInGroup');
        ApplyDatasetFilter(Dataset, 'GroupID', GroupID, true);
        ApplyDatasetFilter(Dataset, 'UserID', UserID, true);
        Dataset.Open();
        var Is = (Dataset.RecordsCount > 0);
        Dataset.Close();
        return Is;
}

Приведенная выше функция, в случае если текущий пользователь системы входит в указанную нами группу пользователей, возвращает значение true, в ином случае - false.

Далее необходимо отредактировать функцию function wnd_OfferingEditOnPrepare(Window). В ней добавим следующую проверку:

function wnd_OfferingEditOnPrepare(Window) {
        scr_BaseDBEdit.wnd_BaseDBEditOnPrepare(Window);
        Initialize(Window);            
        if(!Connector.CurrentUser.IsAdmin)
        {
                var UsrDataset = Services.GetSingleItemByUSI('ds_UserInGroup');                  
                var GroupName = 'Название';
                //где 'Название' - имя группы пользователей, для которых нужно ограничить доступ к представлению         
                ApplyDatasetFilter(UsrDataset, 'GroupName', GroupName, true);
                //тут следует не забыть создать фильтр сравнения в сервисе sq_UserInGroup (см. скриншот ниже)
                UsrDataset.Open();             
                var GroupID = UsrDataset.Values('GroupID');
                if(IsUserInGroup(GroupID))
                {
                        //скрываем само представление, установив свойству IsVisible значение false
                        pgOfferingAnalytic.IsVisible = false;  
                }
                UsrDataset.Close();
        }
       
}

Так же, перед тестированием результатов, следует создать фильтр сравнения в сервисе sq_UserInGroup:

2
3

После этого не забудьте сохранить изменения и перезапустить клиентское приложение Terrasoft.

Нравится

Поделиться

2 комментария

Воспользовался вашим примером переработав функцию получения группы пользователя, у меня она выглядит так:

    var GroupDataset = Services.GetSingleItemByUSI('ds_UserInGroup');
    ApplyDatasetFilter(GroupDataset, 'UserID', UserID, true);
	     GroupDataset.Open();
	      GroupDataset.GotoNext();     //берем второе значение, так как первая по порядку группа 'Все пользователи'                 
         var GroupID = GroupDataset.ValAsStr('GroupID'); 
         GroupDataset.Close();

Большое спасибо за Ваш пример, очень пригодился!

В принципе есть базовая функция в scr_Access называется GetIsUserInGroup, делает примерно тоже самое только немного написана по другому

function GetIsUserInGroup(UserName, GroupID) {
	var sqGetIsUserInGroup = GetSingleItemByCode('sq_GetIsUserInGroup');
	SetParameterValue(sqGetIsUserInGroup.Parameters, 'GroupID', GroupID);
	SetParameterValue(sqGetIsUserInGroup.Parameters, 'UserName', UserName);
	var dsRes = sqGetIsUserInGroup.Open();
	try {
		return dsRes('IsExists') != 0;
	} finally {
		dsRes.Close();
	}
}
Показать все комментарии

Реестр записей содержит несколько представлений. На нажатие кнопки "Добавить" в форме создания новой записи необходимо проставить некоторые значения в зависимости от выбраного фильтра. Скажите пожалуйста, можно ли узнать какое представление выбрано в обработчике OnPrepare окна создания записи? Или же необходимо записывать его в глобальную переменную в обработчике события ActiveViewChange грида?

Нравится

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

SDK
Смотрите в имя, например :wink:

Спасибо за ответ, но я немного не то спрашивал.
Я имел ввиду можно ли в методах обработки событий формы создания новой записи вытянуть это значение, то есть можно ли доступиться до грида реестра записей. Но я уже сам разобрался как мне реализовать задачу :smile:

хотя, конечно, не уверен насколько я правильно и корректно это сделал, я только начинаю изучать XRM.
В обработчике нажатия кнопки "добавить" я прописал

BaseGridArea.AddDataDefaultValues('ActiveView') = Self.ComponentsByName('grdData').ActiveView.Name;

а потом в функции установки дефолтных значений вытянул при помощи

var ActiveView = GetAttribute(this.scr_WindowUtils.WinCache_Windows[0].Instance, 'DefaultValues')('ActiveView');

Для какого раздела делаете функционал?
Правильнее действовать по следующей схеме:
1) Находим функцию, где устанавливаются значения по умолчанию для окна редактирования. (DefaultValues)
2) В ней проверить какая вкладка была активна. Но лучше использовать метод, когда окно реестра устанавливает еще не открытому окну редактирования дополнительный атрибут, а не наоборот.

Уточните раздел, пожалуйста, тогда ответить будет проще.

Мне кажется, проще было бы в обработчике кнопки добавить название активного представления в атрибуты:

Attributes('ActiveView') = Self.ComponentsByName('grdData').ActiveView.Name;

и в той же функции установки дефолтных значений

var ActiveView = Window.Attributes('ActiveView');

при условии, что эти атрибуты были переданы объекту Window.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Раздел - Счета.
Функцию нашёл.
Это

FillInvoiceDefaultValues(Dataset)

в файле ds_InvoiceScript

Перекройте обработчик события btnAddOnClick (только не забудьте вызвать базовый) и в нем передавайте значения по умолчанию через BaseGridArea.AddDataDefaultValues, все остальное сделают базовые скрипты.

FillInvoiceDefaultValues(Dataset) изменять в Вашем случае нерационально.

"Агутин Алексей" написал:Перекройте обработчик события btnAddOnClick (только не забудьте вызвать базовый) и в нем передавайте значения по умолчанию через BaseGridArea.AddDataDefaultValues, все остальное сделают базовые скрипты.

Да, таким образом работает. Спасибо :)
Хотя не хотелось бы нагружать каждый обработчик (в том числе и если добавляю счета через детали) похожей логикой.

Но всё равно, Вы мне предоставили достаточно вариантов решения вопроса, полагаю я уже придумаю как бы всё лучше реализовать.

Спасибо огромное.

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

Думаю, особенно полезна эта информация будет тем, кто использует MS SQL Server Express (ввиду отсутствия настройки Analysis Services, необходимой для моделирования куба) и желает работать с разделом OLAP.
Для того, чтобы работать с разделом OLAP можно также использовать View-представления.

Поясню, что это. View, в отличие от обычных таблиц реляционной БД, не является самостоятельной частью набора данных, хранящегося в базе. Содержимое представления строится из набора полей нескольких таблиц и динамически вычисляется на основании данных, находящихся в этих таблицах. Изменение данных в реальной таблице БД немедленно отражается в содержимом всех представлений, построенных на основании этой таблицы.

Итак, показываю на практике как строится View и настраивается его соединение с разделом OLAP:
1. Запускаем MS SQL Server. Выбираем рабочую базу и открываем папку Views.
2. При помощи контекстного меню NewView добавляем новое представление:

3.  Предварительно необходимо определиться, по каким полям нужно настроить OLAP, а также в какие таблицы эти поля входят. В новом появившемся окне создаем набор таблиц базы (это может быть либо одна таблица, либо несколько - в зависимости от поставленных Вами задач). После того, как таблицы будут выбраны, нажмите на  кнопку  "Close".

4. В следующем окне необходимо создать набор полей, входящих в разные таблицы, кликнув в каждом требующемся поле мышью. Все выбранные поля отобразятся в нижней части.

5. Здесь же, используя кнопки панели инструментов Вы можете добавить фильтры, группировки, ограничения и т.д.
6. Когда все будет сформировано, закрываем созданный View и даем ему название.
7. Далее запускаем рабочее приложение Terrasoft CRM, переходим в раздел OLAP. Слева при помощи опции контекстного меню "Добавить куб" добавляем новую запись.
8. Нажимаем на кнопку "Параметры подключения". В появившемся окне выбираем опцию "+Подключение к новому источнику данных.odc":

9. В качестве мастера подключения данных выбираем Microsoft SQL Server.
10. Далее вводим параметры, необходимые для подключения к серверу БД.
11. Выбираем нужную базу и созданный View. Также советую Вам предварительно позаботиться о том, чтобы название Вашей базы не содержало никаких знаков препинания (точек, запятых, подчеркиваний и т.д.), а также цифры, поскольку по этой причине список таблиц и представлений в нижеуказанном списке не будет отображаться.

12. Нажимаем на кнопку "Готово".
13. Теперь Вы можете вытягивать с списка поля в нужные Вам области для отображения данных в удобном для Вас виде.

Заметьте, что при изменении данных в таблицах, эти данные будут меняться в View, и следовательно в разделе OLAP.

Желаю удачи!

С уважением,
Мельникова Екатерина

Нравится

Поделиться

2 комментария

то же самое относится и к Firebird?

Владимир, дело в том, что создать View на Firebird - не является проблемой. Все настройки аналогичны построению View на MS SQL Server (во всяком случае при использовании утилиты IBExpert). Но вся проблема заключается в том, что в Terrasoft предусмотрена настройка соединения только с СУБД MS SQL.
Но думаю, что со временем такая возможность в приложении Terrasoft CRM будет реализована :)
http://community.terrasoft.ua/node/3097

Мельникова Екатерина

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