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

Нравится

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
		}
	}
]

 

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

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

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

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

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

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

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

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

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

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

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

 

Нравится

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

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

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

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

А при запуске через ProcessEngineService там в начале функции ExecuteProcess считывается то самое HttpContext.Current.Session["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 комментарий

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

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

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

Нравится

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

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

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

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

Нравится

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);
},

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

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

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

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

Всем добрый день! Столкнулся с проблемой, в замещенной схеме 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)

 

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