Кто может выслать файл BPMonline Messaging Service Install (поддержка пока молчит).

Нравится

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

версия: 7.8 service
1. Как сделать вторую вкладку в разделе? что бы можно было там выводить другие поля из карточки.
2. Как сделать чтобы две-три колонки кроме своих названий имели еще одно общее которое будет написано вверху.

Нравится

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

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

Если мы правильно поняли, то как вариант Вы можете воспользоваться базовыми средствами:

1. Вы можете добавить вкладку через мастер раздела;

2. Добавить и назвать группу полей, затем расположить пользовательские колонки;

Также можете посмотреть ознакомительный видеоролик - https://www.youtube.com/watch?v=DLFjsAR2CbI&t=271s

Нет, не то, это должна быть другая вкладка реестра, как в 3.х: "все контакты", "мои контакты". Такое можно сделать?

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

В bpm'online 7.8 есть представления разделов. По умолчанию в разделах есть два представления:
1) Список
2) Итоги

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

Это сложная реализация, требующая навыков программирования на языке JS.

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

Можете дать ссылку на документацию(более сложного способа)? Если она есть по именно данному случаю.

Здравствуйте, подобную задачу решали тут:

http://www.community.terrasoft.ru/blogs/12682
И тут: http://www.community.terrasoft.ru/forum/topic/15335

Удачи.

О, благодарю, то что нужно, а что по второму вопросу? он тоже касается реестра

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

Виталий, функционал раздела не позволяет отобразить несколько колонок, объединив их одним названием, поскольку название колонок берется из объекта раздела.

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

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

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

Нравится

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

Добрый день, Антон!
Да, Вы можете реализовать подобный функционал.
Это возможно выполнить путем разработки бизнес процесса, который будет анализировать состояние обращения и создавать по ним активности для пользователя, который указан в поле "Ответственный".
При этом, Вы можете это настроить как через активность, которая будет отображаться в расписании пользователя, так и реализацией отправки письма с необходимой информацией.

"Михайленко Михаил" написал:

Добрый день, Антон!

Да, Вы можете реализовать подобный функционал.

Это возможно выполнить путем разработки бизнес процесса, который будет анализировать состояние обращения и создавать по ним активности для пользователя, который указан в поле "Ответственный".

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


Михаил, вопрос в том, чтобы считать данные из множества записей и создать множество задач. Это как то возможно реализовать без блока задание-сценарий?

Вопрос снимается) решил через блок добавление данных

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

Уважаемые коллеги!

Подскажите пжл., как можно настроить итоги в группах (см. вложенный файл)?..

Нравится

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

Юрий, здравствуйте!

Предположительно Вы не правильно настроили фильтр в динамической группы (по колонке «Название», а не родительский контрагент)
Так как согласно Вашему запросу итоги отображаются корректно.


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

Добрый день, Дмитрий!

Да, Вы правы, если фильтр настроить на "родительский контрагент", то он отразит корректные цифры...
Однако, фильтр покажет не только цифры, но и все остальные данные по самим дочерним предприятиям...
Следуя этой логике, нам такие итоги в группах не интересны - представляете сколько будет показано предприятий, например в группе "ЕВРАЗ"? То есть, сегментацию Группы ЕВРАЗ как вертикально-интегрированный Холдинг, провести будет невозможно. Чтобы отобразить корректный результат итогов по данной Группе, надо включить в эту группу все без исключения предприятия "нижнего уровня".

А хотелось бы настроить так, чтобы ИТОГИ вначале формировались по Объединениям, в которые входят дочерние предприятия, затем ИТОГИ по управляющим компания, в которые входят как дочерние предприятия - Объединения, а затем уж ИТОГИ по всей группе ЕВРАЗ, в которую входят как дочерние предприятия - Управляющие Компании..

Юрий, как вариант можно добавить новую агрегирующую колонку. Например, Контрагент (по колонке Родительский контрагент).Договоров, руб. без НДС


Добрый день, Дмитрий!

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

Здравствуйте, Юрий!

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

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

Уважаемые коллеги!

Подскажите пжл., как можно показать или скрыть Деталь в разделе в зависимости от условия?
Например, в разделе Контрагенты, мне необходимо, чтобы у головных компаний (холдингов) была одна Деталь, а для дочерних компаний - другая...
Можно ли обойтись пользовательским настройками без написания кода?

Нравится

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

"Ифутин Юрий Борисович" написал:Можно ли обойтись пользовательским настройками без написания кода?

Нет.

Спасибо за лаконичный ответ!

Понял, что нельзя обойтись без кода...

А можно объяснить как можно эту задачу решить при помощи кода и где можно посмотреть аналогичные примеры?...

Переопределяете допустим AccountPageV2 в пакете Order.
Деталь "заказы" добавляется в diff, прописываем св-во visible

{
	"operation": "merge",
	"parentName": "HistoryTabContainer",
	"propertyName": "items",
	"name": "Order",
	"values": {
                "visible": {bindTo: "getDetailVisibility"},
		"itemType": Terrasoft.ViewItemType.DETAIL
	}
}

В методах прописываем что-то вроде:

getDetailVisibility: function() {
         return this.get("IsMain") ? true : false; //IsMain - допустим булево поле в контрагенте, индикатор главной компании
}

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

Спасибо, Данила!

А вот, к примеру, такая комбинация:
1. Располагаем в разделе сразу 2 детали
2. А вот права раздаем разные. Одни пользователи видят первую деталь, другие пользователи видят вторую деталь, а админ видит все детали.
3. Права раздаем при помощи бизнес-процесса.

Как Вы думаете, можно таким методом воспользоваться?

Никогда не пробовал. Уж слишком муторно через права всё это настраивать. К тому же права, вроде как, нельзя на детали накладывать. Только на поля. Придется раздавать права на объект/таблицу, на которую ссылается деталь. Короче гемор:smile:

Добрый день!
Раздать права доступа на детали не получится.
Можно раздавать права доступа на операции.
В Конфигурации пользовательскими средставми можно добавить пользовательскую операцию и далее обращатся к ней из кода, например во так:
/**
* Название операций.
* @type {Object}
*/
SysAdminOperationCode: {
CAN_DESIGN_PAGE: "CanChangeApplicationTuningMode"
},
Идея состтоит в том, чтобы раздать права доступа на созданную пользовательскую операцию, затем в коде схемы страницы редактирования карточки, на которй выведены детали, добавить атрибут логического (булевского типа), установить для него значение по умолчанию - false, и привязать свойство visible детали к значению данного атрибута. Сам атрибут устанавливать в зависимости от возвращаемого значения метода, проверяющего права пользователей на описанную выше пользовательскую операцию. Этот метод будет в свою очередь использовать методы Сервиса страницы управления правами доступа к записи ("RightsService").
Например, вот так вызывается нужный метод из утилитного сервиса "RightsService":
/**
* Метод вызывает метод веб сервиса с указанными параметрами.
* @param {String} methodName Имя метода веб сервиса.
* @param {Object} data Обьект данных для метода веб сервиса.
* @param {Function} callback Функция обратного вызова.
* @param {Object} scope Объект окружения фукнции обратного вызова.
*/
callServiceMethod: function(methodName, data, callback, scope) {
var requestUrl = Terrasoft.workspaceBaseUrl + "/rest/" + this.serviceName + "/" + methodName;
Terrasoft.AjaxProvider.request({
url: requestUrl,
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
method: "POST",
jsonData: data || {},
callback: function(request, success, response) {
var responseObject = success ? Terrasoft.decode(response.responseText) : {};
callback.call(scope || this, responseObject, success);
},
scope: this
});
}

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

Добрый день.
В мастере разделов «Активности» создали две новые страницы. Для того чтобы новые страницы имели вид и функционал стандартной ActivityPageV2 мы создали "Схемы модели представления карточек". Все работает если не одно но. В базовой логике схемы ActivityPageV2 указана видимость поля "Категория" только при выбранном типе "Задача". Можете помочь и написать детально, как переопределить логику отображения данного поля в добавленных карточках так чтобы поле "Категория" отображалось на страницах с новыми типами?

Нравится

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

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

Вам стоит смотреть в сторону замещения логики из ActivityPageV2(UIv2). В частности, обратите на следующий код:

{
	"operation": "insert",
	"parentName": "Header",
	"propertyName": "items",
	"name": "ActivityCategory",
	"values": {
		"bindTo": "ActivityCategory",
		"layout": {"column": 12, "row": 4, "colSpan": 12},
		"visible": {
			"bindTo": "Type",
			"bindConfig": {
				"converter": "getVisibleCategoryByType"
			}
		},
		"contentType": Terrasoft.ContentType.ENUM
	}
},

Если кратко, видимость поля зависит от значения поля Type, которое затем обрабатывается методом getVisibleCategoryByType.

также в данной схеме есть следующее правило видимости:

"BindParameterVisibleActivityCategoryToType": {
						"ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
						"property": BusinessRuleModule.enums.Property.VISIBLE,
						"conditions": [
							{
								"leftExpression": {
									"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
									"attribute": "Type"
								},
								"comparisonType": Terrasoft.ComparisonType.EQUAL,
								"rightExpression": {
									"type": BusinessRuleModule.enums.ValueType.CONSTANT,
									"value": "fbe0acdc-cfc0-df11-b00f-001d60e938c6"
								}
							}
						]
					},

Фактически оно дублирует логику видимости, описанную в самом поле.

Так же обратите внимание на метод setActivityCategory.

Спасибо, Илья!
Получилось вывести поле категория на новую страницу активности (В Схему модели представления новой карточки прописал правило где поменял "value": на ID типа в котором не отображалось поле, надеюсь, ничего не напутал там). Но теперь проблема в setActivityCategory. Метод видит, что тип страницы не "Задача" и устанавливает его "Звонок" причем справочник даже не открывается. Я только начал работать в bpm и еще очень "зеленый". Если Вам не трудно, можете детально описать, как можно это исправить?

upd: в Схему модели представления новой карточки добавил строчку

methods: {
setActivityCategory: function() {},
},

Категория проставляется согласно "Значение по умолчанию" в конфигурации. Но справочник не открывается.

Значения не отображаются по причине фильтрации. Сам код фильтрации:

"FiltrationActivityCategoryByActivityType": {
	"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
	"baseAttributePatch": "ActivityType",
	"comparisonType": Terrasoft.ComparisonType.EQUAL,
	"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
	"attribute": "Type"
}

Если кратко, то отображаются только те Категории активностей, у которых в колонке ActivityType стоит тип активности, который имеет карточка. Для исправления необходимо или добавить дублирующие записи в справочник ActivityCategory и указать созданные типы активностей. Или же добавить в карточке следующее правило:

"ActivityCategory": {
	"FiltrationActivityCategoryByActivityType": {
		"ruleType": 999,
		"baseAttributePatch": "ActivityType",
		"comparisonType": Terrasoft.ComparisonType.EQUAL,
		"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		"attribute": "Type"
	}
}

Так же в define необходимо добавить зависимость от BusinessRuleModule

Огромное спасибо!

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

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

Скелет класса CaseRatingService (клон CaseRatingManagementService):

namespace Terrasoft.Configuration.CaseManagementService
{
        using System;
        using System.CodeDom.Compiler;
        using System.Collections.Generic;
        using System.Collections.ObjectModel;
        using System.Data;
        using System.IO;
        using System.Text;
        using System.Threading;
        using System.Threading.Tasks;
        using System.ServiceModel;
        using System.ServiceModel.Web;
        using System.ServiceModel.Activation;
        using System.ServiceModel.Channels;
        using System.Security.Principal;
        using System.Web;
        using Newtonsoft.Json;
        using Newtonsoft.Json.Linq;
        using Terrasoft.Common;
        using Terrasoft.Common.Json;
        using Terrasoft.Core;
        using Terrasoft.Core.DB;
        using Terrasoft.Core.Entities;
        using Terrasoft.Core.Store;
        using Terrasoft.Nui.ServiceModel;
        using Terrasoft.Nui.ServiceModel.Extensions;
        using Terrasoft.UI.WebControls;
       
        #region Class: CaseManagementService
        [ServiceContract]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
        public class CaseManagementService {

                [OperationContract]
                [WebGet(UriTemplate = "Case/{id}/{rating}")]
                public void GetCase(string id, string rating) {
                        var context = HttpContext.Current;
                        try{
                                HttpRequest request = context.Request;
                                if (id == null || rating == null) {
                                        throw new ArgumentNullOrEmptyException("rating");
                                }
                                _appConnection = HttpContext.Current.Application["AppConnection"] as AppConnection;
                                _sysUserName = _appConnection.SystemUserConnection.CurrentUser.Name;
                                _sessionId = Guid.NewGuid().ToString("N");
                                Thread.CurrentPrincipal = new TerrasoftPrincipal(new GenericIdentity(_sysUserName), new string[0], _sessionId);
                                this._setResponseText(context.Response, "Ok");
                        } catch (Exception ex) {
                                this._setResponseText(context.Response, ex.Message);
                        }
                }
               
                #region Fields: Private

                private UserConnection _userConnection;
                private string _sessionId;
                private string _sysUserName;
                private AppConnection _appConnection;

                #endregion

                #region Private property: UserConnection::UserConnection
                private UserConnection UserConnection {
                        get {
                                if (_userConnection != null) {
                                        return _userConnection;
                                }
                                if (HttpContext.Current.Session != null) {
                                        _userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
                                }
                                if (_userConnection == null) {
                                        var result = new UserConnection(_appConnection);
                                        result.Initialize();
                                        result.SessionId = _sessionId;
                                        _userConnection = result;
                                }
                                return _userConnection;
                        }
                }
                #endregion     

                #region Private method: _setResponseText(response,text)::void
                private void _setResponseText(HttpResponse response, string text) {
                        var label = string.Format("{0}",
                                text);
                        response.Write(label);
                }
                #endregion
        }
        #endregion
}

Выдает такую ошибку:

Date: 08.12.2016 11:27:01
Date (UTC): 08.12.2016 9:27:01

Exception Message: Не удалось найти тип "Terrasoft.Configuration.CaseManagementService.CaseManagementService", заданный значением атрибута Service в директиве ServiceHost или указанный в элементе конфигурации system.serviceModel/serviceHostingEnvironment/serviceActivations.
Exception Type: System.InvalidOperationException
Exception Source: System.ServiceModel.Activation

Exception Stack Trace:
   в System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses)
   в System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(String normalizedVirtualPath, EventTraceActivity eventTraceActivity)
   в System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(ServiceActivationInfo serviceActivationInfo, EventTraceActivity eventTraceActivity)
   в System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity)

SessionID: 1r4srdi5za0yv132xnjywfzg
Request URL: /WebApp770/0/ServiceModel/CaseManagementService.svc
Request Path: /WebApp770/0/ServiceModel/CaseManagementService.svc
Request Type: GET
User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
User Host Address: ::1
User: EFrolov
Is Authenticated: True
Authentication Type: Forms
Is Secure Connection: False

Application Version: 7.7.0.0
Application Path: G:\Projects\Core\TSBpm\Src\Lib\Terrasoft.WebApp.Loader\Terrasoft.WebApp\
Application Virtual Path: /WebApp770/0
Application Trust Level: Full
Machine Name: PC-23-N
Is Local: True

Process ID: 10396
Process Name: iisexpress.exe
Process Account Name: INDOORMEDIA\developer
Thread Account Name: INDOORMEDIA\developer
OS Version: Microsoft Windows NT 6.2.9200.0
Net Framework Version: 4.0.30319.42000
DBExecutor Type: MSSqlExecuto

1. в ServiceModel поцепил файлик CaseManagementService.svc:

%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.CaseManagementService.CaseManagementService" %>

2. в services.config (http и https) :


 
    address=""
    binding="webHttpBinding"
    behaviorConfiguration="RestServiceBehavior"
    bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
    contract="Terrasoft.Configuration.CaseManagementService.CaseManagementService" />

3. в web.config:

...
 
   
     
       
     

   
 

...

...

4. в App.config:

...

...

Нравится

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

Вопрос закрыт.

Совет на будущее:
"ПРОВЕРЯЙТЕ КОНФИГУРАЦИЮ, НА КОТОРОЙ ВС СОЗДАВАЛСЯ И ПОД КАКОЙ ВЫ К НЕМУ СТУЧИТЕСЬ!"

Добрый день!
Имеется следующий пример реализации.
В конфигурации необходимо создать схему исходного кода c контрактом сервиса:
[ServiceContract]
public interface IService
{
[OperationContract]
SPMClientInfoResponse SPMClientInfo(string Login);
}

[DataContract]
public class SPMClientInfoResponse
{
bool success = true;
string errorText = "";

[DataMember]
public bool Success
{
get { return success; }
set { success = value; }
}

[DataMember]
public string ErrorText
{
get { return errorText; }
set { errorText = value; }
}
}

и схему исходного кода c реализацией сервиса:

public class SPMSUBPService : IService
{
public SPMClientInfoResponse SPMClientInfo(string Login)
{
return new SPMClientInfoResponse();
}
}

Методы конфигурационного веб-сервиса должны быть помечены атрибутами [OperationContract] и
[WebInvoke] с параметрами.
Например, вот так: [OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle
= WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]

Далее, в папке В папке Terrasoft.WebApp\ServiceModel создаем файл CaseManagementService.svc с примерно таким текстом:
<%@ ServiceHost Language="C#" Debug="true" Service="CaseManagementService.CaseManagementService" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>

Добавить в файл Terrasoft.WebApp\ServiceModel\http\services.config описание сервиса:

...

...

Модифицировать Terrasoft.WebApp\Web.config

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

Добрый день.
Такой вопрос. Как переопределить rules, прописанные из коробки? Например на странице активности есть такое правила для установки обязательности поля Result:

"Result": {
                                        "BindParameterRequiredResultToStatus": {
                                                "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
                                                "property": BusinessRuleModule.enums.Property.REQUIRED,
                                                "logical": Terrasoft.LogicalOperatorType.AND,
                                                "conditions": [
                                                        {
                                                                "leftExpression": {
                                                                        "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                                                        "attribute": "Status",
                                                                        "attributePath": "Finish"
                                                                },
                                                                "comparisonType": Terrasoft.ComparisonType.EQUAL,
                                                                "rightExpression": {
                                                                        "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                                                        "value": true
                                                                }
                                                        },
                                                        {
                                                                "leftExpression": {
                                                                        "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                                                        "attribute": "IsProcessMode"
                                                                },
                                                                "comparisonType": Terrasoft.ComparisonType.EQUAL,
                                                                "rightExpression": {
                                                                        "type": BusinessRuleModule.enums.ValueType.CONSTANT,
                                                                        "value": true
                                                                }
                                                        }
                                                ]
                                        }
                                },

Я хотел бы отменить его и указать кастомное. Добавление нового правила на замещающую страницу не помогает. Как быть?

Нравится

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

"Салихов А" написал:Как быть?

Убрать ненужное дефолтное правило:

"Order": {
	"EnabledOrderForQualifyStatus": { "ruleType": 999 }
},

Добавить своё:

"Order": {
	"NewEnabledOrderForQualifyStatus": {.../*Описание правила*/...}
},

"Салихов А" написал:

Добрый день.

Такой вопрос. Как переопределить rules, прописанные из коробки? ...

Добрый день.
Попробуйте переопределить с этим же именем, но другие правила:

"Result": {
  "BindParameterRequiredResultToStatus": {/* свои правила */}
}

Для удаления, нужно ковырять, но где-то решение было.

"Фролов Евгений" написал:Для удаления, нужно ковырять, но где-то решение было.

"ruleType": 999 для удаления.

Всем спасибо! Заработало

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

Уважаемые коллеги!

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

Нравится

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

Здравствуйте.
Пользовательскими средствами данную настройку не выполнить. Но, обладая навыками разработки, можно это сделать по аналогии с деталью Продукты в разделе Заказы. Смотрите в схему OrderProductDetailV2 там объявлены как diff-ы для отображения текста итогов. Так и методы общения через sandbox для получения этих данных из основной карточки.

Пора это в идеи кидать

Совершенно с Вами согласен, Владимир!

Разместил эту просьбу в идеях...

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

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

Нравится

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

Здравствуйте.
Вы можете создать одноименный колонке атрибут, и реализовать любую функцию возвращающую необходимую фильтрацию в формате esq. Пример:

"QueueEntitySchema": {
   "dataValueType": Terrasoft.DataValueType.LOOKUP,
   "lookupListConfig": {
      "filter": function() {
         var filterGroup = this.Terrasoft.createFilterGroup();
         filterGroup.logicalOperation = Terrasoft.LogicalOperatorType.OR;
         var queueObjectFilter = this.Terrasoft.createExistsFilter(
            "[QueueObject:EntitySchemaUId].Id");
         filterGroup.addItem(queueObjectFilter);
         return filterGroup;
      },
      columns: ["Name"]
   }
},

Руслан, спасибо, помогло!

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