Доброе утро. Подскажите, пожалуйста, каким образом можно настроить права доступа к детали «Платежные реквизиты» раздела Контрагенты? Иначе получается, так, что любой пользователь системы может удалить запись в детали, которую не он создавал, даже при том условии, что контрагент ему открыт только на чтение.

Terrasoft XRM 3.3.2.43, СУБД MSSQL

Нравится

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

Думаю, для получения подобной возможности нужно реализовать в базовом окне реестра функционал прав доступа, подобный тому, который реализован в дереве групп.

Для реализации необходимо:

1) Добавить в список элементов контекстного меню окна wnd_BaseGridArea компонент ActionMenuItem с названием amiDetailAccessRights и заголовком "Права доступа". По умолчанию свойство IsVisible для него установить в false.
2) Создать обработчик события OnExecute для этого пункта меню. Текст обработчика будет примерно такой:

function amiDetailAccessRightsOnExecute(ActionMenuItem, Sender) {
	if (!Assigned(dlData.Dataset.SelectQuery)) {
		return;
	}
	var TableUSI = dlData.Dataset.SelectQuery.Items(0).FromTable.USI;
	OpenAccessWindow(TableUSI, dlData.Dataset.Values('ID'), 
		grdData.SelectedIDs);
}

3) Добавить в скрипт scr_BaseGridArea функцию:

function UpdateActionMenuItemsByTableAttributes() {
	if (!Assigned(dlData.Dataset.SelectQuery)) {
		return;
	}
	var Table = dlData.Dataset.SelectQuery.Items(0).FromTable;
	amiDetailAccessRights.IsVisible = (Table.IsAdministratedByRecords &&
		!Assigned(Self.Attributes('WorkspaceWindow')));
}

Эта функция проверяет, является ли таблица детали администрируемой по записям и является ли она деталью, а не реестром.

4) Добавить вызов этой функции в формирование контекстного меню реестра:

function amGridOnPrepare(ActionMenu, Control) {
	GridPopupMenuPrepare(Self, ActionMenu, BaseGridArea, dlData.Dataset);
	if (amiCallTo.IsVisible) {
		SetDatasetAttributesForCall(dlData.Dataset);
	}
	UpdateActionMenuItemsByTableAttributes();
}

5) После внесённых изменений для того, чтобы в контекстном меню реестра детали появился пункт "Права доступа", необходимо для таблицы реестра установить свойство "Администрируется по записям".

Если нет необходимости использовать данный функционал во всех окнах, которые наследуются от wnd_BaseGridArea, лучше реализовать его непосредственно в окне реестра детали.

Большое спасибо! Получилось сделать.

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

Раздел - [Клиенты]
Таблица - tbl_Customer
Главное окно раздела - wnd_CustomersWorkspace
Cкрипт - wnd_CustomersWorkspaceScript

Для создания детали "Описание" в разделе, необходимо выполнить следующие шаги:

1. Создать поле [Description] в таблице tbl_Customer типа BLOB (Большой бинарный обьект)

2. В окне раздела в компоненте pcDetails создать компонент [Page] c именем [pgDescriptionDetail]
В атрибуте [Caption] указать [Описание]

3. В компоненте [pgDescriptionDetail] создать компонент [WindowContainer] с именем [wndDescriptionDetail]
В атрибуте [Window] указать [wnd_Description]
Установить свойство [AlignHorizontal] в значение [alhClient]
Установить свойство [AlignVertical] в значение [alvClient]

4. В функцию RefreshDetails скрипта добавить строки:
else
if (pcDetails.ActivePage.Name == pgDescriptionDetail.Name) {
RefreshDescriptionDetail(BaseWorkspace, wndDescriptionDetail,
BaseWorkspace.GridDataset);
}
5. Сохранить изменения

Нравится

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

Для создания детали "Доступ" в разделе, необходимо выполнить следующие шаги:

1. Указать для таблицы раздела tbl_Customer опцию "Администрируется по записям", сохранить изменения, - создастся таблица [tbl_CustomerRight]

2. В окне раздела в компоненте pcDetails создать компонент [Page] c именем [pgAccessDetail]
В атрибуте [Caption] указать [Доступ]

3. В компоненте [pgAccessDetail] создать компонент [WindowContainer] с именем [wndAccessDetail]
В атрибуте [Window] указать [wnd_AccessGridArea]
Установить свойство [AlignHorizontal] в значение [alhClient]
Установить свойство [AlignVertical] в значение [alvClient]

4. В функцию RefreshDetails скрипта добавить строки:
else
if (pcDetails.ActivePage.Name == pgAccessDetail.Name) {
RefreshAccessDetail(BaseWorkspace, wndAccessDetail, 'tbl_CustomerRight');
}
5. Сохранить изменения

[легкий оффтопик] ...и с появлением мастера разделов стала жизнь разработчика чуть-чуть скучнее, не пришлось ему более проводить рутинные операции по созданию стандартных деталей и самого раздела:smile:

Можно сказать, что материал будет полезен тем, кто в силу разных причин работает с версией 3.0.х и 3.1.х. А с появлением мастера создания и редактирования разделов (wnd_CreateNewWorkspace) жизнь разработчика стала разнообразнее, поскольку теперь больше времени уделяется сложным нестандартным задачам.

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

Сейчас пытаюсь создать деталь, аналогичную стандартной детали «Описание», и столкнулся вот с какой проблемой: компонент RichDataControl не реагирует на действия пользователя — такое впечатление, что он неактивен, хотя свойство IsEnabled установлено в True.

Для детали я создал отдельную таблицу, SelectQuery, DataSet, окно и скрипт; затем в раздел «Контакты» добавил Page, на нем WindowContainer где в свойстве window прописал название своего окна (как, в общем-то и описано в первом сообщении в этой теме), отредактировал функцию RefreshDetails в скрипте, и на этом, собственно, все и закончилось :)

Коллеги, кто-нибудь сталкивался с такой проблемой?
Версия программы — 3.0.1.

Здравствуйте, Андрей.

Попробуйте в атрибуте Window данного окна прописать не название Вашего окна, а wnd_Description, насколько мы видим из описания Ваших действий, проблема может быть именно в этом.

Инна Безверхняя,
II линия службы поддержки Terrasoft.

Инна, спасибо за ответ.
К сожалению, предложенные Вами действия эффекта не возымели — RichDataControl все так же игнорирует мои попытки хоть что-то в нем написать :)

Что еще более интересно — даже если я создаю точную копию детали «Описание», я получаю ту же саму проблему.

Здравствуйте, Андрей.
Напишите пожалуйста письмо с описанием данной проблемы на support@tscrm.com и мы постараемся решить ее в индивидуальном порядке.

Инна Безверхняя,
II линия службы поддержки Terrasoft.

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

У меня возникла такая же проблема. При добавлении детали аналогичной стандартной детали "Описание", RichDataControl не реагирует на действия пользователя.
Подскажите, пожалуйста, выход из данной ситуации.

Забыла подключить scr_WindowUtils в скрипте окна, теперь все работает =)

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