Коллеги, привет!

 

Подскажите, пожалуйста, возможно ли создать кнопку для пользователей с ролью Администратор, которая бы позволяла логиниться в учетную запись без ввода логина и пароля. То бишь просто нажимаем один раз, например, в разделе Пользователи (в Дизайнере, на самой карточке) и мы залогинились под ним. Речь исключительно о веб-версии.

 

Может быть кто-то реализовал уже?

Спасибо!

 

Нравится

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

Пароль хранится в зашифрованном виде, нельзя так просто взять его из базы.

 

Стандартно существует механизм безопасного доступа в систему для поддержки, в версии 7.16.4 появляется бета-версия входа в систему извне под OAuth 2.0 с client_id и client_secret без необходимости ввода пароля. Возможно, нужно смотреть в сторону этих механизмов. Логика безопасного доступа реализована в схемах в пакете ExternalAccess.

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

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

не нашёл в документации информации о структуре данных авторизованного в bpm'online пользователя. Эта информация необходима для реализации API, к которому будет обращаться модуль bpm'online. Т.е. обращение будет идти изнутри наружу.

Можете ли поделиться структурой данных авторизованного пользователя? Или скинуть ссылку на место в документации, где она описана?

Нравится

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

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

Данные пользователя хранятся в таблице SysAdminUnit, его привязки к ролям в SysAdminunitInRole.

Спасибо

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

Добрый день!

Как Вы знаете, в карточке редактирования может быть представлено несколько представлений. Иногда требуется ограничить доступ к этому представлению некоторой группе пользователей. Этот функционал можно дополнительно реализовать средствами Terrasoft Administrator. Ниже приведу сам алгоритм, на примере карточки редактирования раздела "Продукты", в которой существует представление "Движение по складу", доступ к которому мы ограничим.

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

function IsUserInGroup(GroupID)
{
        var Dataset = Services.GetSingleItemByUSI('ds_AdminUnit');
        ApplyDatasetFilter(Dataset, 'UserContactID', Connector.CurrentUser.ContactID, true);
        Dataset.Open();
        var UserID = Dataset.ValAsGUID(IDFieldName);
        Dataset.Close();
        var Dataset = Services.GetSingleItemByUSI('ds_UserInGroup');
        ApplyDatasetFilter(Dataset, 'GroupID', GroupID, true);
        ApplyDatasetFilter(Dataset, 'UserID', UserID, true);
        Dataset.Open();
        var Is = (Dataset.RecordsCount > 0);
        Dataset.Close();
        return Is;
}

Приведенная выше функция, в случае если текущий пользователь системы входит в указанную нами группу пользователей, возвращает значение true, в ином случае - false.

Далее необходимо отредактировать функцию function wnd_OfferingEditOnPrepare(Window). В ней добавим следующую проверку:

function wnd_OfferingEditOnPrepare(Window) {
        scr_BaseDBEdit.wnd_BaseDBEditOnPrepare(Window);
        Initialize(Window);            
        if(!Connector.CurrentUser.IsAdmin)
        {
                var UsrDataset = Services.GetSingleItemByUSI('ds_UserInGroup');                  
                var GroupName = 'Название';
                //где 'Название' - имя группы пользователей, для которых нужно ограничить доступ к представлению         
                ApplyDatasetFilter(UsrDataset, 'GroupName', GroupName, true);
                //тут следует не забыть создать фильтр сравнения в сервисе sq_UserInGroup (см. скриншот ниже)
                UsrDataset.Open();             
                var GroupID = UsrDataset.Values('GroupID');
                if(IsUserInGroup(GroupID))
                {
                        //скрываем само представление, установив свойству IsVisible значение false
                        pgOfferingAnalytic.IsVisible = false;  
                }
                UsrDataset.Close();
        }
       
}

Так же, перед тестированием результатов, следует создать фильтр сравнения в сервисе sq_UserInGroup:

2
3

После этого не забудьте сохранить изменения и перезапустить клиентское приложение Terrasoft.

Нравится

Поделиться

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

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

    var GroupDataset = Services.GetSingleItemByUSI('ds_UserInGroup');
    ApplyDatasetFilter(GroupDataset, 'UserID', UserID, true);
	     GroupDataset.Open();
	      GroupDataset.GotoNext();     //берем второе значение, так как первая по порядку группа 'Все пользователи'                 
         var GroupID = GroupDataset.ValAsStr('GroupID'); 
         GroupDataset.Close();

Большое спасибо за Ваш пример, очень пригодился!

В принципе есть базовая функция в scr_Access называется GetIsUserInGroup, делает примерно тоже самое только немного написана по другому

function GetIsUserInGroup(UserName, GroupID) {
	var sqGetIsUserInGroup = GetSingleItemByCode('sq_GetIsUserInGroup');
	SetParameterValue(sqGetIsUserInGroup.Parameters, 'GroupID', GroupID);
	SetParameterValue(sqGetIsUserInGroup.Parameters, 'UserName', UserName);
	var dsRes = sqGetIsUserInGroup.Open();
	try {
		return dsRes('IsExists') != 0;
	} finally {
		dsRes.Close();
	}
}
Показать все комментарии

Необходимо отобразить расписание для пользователя с учет того, что каждый день у него различное рабочее время, т.е. необходимо по разному раскрашивать рабочее время для каждого дня в закладке "Расписание".
Возможно ли это реализовать? Сталкивался ли кто-то с подобной проблемой?

Нравится

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

Вы имеете ввиду, что нужно изменить подсветку с 9 до 18 для каждого дня по-своему? Не получится, она одна для всех. Мы создавали задачи с типом "Рабочее время", отображали их особым цветом в расписании, в реестре накладывали фильтр по умолчанию, чтобы их не было видно. При создании задач на это рабочее время в расписании будут параллельные задачи. Не очень удобно, не очень красиво, но без изменений в самом элементе управления Scheduler по-другому не получалось.

"Раловец Ольга" написал:Не очень удобно, не очень красиво, но без изменений в самом элементе управления Scheduler по-другому не получалось.

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

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

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

Здравствуйте!
ПРи попытке добавить зользователя из домена возникает ошибка:

[11.04.11 20.47.03.265] (E) Создание нового пользователя базы данны 'FONTE\e.egor' завершено с ошибкой: Сервер-участник "FONTE\e.egor" уже существует

В чем может быть проблема?

Нравится

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

Егор, ошибка четко говорит о причине. На вашем sql сервере логин с именем "FONTE\e.egor" уже добавлен.

Действительно так.
Меня смутила формулировка "сервер-участник". Если бы сообщение об ошибке гласило о дублировании имени входа или пользователя - вопрос бы не возник.
Спасибо, Александр!

Кстати, пользователь домена FONTE\e.egor оказался в списке имен входа MS SQL Server из-за того, что при установке оного он был добавлен в список администраторов сервера.

Егор, русская редакция sql сервера и не такое вам выдаст :) Я бы не использовал ее, там перлы можно встретить и не такие :)

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

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

Стоит задача получать от пользователя на определенном этапе некоторые данные, чтобы в дальнейшем их использовать в БП. В частности, нужно использовать какой-нибудь элемент для ввода даты, CalendarControl, например, и NumericEdit.

В БД эти данные сохранять не нужно (по крайней мере, пока), поэтому, как я понимаю, достаточно их записать в параметры БП. Однако сделать это не удается, я пытаюсь обработать событие OnClick единственной в окне кнопки ОК. Вопросы:

1. Как получить запущенный экземпляр БП из обработчика нажатия кнопки? Как я понимаю, GetDiagramByItem() тут не подходит, так же как и GetNewItemByUSI().

2. Для установки параметров диаграммы кажутся подходящими ф-ии WFSetParamValueDirect и WFSetParamValue. В чем их отличия?

3. Как работать с датой из CalendarControl?

4. Описан ли вообще где-то в документации DOM, ф-иям для БП? Без этого как-то очень тяжело :(

Заранее спасибо!

Нравится

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

Юрий, добрый день.

1) Среди элементов БП есть такой, как "Открытие окна". Вы можете создать своё окно для ввода значений, связать этот элемент с окном и сопоставить поля окна с параметрами бизнес-процесса. Другой вариант - добавить на диаграмму элемент "Скрипт", в обработчике события OnExecute которого написать примерно такой код:

var Window = Services.GetNewItemByUSI(<USI окна редактирования>);
Window.ShowModal();
var ResultValue = Window.ComponentsByName(<Название контрола>).DataField.Value;
............

Далее можно присвоить эти значения параметрам диаграммы.

2) Данные функции отличаются исключительно набором входящих параметров: функция WFSetParamValueDirect работает непосредственно с коллекцией параметров, а WFSetParamValue получает на вход элемент диаграммы (параметры которого извлекаются уже внутри функции). В остальном - никаких отличий.

3) Получить дату из компонента ICalendarControl просто:

var ResultDate = Window.ComponentsByName('CalendarControl').Value;

Со списком остальных методов для работы с этим контролом можно ознакомиться здесь. Но лично мне кажется, в плане ввода и получения нужной даты удобнее работать с объектами DateTimeDataControl или DateTimeControl.

4) Информацию о свойствах и методах элемента БП и диаграммы можно найти в SDK на нашем сайте. События определённых элементов БП, а также другая информация о создании БП описаны в Руководстве администратора, которое поставляется вместе с установочным пакетом системы Terrasoft. Различного рода примеры, ответы на вопросы и другую информацию Вы можете найти и на нашем комьюнити.

Спасибо, со скриптом все получилось!

Я как раз и пользовался "Открытием окна", и думал про связывание параметров диаграммы с полями данных. Однако в окне настройки блока это поле пустое, а кнопки "Добавить" и прочие неактивны (см. скрин). С чем это может бызть связано?

Возможно, Ваше окно wnd_InsertPaymentDate - наследник wnd_BaseEdit, а не wnd_BaseDBEdit, то есть, в нём нет ссылки на датасет. Попробуйте подставить окно с датасетом, всё должно быть корректно. Если же используются контролы без привязки к датасету, тогда лучше вызывать окно из скрипта.

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

Нередко компаниям, в результате реструктуризации или каких-либо видимых причин необходимо перераздать права доступа на записи в приложении Terrasoft CRM.
В том случае, если база достаточно велика, раздача прав доступа превращается в рутинную работу.
Предлагаю для пользователей sql-запрос, который "перераспределит" права доступа пользователям таким образом, чтобы они видели только те записи, в которых являются ответственными.
Что нужно сделать:
1. Перед выполнением нижеуказанных действий настоятельно рекомендую сделать резервную копию Вашей базы данных во избежание нарушения работоспособности системы и потери данных! 
2. Запустите менеджер по управлению базой данных, в зависимости от используемой Вами СУБД (для SQL - например, Enterprise Manager). Выберите базу, на которой необходимо выполнить Sql-запрос. Откройте окно для нового запроса и вставьте запрос следующего содержания:

DELETE FROM tbl_AccountRight
INSERT INTO tbl_AccountRight (ID, RecordID, AdminUnitID, CanRead, CanWrite, CanDelete, CanChangeAccess)
SELECT newid(), A.ID, AU.ID, 1, 1, 1, 1
FROM tbl_Account A
JOIN tbl_AdminUnit AU ON AU.UserContactID = A.[OwnerID]

3. Запустите на выполнение.
4. Данный запрос предназначен для раздачи прав доступа для раздела контрагентов. Вы также можете раздать аналогичные права доступа пользователям на записи путем замены в запросе tbl_Account на название соответствующей таблицы.
5. Затем необходимо запустить рабочее приложение Terrasoft CRM под пользователем с правами администратора. Зайти в раздел «Контакты», выбрать записи тех контактов, которые являются пользователями системы и добавить этих пользователей на закладку «Доступ» менеджера деталей. То есть раздать пользователям права доступа на записи контактов самих себя. Это делается с той целью, чтобы пользователь в поле «Ответственный» мог видеть запись себя.
6. Затем Вы можете зайти в приложение под обычным пользователем и протестировать работоспособность системы.

Желаю удачи!

С уважением,
Мельникова Екатерина

Нравится

Поделиться

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

Если уж делать что-то такое, то скрипт должен учитывать и права доступа по-умолчанию.

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

В том то и дело, что этот скрипт не учитывает прав доступа по умолчанию. Это учитывают другие скрипты http://community.terrasoft.ua/blogs/3277
Дело в том, что клиенты нередко обращаются с просьбой предоставить что-то подобное, поскольку регламенты работы в их компаниях предусматривают именно такой функционал.

Мельникова Екатерина

Если у клиента права доступа по-умолчанию настроены каким-то образом, то это, скорее всего, соответствует его регламентам.

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

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

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

Это вполне жизненная задача, также как и остальные требует решения.

Мельникова Екатерина

Так тогда начальник отдела не сможет посмотреть статистику по своим подчиненным.
То что поставили такую задачу, не означает что она имеет смысл :)

Так сделали бы отдельный раздел "База знаний". Ато вытаскивание оттуда кусков в блоги смотрится как-то странно.

"Underscore a.k.a. _" написал:Так тогда начальник отдела не сможет посмотреть статистику по своим подчиненным
Если он конечно не администратор.

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

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

Иногда при постановке задачи возникает необходимость добавить к этой задаче еще десяток пользователей системы. Добавление вручную каждого пользователя на закладку "Контакты" занимает значительную часть времени пользователя. Полезным функционалом было бы создание новой кнопки "Добавить группу контактов".
Предлагаю вариант решения:
1. Вам необходимо в грид детали "Контакты" (менеджера деталей раздела "Задачи") добавить новую кнопку. Назвать ее, например, "Добавить группу пользователей" и присвоить Caption "AddUsersGroup".
2. Далее Вам необходимо реализовать две функции, которые потом будут вызываться в обработчике события нажатия на созданную кнопку.
2.1. Одна из функций должна реализовывать появление окна выбора существующих групп пользователей. Необходимая функция будет выглядеть примерно следующим образом:

function AddUsersGroup() {
var Dataset = GetSingleItemByCode('ds_Group', 'ContactInTaskGridArea');
var SearchFieldNames = 'Name';
var DisplayFieldNames = 'Name';
var KeyFieldName = 'ID';
var KeyValue = '';
var SearchFieldName = 'Name';
var SearchValue = '';
var NotifyObject = Self;
var Tag = 'SelectUsersGroupWindow';
var IsReadOnly = true;
ShowSelectDataWindow(Dataset, SearchFieldNames, DisplayFieldNames,
KeyFieldName, KeyValue, SearchFieldName, SearchValue, NotifyObject,
Tag, IsReadOnly);
}

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

function ProcessAddUsersGroup(Sender) {
var GroupID = Sender.Attributes('KeyValue');
if (!GroupID) {
return;
}
var UserSelectQuery = GetSingleItemByCode('sq_User',
'ContactInTaskGridArea');
var ContactInTaskDataset = GetSingleItemByCode('ds_ContactInTask',
'ContactInTaskGridArea');
ApplySelectQueryFilter(UserSelectQuery, 'GroupID', GroupID, true);
var UserDataset = UserSelectQuery.Open();
var TaskID = Self.Attributes('ParentItemID');
while (!UserDataset.IsEOF) {
ContactInTaskDataset.Append();
ContactInTaskDataset.Values('ID') = Connector.GenGUID();
ContactInTaskDataset.Values('TaskID') = TaskID;
ContactInTaskDataset.Values('ContactID') =
UserDataset.Values('UserContactID');
ContactInTaskDataset.Post();
UserDataset.GotoNext();
}
ContactInTaskDataset.Close();
UserDataset.Close();
}

3. Далее нужно в обработчике события OnClick созданной кнопки прописать вызов процедуры AddUsersGroup (вызова окна выбора групп).
function amiAddUsersGroupOnExecute(ActionMenuItem) {
AddUsersGroup();
}

4. Затем в обработчике события OnNotify грида менеджера деталей "Контакты" раздела "Задачи", прописать вызов фукнции ProcessAddUsersInGroup с необходимыми условиями.

function wnd_ContactInTaskGridAreaOnNotify(ScriptableService, Sender, Message,
Data) {
if (Message == MSG_OK) {
if (Sender.Tag == 'SelectUsersGroupWindow') {
ProcessAddUsersGroup(Sender);
}
RefreshDataset(BaseGridArea.GridDataset);
} else {
scr_BaseGridArea.wnd_BaseGridAreaOnNotify(ScriptableService, Sender,
Message, Data);
}
}

В прикрепленном файле высылаю пример текста доработанного сервиса.

Желаю удачи!

С уважением,
Мельникова Екатерина

Нравится

Поделиться

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

Наверняка каждый, кто создавал бизнес-процесс в системе Terrasoft хотя бы раз сталкивался с задачей раздать разные права доступа пользователям на элемент бизнес-процесса. Вариант, когда пользователь 1 раздает вручную права доступа например, на документ по процессу пользователю 2 не совсем удобен (нужно всегда об этом помнить, делать лишние движения руками, мышью и т.д.). Волей-неволей задаешься задачей реализовать это один раз и больше не задумываться о подобных мелочах.
Предлагаю для решения задачи создать хранимую процедуру, которая и будет создавать нужные права доступа, а затем вызывать эту процедуру в любом месте скрипта бизнес-процесса.
Привожу текст хранимой процедуры в прикрепленном файле. Она предназначена для раздачи полных прав доступа одному пользователю и прав только на чтение другому (для документа).

После создания этой хранимой процедуры Вам необходимо создать ее обработку уже в Terrasoft CRM Administrator с передачей используемых в ней параметров. Это делается следующим образом:

function SetSpecialPermission(User1ID, User2ID) {
 if (IsEmptyValue(User1ID) || IsEmptyValue(User2ID)) {
  return;
 }
 var IsAdmin = Connector.CurrentUser.IsAdmin;
 IsAdmin = IsAdmin ? 1 : 0;
 var SQL = "exec tsp_SetSpecialPermissions :P1, :P2, :P3";
 var Param = System.CreateObject("TSObjectLibrary.Parameters");
    AddParameter(Param, pdtGUID, User1ID).Name = 'P1';
    AddParameter(Param, pdtGUID, User2ID).Name = 'P2';
    AddParameter(Param, pdtGUID, IsAdmin).Name = 'P3';
 Connector.DBEngine.ExecuteCustomSQL(SQL, Param);
}

Затем в нужном месте скрипта бизнес-процесса, например на событии OnAfterExecute задачи процессе, вызвать эту процедуру, указав ID пользователей.

 function Action1OnAfterExecute(ActionItem, IsComplete)

 var User1ID = '{251FB9AC-C17E-4DF7-A0CB-D591FDB97462}';
 var User2ID = '{B8ABDC0D-D36E-42C5-B1F6-2AD425F6CAD0}';
 SetSpecialPermission(User1ID, User2ID);
}

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

Надеюсь, мой пример сократит затраты Вашего драгоценнейшего времени на реализацию функционала раздачи прав доступа.

С уважением,
Мельникова Екатерина

Нравится

Поделиться

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

Если ваша система работает с СУБД Oracle, то вам необходимо знать, что если ввести несколько раз подряд неверный пароль, то учетная запись пользователя может быть заблокирована на уровне СУБД. "Может быть" я написал потому, что это зависит от настроек Oracle. В случае, если пользователи, все таки, блокируются, для их разблокировки проще всего выполнить в sqlplus следующую команду

ALTER USER username ACCOUNT UNLOCK

Если с такой ситуацией приходится сталкиваться часто, то можно пойти дальше - добавить в разделе Администрирование действие "Разблокировать пользователя" и реализовать следующий обработчик события:
function amiUnlockUserOnExecute(ActionMenuItem, Sender) {
  var UserName = GetDatasetFieldValue (dlData.Dataset, 'SQLObjectName');
  if (UserName) {
    Connector.DBEngine.ExecuteCustomSQL('ALTER USER "' + UserName + '" ACCOUNT UNLOCK', System.EmptyValue);
    ShowInformationDialog('Пользователь "' + UserName + '" успешно разблокирован!');
  }
}

Нравится

Поделиться

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

Впринципе, если это часто происходит блокировка пользователей в следствии некорректного воода пароля, то в настройках Oracle параметру FAILED_LOGIN_ATTEMPTS нужно указать UNLIMITED и пользователь блокироваться не будет.

я вообще ничего не понимаю в этом оракле =)
что он хочет?

ALTER USER username ACCOUNT UNLOCK
   2  /
SP2-0640: Not connected
Показать все комментарии