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

Нравится

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

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

 

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

Предложите

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

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

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

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

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

 

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

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

 

Если Вам необходимо реализовать возможность отправки E-mail контрагенту через действие "Отправить E-mail", то Вы можете воспользоваться следующим алгоритмом (пример реализации для версии Terrasoft CRM 3.3):

 

1. В скрипте scr_MailUtils реализовать функцию получения e-mail адреса текущего контрагента:

 

 

function GetCurrentAccountEmailAddress(AccountDataset) {

 

         var AccountEMailAddress = '';

 

         var Email = GetEmailCommunicationTypeID();

 

         for (var i = 1; i = 4; i++) {

 

                   var CommunicationTypeName = FormatStr('Communication%1TypeID', i);

 

                   var CommunicationType = GetFieldValueFromDisabledField(AccountDataset,

 

                            CommunicationTypeName);

 

                   if (CommunicationType == Email) {

 

                            var CommunicationName = FormatStr('Communication%1', i)

 

                            AccountEMailAddress = GetFieldValueFromDisabledField(AccountDataset,

 

                                      CommunicationName);

 

                            continue;

 

                   }

 

         }

 

         var AccountName = GetFieldValueFromDisabledField(AccountDataset, 'Name');

 

         if (IsEmptyStr(AccountEMailAddress)) {

 

                   Dataset = GetAccountCommunicationDataset(Email);

 

                   ApplyDatasetFilter(Dataset, 'AccountID',

 

                            AccountDataset.Values('ID'), true);

 

                   Dataset.Open();

 

                   try {

 

                            AccountEMailAddress = Dataset.ValAsStr('Number');

 

                   } finally {

 

                            Dataset.Close();

 

                   }

 

         }

 

         if (!IsEmptyStr(AccountEMailAddress)) {

 

                   if (!IsEmptyStr(AccountName)) {

 

                            AccountEMailAddress = AccountName + '' + AccountEMailAddress + '>';

 

                   }

 

         } else {

 

                   AccountEMailAddress = '';

 

         }

 

         return AccountEMailAddress;

 

}

 

 

 

function GetAccountCommunicationDataset(EmailTypeID) {

 

         if (!Assigned(MailUtilsScript.AccountCommunicationDataset)) {

 

                   var Dataset = Services.GetNewItemByUSI('ds_AccountCommunication');

 

                   MailUtilsScript.AccountCommunicationDataset = Dataset;

 

                   ApplyDatasetFilter(Dataset, 'CommunicationTypeID', EmailTypeID, true);

 

         }

 

         return MailUtilsScript.AccountCommunicationDataset;

 

}

 

2. Далее в скрипте scr_AccountsWorkspace реализовать функцию отправки сообщения :

 

 

 

function SendMailWithoutTemplate() {

 

    var Dataset = Services.GetNewItemByUSI('ds_Account');

 

         EnableDatasetFilters(Dataset, false);

 

         Dataset.FetchRecordsCount = -1;

 

         var IDs = GetArrayByCollection(BaseWorkspace.Grid.SelectedIDs);

 

    var KeyDataFieldName = Dataset.KeyDataField.Name;

 

         var AccountEMailAddress = '';

 

         for (var i = 0; i IDs.length; i++){

 

                   Dataset.Close();

 

                   ApplyDatasetFilter(Dataset, 'ID', IDs[i], true);

 

                   Dataset.Open();

 

                   var SingleAccountEMailAddress = GetCurrentAccountEmailAddress(Dataset);

 

                   AccountEMailAddress += IsEmptyValue(SingleAccountEMailAddress) ? '' :

 

                       (IsEmptyValue(AccountEMailAddress) ? '' : ';') +

 

                            SingleAccountEMailAddress;

 

         }

 

         CreateEmptyMessage(AccountEMailAddress);

 

         Dataset.Close();

 

}

 

 

3. В окне wnd_AccountsWorkspace добавить на закладке невизуальных компонентов одно действие, например, amiSendEmail и на событие OnExecute прописать вызов функции:

 

SendMailWithoutTemplate();

 

 

В результате с помощью действия будет создано письмо с e-mail адресом контрагента, действие в гриде продублируется автоматически.

 

Полная инструкция со скриншотами прикреплена.

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

Нравится

Поделиться

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

Значительно ли будет отличатся реализация данного функционала в Terrasoft CRM 3.2?

Олег, данные функции работают и в Terrasoft CRM 3.2, т.е. реализация отправки e-mail в данной версии аналогична.

P.S. Не забудьте присоединять скрипт scr_MailUtils в scr_AccountsWorkspace.

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

Чтобы запустить бизнес-процесс, например, «Продажа» по выбранному контакту в реестре записей раздела Контакты, я создал действие «Запустить процесс Продажа». На событие OnExecute прописал код:

function StartWFbyContact(WorkflowUSI, GridDataset) {
     var ParamNames = new Array();
     var ParamValues = new Array();
     var FieldValue = GridDataset.CommaText;
         ParamNames.push('ContactID');
         ParamValues.push(FieldValue);
     var Params = WFArrayToParams(ParamNames, ParamValues);
     var WorkflowEngine = GetAttribute(Connector, 'WorkflowEngine');
     var Now = new Date().getVarDate();
         WorkflowEngine.StartWorkflow(WorkflowUSI, Now, Params);
}

function amiWorkWithClientOnExecute(ActionMenuItem, Sender) {
 var GridDataset = BaseWorkspace.Grid.SelectedIDs;
 var SelectCount = GridDataset.Count;
     switch (SelectCount) {
            case 1:
            var WorkflowUSI = "Workflow\\Workflow Diagrams\\wd_WorkWithClient";
            StartWFbyContact(WorkflowUSI, GridDataset);
            return
            case SelectCount 1:
            Message("Контакт не выбран");
            return
            case SelectCount > 1:
            Message("Выбрано более одного контакта");
            return
      }
}

И подключил скрипт scr_WorkflowUtils.
Это все! ;-)

Нравится

Поделиться

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

Здравствуйте, Виталий
Реализовала по Вашему примеру запуск процесса из раздела Контрагенты. Процесс запустился, но Параметр не присвоился, то есть поле Котнтрагент осталось пустым.
В первой задаче процесса параметр AccountID является Входящим/Исходящим (Исходящим по причине того, что если запускать процесс в разделе Процессы - в первой задаче процесса задается Контрагент, а Входящим он должен быть для запуска процесса как раз из раздела Контрагентов, насколько я понимаю).
Если в чем-то ошиблась или есть другие причины проблемы с параметром, подскажите, пожалуйста.

www.informicus.ru

Здравствуйте! Получение параметра:

var ParentDiagram = GetDiagramByItem(ScriptItem);
var AccountID = WFGetParamValue(ParentDiagram, 'AccountID');

Я так понимаю, эти строки мне надо в функции BeforeExecute задачи прописать? Вот что написала, но результата нет:

function ActionItem1OnBeforeExecute(ActionItem) {       
	var ParentDiagram = GetDiagramByItem(ActionItem);
	var AccountID = WFGetParamValue(ParentDiagram, 'AccountID');
	if (!IsEmptyValue(AccountID)){
		WFSetParamValue(ActionItem, 'AccountID', AccountID, 0);	
	}
}

www.informicus.ru

1) Проверьте передается ли значение ‘AccountID’ в диаграмму?
2) Проверьте «Связи параметров», создан ли параметр ‘AccountID’?
P.S. Удалите

function ActionItem1OnBeforeExecute(ActionItem)

1)Да, параметр в диаграмме не пустой, там есть значение при запуске первой задачи.
2)Да, параметр создан и привязан к параметру диаграммы с тем же именем AccountID.

www.informicus.ru

Удалила функцию. Но почему-то все равно не срабатывает передача параметра.
Мистика. С правами этоне может быть связано?

www.informicus.ru

Могу посмотреть через TeamViewer.
Skype: genekogo

Появилась догадка по поводу типа параметра. Он у меня строковый в диаграмме. Хочу сделать справочником, но в списке нет Контрагентов.

www.informicus.ru

Это правильно, что параметр 'AccountID' имеет тип 'Строка'.

А откуда процесс знает, какой параметр какому полю задачи нужно присвоить?

www.informicus.ru

Кажется, стало ясно, в чем причина.
У меня в начале бизнес процесса стоит элемент Script, а только за ним задача. Script создает Продажу (это сделано для того, что бы пользователю не нужно было лишний шаг в процессе проходить. То есть важно, что бы продажа сама по себе жила и в процессе не мелькала в качестве шагов). Но в Связи параметров нет Script, поэтому ему не удается передать параметр в начале процесса.
Так вот надо как-то с этим теперь справиться :exclaim:

www.informicus.ru

Получилось передавать параметр первой задаче процесса, идущей за Script при выполнении Script. Задача запускается с уже непустым параметро AccountID, но в карточке все равно поле пустое.
Хелп

www.informicus.ru

Все, проблема устранена.
В SriptItem при создании Продажи присвоила полю AccountID значение параметра AccountID процесса и стало работать.

www.informicus.ru

еще пример мистики :(
пытался реализовать аналогичный пример запуска БП

function amiWorkWithClientOnExecute(ActionMenuItem, Sender) {
 var GridDataset = BaseWorkspace.Grid.SelectedIDs;
 var SelectCount = GridDataset.Count;
     switch (SelectCount) {
....

и даже один раз сработало :)
но потом начал код приводить в порядок и в какой-то момент начал получать облом
[font=monospace]
Сообщение об ошибке: 'BaseWorkspace' is undefined
[/font]
не подскажите куда копать?

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

Осваиваю функциональность TS CRM вер.3.2.1.4. Сегодня столкнулся с ситуацией, набор продуктов в счете есть, сумма по продуктам считается, но попытка пересчитать сумму дает стабильно 0.00, вопрос куда смотреть?
Я раньше я сделал несколько счетов, начал по классической технологии -
1. Создал договор.
2. Созадал счет.
3. Набрал продукты в счет.
4. Нажал кнопку пересчет суммы.
самый первый счет тоже страдал аналогичной болезнью, я его удалил. Сделал заново, все сработало нормально, думал, може че не туда ткнул по неопытности... Потом два счета сделал, все отработало предсказуемо, а сегодня начал делать счет - опять 0-сумма. Я грешил на то что попробовал счет просто без договора создать, удалил его, создал договор, на детали счета добавил счет, добавил туда продукты и опять сумма -0.0 если надо могу скрин экрана прислать...

Нравится

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

Добрый день, Руслан!
1. Наличие значения в поле "Договор" карточки Счета на результат пересчета суммы не влияет.
2. Пересчет суммы означает:
а) суммирование значений поля "Итого (б.в.)" записей на детали Продукты в разделе счета,
б) помещение результата в поле "Сумма (б.в.)" для текущей записи в разделе Счета,
в) и вычисление значения поля "Сумма" исходя из значений полей "Сумма (б.в.)" и "Курс валюты" для текущей записи в разделе Счета.

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

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

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