Добрый день.
1 вопрос.
Никак не могу понять, как мне реализовать права для пользователей.
Есть три разных типа прав:
1 - видит все;
2 - видит только своих контрагентов и контактов, которые находятся в определенном воздействии с состоянием "в работе"
3 - видит только контрагентов и контактов, которые находятся в определенном воздействии с состоянием "в работе" в своей бригаде

Во 2 и 3 пункте, видимость контрагентов и контактов определяется даже тем, что при любом выборе контрагента / контакта откуда угодно (например при создании задачи и т.д.) выбор был только из видимых.

2 вопрос.
добавил и зарегистрировал нового пользователя, при закрытии Terrasoft вылетает ошибка - "Несоответствие типов" в этом коде:

function wnd_BaseWorkspaceOnProfileSerialize(Window, Node) {
        Node.SetAttributeAsStr('SavedGroupID', dlGroups.Dataset('ID'), '');  
        SaveDescription();
}

Нравится

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

Добрый день!

"Когут Константин Васильевич" написал:
Есть три разных типа прав:

2 - видит только своих контрагентов и контактов, которые находятся в определенном воздействии с состоянием "в работе"

3 - видит только контрагентов и контактов, которые находятся в определенном воздействии с состоянием "в работе" в своей бригаде

Нет таких прав :smile:
С помощью раздела "Администрирование" подобные комплексные условия установить нельзя.
Неудобный момент, который Вы можете попробовать - написать запрос с фильтрацией, который будет выбирать данные в необходимом количестве с учетом условий. Затем накладывать фильтрацию в каждом моменте, где производится выбор контакта/контрагента.

"Когут Константин Васильевич" написал:добавил и зарегистрировал нового пользователя, при закрытии Terrasoft вылетает ошибка - "Несоответствие типов" в этом коде:

Ошибка не должна быть связана с добавлением пользователя. При следующем появлении ошибки посмотрите CallStack и определите, место, в котором функция вызывалась.

1. О, пришла идея, при выборе контрагента / контакта, он же открывает датасет, в котором при открытии он бы отфильтровал его по нужным условиям. Вечером попробую сделать.

2. даже не при добавлении, а при нахождении в определенной группе, при чем у этой группы прав даже больше чем у той в которой все нормально.

"Когут Константин Васильевич" написал:2. даже не при добавлении, а при нахождении в определенной группе, при чем у этой группы прав даже больше чем у той в которой все нормально.

Ну это не совсем нормально)
Сделайте обезличенную копию базы (без данных) и перешлите в поддержку, указав данную тему. Мы пройдемся отладчиком и выясним, в чем дело.

Может удаленно подключиться, показать ошибку на примере?

"Когут Константин Васильевич" написал:

Может удаленно подключиться, показать ошибку на примере?


Можно, но не факт, что решение не придет во время удалёнки, поэтому база предпочтительнее.

Попытка не пытка, завтра готов) дальше решим, что да как

По поводу первого вопроса: для 1 и 2 пункта все замечательно, а вот для 3 чет никак не придумать запрос. Мож кто подскажет как сделать фильтр в sq_Account, необходимо:

Набор фильтров (И):

  1. Контрагент находится в воздействии с состоянием в работе:
    [tbl_CampaignAudience].[ResponseID] = Work ("в работе")
  2. Контрагент находится в воздействии у оператором в бригаде текущего пользователя:
    [tbl_CampaignAudience].[OperatorID] = все операторы у которых бригадир является Current User Contact ID

    (в таблице Contact есть поле BrigID)

Добрый день!

Создайте два параметра:
один - для хранения идентификатора состояния "В работе" (получить можно из tbl_CampaignStatus),
второй - для заполнения идентификатором текущего пользователя (тип функция - "Контакт текущего пользователя").
Оба параметра используйте для сравнения в фильтре.

немного не то, вот как в такой фильтр передать массив? Включается обычным EnableDatasetFilters
изобр

Добрый день!

Не трогайте пока сервис запроса :) Напишите SQL текст на базе данных, и если он даст нужный результат, приступите к внесению изменений в sq

Он же выключен в sq ;) Просто не знаю как передать массив в нужный подфильтр (OperatorIDs)

Константин,

Вам следует выполнить это в виде EXISTS запроса (пример реализации тут: http://www.community.terrasoft.ru/forum/topic/7123). Для того, чтобы я могла предоставить рекомендации по реализации запроса, мне нужно знатьб Вашу структуру таблиц.

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

1. ds_Account, sq_Account, tbl_Account
2. ds_Contact, sq_Contact, tbl_Contact
3. ds_Campaign, sq_Campaign, tbl_Campaign
4. ds_CampaignAudience, sq_CampaignAudience, tbl_CampaignAudience

а также сервисы связанных таблиц и скриптов датасетов, если такие есть.

Спасибо за помощь!
Через Exists не мог получить множественный выбор.
Решилось таким способом

WHERE(([tbl_CampaignAudience].[ResponseID] = :Work AND
	[tbl_CampaignAudience].[OperatorID] IN 
	(SELECT
		[tbl_ContactBrig2].[ID] AS [ID2]   // таблица контактов
	FROM
		[dbo].[tbl_Contact] AS [tbl_ContactBrig2]
	WHERE([tbl_ContactBrig2].[BrigadID] =CurrentUser ))))

Где параметр :Work - состояние в работе
CurrentUser - функция Current User Contact ID.
Получается он выбирает всех контрагентов, у которых состояние в любом воздействии = "в работе" и у которых операторы находятся в бригаде текущего пользователя.
может кому и пригодится :smile:

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

Всем доброго времени суток!

В Террасофт 3.х, при создании записи в таблице, которая администрируется по записям, автоматически выдаются полные права автору, и права на чтение и изменение ответственному.

Раздача прав ответственному реализована в конфигурации, а именно функцией GiveRightsToRecordOwner(Dataset), логику которой при желании можно легко изменить.

Логика же раздачи прав автору записи спрятана немного "глубже" - записи в таблицу прав (tbl_tablenameRights) попадают в следствии выполнения триггера на таблице, который в свою очередь создается хранимой процедурой tsp_AdministratedByRecords.

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

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

INSERT INTO ' + @RightTableName + ' (' + @NL +
        '
   [ID]' + @NL +
        '
   ,[RecordID]' + @NL +
        '
   ,[AdminUnitID]' + @NL +
        '
   ,[CanRead]' + @NL +
        '
   ,[CanWrite]' + @NL +
        '
   ,[CanDelete]' + @NL +
        '
   ,[CanChangeAccess])' + @NL +
        '
 SELECT' + @NL +
        '
   newid()' + @NL +
        '
   ,[ID]' + @NL +
        '
   ,@AdminUnitID' + @NL +
        '
   ,1' + @NL +
        '
   ,1' + @NL +
        '
   ,1' + @NL +
        '
   ,1' + @NL +
        '
 FROM INSERTED' + @NL +

четыре единички в данном фрагменте означают что пользователь имеет полные права. Соответственно, при замене их на "0":

INSERT INTO ' + @RightTableName + ' (' + @NL +
        '
   [ID]' + @NL +
        '
   ,[RecordID]' + @NL +
        '
   ,[AdminUnitID]' + @NL +
        '
   ,[CanRead]' + @NL +
        '
   ,[CanWrite]' + @NL +
        '
   ,[CanDelete]' + @NL +
        '
   ,[CanChangeAccess])' + @NL +
        '
 SELECT' + @NL +
        '
   newid()' + @NL +
        '
   ,[ID]' + @NL +
        '
   ,@AdminUnitID' + @NL +
        '
   ,1' + @NL +
        '
   ,1' + @NL +
        '
   ,0' + @NL +
        '
   ,0' + @NL +
        '
 FROM INSERTED' + @NL +

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

Нравится

Поделиться

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

Привет сообществу Террасофта.
Не так давно начал познавать новое для меня направление (автоматизация бизнес процессов). Что это такое знаю хорошо.
Перечитал скорее всего весь форум и все блоги на предмет реализации прав доступа, но всё же не до конца понял поэтому прошу гуру данного вопроса помочь.
Принцип реализации я понял исходя из этого -> 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;

        }

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

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

Есть несколько проблем с правами.

Планирование
В разделе Настройка планирования на детали Доступ поставил права на запись, на детали Измерения поставил права на запись.
Также поставил права в разделе Планирование в детали Доступ. Тем не мене пользователи не могут пересчитать факт.

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

Права на деталь
Можно ли настроить права таким образом, чтобы пользователь имел только права чтения на запись, и права на запись в детали файлы? Попробовал настроить подобным образом, записывать в деталь всё равно не даёт.

Спасибо.

Нравится

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

Добрый день, Виталий!

По вопросу планирования: просмотрите, пожалуйста, прикрепленный документ Настройка раздела ПЛАНИРОВАНИЕ.doc – в нем даны подробные рекомендации о там, как настроить данный раздел, и раздать права доступа на его измерения.

По вопросу настройки раздела E-mail: необходимо видеть скриншоты Ваших настроек прав доступа в разделе Администрирование, а также скриншот Детали[Доступ] в разделе E-mail для одного из почтового сообщения, о котором идет речь. Отправьте нам их, пожалуйста, на support@terrasoft.ru (с указанием номера инцидента по Вашему запросу в теле письма: 0110145).

По правам на деталь: рассмотрим пример Детали[Визы] в разделе Документы. Доступ на деталь можно назначать как на отдельный объект (группа таблиц), так и совместно с разделом системы - Документы, указав в сервисе таблицы Вызы tbl_DocumentVises параметр Группа таблиц (Parent Table Group) – DocumentVises.png.

В случае, если Вы желаете администрировать Деталь как отдельную группу таблиц, в разделе Администрирование :: Права доступа к группам таблиц, нажмите кнопку «Добавить». Укажите название как «Визы в документах», а имя объекта SQL: tg_VisesInDocuments (префикс tg_ - обязателен). Затем в серсвисе tbl_DocumentVises указать параметр Группа таблиц (Parent Table Group) равным «Визы в документах». В разделе Администрирование :: Права доступа к группам таблиц после этого можно будет настраивать доступ к Детали по новой записи «Визы в документах».

Может кто сталкивался...
Почему возникает такая проблем с доступом: не доступны все кнопки Добавить-Изменить-Удалить... в окне wnd_VisesDetailGridArea. Причём при обновлении окна они на доли секунды становятся доступны, но доступность сразу исчезает. У пользователя полные права. У пользователя с аналогичными правами всё работает.
Кэш чистил.
Что это может быть и как исправить?

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

Свойство IsEnabled устанавливается в функции:

1

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

2

т.е. зависит от прав доступа на текущую (выделенную в реестре) запись.
Таким образом, у Вас, скорее всего, пользователь не имеет полных прав на запись.

Пользователь входит в группу, которая имеет расширенные права (на документы у группы полный доступ). Конкретно этому логину помимо этого дал полные права - никакого эффекта.
Переустановка ТерраСофт с очисткой %USERPROFILE%\\Application Data\\Terrasoft решила проблему после мониторинга Windows по обращению к файлам и реестру.

Хммм! Вышеописанное произошло вчера. Только что, с начала дня пользователи включили компы и понеслось автообновление Винды. Тот же пользователь, которому вчера переустанавливал Террасофт сообщает о рецессии проблемы, т.к. времени на выяснение причин возникновения траблы не дали - могу сообщить, что было обновление Windows XP. Просто переустановил ТерраСофт.

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

Скорее всего Вам просто нужно очистить (удалить все содержимое) папки Cache:

Пуск-Выполнить-%Appdata%-Terrasoft-Cache.

Фокус с очисткой кэша не удался (сразу написал об этом). Хорошо, что до переустановки винды не дошло:wink:

Vadson, здравствуйте.

Предлагаю поставить отладчик в функции function DoPrepare(Window) и проверить чему равна переменная AccessLevel.

Снова возникла аналогичная проблема, но у другого пользователя. Быстренько переустановили Террасофт. Проблема не исчезла (доступа к визированию у пользователя не появилось). У данного пользователя к группе договоров права на чтение, добавление, изменение. Поставили дебагер. Когда дебагер работает - AccessLevel=2. Доступ есть. Отключаем дебагер и пользователь снова не может поставить визу. Насколько непонимаю, то GetCurrentRecordAccessLevel работает как-то совсем непонятно. Кэш чистил. Доступ без дебагера появляется только при внесении ещё доступа на удаление.

Добрый день.
В выражении var AccessLevel = WorkspaceGridDataset.GetCurrentRecordAccessLevel(); метод GetCurrentRecordAccessLevel() определен в ядре. Причиной поведения приложения, описанного Вами может быть взаимодействие приложения с сервером СУБД.

Попробуйте изменить функцию DoPrepare(Window) в сервисе Common\Details\Vises\wnd_VisesDetailGridAreaScript, приведите ее, например, к такому виду:

function DoPrepare(Window) {
	SetAttribute(Window, 'EditWindowUSI', 'wnd_VisesDetailEdit');
	var WorkspaceGridDataset =
		Window.ParentWindow.Attributes('WorkspaceGridDataset');
	SetAttribute(Window, 'WorkspaceGridDataset', WorkspaceGridDataset);
	var IsCanEditWorkspace = false;
    if (Assigned(WorkspaceGridDataset)) {
 
	    var VisesContactsDataset = GetSingleItemByCode('ds_VisesContacts', 'VisesContacts');
	    ApplyDatasetFilter(VisesContactsDataset, 'ContactID', Connector.CurrentUser.ContactID, true);
 
		VisesContactsDataset.Open();
 
		// старый способ назначения переменной AccessLevel 
		//var AccessLevel = WorkspaceGridDataset.GetCurrentRecordAccessLevel();
 
		var AccessLevel = (VisesContactsDataset.RecordsCount > 0) ?  tfalFullAccess : tfalReadAccess;
	    IsCanEditWorkspace = (AccessLevel == tfalFullAccess);
	}
	SetAttribute(Window, 'CanEditWorkspace', IsCanEditWorkspace);
	wnd_BaseGridAreaOnPrepare(Window);
}

Спасибо Павел!!!! Работает.

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

Часто возникает потребность раздавать права доступа после назначения ответственного. Дело в том, что принцип раздачи прав на записи действует не всюду. В случае задач все будет происходить именно таким образом.
Но, к примеру, для контрагентов это не действует. Чтобы это действовало для необходимых разделов, следует в Terrasoft Administrator’e открыть скрипт обработки датасета, в нем найти функцию SelfOnDatasetAfterPost и дописать следующую строку:

GiveRightsToRecordOwner(Dataset);

Затем сохраните изменения.

/system/files/04.05.png

Нравится

Поделиться

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

О, Боже, а мы строили такие безумные схемы... :)
Спасибо!

А при импорте из Excel этого происходить не будет?

Нет, при импорте права раздаются по настройкам прав доступа по умолчанию.

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

Добрый день!
На днях клиент выразил недоумение по поводу того, что невозможно нигде увидеть результирующие права того или иного пользователя в Terrasoft 3.x. Кроме того, Юлей Старун выдвигалась уже идея добавить этот функционал в базовую версию (см. http://www.community.terrasoft.ua/ideas/4744).

Поэтому решено было сделать такую опцию, которую каждый желающий может загрузить, если действительно это нужно.
Для этого нужно:
1. Загрузить сервисы из прикрепленного архива.
Внимание!Если Вами ранее вносились изменения в сервис sq_AdminUnit и Ваша версия этого сервиса наверняка отличается от базовой, то просто добавьте в этот Select Query фильтр по полю IsGroup и параметр IsGroup (тип - булевский).

2. В окне wnd_Users добавить пункт меню amiFullRights и прописать для него следующий код:

function amiFullRightsOnExecute(ActionMenuItem, Sender) {
    GetFullRightsByAdminUnit(dlData.Dataset('ID'), dlData.Dataset('Name'));
}

Кроме того, нужно в скрипте этого окна подключить скрипт scr_AdminUnitFullRights.

3. Если необходимо показывать полные права и для групп пользователей, то необходимо проделать шаг 2, но уже для окна wnd_UsersGroups.

В результате в разделе "Администрирование" при выборе соотв. пункта меню Вы должны увидеть что-то типа этого:

В принципе, все. Пользуйтесь на здоровье. :)

Нравится

Поделиться

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

Стас, большое спасибо! Очень нужная и ценная доработка!

+1, очень полезная функция!

Был маленький недочет, который виден на скриншоте :), но я его уже подправил и прикрепил архив снова.

то что надо :)

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

Добрый день! Подскажите пожалуйста где в версии 3.1.0.16 находится настройка прав на слияние записей(контакты/контрагенты) при использовании "Проверка на дубли"? В самом разделе администрирование и в системных настройках не нашел ничего подобного. Права пользователя на раздел контакты/контрагенты выставлены по типу полный доступ. Заранее спасибо!

Нравится

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

Serega, в конфигурации идет проверка, что если пользователь не администратор, то слияние запрещено. Эта проверка реализована в конфигурации. Но даже если Вы эту проверку уберете, то нет гарантии, что под пользователем у Вас все будет работать корректно, так как для слияния дублей необходимо иметь полные права, не только в разделах но и на все(!) записи. А это на 100% - администратор.

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

Запретить Вы ему ничего не сможете - на то он и администратор.

"Осауленко Александр" написал:Запретить Вы ему ничего не сможете - на то он и администратор.

Не получится запретить "знающему" администратору :wink:. А для незнающего - легко: есть системные настройки запрета печати и экспорта. На администраторов они тоже действуют.

Либо в скрипте scr_BaseGridAreaUtils модифицировать функцию InitializeDataGridExport, напрямую запретив печать конкретному пользователю:

function InitializeDataGridExport(GridArea) {
	if (!Connector.CurrentUser.IsAdmin) {
		GridArea.CanPrint = !!Connector.Attributes(GridCanPrintName);
		GridArea.CanExport = !!Connector.Attributes(GridCanExportName);
	}
	if (Connector.CurrentUser.ContactName == '<Имя контакта пользователя>') {
		GridArea.CanPrint = false;
		GridArea.CanExport = false;
	}
	// TODO Delete after implementation export to CSV
	if (GridArea.CanExport) {
		GridArea.CanExport = GetIsMSExcelIstalled();
	}
}

Спасибо! :)

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

Помогите, пожалуйста, с идеей как ограничить права доступа для выполнения действия (Action) в разделе.

Нравится

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

Правку кода в разделе не предлагать? :wink:

 

"Александр Кудряшов" написал:Правку кода в разделе не предлагать?

Предложите

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

    amiCreateTask.IsVisible = (..проверка условий..);

Если нужен более формальный инструмент, то есть возможность раздачи прав любому пользователю/группе на любое действие, то нужны доработки помасштабнее, например:
- сделать в разделе "Администрирование" новую вкладку "Права на действия", и написать код, который определяет список действий в каждом разделе, и хранит права на них;
- модифицировать scr_BaseWorkspace, который станет "прятать" действия в зависимости от прав текущего пользователя.
--------------------------------------------
Лабитек
Центр разработки приложений
[update: :wink:]

Ну вариантов много в общем.. самый прямолинейный делаем группы пользователей и дорабатываем метод amiActionsOnPrepare в нужном разделе, определяя группу текущего пользователя и включая/выключая для него свойство IsVisible для соответствующих ActionMenuItem.

[update: надо мне было быстрее печатать]

 

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

Добрый день.

Настроил репликацию для двух точек.
База велась на одной территории, потом поставил базу на другую.
Базу переносил при помощи той же репликации.
Т.е. на точке создал пустую базу и сказал - реплицируй.
Пользователи конечно ни какие не перенеслись.

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

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

[09.12.08 15.49.50.749] (E)     Ошибка выполнения метода 'amiAddFileOnExecute'. Текущий пользователь не имеет достаточно прав для добавления записей в таблицу 'tbl_FileInOpportunity' «Call Stack»

На основной точке они в эти проекты добавлять файлы могут.
Права в SQL я сравнил - все одинаково.

Я посмотрел, на эту таблицу в SQL-у явные права даны в группе "Все пользователи" (если смотреть из интефейса Террасофта, то у группы "Все пользователи" нет вообще ни одной галочки !!!???). Эти три пользователя в эту группу входят...

Помогите пожалуйста в этой ситуации.

Нравится

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

Зашел под именем одного из проблемных пользователей в SQL Query Analyzer. Запись в таблицу добавилась без всяких проблем.

Кирилл, какие лицензии у "проблемного" пользователя?

Не очень понял вопрос...
Как у всех. У нас у всех лицензии одинаковые...
А они разные бывают?

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

Конкурентные и именные

У нас именные.

Да, они бывают не только конкурентные и именные, но еще на разные продукты. Например: SD Agent и SD User. У "проблемного" пользователя какие?

А как это посмотреть?

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

Какое имя пользователя и Ваш Customer ID?

Можете в "личку" написать.

Написал

Да, с лицензиями все ок.
Выполните под "проблемным" пользователем запрос на центральной точке и на удаленной:

SELECT * FROM [dbo].[fn_CurrentUserTableGroupRoleList] ()
WHERE [SQLObjectName] = 'TG_OPPORTUNITY'
GO

Какие результаты?

Кирилл, есть ли у Вас документ "TSCRM MSSQL Руководство по репликации.doc"? Если есть посмотрите пункт 5.2. Использование утилиты репликации.

на основной
read 1; insert 1; update 1; delete 0

на второй

read 1; insert 0; update 1; delete 0

???

Ну как бы все понятно:)
На основной разрешено добавление, на второй нет.

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

Как Вы проверяете что права в SQL на основной точке и удаленной совпадают для таблицы tbl_FileInOpportunity?

В базе данных существует роль TG_OPPORTUNITY_CI, этой роли разрешена вставка в таблицы tbl_Opportunity и tbl_FileInOpportunity. Так ли это на удаленной точке?
Когда Вы разрешаете через раздел Администрирование роли или пользователю вствку в группу таблиц "Проекты", пользователь или роль становится членом роли и получает возможность вставки записи. Так ли это на удаленной точке?

в SQL EM -> Tables -> tbl_FileInOpportunity -> Permission -> List only ...
Там остается 5 групп TG_..._CD, ..CI ..CR ..CD и Все пользователи у групп TG права на свою функцию у "Все пользователи" на все кроме удаления.

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

Откройте на удаленной точке в Администраторе таблицу tbl_FileInOpportunity. Указана ли там группа таблиц "Проекты"?

Создал новые проект проверил добавление файлов у всех трех пользователей.

Ситуация такая: у двоих работает, у одного (собственно самого нужного) - нет.

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

Есть ли у Вас документ "TSCRM MSSQL Руководство по репликации.doc"? Если есть посмотрите пункт 5.2. Использование утилиты репликации.

Руководство есть. Репликация работает, все передается, все принимается.

Да указана

Кирилл, не может все передаваться и приниматься.
В п.5.2. описаны ограничения, которые появились в версии 3.2:

В версии Terrasoft CRM 3.2 по репликации не передаются таблицы логирования, пользователи, роли, права на группы таблиц, права на поля таблиц, а также вхождения пользователя в роль и роли в роль на сервере.

"Хомутов Кирилл" написал:Т.е. на точке создал пустую базу и сказал - реплицируй.
Пользователи конечно ни какие не перенеслись.

"Хомутов Кирилл" написал:Завел логины поключил их к базе... Все работает... Видят все кому чего положено...

Я имел ввиду, что данные переносятся.

Объясню более подробно. Репликация может передавать только данные, которые храняться в пользовательский таблицах, таких как tbl_Account, tbl_Contact и т.п. Пользователи и роли храняться в таблице tbl_AdminUnit, и данные этой таблицы передаются, но(!) начиная с версии 3.1.0 мы создаем еще пользователей и на стороне сервера: логины, пользователи и роли. Эти объекты уже не данные, а обьекты базы данных и сервера и репликация их не "видит". Для того чтобы и они передавались Вам необходимо написать sql скрипты по созданию пользователя(не как записи в таблице tbl_AdminUnit, а через конструкции sp_adduser или create user - зависит от версии sql сервера), логина(sp_addlogin или create login), ролей и опять же запросом раздать права инструкциями GRANT, REVOKE и DENY. И эти запросы добавить в таблицу rep_ExecutedSQL(см. п. "5.3.1. Отправка SQL-скриптов" все того же руководства)

Спасибо Вам, Александр, за помощь!

Получилось у меня все!!!

Я переподключил пользователей в группы в террасофте...
До этого я делал это только с группой "Все пользователи", поскольку только она фигурировала в правах на таблицу. Сейчас сделал просто по всем имеющимся...

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

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

Добрый день!

В БД создана некая таблица.
Таблица отнесена в группу "Сервисы".
Для вывода реестра записей таблицы (с возможностью редактирования одного из полей) создано окно.
Особенность: наполнение таблицы происходит не через датасет, а через INSERT посредством ExecuteCustomSQL(...).

Под пользователем с админскими правами все работает отлично.
Под обычным - ошибка: "Текущий пользователь не имеет достаточно прав для редактирования..."
При том, что все права на группу таблиц "Сервисы" ему выданы.

На уровне БД права выставляются корректно.
Под данным пользователем доступны все операции над записью.

В связи с вышеописанным вопрос: какова логика работы функции Connector.CurrentUser.GetCanUpdateTableGroup(ParentTableGroup)?
Что она проверяет, куда смотреть?

Версия - 3.3.1.38.

Нравится

21 комментарий

А доступ раздавали через Администрирование или средствами СУБД. Можете попробовать исключить пользователя из группы "Все пользователи", а потом добавить и перераздать доступ на группу таблиц "Сервисы" в резделе [Администрирование], т.е. снять все опции и проставить.

В Insert, который выполняется с помощью Connector.DBEngine.ExecuteCustomSQL(), Вы, наверное, прописали имя таблицы. Под пользователем администрируемые таблицы заменяются на view в сервисах, но не в подобных запросах, поэтому возникает ошибка. Вам следует создать сервис InserQuery, повторяющий то, что Вы прописали запросом.

"Татьяна Адамчук" написал:А доступ раздавали через Администрирование или средствами СУБД.

Нет, все делается средствами Террасофт.

Попробовал исключить/включить пользователя и перевыдать права.
Не помогает.
Есть ли возможность узнать, что конкретно проверяет функция, указанная в исходном сообщении?

"Раловец Ольга" написал:Вам следует создать сервис InserQuery, повторяющий то, что Вы прописали запросом.

Да, делаю INSERT напрямую в таблицу.
Как я понимаю, Террасофт всегда делает так же.
Представления, которые вы упоминаете, используются только для выборки данных, если не ошибаюсь.
Создаются они только в случае "Администрирования по записям" - что мне не нужно.
Данная опция отключена.

InsertQuery, насколько я понимаю, не позволяет вставить несколько десятков записей одним запросом.
Делать же цикл и вставлять по одной - рука не поднимается. :)

Дмитрий, приведите пожалуйста код который приводит к ошибке.

Получаем Key из SelectDataWindow и вносим изменения...

function UpdateAccount(Key) {
	var Dataset = dlData.Dataset;
	Dataset.Edit();
	Dataset.ValAsGUID('FoundAccountID') = Key;
	Dataset.Post();
	RefreshDataset(Dataset);
}

Сложности в том, что не получается настроить права так, чтобы функция GetCanUpdateTableGroup(...) вернула true.
Остальное - следствие.
В случае, если бы форма была сделана на основе шаблона Террасофт, сообщения бы вообще не было, так как была бы исключена сама возможность редактирования.

Дмитрий, а ExecuteCustomSQL Вы выполняете когда? И прикрепите пожалуйста сервис таблицы на основе которой построен Dataset.

Да и забыл: какая СУБД?

"Осауленко Александр" написал:Дмитрий, а ExecuteCustomSQL Вы выполняете когда?

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

Дмитрий, какая у Вас СУБД?

Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

Подключитесь под пользователем к серверу mssql через Managment Studio и выполните запрос на Вашей базе:

SELECT * FROM [dbo].[fn_CurrentUserTableGroupRoleList] ()
WHERE [SQLObjectName] = N'TG_ITSERVICE'
GO

И посмотрите что вернет запрос.

Сервисы TG_ITSERVICE TG_ITSERVICE 1 1 1 1

С правами нормально. Приложите сервисы SelectQuery и Dataset на котором возникает ошибка.

Вы подключились под пользователем, под которым возникает ошибка?

"Осауленко Александр" написал:Вы подключились под пользователем, под которым возникает ошибка?

Да. Проверил.

А что возвращает функция Connector.CurrentUser.GetCanUpdateTableGroup("TG_ITSERVICE") под пользователем? И какая у пользователя лицензия?

Функция возвращает false;
Лицензия... Авторизация SQL Server, если вы про это.

Нет я имел ввиду лицензия Terrasoft.

Лицензия именная TS XRM + SD User 3.X.

TS XRM + SD User 3.X.
Ключевое слово я выделил. Эта лицензия предполагает работу в модуле "Сервисы", но только на чтение.

Ясно.
Так и думал, что все просто. :)

Спасибо за уделенное время!

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