Группы
доступ пользователям
права
3.x

Реализация прав доступа для филиалов

Привет сообществу Террасофта.
Не так давно начал познавать новое для меня направление (автоматизация бизнес процессов). Что это такое знаю хорошо.
Перечитал скорее всего весь форум и все блоги на предмет реализации прав доступа, но всё же не до конца понял поэтому прошу гуру данного вопроса помочь.
Принцип реализации я понял исходя из этого -> https://community.terrasoft.ru/developer/advice/sequrity

Вот пример:
Имеем допустим 2 Филиала.

Задача: Пользователи этих филиалов не должны вообще знать про работу друг друга.

Имеем группу пользователей администраторы со всеми доступными правами, и ещё две группы филиалов со своими, и соответственно в каждой подгруппе филиала свои права для менеджеров по продажам и менеджеров по закупкам (это Важно!!).
Ещё нюанс: группе "Все пользователи" отключили все права (по логике это правильно исходя из того, что филиалы друг про друга не знают).

Сам процесс:
Каждый раздел будь то документы, контакты, контрагенты, счета и т.д. делится так же как и в "Правах пользователей" на филиал 1 и филиал 2.

В результате: каждый пользователь видит только то, что дают права его группы + только его отдела (если он входит и в другой отдел, то и те записи доступны). При этом при добавлении новой записи пользователю вылетает окно (Данный элемент не входит в группу 'Название группы'. Добавить его в эту группу?) с кнопками да и нет. Если нажмёт да -> будет видеть этот элемент, иначе не будет.

Собственно сами вопросы:
1. В детале "Группы" к элементу нужно просто автоматом добавлять название группы и всё будет пучком. как это реализовать из террасофт?
2. Сделать доступными динамические подгруппы для каждого филиала в которых не показываются записи другого филиала.

Оба этих момента я думаю многим интересны. А мне очень нужны. Вся работа стоит.

Имеем Terrasoft 3.3.2.145 XRM Distribution

Нравится

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

"Заболоцкий Илья Анатольевич" написал:2. Сделать доступными динамические подгруппы для каждого филиала в которых не показываются записи другого филиала.

По 2-му вопросу было подобное обсуждение здесь -> http://www.community.terrasoft.ru/forum/topic/1537
Но можно ли это реализовать другими способами??? или ,если на то пошло, поподробнее кто-нибудь может объяснить как это сделать?

P.S. Ещё не знаком с программированием под Terrasoft, хотя веб-программист. Хотелось бы решить стандартными возможностями Terrasoft.

Добрый день!

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

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

Игорь, по 2-му вопросу.
Дело в том, что права на группу допустим документов стоят для определённой группы пользователей и администраторов (специально созданная группа).
И получается так, что из любой динамической подгруппы видно записи находящиеся в других группах раздела, которым права присвоены подобным образом для своих пользователей.

На сами записи присвоены права по умолчанию полные для администраторов и пользователя которым создана запись + чтение для текущей группы пользователей (именно для этой группы).

Каждый раздел выглядит так:

А по первому вопросу можете описать как это реализовать, если не сложно?

По сути идея реализации: сделать линукс-подобные права. т.е. с иерархией, чтобы более высокая группа могла видеть что творится в более низкой, а более низкой группе была не доступна информация выше, но видно было, что творится ниже, если это нужно.
Логика по идее в terrasoft такая же, или я неправильно понял?

Илья, в Terrasoft наоборот. Чем "глубже" находится пользователь, тем больше у него прав.

Пример добавления записи в группу:

1. Открываем скрипт scr_Account
2. В конец функции SelfOnDatasetAfterPost добавляем код:

	var AccountGroupDataset = Services.GetSingleItemByUSI('ds_AccountInGroup');
	var AccountID = Dataset.Values('ID');
	var GroupID = '{6BC9D098-6C64-4142-8615-321E56714C2F}'; //ID нужной группы
	AccountGroupDataset.Open();
	AccountGroupDataset.Edit();
	AccountGroupDataset.Values('ID') = Connector.GenGUID();
	AccountGroupDataset.Values('AccountID') = AccountID;
	AccountGroupDataset.Values('GroupID') = GroupID;
	AccountGroupDataset.Post();

3. Сохраняем изменения

http://www.community.terrasoft.ru/system/files/06-07-2012_12-43-48.png

var GroupID - это значение формируется динамически или скажем так: берётся id выделенной группы при добавлении записи?

Сейчас попробовал добавить ваш код.

При добавлении контрагента:

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

"Гакало Игорь Александрович" написал:

GroupID в моем случае задан строго.

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

Добрый день.

Ваш пример был добавлен в Accounts->General->scr_account без каких либо изменений.

Конфигурация до этого не изменялась.
Скорее всего ругается на GroupID, у нас его скорее всего нет.
Где можно взять id уже существующей в базе группы? это нужно для тестирования.

"Заболоцкий Илья Анатольевич" написал:
Скорее всего ругается на GroupID, у нас его скорее всего нет.

Где можно взять id уже существующей в базе группы? это нужно для тестирования.

Выполните следующий запрос на базе:

select ID, Name from tbl_AccountGroup

Он возвратит ID групп и названия.

Спасибо большое за помощь. Мне очень помогло для понимания структуры самого продукта.
Я решил эти вопросы немного другим способом.

В каждом разделе сделал динамические группы доступные пользователям только определённых групп + добавил в каждом разделе например к папке "все документы" доступ пользователям группы "Все пользователи" только на чтение.

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

Один нюанс: при входе от администратора динамические группы выдают информацию по всем записям например документы.

Есть: 2 филиала, у каждого свои коммерческие предложения. Добавляю динамическую группу ком.предложения (филиал1) и для второго тоже самое. Добавляем фильтр: ТИП - коммерческое предложение.
И в результате в этой подгруппе видны все коммерческие предложения для 2-х филиалов, а нужно только одного.Уточню: это только из под администратора, у остальноых пользователей всё как нужно.
Может быть знаете как это побороть?

У администратора в любом случае будут права на чтение записей, поэтому он будет видеть все записи.

Я так и думал. Спасибо за быстрые ответы, очень помогло.

В принципе модель Доступа в Террасофте сделана не плохо, при ваших требованиях к видимости и доступности объектов, Вам надо раздать грамотно Права по умолчанию по Группам Пользователей:
1. Допустим есть объекты, которые доступны всем пользователям на филиале - Контрагенты к примеру, соответственно группам Филиал1 и Филиал2, нужно в правах по-умолчанию таблицы Контрагенты - добавить группу Филиал1 и Филиал2, соответственно с правами ТОЛЬКО ЧТЕНИЕ, и аналогично поступить для общих объектов доступных на чтение/запись объектов всем пользователям филиалов.
2. Добавить индивидуальные группы для пользователей Менеджеры по Закупкам Ф1 и т.д., где уже более глубоко настроить Права по умолчанию, к примеру дать той же Группе пользователей уже ПОЛНЫЙ доступ по-умолчанию к объектам, которые создают пользователи в этой группе.
У меня модель доступа 3-уровневая для пользователей:
Все пользователи - мин. набор прав - контрагенты, библиотека, база знаний на чтение.
Менеджеры - общие права на доступ к Группам Таблиц
Индивидуальные группы для каждого направления, которое обслуживают менеджеры - в общем случае отдельная группа на пользователя, с индивидуальной настройкой прав по-умолчанию, где большая часть объектов доступна для пользователей Группы, это позволяет допустим оперативно добавлять пользователя для видимости объектов и возможности работы с ними(Контрагенты, Контакты, Задачи)(допустим пользователь в отпуске, больничный, уволился)
по поводу автоматической фильтрации объектов по филиалам(вряд ли это нужно самим пользователям филиалов - они и так при правильной настройке Прав по умолчанию видят только объекты своего филиала). Вам надо реализовать автоматическое добавление Группы в каждый раздел в зависимости от принадлежности Сотрудника(пользователя) к тому или иному подразделению, т.к. думаю вряд ли в текущей конфигурации можно добавить Динамическую группу с фильтром по Подразделению Ответственного... можно конечно посмотреть в эту сторону, чтоб доработать раздел фильтрации на более глубокую вложенность фильтра по Ответственному...

"Черных Руслан" написал:1. Допустим есть объекты, которые доступны всем пользователям на филиале - Контрагенты к примеру, соответственно группам Филиал1 и Филиал2, нужно в правах по-умолчанию таблицы Контрагенты - добавить группу Филиал1 и Филиал2, соответственно с правами ТОЛЬКО ЧТЕНИЕ, и аналогично поступить для общих объектов доступных на чтение/запись объектов всем пользователям филиалов.
2. Добавить индивидуальные группы для пользователей Менеджеры по Закупкам Ф1 и т.д., где уже более глубоко настроить Права по умолчанию, к примеру дать той же Группе пользователей уже ПОЛНЫЙ доступ по-умолчанию к объектам, которые создают пользователи в этой группе.

Так я и сделал.
Я и пытался найти решение для самих разделов.
Т.е. если я добавляю контрагента в группу "филиал 1" - Terrasoft ругается на то, что запись не добавлена в группу. добавить?
Нужно было сделать только автоматическое добавление группы к новой записи на детале "группы".
А как это реализовать - я не знаю. Может у Вас есть решение?

Добрый день!
Илья, Terrasoft не ругается, а выдает сообщение :) Если вопрос в том, как сообщение отключить с учетом утвердительного ответа, то это легко.

1. Зачем Вам разбивать объекты, которые вводят пользователи на Группы?
2. В моем случае, это разбиение нужно ТОЛЬКО для руководителей, они по кол-венным показателям контрагентов и контактов по филиалам делают определенные выводы. Я вышел из ситуации без доработки кода, в карточках Контагентов и Контактов есть поле "Территория" - Нам это поле в принципе не нужно. Я в справочник Территорий добавил нужные мне Объекты - Филиалы и сделал в свойствах датасета ds_Contact и ds_Account это поле обязательным для заполнения(еще до начала работы в Террасофт), и пользователи заполняя поле Территория в "ручном" режиме указывают Филиал.
Вариант автоматической привязки Статической группы, которые вы добавите в Панель Групп и будете автоматом привязывать дано выше пользователем "Гакало Игорь Александрович", можно добавить анализ в скрипт , к какой группе Пользователей пренадлежит Автор записи и добавлять в эту Группу Организаций(Контрагентов) карточку автоматически.

1. Это нужно для того, чтобы объекты были не видны друг другу.
Допустим даже есть одна организация и имеет несколько отделов : it, отдел розничной продажи светильников, отдел оптовой продажи кирпича, столовая (в которой едят все) и т.д.
Все эти отделы работают по своему. Неужели нельзя разделить видимость между ними созданных записей?

И должна быть эта возможность:

"Черных Руслан" написал:это разбиение нужно ТОЛЬКО для руководителей, они по кол-венным показателям контрагентов и контактов по филиалам делают определенные выводы

а вот это и нужно сделать:

"Черных Руслан" написал:можно добавить анализ в скрипт , к какой группе Пользователей пренадлежит Автор записи и добавлять в эту Группу Организаций(Контрагентов) карточку автоматически

только как? никак не разберусь

"Гакало Игорь Александрович" написал:

Добрый день!

Илья, Terrasoft не ругается, а выдает сообщение :) Если вопрос в том, как сообщение отключить с учетом утвердительного ответа, то это легко.

А как? это было бы решение всех проблем. Как правило пользователи нажмут и нажимают "нет".
Такие вопросы решаются легко, если есть опыт))) Для меня это сложно на данный момент, но очень нужно.

"Заболоцкий Илья Анатольевич" написал:1. Это нужно для того, чтобы объекты были не видны друг другу.

Для того, чтоб Объекты(Контакты, Контрагенты и т.д.), были НЕ ВИДНЫ пользователям разных групп, нужно настроить Доступ по-умолчанию.
Постараюсь объяснить модель доступа в Террасофте:
1. Доступ можно настраивать для двух субъектов - Пользователя и Группы пользователей.
2. Доступ регламентируется на Объекты - Группы таблиц, это как правило разделы, где настраиваются права на Чтение/Создание/Редактирование/Удаление объекта.
3. По- умолчанию, к объектам, которые создал Пользователь ДОСТУП(даже на чтение) имеет ТОЛЬКО Пользователь-владелец(автор) и Администратор системы. Для того чтоб раздать доступ по-умолчанию другим пользователям или группам пользователей есть специальный раздел Права доступа по-умолчанию, где задается соответствие между Пользователем(Группой пользователей)- автором - это панель слева в окне Администрирование; Объектом(Группой таблиц) -основной раздел и Остальными пользователями - это Деталь Досуп по умолчанию раздела Администрирования, куда добавляются Пользователи и Группы, которые будут иметь доступ к Объектам, которые создал Пользователь(Группа пользователей)-Автор(ы).
Соответственно видимость объектов элементарно настраивается с помощью Доступа по-умолчанию. Если при создании Объекта в любом Разделе Террасофта в детали- Доступ у Вас группа Все пользователи имеет Доступ на чтение или другие уровни доступа к Объекту, то значит так у Вас настроено в разделе Доступ по-умолчанию. Установите курсор на Группу все пользователи и пройдитесь по всем Объектам системы, и удалите из детали Доступ по умолчанию группу Все пользователи, там где это не нужно.

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

"Заболоцкий Илья Анатольевич" написал:1. В детале "Группы" к элементу нужно просто автоматом добавлять название группы и всё будет пучком. как это реализовать из террасофт?

Игорь сказал что это не сложно:

"Гакало Игорь Александрович" написал:Илья, Terrasoft не ругается, а выдает сообщение :) Если вопрос в том, как сообщение отключить с учетом утвердительного ответа, то это легко.

а как?

Цель:
1. просмотр от администратора информации отдельно взятого "филиала".
2. удобство работы для пользователей
3. масштабируемость (за счёт добавления филиалов и покупки новых лицензий)

"Заболоцкий Илья Анатольевич" написал:

а как?


Решил таким образом для контрагентов:

В скрипте scr_AccountsWorkspace изменил следующую функцию:

function dlAccountsOnDatasetRefreshRecord(Dataset, KeyValue, 
		AddNewRecordOnPage) {
	if (AddNewRecordOnPage) {
//////////////////////////////////////////////////////////////////////////
		AddItemInGroup(BaseWorkspace.GroupsDataset, 'ds_AccountInGroup', 
			KeyValue, 'AccountID', true); 
////////////////////////////////////////////////////////////////////////
	}
	RefreshDetails();
}

Если необходимо это сделать для всех разделов, то можно изменить функцию AddItemInGroup скрипта scr_DB, закомментировав строки

	if (!SilentAdd) { 
	        if (System.MessageDialog(FormatStr(AddItemInGroupAsk, GroupName), mdtWarning, 
			mdbYes + mdbNo, 0) != wmrYes) {
		        return;
	        }
	}

"Гакало Игорь Александрович" написал: if (!SilentAdd) {
if (System.MessageDialog(FormatStr(AddItemInGroupAsk, GroupName), mdtWarning,
mdbYes + mdbNo, 0) != wmrYes) {
return;
}
}

Для всех разделов только это закомментировать нужно? Не могу найти такую часть в скрипте.

Для версии 3.3.2 эти строки имеют следующий вид (в этой же функции AddItemInGroup)

	if (System.MessageDialog(FormatStr(AddItemInGroupAsk, GroupName), mdtWarning, 
			mdbYes + mdbNo, 0) != wmrYes) {
		return;
	}

Закоментировал эти строки:

"Гакало Игорь Александрович" написал:

Для версии 3.3.2 эти строки имеют следующий вид (в этой же функции AddItemInGroup)

        if (System.MessageDialog(FormatStr(AddItemInGroupAsk, GroupName), mdtWarning,

                        mdbYes + mdbNo, 0) != wmrYes) {

                return;

        }

И всё заработало так, как мне было нужно. Спасибо большое
Вопрос закрыт

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