Вопрос

Как часто происходит синхронизация с сервером Exchange в БПМ?

Ответ

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

Системная настройка для изменения частоты синхронизации называется "Интервал синхронизации с почтовым ящиком". Необходимо учитывать, что данная системная настройка будет действовать только для новых почтовых ящиков. Для старых необходимо или передобавить их или выполнить update  в бд.

Нравится

Поделиться

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

Вопрос

Мы пытаемся оптимизировать время синхронизации мобильного приложения (оффлайн) и как один из шагов - оптимизации изображений.

Подскажите, каким образом можно выставлять целевой размер фотографий (к примеру 1280 х 800). К примеру в Apache Cordova такая возможность есть.

Возможно ли делать изменить это в настройках  или необходимо изменять код?

Ответ

В приложении мы уже оптимизируем.

Ниже приведен код, который есть в базовой версии:

Terrasoft.Camera.captureFromCamera({
            quality: 70,//в процентах
            size: 1280,//по максимальной стороне
            success: function() {},
            failure: function() {},
            scope: this
        });

Ниже приведен пример как можно изменить качество: 

Terrasoft.sdk.RecordPage.configureColumn("Opportunity", "opportunityFilesDetail", "Data", {
    quality: 50
});

Общая информация по настройке мобильного приложения есть на SDK - https://academy.terrasoft.ru/documents/technic-sdk/7-11/stranica-redaktirovaniya-s-ukazannym-naborom-kolonok

Нравится

Поделиться

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

Вопрос

Настроили почту для регистрации обращений и система не регистрирует обращения с локального провайдера, а вот с mail.ru  регистрирует.  При этом в BPM письма не попадают, а если посмотреть в ящик не в BPM, то там они есть, отображаются как непрочитанные.

Ответ

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

Нравится

Поделиться

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

Вопрос

Делаю ESQ с rootSchemaName: "X". Как мне узнать, какое свойство этого объекта является его текстовым представлением (значение колонки, указанной в скриншоте)?

Изображение удалено.На некоторые запросы, написанные не мной приходит ответ. В ответе объекты и у объектов есть свойство displayValue, вот мне нужно такое же.

Пример кода

var select = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: dimensionItem.get("SysSchemaName")
});
 
select.getEntityCollection(function(response) {
    if (response.success) {
        var collection = response.collection;
        if (collection && collection.getCount() > 0) {
 
        }
    }
})

Ответ

Для получения через esq значений колонки помеченной в объекте как Displayed name, Вам необходимо воспользоваться методом esq esq.addMacrosColumn().

Пример кода:

var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: 'UsrTestObj'
});
esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_DISPLAY_COLUMN, "displayValue");
esq.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_COLUMN, "value");
esq.getEntityCollection(function(result) {
    if (result.success) {
        debugger;
    }
}, this);

В результате получаем коллекцию из значений колонок Id и колонки помеченной как Displayed value из таблицы UsrTestObj.

Нравится

Поделиться

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

Симптомы

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

Причина

Не заполнена деталь "Карьера". 

Решение

Уведомление по знаметальному событию приходит только в том случае, когда заполнена деталь "Карьера".

Нравится

Поделиться

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

Вопрос

В предыдущих версиях у нас автоматически проставлялись напоминания в активностях (для автора и ответственного).

Сейчас такого нет.

Ответ

Данный функционал можно реализовать расширением существующих методов в схеме страницы редактирования активности:

methods: {
   setRemindCustom: function() {
      if (this.get("StartDate")) {
         var remindToOwnerDate = this.get("StartDate");
         remindToOwnerDate = Ext.Date.add(remindToOwnerDate, Ext.Date.MINUTE, -15);
 
         var remindToAuthorDate = this.get("StartDate");
         remindToAuthorDate = Ext.Date.add(remindToAuthorDate, Ext.Date.MINUTE, -15);
 
         this.set("RemindToOwner", true);
         this.set("RemindToAuthor", true);
         this.set("RemindToOwnerDate", remindToOwnerDate);
         this.set("RemindToAuthorDate", remindToAuthorDate);
      }
   },
   onStartDateChanged: function() {
      this.callParent(arguments);
      this.setRemindCustom();
   },
   onEntityInitialized: function() {
      this.callParent(arguments);
      if (this.isAddMode() || this.isCopyMode()) {
         if (this.get("StartDate")) {
            this.setRemindCustom();
         }
      }
   }
},

 

Нравится

Поделиться

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

Симптомы

Медленная работа детали "Взаимосвязи" раздела "Контрагенты" (режим графического отображения)

Причина

Внутренняя реализация компонента diagram.js и механизма отображения элементов детали (RelationshipDiagramViewModel).

Решение

В версии 7.7.0 реализация компонента diagram.js существенно оптимизирована. Для переноса функционала на версию 7.6 можно загрузить в пакет Custom модуль из файла UsrDiagram.md, который полностью переопределяет базовый класс "Terrasoft.Diagram", а также добавить в конфигурацию замещающий клиентский модуль для детали AccountRelationshipDetailV2, в котором добавить связь с модулем UsrDiagram и переопределения некоторых методов из вью-модели диаграммы.

Пример кода:

define("AccountRelationshipDetailV2", ["UsrDiagram"], function() {
		return {
			methods: {
				getMinLevel: function(accounts) {
					return accounts[0].level;
				},
 
				getMaxLevel: function(accounts) {
					return accounts[accounts.length - 1].level;
				},
 
				buildDiagramNodes: function(accounts) {
					this.clearAllDiagramNodes();
					var nodes = this.get("Nodes");
					var accountConfigs = {};
					accounts.forEach(function(account) {
						accountConfigs[account.id] = this.getNodeConfig(account);
					}, this);
					nodes.loadAll(accountConfigs);
					this.createNodeConnections(accounts);
				},
 
				createNodeConnections: function(accounts) {
					var nodes = this.get("Nodes");
					var connectionConfigs = {};
					var maxLevel = this.getMaxLevel(accounts);
					var filteredAccounts = accounts.filter(function(item) {
						return item.level < maxLevel;
					});
					filteredAccounts.forEach(function(account) {
						account.children.forEach(function(child) {
							connectionConfigs[account.id + "/" + child.id] = this.getConnectionConfig(child, account);
						}, this);
					}, this);
					nodes.loadAll(connectionConfigs);
				}
			},
 
			diff: /**SCHEMA_DIFF*/ []/**SCHEMA_DIFF*/
		};
	}
);

Для версий 7.7.0-7.8.0 достаточно переопределить методы вью-модели.

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

Необходимые условия и возможные ограничения

При обновлении с версии 7.6.0 на 7.7.0 и выше, описанную выше схему UsrDiagram и ссылки на неё необходимо удалить.

Прикрепленные файлы

Нравится

Поделиться

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

Вопрос

Как посмотреть, что записано в планировщике?

Ответ

Вы можете проверить существующие тригера выполнив запрос в БД:

select * from QRTZ_TRIGGERS
select * from QRTZ_SIMPLE_TRIGGERS

 

Нравится

Поделиться

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

Вопрос

Как создать свой элемент управления?

Ответ

Для создания пользовательского элемента управления необходимо:

1) Создать модуль - класс элемента управления:

Ext.ns("Terrasoft");
/**
 * @class Terrasoft.controls.UsrMyControl
 * Класс элемента управления для отображения
 */
Ext.define("Terrasoft.controls.UsrMyControl", {
	extend: "Terrasoft.Component",
	alternateClassName: "Terrasoft.UsrMyControl",
	mixins: {
	},
	myParam: "",
	/**
	 * @inheritdoc Terrasoft.Component#tpl
	 * @protected
	 * @overridden
	 */
	tpl: [
		/*jshint white:false */
		"<div id='{id}-usr-my-control' class='{wrapClass}'>",
		"{myParam} test-test-test",
		"</div>"
		/*jshint white:true */
	],
	getTplData: function() {
		var tplData = this.callParent(arguments);
		tplData.myParam = this.myParam;
		this.updateSelectors(tplData);
		return tplData;
	},
	/**
	 * @inheritDoc Terrasoft.Component#init
	 * @protected
	 * @overridden
	 */
	init: function() {
		this.callParent(arguments);
		this.addEvents(
			"myMethod"
		);
	},
	/**
	 * @inheritDoc Terrasoft.Component#constructor
	 * @overridden
	 */
	constructor: function() {
		this.callParent(arguments);
	},
 
	updateSelectors: function(tplData) {
		var id = tplData.id;
		var baseIdSuffix = "-usr-my-control";
		var selectors = this.selectors = {};
		selectors.wrapEl = "#" + id + baseIdSuffix;
		return selectors;
	},
	/**
	 * Подписка на события элементов элемента управления
	 */
	initDomEvents: function() {
		this.callParent(arguments);
		var wrapEl = this.getWrapEl();
		if (wrapEl) {
			wrapEl.on("click", this.onClick, this);
		}
	},
	/**
	 * Обработчик события click на основном элементе
	 * @param event
	 */
	onClick: function(event) {
		event.stopEvent();
		this.fireEvent("myMethod", this);
	},
	/**
	 * Возвращает конфигурацию привязки к модели. Реализует интерфейс миксина {@link Terrasoft.Bindable}.
	 * @overridden
	 */
	getBindConfig: function() {
		var parentBindConfig = this.callParent(arguments);
		var bindConfig = {
			myParam: {
				changeMethod: "setMyParam"
			}
		};
		Ext.apply(bindConfig, parentBindConfig);
		return bindConfig;
	},
 
	setMyParam: function(val) {
		this.myParam = val || this.myParam;
		if (this.allowRerender()) {
			this.reRender();
		}
	},
	/**
	 * @overridden
	 * @inheritdoc Terrasoft.Component#destroy
	 */
	onDestroy: function() {
		var wrapEl = this.getWrapEl();
		if (wrapEl) {
			wrapEl.un("myMethod", this.onClick, this);
		}
		this.callParent(arguments);
	},
	/**
	 * Устанавливает значение флага только для чтения
	 * @param {Boolean} readonly Значение флага только для чтения. Если true - элемент управления устанавливается в
	 * режим только для чтения, false - рабочий режим элемента управления
	 */
	setReadonly: function(readonly) {
		if (this.readonly === readonly) {
			return;
		}
		this.readonly = readonly;
		if (this.allowRerender()) {
			this.reRender();
		}
	}
});

2) Создать модуль - генератор элемента управления:

define("UsrMyControlGenerator", ["UsrMyControlGeneratorResources", "terrasoft", "ext-base", "UsrMyControl"],
		function(resources) {
	var UsrMyControlGenerator = Ext.define("Terrasoft.configuration.UsrMyControlGenerator", {
		extend: "Terrasoft.ViewGenerator",
		alternateClassName: "Terrasoft.UsrMyControlGenerator",
		generateUsrMyControl: function(config) {
			var usrMyControl = {
				className: "Terrasoft.UsrMyControl",
				id: config.name + "UsrMyControl",
				selectors: {wrapEl: "#" + config.name + "UsrMyControl"},
				myParam: {bindTo: config.getMyParam},
				myMethod: {bindTo: config.myMethod}
			};
			if (!Ext.isEmpty(config.wrapClassName)) {
				usrMyControl.classes = {
					wrapClassName: config.wrapClassName
				};
			}
			return usrMyControl;
		}
	});
	return Ext.create(UsrMyControlGenerator);
});

3) Добавить пользовательский элемент управления в схему в секцию diff:

define("CasePage", ["CasePageResources", "terrasoft", "UsrMyControlGenerator", "UsrMyControl"],
	function(resources, Terrasoft) {
	return {
		entitySchemaName: "Case",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		attributes: {
			"Test": {
				"dataValueType": Terrasoft.DataValueType.TEXT,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"value": "123"
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "SolutionTab_gridLayout",
				"name": "UsrTest",
				"propertyName": "items",
				"values": {
					"className": "Terrasoft.UsrMyControl",
					"layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 4 },
					"generator": "UsrMyControlGenerator.generateUsrMyControl",
					"visible": true,
					"getMyParam": "getMyParam",
					"myMethod": "myMethod"
				}
			}
		]/**SCHEMA_DIFF*/,
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				// just for debug:
				document.scope = this;
			},
			getMyParam: function() {
				return this.get("Test");
			},
			myMethod: function() {
				var oldTest = this.get("Test");
				this.set("Test", oldTest + "!");
			}
		},
		rules: {}
	};
});

В зависимостях схемы обязательно указать модули UsrMyControl и UsrMyControlGenerator.

Нравится

Поделиться

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

Вопрос

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

Ответ

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

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

Пример на основе файлов базы знаний:

В манифесте в секции ModelDataImportConfig для KnowledgeBaseFile колонки Data установить признак "ImportBinaryData": false

 

{
    "Name": "KnowledgeBaseFile",
    "SyncColumns": [
        {
            "Name": "Data",
            "UseRecordIdAsFileName": false,
            "ImportBinaryData": false
        } 
    ]
}

 

Нравится

Поделиться

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