Добрый день, коллеги. 



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



Пользователь создается вручную. 



У кого есть идеи, как все-таки запускать процесс при создании пользователя?

Нравится

2 комментария
Лучший ответ

Здравствуйте! Разве что через событийный слой

[EntityEventListener(SchemaName = "SysAdminUnit")]
    public class SysAdminUnitEntityEventListener : BaseEntityEventListener
{
  public override void OnSaving(object sender, EntityBeforeEventArgs e) {
    base.OnSaving(sender, e)
  }
  public override void OnInserting(object sender, EntityBeforeEventArgs e) {
    base.OnInserting(sender, e);
  }
 public override void OnUpdating(object sender, EntityBeforeEventArgs e) {
   base.OnUpdating(sender, e);
}
public override void OnUpdated(object sender, EntityAfterEventArgs e) {
 base.OnUpdated(sender, e);
}
public override void OnInserted(object sender, EntityAfterEventArgs e) {
 base.OnInserted(sender, e);
}
}

Ну а там уже выбирайте при каких событиях Вам нужно обрабатывать про событийный слой прочтите данную статью

 

Так же БП можно запускать из серверного кода примерно следующее:

 

using Terrasoft.Core;
using Terrasoft.Core.Process;
using Terrasoft.Core.Process.Configuration;
 
ProcessSchema schema = UserConnection.ProcessSchemaManager.GetInstanceByName("LeadManagement");
//schema = UserConnection.ProcessSchemaManager.GetInstanceByUId(leadManagementProcessUId);
 
//Разные движки для интерпритируемых и компилироуемых БП
bool canUseFlowEngine = ProcessSchemaManager.GetCanUseFlowEngine(UserConnection, schema);
if(canUseFlowEngine) {
	var flowEngine = new FlowEngine(UserConnection);
	var param = new Dictionary<string, string>();
	param["LeadId"] = Entity.Id.ToString();
	flowEngine.RunProcess(schema, param);
} else {
	Process process = schema.CreateProcess(UserConnection);
	process.SetPropertyValue("LeadId", Entity.Id);
	process.Execute(UserConnection);
}		

 

Здравствуйте! Разве что через событийный слой

[EntityEventListener(SchemaName = "SysAdminUnit")]
    public class SysAdminUnitEntityEventListener : BaseEntityEventListener
{
  public override void OnSaving(object sender, EntityBeforeEventArgs e) {
    base.OnSaving(sender, e)
  }
  public override void OnInserting(object sender, EntityBeforeEventArgs e) {
    base.OnInserting(sender, e);
  }
 public override void OnUpdating(object sender, EntityBeforeEventArgs e) {
   base.OnUpdating(sender, e);
}
public override void OnUpdated(object sender, EntityAfterEventArgs e) {
 base.OnUpdated(sender, e);
}
public override void OnInserted(object sender, EntityAfterEventArgs e) {
 base.OnInserted(sender, e);
}
}

Ну а там уже выбирайте при каких событиях Вам нужно обрабатывать про событийный слой прочтите данную статью

 

Так же БП можно запускать из серверного кода примерно следующее:

 

using Terrasoft.Core;
using Terrasoft.Core.Process;
using Terrasoft.Core.Process.Configuration;
 
ProcessSchema schema = UserConnection.ProcessSchemaManager.GetInstanceByName("LeadManagement");
//schema = UserConnection.ProcessSchemaManager.GetInstanceByUId(leadManagementProcessUId);
 
//Разные движки для интерпритируемых и компилироуемых БП
bool canUseFlowEngine = ProcessSchemaManager.GetCanUseFlowEngine(UserConnection, schema);
if(canUseFlowEngine) {
	var flowEngine = new FlowEngine(UserConnection);
	var param = new Dictionary<string, string>();
	param["LeadId"] = Entity.Id.ToString();
	flowEngine.RunProcess(schema, param);
} else {
	Process process = schema.CreateProcess(UserConnection);
	process.SetPropertyValue("LeadId", Entity.Id);
	process.Execute(UserConnection);
}		

 

Мне кажется, вопрос в другом.

При добавлении пользователя через интерфейс идёт обращение к веб-сервису AdministrationService и его методу UpdateOrCreateUser. В схеме AdministrationServiceUsers виден его код:

protected void SaveUser(object roleId) {
	bool isNew = false;
	object primaryColumnValue;
	changedValues.TryGetValue("Id", out primaryColumnValue);
	EntitySchema entitySchema = UserConnection.EntitySchemaManager.GetInstanceByName("VwSysAdminUnit");
	Entity entity = entitySchema.CreateEntity(UserConnection);
	isNew = !entity.FetchFromDB(primaryColumnValue);
	if (isNew) {
		entity.SetDefColumnValues();
	}
	foreach (KeyValuePair<string, object> item in changedValues) {
		EntitySchemaColumn column = entitySchema.Columns.GetByName(item.Key);
		object columnValue = item.Value;
		if ((column.DataValueType is DateTimeDataValueType) && (item.Value != null)) {
			columnValue = DataTypeUtilities.ValueAsType<DateTime>(item.Value);
		}
		entity.SetColumnValue(column.ColumnValueName, columnValue);
	}
	entity.Save();
	if (isNew) {
		AddUserInRole(entity.PrimaryColumnValue, roleId);
	}
}

То есть видно, что вставка идёт через механизмы ESQ (значит, события отработают), но в объект VwSysAdminUnit, а не SysAdminUnit. Если посмотреть в коде встроенного БП на VwSysAdminUnit в пакетах Base, Translation и WebitelCollaborations, там как раз успешно добавляют свои обработчики на вставку, сохранение и другие события:

То есть нужно будет либо в Custom сделать своё переопределение схемы со встроенным БП, либо сделать отдельный БП, запускающийся по сигналу вставки туда:

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

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

Подскажите как можно экспортировать пользователей с номерами IP телефонии что занесены в настройки пользователя?

Нравится

6 комментариев
Лучший ответ

Вот пример формата поля ConnectionParams - {"debugMode":false,"disableCallCentre":true,"ExtensionName":"123"}

Для загрузки данных можно попробовать использовать стандартный импорт данных из MS Excel либо написать свой парсер.

Ещё, как вариант, можно написать стандартный sql-запрос insert.

Для выгрузки данных реализуйте sql-запрос.

Если у Вас bpm'online on-site, то можно выполнить запрос прямо на сервере баз данных через Microsoft SQL Server Management Studio.

Если on-demand, то можно установить Модуль для выполнения SQL - скриптов "SQL Executor" и выполнить запрос из него.

И оттуда, и оттуда можно информацию выгрузить в MS Excel.

Алла Савельева,

а в какой таблице хранятся данные о номерах ip телефонии что прикреплены к пользователю? Мне нужно выгрузить таблицу с колонками "контакт; номер телефона avaya"

Александр Тыра,

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

Подозреваю, что речь о настройках телефонии Avaya, которые хранятся в части записей таблицы SysMsgUserSettings сериализированными в формате JSON в поле ConnectionParams. И в SQL-запросе придётся этот JSON парсить, вычленяя номер.

Как вариант, те же номера могут также вестись на детали средств связи в разделе контактов. Если они там есть у контактов этих пользователей, проще выгрузить оттуда.

Вот пример формата поля ConnectionParams - {"debugMode":false,"disableCallCentre":true,"ExtensionName":"123"}

Для разных систем телефонии формат ещё и разный.

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

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

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

Благодарю заранее.

Нравится

1 комментарий
Лучший ответ

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

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

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

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

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

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

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

Добрый день. Подскажите, есть 163 лицензии, в менеджере лицензий отображаются 160 пользователя и 3 встроенной учетной записи. Проблема в том что отображается только 100 записей списка и нет ни где подгрузки или перехода на другую страницу.

Вопрос - как можно увидеть остальные 63 пользователей что бы видеть из лицензии в менеджере лицензий? И можно ли экспортировать этот список с полями "Пользователь - тип лицензии"?

Нравится

4 комментария
Лучший ответ

Prime Source,

А раздел Пользователи системы из дизайнера системы доступен? По сути одно и то же. В менеджере лицензий нет возможности исправить набор колонок и отобразить больше 100 записей. Ответ от техподдержки звучал так: "На уровне приложения можно просмотреть только 100 записей. Это действительно так. У нас есть задачи по доработке функционала, однако в ближайшее время они реализованы не будут."

Есть нет раздела Пользователи системы, то выгружать из БД. 

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

либо запрос к БД - покажет пользователей без лицензий.

SELECT us.NAME

    ,lic.SysLicPackageId

    ,licp.NAME

    ,lic.Active

    ,lic.SysUserId

FROM SysAdminUnit us

LEFT JOIN SysLicUser lic ON lic.SysUserId = us.id

LEFT JOIN SysLicPackage licp ON lic.SysLicPackageId = licp.id

WHERE us.SysAdminUnitTypeValue = 4 and lic.SysLicPackageId is null.

Алексей Следь,

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

Экспорт выходит можно только через БД сделать?

Prime Source,

А раздел Пользователи системы из дизайнера системы доступен? По сути одно и то же. В менеджере лицензий нет возможности исправить набор колонок и отобразить больше 100 записей. Ответ от техподдержки звучал так: "На уровне приложения можно просмотреть только 100 записей. Это действительно так. У нас есть задачи по доработке функционала, однако в ближайшее время они реализованы не будут."

Есть нет раздела Пользователи системы, то выгружать из БД. 

Алексей Следь,

 

Пользователи есть, спасибо, попробую там

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

Коллеги, добрый день.

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

"Превышено максимально допустимое количество подключений"

Лицензии у пользователей есть.

Как устранить данную ошибку? 

 

update: Нашли не законченные сессии, которые висят еще с 17 года. Как правильно их закончить? Достаточно будет ли сделать update записей прописав им дату завершения сеанса сегодняшним числом? Могут ли данные сессии использовать лицензии и быть причиной возникновения ситуации описанной выше?

Нравится

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

Добрый день, Евгений.

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

UPDATE SysAdminUnit SET LoggedIn = 0 WHERE LoggedIn = 1

UPDATE SysUserSession SET SessionEndDate = '2018-02-12 10:16:49.078' WHERE SessionEndDate IS NULL

Также, чтобы избежать повторения ситуации в будущем, рекомендуйте пользователям правильно заканчивать сессии - при помощи кнопки "Выход".

Антон Малий,

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

Антон Малий,

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

Это зависит от версии. В последних версиях пользователи окажутся на странице логина. Им нужно будет просто перезайти на сайт еще раз.



Закрытие браузера не всегда происходит в штатном режиме. Если, к примеру, браузер аварийно закрылся с несохранением последней истории, кэша и куки - в БД сессия продолжится вечно, пока Вы не закроете ее вручную.

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

В API текущего приложения, не входит каких либо инструментов для упрощенной работы с элементами организационной структуры:
"Функциональные роли", "Организационные юниты", "Пользователи" (само по себе)
Уже обсуждалось вот в этой теме
Там же я выложил первые наработки, миксин-модуля с некоторыми методами решающими классические "юзкейсы".
С тех пор его пришлось существенно доработать и расширить функционал, по этому выложу его в этой отдельной теме для тех кому может понадобиться.
Во вложении (ZIP-архив) вы найдете исчерпывающую документацию в виде HTML-страницы.
Модуль реализован в виде "миксина", т.е. без каких либо трудностей подключайте в любой схеме и пользуйтесь на здоровье :) так же в конце темы есть исходный код, а так-же Уже готовая к импорту схема в виде MD-файла.
Краткое описание:
getRelAU ([id], callback, [contactModeFlag], [scope]);
Получить информацию об административных юнитах связанных с пользователем, по его идентификатору Id или Id связанного с ним контакта, или для текущего пользователя если опустить первый аргумент.
(элементы "Организационной структуры", "Функциональные роли", "Организации", "Роли руководителей" (если он в них входит)) в виде структурированного объекта с дополнительной информацией (н/п о родительских OU/FU) будут переданы в callback вызов.
checkUserInAU (AUname, [AUtype], [UserId], callback, [scope])
Проверить принадлежит ли текущий пользователь (или произвольный по его Id) к конкретному административному юниту по его имени (элементу "Организационной структуры", "Функциональные роли", "Организации").
В целях оптимизации предусмотрен поиск только по конкретным типам Орг.юнитов. Результат передается в виде булева примитива в callback-функцию
getUsersFromRole (RoleId, [getManagerFlag], callback, [scope])
Получить всех пользователей непосредственно входящих в целевые орг.юнит или функциональную роль, в том числе руководителей (пользователей из специалищированного связанного орг.юнита).
Коллекция пользователей будет передана в callback-функцию

Исходный код:

define("UserUtilsMixin", ["UserUtilsMixinResources"],
        function(resources) {
                Ext.define("Terrasoft.configuration.mixins.UserUtilsMixin", {
                        "alternateClassName": "Terrasoft.UserUtilsMixin",
                        "getRelAU": function(UserId, callback, UseContactIdFlag, scope) {
                                var serviceScope;
                                if (callback === undefined) {
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof callback === "object") {
                                        scope = callback;
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UseContactIdFlag === "object") {
                                        scope = UseContactIdFlag;
                                        UseContactIdFlag = false;
                                }
                                if (typeof scope !== "object") {
                                        scope = this;
                                } else if (scope.scope) {
                                        serviceScope = scope;
                                        scope = scope.scope;
                                }
                                function mainLogick(UserId, callback) {
                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysUserInRole"
                                        });
                                        var filter = this.scope.Terrasoft.createColumnFilterWithParameter(
                                                this.scope.Terrasoft.ComparisonType.EQUAL,
                                                "SysUser",
                                                UserId
                                        );
                                        esq.filters.addItem(filter);
                                        esq.addColumn("SysRole");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].Name", "AuName");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].ParentRole", "Parent");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].[SysAdminUnitType:Value:SysAdminUnitTypeValue].Name", "AuType");
                                        esq.getEntityCollection(
                                                function(response) {
                                                        if (response && response.success) {
                                                                var resultObject = {
                                                                        FuncRoles: [],
                                                                        OrgUnits: [],
                                                                        Organizations: [],
                                                                        Managers: [],
                                                                        Teams: []
                                                                };
                                                                response.collection.each(function(item) {
                                                                        var wrapObj = {
                                                                                name: item.values.AuName,
                                                                                id: item.values.SysRole.value,
                                                                                parentAU: item.values.Parent
                                                                        };
                                                                        var type = item.values.AuType;
                                                                        if (type === "Division") {
                                                                                resultObject.OrgUnits.push(wrapObj);
                                                                        } else if (type === "Функциональная роль") {
                                                                                resultObject.FuncRoles.push(wrapObj);
                                                                        } else if (type === "Organization") {
                                                                                resultObject.Organizations.push(wrapObj);
                                                                        } else if (type ===  "Manager") {
                                                                                resultObject.Managers.push(wrapObj);
                                                                        } else if (type ===  "Team") {
                                                                                resultObject.Teams.push(wrapObj);
                                                                        }
                                                                });
                                                                if (serviceScope) {
                                                                        this.callback.call(serviceScope, resultObject);
                                                                } else {
                                                                        this.callback.call(scope, resultObject);
                                                                }
                                                        }
                                                },
                                                {callback: callback, scope: this.scope}
                                        );
                                }
                                var wrapOfMainLogick = mainLogick.bind({scope: scope, callback: callback});
                                if (UseContactIdFlag) {
                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysAdminUnit"
                                        });
                                        var filter = this.Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.EQUAL,
                                                "Contact.Id",
                                                UserId
                                        );
                                        esq.filters.addItem(filter);
                                        esq.getEntityCollection(
                                                function(response) {
                                                        if (response.collection.getCount() !== 1) {
                                                                this.scope.log("(getRelAU) Target Contact is not associated with User", Terrasoft.LogMessageType.ERROR);
                                                        } else {
                                                                this.mainLogick(response.collection.getByIndex(0).values.Id, this.callback);
                                                        }
                                                },
                                                {
                                                        scope: scope,
                                                        mainLogick: wrapOfMainLogick,
                                                        callback: callback
                                                }
                                        );
                                } else {
                                        wrapOfMainLogick(UserId, callback);
                                }
                        },
                        "checkUserInAU": function(AUname, AUtype, UserId, callback, scope) {
                                if (typeof AUtype === "function" && UserId === undefined) {
                                        callback = AUtype;
                                        AUtype = "ALL";
                                        if (typeof UserId === "object") {
                                                scope = UserId;
                                        }
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UserId === "function") {
                                        if (typeof callback === "object") {
                                                scope = callback;
                                        }
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UserId !== "object") {
                                        scope = this;
                                }
                                this.getRelAU(UserId, function(result) {
                                        var CompareResult = false;
                                        switch (this.AUtype) {
                                                case "OU":
                                                        for (var OU in result.OrgUnits) {
                                                                if (this.AUname === result.OrgUnits[OU].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                case "FR":
                                                        for (var FU in result.FuncRoles) {
                                                                if (this.AUname === result.FuncRoles[FU].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                case "ORG":
                                                        for (var orgIndex in result.Organizations) {
                                                                if (this.AUname === result.Organizations[orgIndex].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                default:
                                                        for (var each in result) {
                                                                for (var subarray in result[each]) {
                                                                        if (this.AUname === result[each][subarray].name) {
                                                                                CompareResult = true;
                                                                        }
                                                                }
                                                        }
                                                        break;
                                        }
                                        this.callback.call(this.scope, CompareResult);
                                }, {
                                        scope: scope,
                                        AUtype: AUtype,
                                        AUname: AUname,
                                        callback: callback
                                });
                        },
                        "getUsersFromRole": function(RoleId, getManager, callback, scope) {
                                var getManagerFlag = false, filter = Terrasoft.createFilterGroup(), esq;
                                if (typeof getManager === "function") {
                                        callback = getManager;
                                        if (typeof callback === "object") {
                                                scope = callback;
                                        }
                                } else {
                                        getManagerFlag = getManager;
                                }
                                if (typeof scope !== "object") {
                                        scope = this;
                                }
                                if (getManagerFlag) {
                                        filter.logicalOperation = Terrasoft.LogicalOperatorType.AND;
                                        esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysAdminUnit"
                                        });
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "ParentRole",
                                                        RoleId
                                                )
                                        );
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "SysAdminUnitTypeValue",
                                                        2
                                                )
                                        );
                                        esq.addColumn("Name");
                                } else {
                                        esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysUserInRole"
                                        });
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "SysRole",
                                                        RoleId
                                                )
                                        );
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Name", "UserName");
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Id", "UserId");
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Contact", "Contact");
                                }
                                esq.filters.addItem(filter);
                                esq.getEntityCollection(
                                        function(response) {
                                                var cleanArray = [];
                                                if (this.getManagerFlag) {
                                                        this.scope.getUsersFromRole(
                                                                response.collection.getByIndex(0).values.Id,
                                                                this.callback,
                                                                this.scope
                                                        );
                                                } else {
                                                        response.collection.each(function(elem) {
                                                                elem.values.Id = elem.values.UserId;
                                                                delete elem.values.UserId;
                                                                cleanArray.push(elem.values);
                                                        });
                                                        this.callback.call(this.scope, cleanArray);
                                                }
                                        }, {
                                                scope: scope,
                                                callback: callback,
                                                getManagerFlag: getManagerFlag
                                        }
                                );
                        }
                });
        });

Нравится

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

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

Полезная информация, спасибо.

код миксина обновлен (исправлены некоторые проблемы, добавлены некоторые решения), MD-файл из приложений убрал он не актуален.
берите код из листинга в теме.

примеры для вызова getRelAU

//Получаем результирующий объект для текущего пользователя
this.getRelAU(
         function(result) {
                console.log(result);
         }
);
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
         function(result) {
                console.log(result);
         }
, context);
//Получаем результирующий объект для пользователя с id "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D"
this.getRelAU(
    "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D",
   function(result) {
        console.log(result);
    }
);
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
    "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D",
    function(result) {
        console.log(result);
    }
, context);
//Получаем результирующий объект для пользователя связанного с контактом id которого "E7D525FB-88EE-4947-94CC-D013E85D2F79"
this.getRelAU(
    "E7D525FB-88EE-4947-94CC-D013E85D2F79",
    function(result) {
        console.log(result);
    },
    true
 );
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
    "E7D525FB-88EE-4947-94CC-D013E85D2F79",
    function(result) {
        console.log(result);
    },
    true,
    context
);

в схему корректно не выгружается кириллица, а поскольку в SysAdminUnitType одна только "Функциональная роль" названа кириллицей.
То после импорта схемы посмотрите в исходник, там где "кракозебры" замените на "Функциональная роль"
Будет время, обновлю MD-корректный

                      

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

Севостьянов Илья Сергеевич,

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

define("UserUtilsMixin", ["UserUtilsMixinResources"]

 

создала у себя миксин, но без этого UserUtilsMixinResources, а также изменив названия миксина в 3 местах. когда его подключаю в своем клиентском модуле, выходит ошибка.

Есть какие-то особенности при этого подключении миксина?

UserUtilsMixinResources, это имя модуля + Resources стандартная мнемоника для объявления ресурсов в зависимостях для схем.

в 3-х местах это в каких ?

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

Добрый день!

Прошу подсказать, каким наиболее изящным образом можно формировать обобщённую статистику по активности пользователей при работе в CRM? Интересует аналог журнала аудита, который показывал бы в каких разделах и какие действия выполняли пользователи, с возможностью фильтра и экспорта в Excel.

Заранее благодарен!

Нравится

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

Сергей, здравствуйте!

На текущий момент, с помощью базовых средств Вы можете в итогах создать график по объекту "Сеанс пользователя", где можно будет отобразить начало и завершение сеанса определенного пользователя и выгрузить указанный список в Excel (см. скриншоты).
Также, в реестре разделов Вы можете вывести колонку "Дата изменения", которая будет отображать последнюю дату изменения записи. Реестр разделов, также можно экспоритировать.

Илья, добрый день!

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

В базовой конфигурации описанный механизм не реализован.

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

Добрый день!
7.6
В разделе Пользователи есть деталь Правила доступа, на которой отображаются Сессии пользователя
!text

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

Нравится

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

Здравствуйте, Дарья!

Данная деталь "смотрит" на объект Сеанс пользователя (SysUserSession). Колонка связи с разделом Пользователь.Id == Сеанс пользователя.Пользователь

Используя эти данные и правила фильтрации найденных записей, Вы можете вывести информацию о последнем сеансе пользователя в реестр.

"Демьяник Алексей Олегович" написал:правила фильтрации найденных записей

Вот только в списке связей при построении расширенного фильтра для "Объекта администрирования" "Сеанса пользователя" нет :wink:

Да, в том-то и дело, что не нахожу "Сеанса пользователя" для "Объекта администрирования" в расширенном фильтре при поиски связей

Дарья,

дело в том, что "Сеанс пользователя" является системным объектом (как и все объекты, которые начинаются с "Sys%")

Системные объекты не отображаются при фильтрации и настройке колонок.

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

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

"Безродный Андрей" написал:Но можно попробовать создать представление на основе этой таблицы и по нему выполнять фильтрацию.

Адрей т.е если есть задачи где требуется пользователю предоставить возможным выполнять фильтрацию по системным таблицам, то лучше заранее делать "Представления". Я правильно вас понял? спасибо!!!

Добрый день!
Представление для таблицы "Сеанс пользователя" можно в этом случае создать как замещающий объект от "Сеанс пользователя" с установленной галкой "представление в БД" ?
или лучше вообще не выбирать для представления родительский объект в данном случае?

"Татаровская Дарья" написал:
Представление для таблицы "Сеанс пользователя" можно в этом случае создать как замещающий объект от "Сеанс пользователя" с установленной галкой "представление в БД" ?

или лучше вообще не выбирать для представления родительский объект в данном случае?

Да именно так и нужно Дарья сделать, а еще нужно написать SQL скрипт для создания представления, иначе представление в "Реальной БД" не появится. Примеры SQL сценариев можно подсмотреть в админке. Переходим "Конфигурация" -- > "SQL сценарии", В строке поиска указываем "vw%" и смотрим. примеры. и делаем свой Вьювер (представление)

про представления я знаю) и про sql скрипт тоже..
Меня интересует в этом конкретном случае - его лучше создать как все-таки замещающий объект или лучше ничего не указывать в родительском объекте?

Дарья день добрый!!!

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

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

спасибо

Создала представление. Теперь в расширенном фильтре появилось данное представления для связи - все получилось

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

Добрый день!
Скажите, пожалуйста, можно ли настраивать авторизацию с LDAP "точечно" - то есть, например, не всех пользователей из группы в LDAP, а только некоторых.
Если такой возможности нет, то какое обходное решение вы можете посоветовать?

Нравится

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

Здравствуйте, Дарья!

Мы уточнили у Вас, что речь идет не об авторизации, а именно о синхронизации пользователей с помощью LDAP.
Решение следующее:
1. Сначала Вам необходимо на сервере Active Directory (где находится информация о пользователях) создать новую группу.
2. В созданную группу внести только тех пользователей, которых Вы хотите синхронизировать с bpm'online.
3. В настройках синхронизации с LDAP указать название новой группы. Сохранить настройки.

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

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

Для определения прав доступа к объектам и системным операциям используются организационные
и функциональные роли пользователей.

Организационная роль является элементом организационной структуры компании, ее подразделением, например, “Отдел продаж московского филиала” или “HR-отдел киевского филиала”.

Функциональная роль отражает должность, которую сотрудник занимает в компании, например,
роль “Менеджеры по продажам”.

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

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

Чтобы предоставить доступ к разделу системы для определенной функциональной роли:

1.   Добавьте и настройте функциональную роль.

2.   Предоставьте доступ к объекту для добавленной функциональной роли.

Как добавить и настроить функциональную роль

Предположим, вам необходимо предоставить доступ к разделу [Продажи] для менеджеров
по продажам, работающим в московском и киевском филиалах компании. Для этого:

1.   Из дизайнера системы перейдите в раздел управления ролями и пользователями,
нажав на ссылку [Функциональные роли].

2.   На странице раздела нажмите на кнопку [Добавить]. На появившейся странице функциональной
роли определите ее параметры:

a.   Введите название роли, например, “Менеджеры по продажам”.

b.   На детали [Организационные роли] добавьте организационные роли, которые должны
входить в данную функциональную роль, например, “Отдел продаж московского филиала”
и “Отдел продаж киевского филиала”.

На заметку

Если доступ к разделу дополнительно требуется предоставить отдельным пользователям,
не входящим в добавленные организационные роли, добавьте необходимых пользователей
на детали [Пользователи].

Если необходимо определить список диапазонов IP-адресов, с которых пользователям
и их руководителям будет разрешен вход в систему, используйте деталь [Диапазон разрешенных
IP-адресов] вкладки [Правила доступа].

c.   Закройте страницу записи.

3.   Актуализируйте настроенные роли. Для этого в меню действий раздела выберите
команду [Актуализировать роли].

Актуализация ролей

Актуализация ролей

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

Как предоставить доступ к разделу

Чтобы предоставить доступ к разделу:

1.   Перейдите в раздел [Доступ к объектам], используя ссылку [Права доступа на объекты]
дизайнера системы.

2.   В списке раздела выберите необходимый объект, например, “Продажа”. Объект должен
администрироваться по операциям. Если администрирование по операциям отключено, установите
признак в колонке [Администрируется по операциям] для выбранного объекта. Обратите
внимание, что установка признака может занять некоторое время.

3.   Перейдите на деталь [Доступ к объекту].

4.   Нажмите на кнопку [Добавить] панели инструментов детали и в открывшемся окне
добавьте роль, для которой будет предоставлен доступ к разделу, например, роль “Менеджеры
по продажам”.

В результате на деталь будет добавлена роль “Менеджеры по продажам”, пользователи
которой смогут читать, добавлять, изменять и удалять данные раздела [Продажи]. Если
необходимо запретить какую-либо из этих операций, например, удаление записей, установите
запрет на удаление в соответствующей колонке.

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

Например,  сотрудник одновременно входит в роль “Менеджеры по продажам” и “Менеджеры
поддержки продаж”. Для роли “Менеджеры поддержки продаж” определено право только
на чтение раздела [Продажи], а для роли “Менеджеры по продажам” — право на все операции.
Чтобы сотрудник получил максимальные права доступа, переместите роль “Менеджеры по
продажам” так, чтобы она оказалась выше роли “Менеджеры поддержки продаж”. В результате
пользователь получит доступ к разделу [Продажи] в соответствии с правами, определенными
для роли “Менеджеры по продаже”, а не “Менеджеры поддержки продаж”.

Для перемещения ролей в списке используйте кнопки [Вверх] и [Вниз] панели инструментов
детали.

Нравится

Поделиться

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