Привет сообществу Террасофта.
Не так давно начал познавать новое для меня направление (автоматизация бизнес процессов). Что это такое знаю хорошо.
Перечитал скорее всего весь форум и все блоги на предмет реализации прав доступа, но всё же не до конца понял поэтому прошу гуру данного вопроса помочь.
Принцип реализации я понял исходя из этого -> https://community.terrasoft.ru/developer/advice/sequrity
Вот пример:
Имеем допустим 2 Филиала.
Задача: Пользователи этих филиалов не должны вообще знать про работу друг друга.
Имеем группу пользователей администраторы со всеми доступными правами, и ещё две группы филиалов со своими, и соответственно в каждой подгруппе филиала свои права для менеджеров по продажам и менеджеров по закупкам (это Важно!!).
Ещё нюанс: группе "Все пользователи" отключили все права (по логике это правильно исходя из того, что филиалы друг про друга не знают).
Сам процесс:
Каждый раздел будь то документы, контакты, контрагенты, счета и т.д. делится так же как и в "Правах пользователей" на филиал 1 и филиал 2.
В результате: каждый пользователь видит только то, что дают права его группы + только его отдела (если он входит и в другой отдел, то и те записи доступны). При этом при добавлении новой записи пользователю вылетает окно (Данный элемент не входит в группу 'Название группы'. Добавить его в эту группу?) с кнопками да и нет. Если нажмёт да -> будет видеть этот элемент, иначе не будет.
Собственно сами вопросы:
1. В детале "Группы" к элементу нужно просто автоматом добавлять название группы и всё будет пучком. как это реализовать из террасофт?
2. Сделать доступными динамические подгруппы для каждого филиала в которых не показываются записи другого филиала.
Оба этих момента я думаю многим интересны. А мне очень нужны. Вся работа стоит.
Имеем Terrasoft 3.3.2.145 XRM Distribution
Нравится
"Заболоцкий Илья Анатольевич" написал: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. Сохраняем изменения
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;
}
И всё заработало так, как мне было нужно. Спасибо большое
Вопрос закрыт