Коллеги всем доброго времени суток!

Нужна помощь.

Есть код обработчик:

 

diff:[
			{
				"operation": "insert",
				"name": "AltNoInformationInterestd2e10eaa-14f7-4005-96b9-78145978b4f2",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "GeneralInfoTabGridLayout8576b06a"
					},
					"labelConfig": {},
					"enabled": true,
					"bindTo": "AltNoInformationInterest",
					"controlConfig": {
						"checkedchanged": {
							"bindTo": "onInterestCheked"
						}
					}
				},
				"parentName": "GeneralInfoTabGridLayout8576b06a",
				"propertyName": "items",
				"index": 0
			},
			{
				"operation": "insert",
				"name": "AltAbsentInterestb586a604-e240-48b6-ba46-2889721a98cf",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 1,
						"layoutName": "GeneralInfoTabGridLayout8576b06a"
					},
					"labelConfig": {},
					"enabled": true,
					"bindTo": "AltAbsentInterest",
					"controlConfig": {
						"checkedchanged": {
							"bindTo": "onInterestCheked"
						}
					}
				},
				"parentName": "GeneralInfoTabGridLayout8576b06a",
				"propertyName": "items",
				"index": 1
			},
			{
				"operation": "insert",
				"name": "AltHaveInterest8b3652ac-d60d-4562-a1a5-e28a28cbce58",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 2,
						"layoutName": "GeneralInfoTabGridLayout8576b06a"
					},
					"labelConfig": {},
					"enabled": true,
					"bindTo": "AltHaveInterest",
					"controlConfig": {
						"checkedchanged": {
							"bindTo": "onInterestCheked"
						}
					}
				},
				"parentName": "GeneralInfoTabGridLayout8576b06a",
				"propertyName": "items",
				"index": 2
			},
],
methods: {
onInterestCheked : function() {
				debugger;
				//var event = window.event;
				if(event) {
					if(event.currentTarget.toString() != "[object XMLHttpRequest]")
					{
						if(this.get("AltNoInformationInterest")  == false 
							&& event.currentTarget.id.indexOf("AltNoInformationInterest") >= 0)
						{
							this.set("AltNoInformationInterest", true);
							this.set("AltAbsentInterest", false);
							this.set("AltHaveInterest", false);
						}
 
						if(this.get("AltAbsentInterest") == false && event.currentTarget.id.indexOf("AltAbsentInterest") >= 0)
						{
							this.set("AltAbsentInterest", true);
							this.set("AltNoInformationInterest", false);
							this.set("AltHaveInterest", false);
						}
 
						if(this.get("AltHaveInterest") == false  && event.currentTarget.id.indexOf("AltHaveInterest") >= 0)
						{
							this.set("AltHaveInterest", true);
							this.set("AltAbsentInterest", false);
							this.set("AltNoInformationInterest", false);
						}
					}
				} 
				else {
					console.log("");
				}
			},
}

В хроме работает отлично, но в FireFox ругается на event. т.к. не определено и не отображало часть контента карточки.

определил event:

var event = window.event;

ошибку перестало бить но метод перестал корректно работать:

Chrome: http://prntscr.com/lkanf6

Firefox: http://prntscr.com/lkaoau

Кто нибудь сталкивался с подобным? И как с этим бороться?

Заранее благодарен.

Нравится

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

Можно попробовать для каждого типа браузеров определить логику, получив браузер



var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);

var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);

 

Проще проверять на null значение event и если да — применять то или иное обходное решение.

WebKit follows IE's old behavior of using a global symbol for "event", but Firefox doesn't. When you're using jQuery, that library normalizes the behavior and ensures that your event handlers are passed the event parameter.

Вопрос с этой особенностью Firefox рассматривается во многих местах, см. ссылки: 1, 2, 3, 4, 5.

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

Добрый день!

Идея такая - при добавлении записи применять страницу добавления (т.к. используется механизм подбора продукта), при редактировании полей количество, цена и т.д. выполнять в режиме редактирования реестра (это быстрее и нет надобности открывать новую страницу). Подскажите, пожалуйста, можно ли как то это реализовать. Спасибо.

Нравится

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

На примере базовой детали:

 

define("ContactCareerDetailV2",
	["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
	function() {
		return {
			attributes: {
				IsEditable: {
					dataValueType: Terrasoft.DataValueType.BOOLEAN,
					value: true
				}
			},
			diff: /**SCHEMA_DIFF*/[
				{
					name: "DataGrid",
					operation: "merge",
					values: {
						activeRowAction: {bindTo: "onActiveRowAction"},
						activeRowActions: [
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.SaveIcon"},
								markerValue: "save",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "save"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.CardIcon"},
								markerValue: "card",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "card"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.CancelIcon"},
								markerValue: "cancel",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "cancel"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.RemoveIcon"},
								markerValue: "remove",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "remove"
							}
						],
						changeRow: {bindTo: "changeRow"},
						className: "Terrasoft.ConfigurationGrid",
						generateControlsConfig: {bindTo: "generateActiveRowControlsConfig"},
						generator: "ConfigurationGridGenerator.generatePartial",
						initActiveRowKeyMap: {bindTo: "initActiveRowKeyMap"},
						multiSelect: false,
						onGridClick: {bindTo: "onGridClick"},
						unSelectRow: {bindTo: "unSelectRow"}
					}
				}
			]/**SCHEMA_DIFF*/,
			methods: {
				getSwitchGridModeMenuItem: Terrasoft.emptyFn,
				onActiveRowAction: function(buttonTag, primaryColumnValue) {
					switch (buttonTag) {
						case "card":
							var row = this.getGridData().get(primaryColumnValue);
							this.saveRowChanges(row, function(p) {
								this.editRecord(row);
							}, this);
							break;
						case "remove":
							this.deleteRecords();
							break;
						case "cancel":
							this.discardChanges(primaryColumnValue);
							break;
						case "save":
							this.onActiveRowSave(primaryColumnValue);
							break;
					}
				},
				openCardByMode: function() {
					var cardState = this.get("CardState");
					var editPageUId = this.get("EditPageUId");
					var primaryValueUId = this.get("PrimaryValueUId");
					//в любом случае открываем страницу редактирования записи детали
					this.openCard(cardState, editPageUId, primaryValueUId);
 
					//кусок базовой логики
					/*if (this.getIsEditable() && cardState !== enums.CardStateV2.EDIT) {
						this.addRow(editPageUId);
					} else {
						this.openCard(cardState, editPageUId, primaryValueUId);
					}*/
				}
			},
			mixins: {
				ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
			}
		};
	});

 

На примере базовой детали:

 

define("ContactCareerDetailV2",
	["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
	function() {
		return {
			attributes: {
				IsEditable: {
					dataValueType: Terrasoft.DataValueType.BOOLEAN,
					value: true
				}
			},
			diff: /**SCHEMA_DIFF*/[
				{
					name: "DataGrid",
					operation: "merge",
					values: {
						activeRowAction: {bindTo: "onActiveRowAction"},
						activeRowActions: [
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.SaveIcon"},
								markerValue: "save",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "save"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.CardIcon"},
								markerValue: "card",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "card"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.CancelIcon"},
								markerValue: "cancel",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "cancel"
							},
							{
								className: "Terrasoft.Button",
								imageConfig: {bindTo: "Resources.Images.RemoveIcon"},
								markerValue: "remove",
								style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								tag: "remove"
							}
						],
						changeRow: {bindTo: "changeRow"},
						className: "Terrasoft.ConfigurationGrid",
						generateControlsConfig: {bindTo: "generateActiveRowControlsConfig"},
						generator: "ConfigurationGridGenerator.generatePartial",
						initActiveRowKeyMap: {bindTo: "initActiveRowKeyMap"},
						multiSelect: false,
						onGridClick: {bindTo: "onGridClick"},
						unSelectRow: {bindTo: "unSelectRow"}
					}
				}
			]/**SCHEMA_DIFF*/,
			methods: {
				getSwitchGridModeMenuItem: Terrasoft.emptyFn,
				onActiveRowAction: function(buttonTag, primaryColumnValue) {
					switch (buttonTag) {
						case "card":
							var row = this.getGridData().get(primaryColumnValue);
							this.saveRowChanges(row, function(p) {
								this.editRecord(row);
							}, this);
							break;
						case "remove":
							this.deleteRecords();
							break;
						case "cancel":
							this.discardChanges(primaryColumnValue);
							break;
						case "save":
							this.onActiveRowSave(primaryColumnValue);
							break;
					}
				},
				openCardByMode: function() {
					var cardState = this.get("CardState");
					var editPageUId = this.get("EditPageUId");
					var primaryValueUId = this.get("PrimaryValueUId");
					//в любом случае открываем страницу редактирования записи детали
					this.openCard(cardState, editPageUId, primaryValueUId);
 
					//кусок базовой логики
					/*if (this.getIsEditable() && cardState !== enums.CardStateV2.EDIT) {
						this.addRow(editPageUId);
					} else {
						this.openCard(cardState, editPageUId, primaryValueUId);
					}*/
				}
			},
			mixins: {
				ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
			}
		};
	});

 

Спасибо, Данила! Настройка работает.

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

В версии 7.12.4 появился новый вид истории обращения. В нем можно видеть комментарии и комментарии к нему. Но не получается понять как можно автоматически разворачивать эти самые ветки комментариев? Очень часто там фигурируют полезные сведения по обращению, и приходится разворачивать их вручную.

Нравится

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

Это определяется атрибутом CommentsVisible в схеме SocialMessageHistoryItemPageV2:

 * Comments block visibility attribute.
 */
"CommentsVisible": {
	"dataValueType": this.Terrasoft.DataValueType.BOOLEAN,
	"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
	"value": false
},

И его состояние считывает и инвертирует та самая ссылка-переключатель «Комментарии (1)»:

/**
 * Toggle comments block visibility and load first portion of comments if it is visible and empty.
 * @protected
 */
toggleCommentsVisibility: function() {
	if (this.get("CommentCount") < 1) {
		return;
	}
	var newVisibilityState = !this.get("CommentsVisible");
	this.set("CommentsVisible", newVisibilityState);
	if (newVisibilityState && this.get("ShownCommentMessagesCount") === 0) {
		this.onLoadNextComment();
	}
},

Нужно смотреть и экспериментировать, достаточно ли поменять атрибут на true, или нужно будет при открытии ещё принудительно вызывать логику загрузки комментариев.

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

При слияние дублей в разделе Контакты у администратора, выполнявшим слияние, в учетной записи поменялся контакт на лицо из дубля. Контакт админа удалился.

В результате имеем двух пользователей, синхронизированных LDAP, но с единым контактом.

Какой нужно выполнить запрос в поднятый бэкап БД для дедубликации или есть ещё какой либо способ. Откат не желателен.

Нравится

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

Ну для конкретных этих двух пользователей произвести их апдейт из бекапа, в бекапе посмотреть, какой контакт был удален и произвести вставку, а уже потом апдейт

Ну для конкретных этих двух пользователей произвести их апдейт из бекапа, в бекапе посмотреть, какой контакт был удален и произвести вставку, а уже потом апдейт

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

Здравствуйте! Подскажите, а как добавить в фильтры серверного EntitySchemaQuery подзапрос или где в системе можно найти пример? На SQL запрос выглядит следующим образом:

SELECT
   * 
FROM
   [Contract] 
WHERE
   StartDate = (
        SELECT MAX(c.StartDate)
        FROM Premises p
        JOIN PremisesInContract pic ON p.Id = pic.PremisesId
        JOIN Contract c ON spic.ContractId = c.Id
        WHERE p.Id = --@someparameter
   )

 

Нравится

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

Добрый день!



Интересует вопрос:

1) как достать тело письма и "засунуть" его в текстовое поле (как это делает базовые процессы), немного не понимаю процесс (в теле активности текст в html коде)

2) как забирать из письма вложения и добавлять их к вложениям другого объекта?

Нравится

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

Логика создания инцидента по письму реализована в БП IncidentRegistrationFromEmailProcess, его функции RegisterIncidentFromEmail. Там обращаются к вспомогательной схеме IncidentRegistrationFromEmaillHelper. В ней и сделано: функция CreateNewCaseByEmail создаёт запись и наполняет поля, функция ClearHtmlText превращает содержимое тела письма из HTML в текст.

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

А базовой логики переноса файлов не реализовано?

См. UploadAttachmentsData в ExchangeUtility.

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

Стартовым сигналом в  БП IncidentRegistrationFromEmailProcess является FinishedSyncSession и если я меняю его на простую активность(письмо) то все рушится. Как в этом плане лучше реализовать регистрацию обращения по письму, не изобретая велосипед. Ведь есть уже практически готовый код, но не могу понять как его переделать.

Так не меняйте сразу, а сначала выясните, как он работает, какие данные в процесс передаются и зачем.

Не могу пронять логику:

- Поступает письмо по имеющемуся обращению

- В активности прикрепляется обращение

Но, если я делаю стартовый сигнал "Новая активность" (входящее письмо) с заполненным обращением - ничего не выходит. А если и запускается процесс (не указываю, что "обращение" заполнено), то в ходе процесса выясняю, что "обращение" не заполнено. 



При этом если я вручную меняю обращение и БП запускается после изменения - все работает как положено.



Вопрос - какой тогда использовать входной сигнал для обработки только что входящей почты с привязанным обращением?

Стандартный БП IncidentRegistrationFromEmailProcess запускается по сигналу «Добавление записи в FinishedSyncSession». Затем Id записей активностей получают из Id сессии при помощи функции GetActivityRecordsId, которая реализована в схеме этого же БП.

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

Проблема не в том, что я не могу найти активность, а в том что в этой активности БП не видит привязанное обращение. Внешне я вижу, что он определил правильно все. Я могу зайти посмотреть письмо и что оно привязано к нужному обращению. Но сам БП активно игнорирует этот факт.

Значит, на момент срабатывания оно ещё не привязано, а привязка происходит позже, чем отрабатывает Ваша логика.

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

Коллеги, всем доброго времени суток, нужна помощь.

Необходимо добавить маску загрузки на страницу редактирования.

Пробовал разными способами.

this.showBodyMask();

также пробовал в зависимости карточки добавлять MaskHelper, и далее в коде вызывать MaskHelper.ShowBodyMask() - не срабатывает

 

так же пробовал следующим образом  - var maskId = this.Terrasoft.controls.Mask.show(this);

 так же не работает.

 страница наследуется от Базовая схема карточки ( NUI ).

Ниже приведен код карточки:

define("AbReportSettingsPageV2", ["AbReportSettingsPageV2Resources", "BaseFiltersGenerateModule", "ServiceHelper"], 
	function(Resources, BaseFiltersGenerateModule, ServiceHelper) {
	return {
		entitySchemaName: "AbCustomReport",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
		attributes: {
			"AbDateFrom":{
				"dataValueType": Terrasoft.DataValueType.DATE,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isRequired": true
			},
			"AbDateBy":{
				"dataValueType": Terrasoft.DataValueType.DATE,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isRequired": true
			},
			"AbCustomReport": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isLookup": true,
				"referenceSchemaName":"AbCustomReport",
				"isRequired": true
			},
			"City": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isLookup": true,
				"referenceSchemaName":"City",
			},
			"Country": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isLookup": true,
				"referenceSchemaName":"Country",
			},
			"Service": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"isLookup": true,
				"referenceSchemaName":"Product",
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "merge",
				"name": "SaveButton",
				"values": {
					"caption": "$Resources.Strings.AbLoadReportCaption",
					"visible": true
				}
			},
			{
				"operation": "merge",
				"name": "BackButton",
				"values": {
					"visible": true
				}
			},
			{
				"operation": "remove",
				"name": "actions"
			},
			{
				"operation": "remove",
				"name": "Tabs"
			},
			{
				"operation": "remove",
				"name": "PrintButton"
			},
			{
				"operation": "remove",
				"name": "OptionsButtonButton"
			},
			{
				"operation": "insert",
				"name": "AbReportSettingsContainer",
				"parentName": "CardContentContainer",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"items": [],
					"markerValue": "AbReportSettingsContainer"
				}
			},
			{
				"operation": "insert",
				"name": "AbReportSettingsGridLayoutContainer",
				"parentName": "AbReportSettingsContainer",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
					"items": []
				}
			},
			{
				"operation": "insert",
				"name": "AbDateFrom",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbDateFromCaption",
					"bindTo": "AbDateFrom",
					"enabled": true
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 0
			},
			{
				"operation": "insert",
				"name": "AbDateBy",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 0,
						"row": 2,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbDateByCaption",
					"bindTo": "AbDateBy",
					"enabled": true
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 1
			},
			{
				"operation": "insert",
				"name": "AbCustomReport",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 0,
						"row": 4,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbReportCaption",
					"bindTo": "AbCustomReport",
					"enabled": true,
					"contentType": 3
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 2
			},
			{
				"operation": "insert",
				"name": "City",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 8,
						"row": 0,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbCityCaption",
					"bindTo": "City",
					"enabled": true,
					"contentType": 5
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 3
			},
			{
				"operation": "insert",
				"name": "Country",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 8,
						"row": 2,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbCountryCaption",
					"bindTo": "Country",
					"enabled": true,
					"contentType": 5
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 4
			},
			{
				"operation": "insert",
				"name": "Service",
				"values": {
					"layout": {
						"colSpan": 8,
						"rowSpan": 1,
						"column": 8,
						"row": 4,
						"layoutName": "AbReportSettingsGridLayoutContainer"
					},
					"caption": "$Resources.Strings.AbServiceCaption",
					"bindTo": "Service",
					"enabled": false,
					"contentType": 5
				},
				"parentName": "AbReportSettingsGridLayoutContainer",
				"propertyName": "items",
				"index": 5
			}
		]/**SCHEMA_DIFF*/,
		methods: {
			onEntityInitialized: function () {
				this.callParent(arguments);
				this.set("Name", this.getHeader());
				this.getCurrentContactCountry();
 
			},
			save: function() {
				this.runReportForming();
			},
			getCurrentContactCountry: function () {
				var currentContactId = Terrasoft.SysValue.CURRENT_USER_CONTACT.value;
				var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
					rootSchemaName: "Contact"
				});
				esq.addColumn("Country", "CountryId");
				esq.getEntity(currentContactId, function(result) {
					if (!result.success) {
						this.showInformationDialog(Resources.localizableStrings.AbCurrentUserCountryError);
						return;
					}
					var country = result.entity.get("CountryId");
					if(country!== null || country!== undefined) {
						this.set("Country", country);
					}
				},this)
			},
			runReportForming: function () {
				var startDate = this.get("AbDateFrom");
				var stopDate = this.get("AbDateBy");
				var report = this.get("AbCustomReport");
				var country = this.get("Country");
				var city = this.get("City");
				var service = this.get("Service");
				if(startDate === null || startDate === undefined) {
					this.showInformationDialog(Resources.localizableStrings.AbFillDateStartCaption);
					return;
				}
				if(stopDate === null || stopDate === undefined) {
					this.showInformationDialog(Resources.localizableStrings.AbFillDateStartCaption);
					return;
				}
				if(startDate > stopDate){
					this.showInformationDialog(Resources.localizableStrings.AbIntervalDateWarningCaption);
					return;
				}
				if(report === null || report === undefined) {
					this.showInformationDialog(Resources.localizableStrings.AbFillReportCaption);
					return;
				}
				if(report.value == "c77af1b5-7118-40c7-8636-870edb85d45f" && (city === null || city === undefined)) {
					this.showInformationDialog(Resources.localizableStrings.AbFiillCityWarningCaption);
					return;
				}
				var reportId = report.value;
				countryId = (country === null || country === undefined) ? null : country.value;
				cityId = (city === null || city === undefined) ? null : city.value;
				serviceId = (service === null || service === undefined) ? null : service.value;
 
				var dateStart = Ext.Date.format(startDate, 'Y-m-d');
				var dateStop = Ext.Date.format(stopDate, 'Y-m-d');
				var dataSend = {
					startDate: dateStart,
					stopDate: dateStop,
					reportId: reportId,
					countryId: countryId,
					cityId: cityId,
					serviceId: serviceId
				};
				this.getReportServices(dataSend);
			},
			getReportServices: function(dataSend) {
				var reportId = dataSend.reportId;
				var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
					rootSchemaName: "AbCustomReport"
				});
				esq.addColumn("Name", "ReportName");
				esq.addColumn("AbSourceCodeServiceName", "SourceCodeServiceName");
				esq.getEntity(reportId, function(result) {
					if (!result.success) {
						this.showInformationDialog("Ошибка запроса данных");
						return;
					}
					var reportName =  result.entity.get("ReportName");
					var sourceCodeName =  result.entity.get("SourceCodeServiceName");
					this.downloadReport(sourceCodeName, reportName, dataSend);
				}, this);
			},
			downloadReport: function(sourceCodeName, reportName, dataSend) {
				debugger;
				this.showBodyMask();
				Terrasoft.AjaxProvider.request({
					url: "../rest/" + sourceCodeName + "/GetReportUrl",
					headers: {
						"Accept": "application/json",
						"Content-Type": "application/json"
					},
					method: "POST",
					jsonData: dataSend,
					callback: function (request, success, response) {
						var responseObject = {};
						if (success) {
							responseObject = Terrasoft.decode(response.responseText);
							var key = "/" + responseObject.GetReportUrlResult;
							var reportCaption = reportName + ".xlsx";
							var report = document.createElement("a");
							report.href = "../rest/" + sourceCodeName + "/GenerateSalaryReport" + key;
							report.download = reportCaption;
							document.body.appendChild(report);
							report.click();
							document.body.removeChild(report);
						}
						this.hideBodyMask();
					}, scope: this
				});
			},
			getHeader: function() {
				return Resources.localizableStrings.AbPageSettingsCaption;
			}
		},
		rules: {},
		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/
	};
});

 

Нравится

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

Добрый день.

Для вызова маски из this необходимо проверить, не потерялся ли контекст где-то по стэку вызова.  При правильном this метод showBodyMask(); должен работать.

Для вызова из MaskHelper необходимо модуль подключить в define.

define("AbReportSettingsPageV2", ["AbReportSettingsPageV2Resources", "BaseFiltersGenerateModule", "ServiceHelper", "MaskHelper"], 
	function(Resources, BaseFiltersGenerateModule, ServiceHelper, MaskHelper) 

В консоли ошибки есть?

Пащенко Александр Сергеевич,

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

Нигрескул Алексей,

попробуйте так:

 

var maskId = Terrasoft.MaskHelper.showBodyMask();

Terrasoft.MaskHelper.hideBodyMask(maskId);

 

Нигрескул Алексей,

Страница настроек случайно не в SystemDesigner вставлена?

Варфоломеев Данила,

Да, туда.

Есть какие то особенности в данной реализации?

Нигрескул Алексей,

Ну как сказать. Я уперся в те же самые проблемы, перепробовал все способы, маска так и не заработала. Убил часа 3, потом просто плюнул на это дело. Только в дизайнере такой бред происходит.

Принял, благодарю. А ТП ничего не говорит по данному поводу?

Cм. пример использования showBodyMask и hideBodyMask. 

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

Все перепробовал - не работает.

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

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

Добрый день!

 

Версия 7.12.3.

Столкнулся с проблемой, одному из пользователей (upd: на самом деле не одному, проблемы точно нет у cупервизора) система не позволяет менять/удалять инфу на детали Средства связи в Контакте (добавлять разрешает). Происходит это не у всех контактов, только на некоторых, системы еще не обнаружил (upd: обнаружил - сбой на контактах, заведенных после 16 августа сего года включительно).

BatchQuery возвращает сообщение об ошибке из темы, сама CRM показывает:

Изображение удалено.

Права на объект вроде по умолчанию.

Изображение удалено.

Что это за глюк?

Нравится

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

Попробуйте перераздать права на через решение Access rights setup wizard for bpm'online

А объект "Контакт" администрируется?

Судя по настройкам, нет.

Хотя на вкладке "Доступ к записям по умолчанию:" есть записи.

Тогда странно. Я бы попробовал встать дебаггером в функцию getValidationMessage. Сообщение похоже на то, что данная функция должна возвращать.

Не, сообщение приходит в ответ на 0/DataService/json/SyncReply/BatchQuery.

"Трасформируется" (неправильно) для вывода на экран в методе onSaved от BaseCommunicationDetail.

 

Борис Леонов,

Добрый день! В объекте детали ContactCommunication в свойстве "Доступ" у вас стоят где нибудь выбранные пункты?("По операциям, по колонкам и др."). Для полного доступа галочки напротив данных полей должны отсутствовать.

 

engineer7,

нет, галочки не установлены

Борис Леонов,

возможно данная статья сможет Вам помочь: https://academy.terrasoft.ru/documents/sales-enterprise/7-10/detal-dostup-k-obektu-razdela-dostup-k-obektam

engineer7,

на детали, указанной в статье, пусто, нет ни одной записи

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

А нет другой логики на сигналы с детали (в том числе на уровне объектных бп)?

Если есть доступ в базу, можно посмотреть скрытые в интерфейсе таблицы прав SysContactRight и SysContactCommunicationRight, если они есть. Отфильтровать по Id контактов и записей на детали средств связи, взяв примеры, созданные до и после 16. Может, права почему-то всё же выдались. Например, если тогда кто-то менял настройки прав для объекта и вернул как было.

Также можно попробовать включить по объектам Contact и/или ContactCommunication права по записям, а потом обратно выключить. Возможно, при прошлом выключении был сбой и не выключилось полностью. Лучше перед этим сделать бекап или проверять на копии базы.

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

 

 

Попробуйте перераздать права на через решение Access rights setup wizard for bpm'online

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

Коллеги доброго времени суток!

Реализовал деталь с редактируемым реестром и карточкой редактирования записи код ниже:

define("AbAccountProductDetail",
	["ConfigurationEnums", "ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
	function (enums) {
		return {
			entitySchemaName: "AbAccountProduct",
			attributes: {
				"IsEditable": {
					dataValueType: Terrasoft.DataValueType.BOOLEAN,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					value: true
				}
			},
			mixins: {
				ConfigurationGridUtilities: "Terrasoft.ConfigurationGridUtilities"
			},
			methods:{
				init: function() {
					this.callParent(arguments);
					this.sandbox.subscribe("[AbAccountProductEntityEventListner]:[RequestToPlatform]:[Exception]", this.accountProductEntityListnerMsgHandler, this);
				},
 
				/*Overrided "BaseGridDetailV2"*/
				editRecord: function(record) {
					var activeRow = record || this.getActiveRow();
					if (!activeRow) {
						return;
					}
					if (!this.getIsCardValid()) {
						return;
					}
					var isCardChanged = this.getIsCardChanged();
					var primaryColumnValue = typeof activeRow === "object" ? activeRow.get(activeRow.primaryColumnName) : activeRow;
					var typeColumnValue = this.getTypeColumnValue(activeRow);
					this.setLastActiveRow(primaryColumnValue);
					if (isCardChanged) {
						this.set("CardState", enums.CardStateV2.EDIT);
						this.set("EditPageUId", typeColumnValue);
						this.set("PrimaryValueUId", primaryColumnValue);
						var args = {
							isSilent: true,
							messageTags: [this.sandbox.id]
						};
						this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
					} else {
						this.openCard(enums.CardStateV2.EDIT, typeColumnValue, primaryColumnValue);
					}
				},
 
				accountProductEntityListnerMsgHandler: function() {
					Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,
					function(scope, message){
							if (!message || message.Header.Sender !== "[AbAccountProductEntityEventListner]:[RequestToPlatform]:[Exception]") {
							return;
						}
						var message2 = message.Body;
						if (!this.Ext.isEmpty(message2)) {
							window.console.info(message2);
							this.Terrasoft.showInformation(message2);
						}
					}, this);
				}
			},
			diff: [
				{
					"operation": "merge",
					"name": "DataGrid",
					"values": {
						"className": "Terrasoft.ConfigurationGrid",
						"generator": "ConfigurationGridGenerator.generatePartial",
						"generateControlsConfig": { "bindTo": "generateActiveRowControlsConfig" },
						"changeRow": { "bindTo": "changeRow" },
						"unSelectRow": { "bindTo": "unSelectRow" },
						"onGridClick": { "bindTo": "onGridClick" },
						"activeRowActions": [
							{
								"className": "Terrasoft.Button",
								"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								"tag": "save",
								"markerValue": "save",
								"imageConfig": { "bindTo": "Resources.Images.SaveIcon" }
							},
							{
								"className": "Terrasoft.Button",
								"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								"tag": "card",
								"markerValue": "card",
								"imageConfig": { "bindTo": "Resources.Images.CardIcon" }
							},
							{
								"className": "Terrasoft.Button",
								"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								"tag": "cancel",
								"markerValue": "cancel",
								"imageConfig": { "bindTo": "Resources.Images.CancelIcon" }
							},
							{
								"className": "Terrasoft.Button",
								"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								"tag": "remove",
								"markerValue": "remove",
								"imageConfig": { "bindTo": "Resources.Images.RemoveIcon" }
							}
						],
						"initActiveRowKeyMap": { "bindTo": "initActiveRowKeyMap" },
						"activeRowAction": { "bindTo": "onActiveRowAction" },
						"multiSelect": false
					}
				}
			]
		};
	});

Пришлось переопределить editRecord():

 

var primaryColumnValue = typeof activeRow === "object" ? activeRow.get(activeRow.primaryColumnName) : activeRow;

т.к. дальше не срабатывало.

сейчас работает - http://prntscr.com/lfe61n

но при переходе на страницу редактирования поле для связи не заполняется - http://prntscr.com/lfe6k4

Подскажите в чем может быть дело?

Заранее благодарен.

Нравится

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

Попробуйте например вызывать openCardInChain и передавать туда значения по умолчанию

 

addChildRecord: function(typeColumnValue, date) {
var selectedItem = this.get("ActiveRow");
var defaultValues = [];
defaultValues.push({
	name: "ParentId",
	value: typeColumnValue
});
defaultValues.push({
	name: "UsrDate",
	value: date
});
var config = {
	sandbox: this.sandbox,
	schemaName: this.getEditPageSchemaName(typeColumnValue),
	operation: ConfigurationEnums.CardStateV2.ADD,
	moduleId: this.getChainCardModuleSandboxId(typeColumnValue),
	defaultValues: defaultValues
};
this.openCardInChain(config);
},

 

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

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

Попробуйте например вызывать openCardInChain и передавать туда значения по умолчанию

 

addChildRecord: function(typeColumnValue, date) {
var selectedItem = this.get("ActiveRow");
var defaultValues = [];
defaultValues.push({
	name: "ParentId",
	value: typeColumnValue
});
defaultValues.push({
	name: "UsrDate",
	value: date
});
var config = {
	sandbox: this.sandbox,
	schemaName: this.getEditPageSchemaName(typeColumnValue),
	operation: ConfigurationEnums.CardStateV2.ADD,
	moduleId: this.getChainCardModuleSandboxId(typeColumnValue),
	defaultValues: defaultValues
};
this.openCardInChain(config);
},

 

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

Всем доброго времени суток!

Коллеги нужна Ваша помощь. Необходимо в С# коде получить идентификатор SystemUser.

http://prntscr.com/lczocy

Хардкодом как то не очень хочется забивать.

Данный идентификатор необходим для работы в событийном слое Entity.

Заранее благодарен.

Нравится

3 комментария
Лучший ответ
//получить значение системной настройки
var mySystemUser=Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "SystemUser");
//получить значение системной настройки
var mySystemUser=Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "SystemUser");

Ну или, учитывая что система по-умолчанию работает от Supervisor-a:

UserConnection.AppConnection.SystemUserConnection.CurrentUser.Id

Не уверен, что сработает, но вроде должно)

Вставлю свои 5 копеек

в Terrasoft.Configuration определена константа id супервизора 

BaseConsts.SystemUserId 

 

 

 

 

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