Права на доступ к детали Адреса в разделе Контрагенты

Можно ли текущими средствами настройки, настроить доступ в разделе Контрагенты на чтение, НО дать доступ на изменение детали Адреса, чтоб пользователь не имея доступа к редактированию карточки мог бы вносить адреса на деталь.

Нравится

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

Добрый день!
Да, конечно можно.

Создайте новую группу таблиц:

http://www.community.terrasoft.ua/system/files/1_66.png

Затем выберите ее для таблицы адресов контрагента:

http://www.community.terrasoft.ua/system/files/2_44.png

При добавлении в таблицу реквизита Группа таблиц и обновлении информации в БД - ошибка

---------------------------
Warning
---------------------------
Конфликт инструкции ALTER TABLE с ограничением FOREIGN KEY "FAccountAddressCityID". Конфликт произошел в базе данных "TSDistr", таблица "dbo.tbl_City", column 'ID'.
---------------------------
OK
---------------------------

С этим разобрался, были ссылки в таблице на несуществующие объекты - удалил, таблица обновилась, НО это просто доступ к объекту Адреса Контрагентов, но на детали Адреса контрагентов, по существующим записям кнопки Добавить/Удалить не становятся активными, для пользователя у которого нет доступа к Карточке Контрагента, т.е. в доступе его группы к контрагенту нет права на Изменение, а я хочу не давая права на редактирование записей в таблице Контрагенты, дать доступ на редактирование Адресов.

ТОчнее даже не так, условия такие, есть группа пользователей Офис-Менеджеры, они имеют доступ на просмотр всех контрагентов, но прав на редактирование "чужих" записей у них нет, НО они занимаются обработкой корреспонденции и зачастую вносят почтовые адреса компаний, т.к. к менеджеру не всегда попадает эта информация.

Здравствуйте, Руслан!

После того, как Вами был добавлен объект администрирования Адреса контрагентов и обновлена соответствующя таблица, Вам необходимо раздать права на этот объект всем пользователям и группам в разделе Администрирование, поскольку при добавлении нового объекта администрирования на него нет никаких прав.

Ну это-то я и так понял, но насколько я понимаю модель доступа в Террасофте,
1. Уровень это доступ к объектам системы в принципе,этот доступ устанавливается на вкладке Доступ к Группам таблиц.
2. Это доступ других пользователей к объектам которые создает Пользователь, соответственно, если к объекту не настроены Права доступа по-умолчанию, то кроме Пользователя и Администратора к этим объектам никто доступа не будет иметь.
После создания и разграничения Доступа к Группе таблиц - пользователи будут иметь право создавать и т.д. эти объекты, это я уже сделал. Объясните мне как к этой Группе таблиц настроить Доступ По умолчанию, таким образом, чтоб я мог дать право определенной группе Редактировать и Добавлять записи на Деталь Адреса, НО иметь доступ только на Чтение к объекту Контрагент?

Руслан, для этого Адреса контрагентов и Контрагенты должны быть разными объектами администрирования.

Соответственно, у Вашей группы будет доступ Только чтение на объект администрирования Контрагенты, и доступ на создание и изменение к объекту Адреса контрагентов.

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

"Alimova Anna" написал:Руслан, для этого Адреса контрагентов и Контрагенты должны быть разными объектами администрирования.

А что в БД - это один объект? Или тогда какие права Мы настраиваем? Насколько я понимаю доступ к к большинству объектов в Разделах террасофт интегрирован с системой безопасности Сервера БД, на котором реализована БД.
Короче говоря, я не совсем понимаю, что вы мне хотите сказать. Попытаюсь объяснить, что я сделал на практике.
1. Создал группу таблиц как рекомендовал Гакало Игорь.
2. Зарегистрировал эту группу в Таблице Адреса Контрагентов.
3. Переоткрыл модуль Террасофта.
4. Назначил права на Чтение/Добавление/Редактирование группе Офис-менеджеры на эту Группу таблиц.
5. Назаначил аналогичные права, только еще и удаление всем группам пользователей, которые имеют права на добавление и редактирование таблицы Контрагенты.
Права доступа по-умолчанию к таблице Контрагенты у группы Офис-менеджеры,для Контрагентов, которых создают другие пользователи - ЧТЕНИЕ.
6. Захожу под паролем пользователя, который добавлен в группу Офис-менеджеры, устанавливаю курсор на Контрагента , который создан не членом группы Офис-менеджеры, перехожу на деталь Адреса - вуаля кнопка Добавить НЕАКТИВНА.... я что-то делаю не так?

Руслан, все права доступа наследуются от корневой группы. В данном случае - группы все пользователи. Попробуйте раздать для группы Все пользователи полные права, и ограничивать их для дочерних.

Мне не нужны в базе полные права для группы Все пользователи, группа Все пользователи у меня в базе имеет ограниченные права и только на чтение некоторых объектов. Более полная раздача прав идет по Целевым группам пользователей, для которых прописаны более развернутые права. И если мне не изменяет память, когда я знакомился с Террасофтом меня учили, что наличие прав на доступ имеет приоритет над отсутствием прав..., т.е. каким образом я буду ограничивать права?

Руслан, попробуйте удалить пользователя из группы Офис-менеджеры и добавить снова, чтобы ему перераздались права на роли на уровне базы данных.

Да вообще-то он был экспериментальный, этот пользователь, я его после всех вышеописанных действий добавил в группу Офис-менеджеры, хотя попробую...

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

Вот прикрепляю скрин-шоты:
1. ПРава на доступ к Группе таблиц Адреса Контрагентов
2. Добавление Пользователя в Группу Офис-Менеджеров
3. Окно программы под пользователем добавленным в Группу Офис-Менеджеры.

Здравствуйте, Руслан!

По результатам сеанса удаленного доступа выяснилось следующее: для версии Terrasoft 3.3.0 скрипт проверки доступности на редактирование учитывает в том числе доступность на редактирование родительской записи для детали.

Было исправлено в скрипте обработки базового окна на предмет доступности записи раздела Контрагенты хотя б на чтение, а т.к. у меня в базе пользователи группы Все пользователи имеют доступ на чтение к разделу Контрагенты, то меня этот вариант устраивает.

function UpdateButtonsByDataset(Window, BaseGridArea, Dataset) {
//debugger;
	var CanUpdateWorkspaceDataset = true;
	if (Assigned(BaseGridArea.WorkspaceDataset)) {
	    if (IsDatasetEmpty(BaseGridArea.WorkspaceDataset)) {
	        CanUpdateWorkspaceDataset = false;
		} else {
	    	CanUpdateWorkspaceDataset =
				(GetCanUpdateTableGroup(BaseGridArea.WorkspaceDataset)
					&& (BaseGridArea.WorkspaceDataset.
//				  GetCurrentRecordAccessLevel() == tfalFullAccess));
				  GetCurrentRecordAccessLevel() == dfalReadAccess));
		}
	}
	var IsEnabled = !IsDatasetEmpty(Dataset) && CanUpdateWorkspaceDataset;
	EnableControl(Window.ComponentsByName('btnCopy'), IsEnabled);
	EnableControl(Window.ComponentsByName('btnEdit'), IsEnabled);
	EnableControl(Window.ComponentsByName('btnDelete'), IsEnabled);
	ReadParentAttributes(Window, BaseGridArea);
	UpdateAddButtonByDataset(Window.ComponentsByName('btnAdd'), Dataset,
		BaseGridArea, !CanUpdateWorkspaceDataset);
}

Вопрос закрыт

А не совсем вопросик-то закрылся :-( случайно заметил - раньше не обратил внимание, что теперь у пользователей с правами Администраторы - в Разделах Контрагенты и Контакты - на детали Адреса Контрагентов и Средства связи панель инструментов задизейблена - нельзя больше оттуда добавлять и редактировать записи, только через Карточку. Но если Средства связи еще можно добавлять на деталь через карточку.. то Адреса только обновлять...Помогите пожалуйста, где покрутить...

Пользователи с правами Администраторы у меня входят в группу BOSS, я этим пользователям естественно раздал полные права на Группу таблиц Адреса контрагентов, кроме этого эта группа имеет полный доступ По-умолчанию ко всем объектам, которые создают пользователи системы... Я уже и удалял пользователей из группы и добавлял повторно, чтоб права обновились - нет ничего не помогает...

Руслан, предоставьте, пожалуйста, скрипт scr_Access в техническую поддержку для анализа.

Прикладываю к сообщению

Здравствуйте, Руслан!

В силу структуры базы данных у нас есть два варианта:

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

2. Сделать универсальное решение, при котором если для таблицы детали не задана группа администрирования, используются права элемента-родителя, а если задана - самой детали.

Однако в этом случае для деталей, в которых используются реестры разделов, права будут соответствовать правам пользователя в соответствующем разделе.

Пример: если у пользователя есть право на добавление и изменение воздействий, то он сможет добавить запись на деталь Воздействия, даже если на Контрагента права только на чтение.

Откройте скрипт scr_BaseGridAreaUtils и замените программный код следующих функций:

function InitializeButtons(Window, BaseGridArea, Dataset) {
	SetGridAreaButtonsFrameVisibleState(Window, BaseGridArea);
    var CanUpdateWorkspaceDataset = true;
    if (Assigned(BaseGridArea.WorkspaceDataset)) {
	    CanUpdateWorkspaceDataset =
			(GetCanUpdateTableGroup(BaseGridArea.WorkspaceDataset)
			|| (!IsEmptyValue(GetParentTableGroup(Dataset))));
	}
	var CanInsert = GetCanInsertTableGroup(Dataset) && CanUpdateWorkspaceDataset;
	EnableControlByTableGroupRight(Window.ComponentsByName('btnAdd'),
		CanInsert);
	EnableActionMenuItemByTableGroupRight(
		Window.ComponentsByName('amiAddAction'), CanInsert);
	EnableControlByTableGroupRight(Window.ComponentsByName('btnCopy'),
		CanInsert);			
	EnableActionMenuItemByTableGroupRight(
		Window.ComponentsByName('amiCopyAction'), CanInsert);				
	var CanEdit = GetCanUpdateTableGroup(Dataset) && CanUpdateWorkspaceDataset;
	EnableControlByTableGroupRight(Window.ComponentsByName('btnEdit'),
		CanEdit);
	EnableActionMenuItemByTableGroupRight(
		Window.ComponentsByName('amiEditAction'), CanEdit);		
	var CanDelete = GetCanDeleteTableGroup(Dataset) && CanUpdateWorkspaceDataset;
	EnableControlByTableGroupRight(Window.ComponentsByName('btnDelete'),
		CanDelete);
	EnableActionMenuItemByTableGroupRight(
		Window.ComponentsByName('amiDeleteAction'), CanDelete);		
	var CanRead = GetCanReadTableGroup(Dataset);	
	SetAttribute(Window, 'CanReadRight', CanRead);		
	SetAttribute(Window, 'CanInsertRight', CanInsert);	
	SetAttribute(Window, 'CanEditRight', CanEdit);	
	SetAttribute(Window, 'CanDeleteRight', CanDelete);
}
function UpdateButtonsByDataset(Window, BaseGridArea, Dataset) {
	var CanUpdateWorkspaceDataset = true;
	var CanUpdateDetail = !IsEmptyValue(GetParentTableGroup(Dataset)) 
							&&  GetCanUpdateTableGroup(Dataset)
							&& (Dataset.GetCurrentRecordAccessLevel() == tfalFullAccess);
	if (Assigned(BaseGridArea.WorkspaceDataset)) {
	    if (IsDatasetEmpty(BaseGridArea.WorkspaceDataset)) {
	        CanUpdateWorkspaceDataset = false;
		} else {
	    	CanUpdateWorkspaceDataset =
				(GetCanUpdateTableGroup(BaseGridArea.WorkspaceDataset)
					&& (BaseGridArea.WorkspaceDataset.
				  GetCurrentRecordAccessLevel() == tfalFullAccess));
		}
	}
	var IsEnabled = !IsDatasetEmpty(Dataset) && (CanUpdateWorkspaceDataset || CanUpdateDetail);
	EnableControl(Window.ComponentsByName('btnCopy'), IsEnabled);
	EnableControl(Window.ComponentsByName('btnEdit'), IsEnabled);
	EnableControl(Window.ComponentsByName('btnDelete'), IsEnabled);	
	EnableControl(Window.ComponentsByName('amiCopyAction'), IsEnabled);
	EnableControl(Window.ComponentsByName('amiEditAction'), IsEnabled);
	EnableControl(Window.ComponentsByName('amiDeleteAction'), IsEnabled);		
	ReadParentAttributes(Window, BaseGridArea);
	UpdateAddButtonByDataset(Window.ComponentsByName('btnAdd'), Dataset,
		BaseGridArea, !CanUpdateWorkspaceDataset);
	UpdateAddButtonByDataset(Window.ComponentsByName('amiAddAction'), Dataset,
		BaseGridArea, !CanUpdateWorkspaceDataset);		
}

"Alimova Anna" написал:Однако в этом случае для деталей, в которых используются реестры разделов, права будут соответствовать правам пользователя в соответствующем разделе.

Пример: если у пользователя есть право на добавление и изменение воздействий, то он сможет добавить запись на деталь Воздействия, даже если на Контрагента права только на чтение.


Ну а разве это не правильно? Если пользователь имеет права на добавление Воздействия, какая разница, где он его будет добавлять?
Список скриптов, которые вы сдесь привели именно для такого варианта? Меня он полностью устаивает - считаю его логичным с точки зрения модели доступа к объектам в Террасофте. А если к примеру пользователь имеет доступ к разделу Контрагенты, НО не имеет доступ к Воздействиям, он же его тоже не сможет добавить на деталь?

К сожалению после изменения скриптов, стали сыпаться ошибки в разделе Почта, который для нас разработал Е. Либин
[12.07.26 17.26.22.631] (E) Ошибка выполнения метода 'wnd_LTMailGridAreaOnPrepare'. OLE error 80020101 «Call Stack»
[12.07.26 17.26.23.269] (E) Ошибка выполнения метода 'wnd_FileInLTMailGridAreaOnPrepare'. OLE error 80020101 «Call Stack»
[12.07.26 17.26.25.937] (E) Ошибка выполнения метода 'wnd_FileInLTMailGridAreaOnPrepare'. OLE error 80020101 «Call Stack»
[12.07.26 17.27.18.697] (E) Ошибка выполнения метода 'wnd_FileInLTMailGridAreaOnPrepare'. OLE error 80020101 «Call Stack»
у П.Фильковского есть образец нашей базы с этим разделом не могли бы вы проверить эти скрипты там.

На имеющейся у нас базе данных нет установлен модуль LITerra.

Для диагностики необходимоактивировать отладчик и выяснить. на какой строке он останавливается. Инструкция по отладке есть по следующей ссылке: http://www.community.terrasoft.ua/blogs/7804

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