Мобильное приложение
сообщения
Первичный запуск
синхронизация
7.14_()
sales_enterprise

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

Нравится

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

Для вывода сообщения используется функция:

Terrasoft.MessageBox.Show({message:'текст',title:'заголовок'})

 

Зверев Александр,

Это понятно как выводить сообщения. Интересует вывод после завершения синхронизации данных.

Определить, загружались ли вообще по синхронизации данные, можно посредством:

!Ext.isEmpty(Terrasoft.CurrentUserInfo.lastSyncDate)

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

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

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

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

"Status": {
		"enabledStatusByUser": {
			"ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
			"property": BusinessRuleModule.enums.Property.ENABLED,
			"logical": Terrasoft.LogicalOperatorType.AND,
			"conditions": [
				{
					"comparisonType": Terrasoft.ComparisonType.EQUAL,
					"leftExpression": {
						"type": BusinessRuleModule.enums.ValueType.SYSVALUE,
						"attribute": "CURRENT_USER"
					},
					"rightExpression": {
						"type": BusinessRuleModule.enums.ValueType.CONSTANT,
						"value": "7f3b869f-34f3-4f20-ab4d-7480a5fdf647"
					}
				}
			]
		}
	}

 

Нравится

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

Добрый день!

Попробуйте такой код в условиях (conditions)

"conditions": [
	{
		"comparisonType": 3,
		"leftExpression": {
			"type": 3,
			"value": "CurrentUser",
			"dataValueType": 10
		},
		"rightExpression": {
			"type": 0,
			"value": "7f3b869f-34f3-4f20-ab4d-7480a5fdf647",
			"dataValueType": 10
		}
	}
]

 

Добрый день!

Попробуйте такой код в условиях (conditions)

"conditions": [
	{
		"comparisonType": 3,
		"leftExpression": {
			"type": 3,
			"value": "CurrentUser",
			"dataValueType": 10
		},
		"rightExpression": {
			"type": 0,
			"value": "7f3b869f-34f3-4f20-ab4d-7480a5fdf647",
			"dataValueType": 10
		}
	}
]

 

Сидоров Александр В.,

Спасибо, работает

Григорий Чех,

Вы имеете ввиду настроить администрирование по колонкам?

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

Зверев Александр,

Спасибо за совет, буду иметь ввиду

Показать все комментарии
UserConnection
бизнес-процесс
7.12
sales_enterprise

Коллеги, здравствуйте!

Подскажите, где происходит сакральный Set("UserConnection", UserConnection) для БП?

Из академического интереса спрашиваю по результатам обсуждения  этого вопроса.

 

Нравится

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

Где то внутри Terrasoft.Core.ProcessEngine.... без исходников или дизасма и не видно :)

Где то внутри Terrasoft.Core.ProcessEngine.... без исходников или дизасма и не видно :)

При запуске процесса из конфигурации, интерпретируемого или компилируемого, UserConnection передаётся извне, как видно из примеров, которые приводил Григорий.

А при запуске через ProcessEngineService там в начале функции ExecuteProcess считывается то самое HttpContext.Current.Session["UserConnection"].

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

Приветствую, коллеги!

Запускается макрос по такой схеме:

  1. БП по таймеру
  2. Подпроцесс
  3. ScriptTask
  4. ReportService
  5. GenerateMSWordReport
  6. Макрос : IExpressionConverter

В макросе надо esq запрос выполнить, пытаюсь получить UserConnection:

 

  • HttpContext.Current.Session["UserConnection"] не работает ибо HttpContext.Current == null
  • Get("UserConnection") - нет метода Get
  • context.UserConnection - нет context в объявленных
  • UserConnection - не переменная, а тип

Как же все таки исхитриццо с UserConnection для esq? можно без него запрос сделать?

 

Нравится

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

См. последний ответ тут.

Зверев Александр,

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

Зверев Александр,

а теперь до пункта 7 добирается и в методе Evaluate на строке с получением UserConnection ломает процесс

Как вариант, использовать SystemUserConnection.

Зверев Александр,

Теперь надо создать топик "Как получить SystemUserConnection в макросе?"

Попробуйте (HttpContext.Current.Application["AppConnection"] as AppConnection).SystemUserConnection.

Зверев Александр,

не работает, ибо 

HttpContext.Current равно null

в каком месте можно глянуть, как инициализируется UserConnection, который берется из Get<UserConnection>(“UserConnection”) или context.UserConnecrion для БП?

В примере макроса вообще есть получение UserConnection и HttpContext.Current там не null:

_userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];

 

Зверев Александр,

ну я же схему объяснил, печатная форма делается в БП, запускаемом по таймеру

A HttpContext.Current.Session[“UserConnection”] работает только при запуске через сервис

Если иначе никак, можно работать через OData, как во стороннем приложении.

Капец как сложно, мне всего то надо если ИПешник, ИНН без КПП выводить и запятой лишней не было :)

Формируйте нужный текст в каком-то поле контакта или контрагента, затем выводите в отчёте стандартными средствами, безо всяких макросов.

Решил - переписал:

1) ExpressionConverterHelper, что бы конструктор принимал параметр типа  UserConnection и присваивал его аналогичного типа свойству и в методе GetValue

var expressionConverter = (IExpressionConverter)Activator.CreateInstance(expressionConverterClass);
if (expressionConverter != null) {
    macrosValue.Data = expressionConverter.Evaluate(value, macrosElement.Argument);
}

поменял на

dynamic expressionConverter = Activator.CreateInstance(expressionConverterClass);
if (expressionConverter != null) {
	PropertyInfo propertyInfo = expressionConverter.GetType().GetProperty("UserConnection");
	if (propertyInfo != null) {
		propertyInfo.SetValue(expressionConverter, UserConnection, null);
	}
	macrosValue.Data = expressionConverter.Evaluate(value, macrosElement.Argument);
}

2) в классе ReportService меняем строку

var expressionConverterHelper = new ExpressionConverterHelper();

на 

var expressionConverterHelper = new ZLExpressionConverterHelper(UserConnection);

3) в макросе в начале пишем:

private UserConnection _userConnection;
public UserConnection UserConnection {
    get {
	    if (_userConnection == null) {
		    _userConnection = (UserConnection)HttpContext.Current?.Session["UserConnection"];
	    };
	    return _userConnection;
	}
    set =&gt; _userConnection = value;
}

потом пользуем UserConnection

 

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

Доброго времени суток! Возникла задача реализовать фильтр для детали, одно из условий - чтоб длина номера телефона превышала 4 символа. Возможно ли это реализовать?Если да то как?

Нравится

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

Добрый день!

Посмотрите тут

Сидоров Александр В.,

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

 

На esq реализовать это довольно сложно. Предлагаю сделать представление (view) и фильтровать уже на уровне представления

Либо сделать в объекте ещё одно числовое поле и при добавлении/изменении номера в БП/встроенном БП/триггере вычислять и записывать туда его длину.

Зверев Александр,

Благодарю ваш вариант и использовали.

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

Столкнулась со странным поведением системы. Версия 7.14.0.597.

В системной настройке 'CurrentPackageId' указан пользовательский пакет (не Custom), а в настройке 'CustomPackageId' указан пакет Custom.

При редактировании карточки раздела изменения вносятся в нового наследника этой карточки в пакет Custom, причем не под тем пользователем, под которым выполняются изменения, а под пользователем Supervisor (в полях 'Создал' и 'Изменил' нового сервиса указан Supervisor).

Никакие 'танцы с бубнами' не помогают решить данную проблему.

Может кто-то сталкивался с таким или у Вас есть идеи, как можно решить эту проблему?

Возможно, проблемы в параметрах пакета, который указан в 'CurrentPackageId'?

Нужно, чтобы изменения, выполненные в мастере, писались в пользовательский пакет, который указан в настройке 'CurrentPackageId'.

Нравится

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

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

Показать все комментарии
7.13_()
sales_enterprise

Подскажите, как можно настроить поле Мобильнный телефон в лиде, что бы при клике можно было сразу звонить?

Нравится

1 комментарий
7.13_()
sales_enterprise

Подскажите, люди добрые!

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

Пока мучаю Итоги-Показатель, но что-то не особо получается. Может лучше использовать бизнес-процесс с автогенерируемыми страницами? Или есть еще другие варианты, кто-нибудь решал похожие задачи?

Нравится

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

Можно настроить свое представление и выводить его в итоги в виде гистограммы или списка с колонками фамилией сотрудника и днями месяца.

Также на основании данного представления можно реализовать отчет с возможностью фильтрации по периоду.

Создайте свой отчет или деталь или раздел. Все зависит от ваших потребностей.

Можно настроить свое представление и выводить его в итоги в виде гистограммы или списка с колонками фамилией сотрудника и днями месяца.

Также на основании данного представления можно реализовать отчет с возможностью фильтрации по периоду.

Всем спасибо, все попробовал, буду создавать отчеты.

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

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

ТЗ: необходимо присваивать категорию клиенту в зависимости от его оборота.

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



Есть ли возможность сделать изменение категории в детали моментально? Как в любом разделе делается. 

Допускаю, что есть непонимание в коде. 

define("UsrUsrPribilPoKvortalam1Page", [], function() {
	return {
		entitySchemaName: "UsrPribilPoKvortalam",
		attributes: {
			"UsrOborotPoLK": {
				dataValueType: Terrasoft.DataValueType.FLOAT,
				dependencies: [
				{
						columns: ["UsrOborot1"],
						methodName: "calcUsrOborotPoLK"
					}
				]
			},
		},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.calcUsrOborotPoLK();
					},
					calcUsrOborotPoLK: function() {
					var slovo = this.get("UsrKategoriyaKlienta");
							if (this.get("UsrOborotPoLK") <= 30) {
								slovo = "до 30";
							}else if (this.get("UsrOborotPoLK") <= 50 && this.get("UsrOborotPoLK") > 30){
								slovo = "до 50";
							}else if (this.get("UsrOborotPoLK") <= 70 && this.get("UsrOborotPoLK") > 50){
								slovo = "до 70";
							}else if (this.get("UsrOborotPoLK") <= 100 && this.get("UsrOborotPoLK") > 70){
								slovo = "*";
							}else if (this.get("UsrOborotPoLK") <= 200 && this.get("UsrOborotPoLK") > 100){
								slovo = "**";	
							}else if (this.get("UsrOborotPoLK") <= 500 && this.get("UsrOborotPoLK") > 200){
								slovo = "***";
							}else if (this.get("UsrOborotPoLK") <= 1000 && this.get("UsrOborotPoLK") > 500){
								slovo = "****";
							}else if (this.get("UsrOborotPoLK") > 1000){
								slovo = "*****";
							}
					this.set("UsrKategoriyaKlienta", slovo);
					},
				},



 

Нравится

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

SavelyevOll,

Передавать нужно ссылку на функцию которая будет вызываться по изменению поля (в нашем случае this.calcUsrOborotPoLK),
те так: this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK, this); 

Те ф-ция init будет такой
init: function() {
this.callParent(arguments);
this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK, this);
},

Пример использования смотрите тут

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

init: function() {
	this.callParent(arguments);
	this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK(), this);
}

 

Григорий Чех,

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

 
init: function() {
this.callParent(arguments);
this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK(), this);
	},
	calcUsrOborotPoLK: function(){
	var slovo = this.get("UsrKategoriyaKlienta");
	if (this.get("UsrOborotPoLK") &lt;= 30) {
		slovo = "до 30";
	}else if (this.get("UsrOborotPoLK") &lt;= 50 &amp;&amp; this.get("UsrOborotPoLK") &gt; 30){
		slovo = "до 50";
	}else if (this.get("UsrOborotPoLK") &lt;= 70 &amp;&amp; this.get("UsrOborotPoLK") &gt; 50){
		slovo = "до 70";
	}else if (this.get("UsrOborotPoLK") &lt;= 100 &amp;&amp; this.get("UsrOborotPoLK") &gt; 70){
		slovo = "*";
	}else if (this.get("UsrOborotPoLK") &lt;= 200 &amp;&amp; this.get("UsrOborotPoLK") &gt; 100){
		slovo = "**";	
	}else if (this.get("UsrOborotPoLK") &lt;= 500 &amp;&amp; this.get("UsrOborotPoLK") &gt; 200){
		slovo = "***";
	}else if (this.get("UsrOborotPoLK") &lt;= 1000 &amp;&amp; this.get("UsrOborotPoLK") &gt; 500){
		slovo = "****";
	}else if (this.get("UsrOborotPoLK") &gt; 1000){
		slovo = "*****";
	}
	this.set("UsrKategoriyaKlienta", slovo);
		},
		},

 

SavelyevOll,

Передавать нужно ссылку на функцию которая будет вызываться по изменению поля (в нашем случае this.calcUsrOborotPoLK),
те так: this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK, this); 

Те ф-ция init будет такой
init: function() {
this.callParent(arguments);
this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK, this);
},

Пример использования смотрите тут

Григорий Чех,

Спасибо большое! Все работает)

Показать все комментарии
Разработка
UpdateQuery
CtiPanel
7.13_()
sales_enterprise

Всем добрый день! Столкнулся с проблемой, в замещенной схеме CtiPanel не работает UpdateQuery.

define("CtiPanel", [],
	function() {
		return {
			entitySchemaName: "Call",
			messages: {
				"WaSendCallDataToContact":{
					mode: Terrasoft.MessageMode.PTP,
					direction: Terrasoft.MessageDirectionType.PUBLISH
				},
				"WaSetDataToCall": {
					mode: Terrasoft.MessageMode.PTP,
					direction: Terrasoft.MessageDirectionType.SUBSCRIBE
				}
			},
			mixins: {},
			attributes: {
				WaRelationEntities: { dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT }
			},
			methods: {
				init: function() {
					this.callParent(arguments);
					this.processMessage();
				},
				onCallSavedEvent: function(call) {
					this.callParent(arguments);
					var relations = this.get("WaRelationEntities");
					if(relations && relations.length > 0) {
						var callId = call.databaseUId;
						this.getUpdateQueryCall(callId, relations);
						this.set("WaRelationEntities", null);
					}
					this.sandbox.publish("WaSendCallDataToContact", call, ["_WaSendCallDataToContact"]);
				},
 
				processMessage: function(){
					this.sandbox.subscribe("WaSetDataToCall", this.onMessageSubscribe.bind(this), this);
				},
 
				onMessageSubscribe: function(args) {
					this.set("WaRelationEntities", args);
					window.console.log("onMessageSubscribe(args): ", args);
				},
 
				getUpdateQueryCall: function (id, relations){
					debugger;
					var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
						rootSchemaName: this.entitySchemaName
					});
					var filters = updateQuery.filters;
					filters.addItem(this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Id", id));
					for(var i = 0; i < relations.length; i++) {
						updateQuery.setParameterValue(relations[i].entitySchemaName, relations[i].value, relations[i].type);
					}
					updateQuery.exequte(this.updateQueryCallBack, this);
				},
				updateQueryCallBack: function(result) {
					if(!result.success) {
						window.console.error(result);
						return;
					}
				}
			},
			diff: []
		};
	}
);

ошибки следующие - http://prntscr.com/nh5uws

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

Нравится

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

Алексей,

у Вас же в консоли все написано: 

updateQuery.exequte is not a function

Нужно написать updateQuery.exeсute

 

Алексей,

у Вас же в консоли все написано: 

updateQuery.exequte is not a function

Нужно написать updateQuery.exeсute

 

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

)) Благодарю, переработал наверное, нужен отдых

странно все равно не сработало даже после изменения, http://prntscr.com/nh7lpa

http://prntscr.com/nh7opx

 

Подключены ли следующие модули "ext-base", "terrasoft", "sandbox" как Ext, Terrasoft, sandbox ?

//те в самом верху должно быть

define("CtiPanel", ["ext-base", "terrasoft", "sandbox"], function(Ext, Terrasoft, sandbox)

 

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