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

Здравствуйте, Владимир!

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

Приятной работы!

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

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

Спасибо, информация зафиксирована и передана на рассмотрение аналитикам.

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

Добрый день!
Есть следующая задача: необходимо во время редактирования записи пользователем, не давать другим пользователем редактировать эту же запись или ее детали. Причем этот функционал должен быть универсальным, т.е. должна быть возможность включать его для любых разделов.
Есть идеи как это можно реализовать?
Версия 7.7.0.2107

Нравится

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

Иван, добрый день.
Функционал можно реализовать при помощи раздачи прав на пользователя/группу пользователей при изменении ответственного/группы ответственных в записи, используя элемент бизнес-процесса "Изменение прав доступа", т.е.:
1) Ловим сигнал изменения поля "Ответственный" в записи интересующего нас объекта;
2) Читаем данные о пользователе/группе пользователей в измененной записи;
3) Элементом "Изменение прав":
a. Удаляем все установленные права в измененной записи;
b. Добавляем права пользователю/группе пользователей, которые выбраны в поле "Ответственный"
Что-то вроде этого должно получиться. Если необходимы подробности для настройки элементов БП, то могу поделиться.

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

Иван,

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

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

Добрый день!
Подскажите пожалуйста, как сделать доступ на детали таким же как и на родительские записи?
Права раздаются на каждую род. запись процессом.
В тройке для этого были группы, а в нет.
BPM 7.6

Нравится

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

Здравствуйте.
Как вариант можно попробовать в процесс добавить логику, которая будет раздавать права на связанные с объектом объекты (то есть давать права на объекты деталей). Необходимо, чтобы эти объекты администрировались по записям.

"Александр Зубков" написал:

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

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

Создал отдельную тему, но здесь тоже спрошу - как скопировать права из родительской записи скопировать в объект детали?

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

После включения администрирования по записям, в системе появится объект SysDetailObjectNameRights.
Права на записи раздела хранятся в таблице SysSectionObjectNameRights.

Задача: при изменении записи в разделе перенести права на записи детали.

Решение:
1) Определите Id записей деталей:

select Id from SysDetailObjectName where SectionObjectNameId = 'Id измененной записи'

2) Удалите права на эти записи:

delete from SysDetailObjectNameRights
where RecordId in
(select Id from SysDetailObjectName where SectionObjectNameId = 'Id измененной записи')

3) Теперь Вам необходимо скопировать записи из таблицы SysSectionObjectNameRights в таблицу SysDetailObjectNameRights, изменив RecordId на Id записи детали.

"Демьяник Алексей" написал:После включения администрирования по записям, в системе появится объект SysDetailObjectNameRights.
Права на записи раздела хранятся в таблице SysSectionObjectNameRights.

А кроме того в системе есть таблицы SysAccountRight и SysAccountAddressRight. Их не трогать?

SysAccountRight - таблица, которая хранит права на записи в объекте Account (Контрагент).
SysAccountAddressRight - таблица, которая хранит права на записи в объекте AccountAddress (Адреса контрагента).

При раздаче прав необходимо переносить права с SysAccountRight в SysAccountAddressRight.

ЗЫ. Прошу прощения - в предыдущем посте указал некорректное название таблиц.

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

Здравствуйте , есть несколько объектов Entity (родитель Базовый Объект) в которых есть каскадное \ связанное обновление реализованное на событиях. Скажите можно ли инициализировать изменения в одном из них, так чтобы для низ лежащих не проверялись права для того кто инициировал изменение в родителе.

Или вообще инициировать изменение или сохранение объекта Entity из под другого логина например?.

Права на объекты настроены на уровне записей.

Предметно:

Есть лист согласования который согласует заявление на отпуск, в котором должны поставить визы руководители и отдел кадров. У заявление на отпуск в детали есть записи указанных дней отпуска (Персональные дни), для каждого сотрудника (Контакт). В этих днях, есть кол-во использованных дней, которое по закрытие заявления рассчитываются. Права на изменение и добавление есть у отдела кадров, у сотрудника только на чтение, для того чтобы формировать заявление. Если лист согласование завизирван всеми участниками успешно то меняется заявление (изменяет состояние), и далее заявление на уровне объект (Entity) меняет те дни которые указанны в детали. И получается: чтобы всё прошло успешно - необходимо выдавать права на изменение на всё это хозяйство - всем кто должен подписать отпуск. Что не есть хорошо.

пример изменения по событие в entity

if (daysCount == daysUsed  &&  (daysUsed > 0)) {
   Entity.SetColumnValue("FreeDayStatusId", Terrasoft.Configuration.FreeDayStatusConst.used);
}

Я понимаю можно было написать update, или сделать на уровне SQL Server триггером, в первом случае придется воротить много одинаковых update со всех мест которые меняют объекты, во втором нагрузка на БД а не на IIS и условия изменения в данных не позволяют использовать триггер бд.

Нравится

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

Если вместо UserConnection использовать UserConnection.AppConnection.SystemUserConnection, то права будут игнорироваться.

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

Здравствуйте!
Можно ли в JS отключить учет прав при update,insert c использованием ESQ?

Нравится

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

Александр, ESQ задумывалась как раз в контексте работы с правами доступа.

Александр, без проверки вроде бы можно только на сервере, с клиентской части это довольно небезопасно.

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

Данная возможность отсутствует, для этого Вы можете использовать объект Select() на стороне сервера

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

"Андрей Каспаревич" написал:

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


Уже так и сделал. Спасибо.

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

Добрый день!
Стоит задача дать права на запись для пользователей, входящих в определенную команду и принадлежащих к одному филиалу (Доп. поле Контакт.Филиал).
Пытался раздать права с помощью БП, но в элементе "Изменение прав доступа" нет возможности добавить права нужным пользователям. Доступны либо все пользователи определенной роли, либо сотрудники, удовлетворяющие условиям фильтрации, в которых можно сделать фильтр по филиалу, но невозможно настроить фильтр по принадлежности пользователя к определенной роли (в агрегирующем фильтре нет Объекта администрирования).
Буду признателен за помощь...

Нравится

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

Здравствуйте, Иван!

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

1) Получить идентификатор пользователя и роли (это можно сделать, обращаясь к объектам Сотрудник и Объект Администрирования).
2) Проверять вхождение пользователя в роль, читая данные из объекта Роль Пользователя. В качестве условий передавать Пользователя и Роль. Если возвращает больше нуля, значит, пользователь входит в роль, иначе - нет.

Это понятно и вполне работает в EntitySchemaQuery, но в БП все сложнее...
Объект Роль Пользователя не доступен в фильтре элемента "Изменение прав доступа".
Добавить в фильтр результат выборки получается только один, а нужна все выборка..
Проблема остается.

Здравствуйте, Иван!

Определенная команда - это определенная роль? Если так, то почему нет возможности отфильтровать по ролям? Или необходимо давать права конкретным людям в определенной роли? Может я не правильно понял суть вопроса?

Команда - это роль(к примеру команда кассиры). Почему нет возможности фильтровать - этот вопрос меня тоже интересует)). В том то и дело, что нужно взять контакта, который входит в определенную роль и принадлежит к нужному филиалу, но в агрегирующем фильтре БП не доступны системные объекты, такие как VwSysAdminUnit. Вопрос в том как применить элемент Изменение прав доступа к нужной выборке сотрудников.

Здравствуйте, Иван!

Действительно, можно выбрать либо конкретную "Роль - группу пользователей в иерархии", либо контакта/ов по определенным условиям (без роли). Но я предлагаю пойти немного иным путем - на странице контакта есть поле "Роль", добавьте в справочник "Роль", необходимое значение, например "Кассир_1" и тогда можно будет по данному условию отфильтровать именно необходимого пользователя или группу.

Приятного дня!

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

Объединил BPMOnline 7.4.1 Sales и Marketing On-Site
Захожу в администрирование через Супервизора. Не могу ни добавить пользователя (кнопки не активны), ни подразделение, пишет "Недостаточно прав для добавления записи в объект "VwSysAdminUnit"
Что это может быть?

Нравится

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

Захожу в конфигурацию, пишет "У Вас нет прав на удаление, редактирование, создание объектов"
Слетели права администратора или что?

Разобрался, просто недодал лицензий.

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

Доброго времени суток!
bpm 5.4.1.728 realty.
Создала новый раздел. Со страницей фильтрации по периоду и ответственному. К объектам добавляю права вручную через триггер.
Страница раздела нормально отображается для админа, но для обычного юзера почему-то при попытке перейти в эту страницу происходит ошибка:
Exception Message: Object reference not set to an instance of an object.
Exception Type: System.NullReferenceException
Exception Source: TSBpm

Exception Stack Trace:
at Terrasoft.WebApp.BaseModuleFoldersPageEventsProcess`1.BaseActiveRowChangedHandler()
at Terrasoft.WebApp.BaseModuleFoldersPageEventsProcess`1.BaseLoadRowsResponseRegisteredHandler(Object sender, DataSourceEventArgs e)
at Terrasoft.WebApp.BaseModuleFoldersPageEventsProcess`1.b__71(Object sender, DataSourceEventArgs e)
at Terrasoft.UI.WebControls.Controls.DataSource.LoadRows(DataSourceRequest request)
at Terrasoft.WebApp.BaseModuleFoldersPageEventsProcess`1.ScriptInitializeExecute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
at Terrasoft.WebApp.BaseModuleFoldersPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.BaseModuleFoldersPageEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
at Terrasoft.WebApp.BaseModuleFoldersPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.BaseModuleFoldersPageEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message)
at Terrasoft.UI.WebControls.PageSchemaUserControl.ThrowEvent(String message)
at Terrasoft.WebApp.BaseModulePageEventsProcess`1.ScriptPageLoadCompleteExecute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
at Terrasoft.WebApp.BaseModulePageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.SalesObjectiveModulePageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.BaseModulePageEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
at Terrasoft.WebApp.BaseModulePageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.SalesObjectiveModulePageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.BaseModulePageEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message)
at Terrasoft.WebApp.SalesObjectiveModulePageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.SalesObjectiveModulePageEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
at Terrasoft.WebApp.SalesObjectiveModulePageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.WebApp.SalesObjectiveModulePageEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message)
at Terrasoft.UI.WebControls.PageSchemaUserControl.ThrowEvent(String message)
at Terrasoft.WebApp.BaseModulePageSchemaUserControl.PageLoadComplete(Object sender, EventArgs e)
at System.EventHandler.Invoke(Object sender, EventArgs e)
at Terrasoft.WebApp.Page.OnLoadComplete(EventArgs e)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

SessionID: 5tn1tn4rvrwlzre5zvcxjbhb
Request URL: /0/ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a&ActiveTabId=PageContainer_5ca0dabc8c894e1a9bb536407e1c4ef2_f42049db350245aab807e3e6f3e5f6de_e6d00ee553ec450a9c77d8d3039fc51b
Request Path: /0/ViewPage.aspx
Request UrlReferrer: http://localhost:81/0/ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a
Request Type: GET
User Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
User Host Address: ::1
User: kataeva
Is Authenticated: True
Authentication Type: Forms
Is Secure Connection: False

Application Version: 5.4.1.728
Application Path: C:\inetpub\wwwroot\Kronwerk\Terrasoft.WebApp\
Application Virtual Path: /0
Application Trust Level: Full
Machine Name: WIN-GGGGO5G0J
Is Local: True

Process ID: 7208
Process Name: w3wp.exe
Process Account Name: IIS APPPOOL\Kronwerk
Thread Account Name: IIS APPPOOL\Kronwerk
OS Version: Microsoft Windows NT 6.3.9600.0
Net Framework Version: 4.0.30319.34014
DBExecutor Type: MSSqlExecutor

Нравится

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

Разобралась. Администрирование в объекте и во вспомогательных объектах надо снимать.

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

Добрый день!
Система BPMOnline 7.3
Стоит такая задача: Пользователь, который входит в группу менеджеры должен видеть в разделе контакты свои записи(в кот. он ответственный) и контакты из группы руководителей отдела продаж(т.е. контакты своих руководителей). Если с первым пунктом проблем нет, то со вторым есть...
Подскажите пожалуйста, есть ли возможность реализовать это без программной доработки или нет?

Нравится

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

Добрый день!

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

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

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

В принципе может этим и обойдемся, спасибо!

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

Добрый день! Поднялся такой вопрос: есть группа менеджеров, у них стоит доступ к карточке "Контрагента" - только на чтение. Такая задача: нужно что бы появился доступ на поле "Ответственный", а на все остальные остались права "Только на чтение". Подскажите как это можно реализовать.

Нравится

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

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

Здравствуйте, Николай Николаевич!

Александр абсолютно верно говорит.

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

Раздать право на изменение группе менеджеров для всех записей в разделе "Контрагенты" можно следующим скриптом:

update tbl_AccountRight set CanWrite = 1 where AdminUnitID = (select ID from tbl_AdminUnit where Name = 'Группа менеджеров')

Если на детали "Доступ" Группа Менеджеров отсутствует вовсе, Вы можете ее добавить для всех записей следующим скриптом:

insert into tbl_AccountRight (RecordID, AdminUnitID, CanRead, CanWrite, CanDelete, CanChangeAccess)
select A.ID, AU.ID, 1, 1, 0, 0
from tbl_Account A
join tbl_AdminUnit AU on AU.ID = (select ID from tbl_AdminUnit where Name = 'Группа менеджеров') 
Показать все комментарии