В разделе "Переводы" получаем следующее уведомление\ошибку:



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

Актуализация переводов завершилась с ошибкой.
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
ORA-06512: at "BS_BCJ_L_M7134ENU.tspkg_Translation", line 16
ORA-06512: at "BS_BCJ_L_M7134ENU.tspkg_Translation", line 72
ORA-06512: at line 2

или такое:



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

Актуализация переводов завершилась с ошибкой.
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
ORA-06512: at "BS_BCJ_L_M7134ENU.tspkg_Translation", line 16
ORA-06512: at "BS_BCJ_L_M7134ENU.tspkg_Translation", line 72
ORA-06512: at line 2



Подскажите куда копать? Как исправить? 

Нравится

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

Добрый день,

 

Во время изменение структуры нужна эксклюзивная блокировка на таблицу (для сохранения целостности).

Вероятнее всего в момент актуализации переводов из других IDE кто-то блокировал таблицу.

Обновление должно производиться не в операционное время (любые DDL операции и т.д), а во время тех.окна. Для этого необходимо исключить одновременный доступ к БД из разных источников (IDE, другие копии приложения и т.п.). Если по какой либо причине, такой возможности нет, то необходимо найти сеанс, который предотвращает исключительную блокировку и остановить его.

Так же, с версии Oracle 11g есть возможность  установить "ddl_lock_timeout", чтобы система ожидала эксклюзивной блокировки указанное Вами время.

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

Как полученное фото передать в запись детали без костилей? 



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



Мне это фото нужно загрузить в деталь обратно как он делал при выборе файла. 

Нравится

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

Здравствуйте Ислам!

После воспроизведения данного Вами кода, ошибка №1 не возникала (вероятно из-за разных версий продукта), но появлялась ошибка «Maximum call stack size exceeded error». Причина - обращение к AddRecordButton. Советую сделать замещение в diff на новую кнопку в FileDetailV2:

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"name": "CustomButton",
		"parentName": "Detail",
		"propertyName": "tools",
		"values": {
			"caption": "Click me",
			"itemType": Terrasoft.ViewItemType.BUTTON,
			"click": {"bindTo": "getWebCamClick"},
			"visible": true
		}
	}
]/**SCHEMA_DIFF*/

Добавление фотографий в деталь не выполнялось. Я внесла несколько изменений в ваш код, теперь функционал работает. При открытии модального окна вы можете несколько раз нажать на кнопку «Сделать фото» и после каждого клика будет добавлено новое фото. Прикрепляю обновленные методы CameraPageMixin:

takePhoto: function() {
	var videoElement = document.querySelector("video");
	if (videoElement.srcObject) {
		var desiredWidth = 1000; 
		var desiredHeight = 1000;
		var canvas = document.createElement("canvas");
		canvas.width = desiredWidth;
		canvas.height = desiredHeight;
		var context = canvas.getContext("2d");
		context.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
 
		var photoData = canvas.toDataURL("image/jpeg");
		var base64Part = photoData.split(",")[1];
		var buffer = this.base64ToArrayBuffer(base64Part);
		var mimeString = photoData.split(",")[0].split(":")[1].split(";")[0];
		var blob = new Blob([buffer], {type: mimeString});
		var files = new File([blob], "photo.jpeg", {type: "image/jpeg"});
		return files;
	}
	  return null;
},
 
base64ToArrayBuffer: function (base64) {
	var binaryString = atob(base64);
	var bytes = new Uint8Array(binaryString.length);
	for (var i = 0; i < binaryString.length; i++) {
		bytes[i] = binaryString.charCodeAt(i);
	}
	return bytes.buffer;
},

Ошибка №2 возникает из-за потери контекста. В FileDetailV2 метод onFileSelect вызывает getIsNewRecord, а getIsNewRecord отправляет сокетное сообщение GetCardState на DetailModuleV2, хотя должен его отправлять в BasePageV2. Воспроизводится, если хотя бы раз открыть контейнер до перезахода на страницу. Поймать точный момент возникновения проблемы у меня не получилось, к сожалению.

Здравствуйте, Ислам!

 

Вы можете реализовать поставленную задачу с помощью пользовательского модуля:

https://academy.creatio.com/docs/developer/front_end_development/sandbox/overview

По нажатию на кнопку будет открываться модальное окно с необходимым функционалом. Пример загрузки модуля описан ниже: https://academy.creatio.com/docs/developer/front_end_development/sandbox/overview#case-2746

Так же хочу уточнить, что метод «CardStateV2.EDIT» актуален только до версии 7.7.0. Для всех следующих версий нужно будет делать его замену. Похожий пример реализации: https://community.creatio.com/articles/error-when-trying-add-new-activity-history-connecred-object?_gl=1*ol2aml*_gcl_au*MTYxNTAzNjkzMi4xNjkyOTU4NzI3

Полезная ссылка по решению загрузки пользовательского модуля с параметрами для конструктора объекта модуля:

https://community.terrasoft.ua/questions/loadmodule-s-parametrami-konstruktora-kak

В конце для загрузки фото с модуля нужно отладить загрузку файла во вложения и вызов ендпоинта /0/rest/FileApiService/UploadFile

 

С уважением,

Ангелина

Anhelina,

Благодарю за подробный ответ, мне не понятен последний момент. С отладкой загрузки файла. Мы можем реализовать этот кейс вызвав функцию upload(config), которая реализована в FileDetailV2?  Если да, то подскажите где посмотреть примеры?

Ислам,

Вы можете вызвать функцию, передав нужное значение в config, так: this.Terrasoft.ConfigurationFileApi.upload(config, callback);

Модуль ConfigurationFileApi нужно добавить в зависимости: define(" ", [… " ConfigurationFileApi "], …

Так же могут быть полезными статьи:

https://academy.terrasoft.ua/docs/developer/ehlementy_interfejsa/strani…

https://community.terrasoft.ua/questions/vstavit-element-photocontainer…

Anhelina,

Я реализовал вызов Upload и у меня добавляется при нажатии на фотографировать фото в детали, но деталь ломается. Сразу после этого она перестает обновляться, то есть если я перехожу по другим записям деталь зависает и выводит две ошибки:

1)  
"Message DetailRendered is not defined in DetailModuleV2 (CardModuleV2_9d571769-06d3-44bf-a1bc-94c8fa686266_FinApplicationContactPage_detail_DocListInFinAppDetail_detail_nested_FilesDocListInFinAppFile) module"



2)



Я так понимаю ошибка происходит тут в файле FileDetailV2: 









Для ясности оставлю код и детали и миксина, которые снимает фото с веб камеры: 

ДЕТАЛЬ:

 

define("FileDetailV2", ["ModalBox", "CameraPageMixin","ConfigurationEnums","ConfigurationFileApi"],
function(ModalBox, ConfigurationEnums) {
	return {
		attributes: {},
		messages: {},
		mixins: {
			CameraPageMixin: "Terrasoft.CameraPageMixin"
		},
		methods: {
 
			getWebCamClick: function() {
				var webCamModuleContainer = this.Ext.create("Terrasoft.Container", {
					id: this.mixins.CameraPageMixin.containerId,
					classes: { 
						wrapClassName: ["webcam-module-container-class"] 
					}
				});
				var photoContainerId = this.Ext.create("Terrasoft.Container", {
					id: this.mixins.CameraPageMixin.photoContainerId,
					classes: { 
						wrapClassName: ["photo-container-class"] 
					}
				});
			    var captureButton = this.Ext.create("Terrasoft.Button", {
			       caption: "Сделать фото",
			        handler: function() {
				        this.onCapturePhotoClick();
				    }.bind(this) 
			    });
			    var closeButton = this.Ext.create("Terrasoft.Button", {
			    	caption: "Закрыть окно",
			        handler: function() {
				        this.closeModalBox();
				    }.bind(this)
			    });
				var parentRecordId = this.get("MasterRecordId");
				var modalBoxConfig = {
					minHeight : "1",
					minWidth : "1",
					maxHeight : "100",
					maxWidth : "100",
			        id: this.sandbox.id + "_CustomModalBox",
			        handler: this,
			        selector: "#CustomModalBox",
			        renderTo: Ext.getBody(),
			        instanceConfig: {
			            parentRecordId: parentRecordId
			        }
			    };
			    var modalBoxContainer = ModalBox.show(modalBoxConfig,  this.destroy.bind(this));
			    ModalBox.setSize(510, 440);
			    modalBoxContainer.setStyle("background-color", "#FFFFFF");
 
 
				webCamModuleContainer.render(modalBoxContainer);
				photoContainerId.render(modalBoxContainer);
				captureButton.render(modalBoxContainer);
				closeButton.render(modalBoxContainer);
 
			    this.mixins.CameraPageMixin.openWebCamClick.apply(this, arguments);
			},
			onCapturePhotoClick: function(callback) {
 
			   var files = this.mixins.CameraPageMixin.takePhoto.apply(this, arguments);
				var config = this.onFileSelect(files);
				if (config) {
					this.Terrasoft.ConfigurationFileApi.upload(config, callback);
				}
			},
			closeModalBox: function() {
				this.mixins.CameraPageMixin.closeWebCamAndRemoveContainer.apply(this, arguments);
			    ModalBox.close();
			}
 
		},
		diff: /**SCHEMA_DIFF*/[
			{
			    "operation": "merge",
			    "name": "AddRecordButton",
			    "parentName": "Detail",
			    "propertyName": "tools",
			    "values": {
			        "itemType": Terrasoft.ViewItemType.BUTTON,
			        "tag": "addFileButton",
			        "fileUpload": false,
			        // "filesSelected": {"bindTo": "onFileSelectOveridden"},
			        "click": {"bindTo": "getWebCamClick"},
			        // "visible": {"bindTo": "getAddRecordButtonVisible"},
			        "imageConfig": {"bindTo": "Resources.Images.AddButtonImage"}
			    }
			}
			]/**SCHEMA_DIFF*/
	};
});

 Миксин: 

define("CameraPageMixin", [], function() { 
    Ext.define("Terrasoft.configuration.mixins.CameraPageMixin", {
        alternateClassName: "Terrasoft.CameraPageMixin",
 
		afterRender: function() {
            this.callParent(arguments);
            this.webcamStarted = false;
        },
	    videoWidth: 500,
	    videoHeight: 380,
	    videoStream: null,
	    containerId: "WebCamModuleContainer",
	    photoContainerId: "PhotoModuleContainer",
 
        onGetApplicationId: function(applicationId) {
           this.alert(applicationId);
        },
	    openWebCamClick: function() {
	           try {
	               var videoElement = document.createElement("video");
	               videoElement.setAttribute("autoplay", "true");
	               videoElement.width = this.videoWidth;
	               videoElement.height = this.videoHeight;
 
	               navigator.mediaDevices.getUserMedia({ video: true })
	                   .then(function(stream) {
	                       videoElement.srcObject = stream;
	                       this.videoStream = stream;
 
	                     var container = this.Ext.get(this.containerId);
	                     if (container) {
	                          container.dom.appendChild(videoElement);
	                          this.webcamStarted = true;
	                      } else {
	                          window.console.error("Ошибка: элемент с идентификатором " 
	                          + this.containerId + " не найден в DOM.");
	                	  }
	                   }.bind(this))
	                   .catch(function(error) {
	                       window.console.error("Ошибка при получении доступа к веб-камере:", error);
	                   }); 
	           } catch (e) {
	                 window.console.error("Произошла ошибка при инициализации веб-камеры:", e);
	           }
	    },
 
	    takePhoto: function() {
	        var videoElement = document.querySelector("video");
	        if (videoElement.srcObject) {
				var desiredWidth = 1000; 
		        var desiredHeight = 1000;
	            var canvas = document.createElement("canvas");
				canvas.width = desiredWidth;
		        canvas.height = desiredHeight;
	            var context = canvas.getContext("2d");
	            context.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
 
	           var photoData = canvas.toDataURL("image/jpeg");
			   var byteString = atob(photoData.split(",")[1]);
		       var mimeString = photoData.split(",")[0].split(":")[1].split(";")[0];
		       var ab = new ArrayBuffer(byteString.length);
		       var ia = new Uint8Array(ab);
		       for (var i = 0; i < byteString.length; i++) {
		           ia[i] = byteString.charCodeAt(i);
		       }
		       var blob = new Blob([ab], {type: mimeString});
		       var files = new File([blob], "photo.jpeg", {type: "image/jpeg"});
		        return files;
	        }
			  return null;
	    },
 
	    closeWebCamAndRemoveContainer: function() {
	        if (this.videoStream) {
	            this.videoStream.getTracks().forEach(function(track) {
	                track.stop();
	            });
	        }
	        var container = this.Ext.get(this.containerId);
	         if (container) {
	             container.dom.remove();
	         }
 
	    }
	 });
    return Ext.create(Terrasoft.CameraPageMixin);
});



 

Здравствуйте Ислам!

После воспроизведения данного Вами кода, ошибка №1 не возникала (вероятно из-за разных версий продукта), но появлялась ошибка «Maximum call stack size exceeded error». Причина - обращение к AddRecordButton. Советую сделать замещение в diff на новую кнопку в FileDetailV2:

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"name": "CustomButton",
		"parentName": "Detail",
		"propertyName": "tools",
		"values": {
			"caption": "Click me",
			"itemType": Terrasoft.ViewItemType.BUTTON,
			"click": {"bindTo": "getWebCamClick"},
			"visible": true
		}
	}
]/**SCHEMA_DIFF*/

Добавление фотографий в деталь не выполнялось. Я внесла несколько изменений в ваш код, теперь функционал работает. При открытии модального окна вы можете несколько раз нажать на кнопку «Сделать фото» и после каждого клика будет добавлено новое фото. Прикрепляю обновленные методы CameraPageMixin:

takePhoto: function() {
	var videoElement = document.querySelector("video");
	if (videoElement.srcObject) {
		var desiredWidth = 1000; 
		var desiredHeight = 1000;
		var canvas = document.createElement("canvas");
		canvas.width = desiredWidth;
		canvas.height = desiredHeight;
		var context = canvas.getContext("2d");
		context.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
 
		var photoData = canvas.toDataURL("image/jpeg");
		var base64Part = photoData.split(",")[1];
		var buffer = this.base64ToArrayBuffer(base64Part);
		var mimeString = photoData.split(",")[0].split(":")[1].split(";")[0];
		var blob = new Blob([buffer], {type: mimeString});
		var files = new File([blob], "photo.jpeg", {type: "image/jpeg"});
		return files;
	}
	  return null;
},
 
base64ToArrayBuffer: function (base64) {
	var binaryString = atob(base64);
	var bytes = new Uint8Array(binaryString.length);
	for (var i = 0; i < binaryString.length; i++) {
		bytes[i] = binaryString.charCodeAt(i);
	}
	return bytes.buffer;
},

Ошибка №2 возникает из-за потери контекста. В FileDetailV2 метод onFileSelect вызывает getIsNewRecord, а getIsNewRecord отправляет сокетное сообщение GetCardState на DetailModuleV2, хотя должен его отправлять в BasePageV2. Воспроизводится, если хотя бы раз открыть контейнер до перезахода на страницу. Поймать точный момент возникновения проблемы у меня не получилось, к сожалению.

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

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

 

Сейчас написал следующий модуль: 

Ext.define("USACapturizePhotoModule", [], function() {
    Ext.define("Terrasoft.configuration.USACapturizePhotoModule", {
        extend: "Terrasoft.BaseModule",
        alternateClassName: "Terrasoft.USACapturizePhotoModule",
 
        init: function() {
            this.callParent(arguments);
        },
 
        render: function(renderTo) {
            this.callParent(arguments);
            var config = this.generateConfig();
            Ext.create(config, renderTo);
        },
 
        generateConfig: function() {
            var width = 750;
            var height = 500;
            var video;
 
            return {
                xtype: "panel",
                title: "Сделать фото клиента",
                height: height,
                width: width,
                draggable: true,
                closable: true,
                floating: true,
                layout: {
                    type: "vbox",
                    pack: "center",
                    align: "stretch"
                },
                items: [{
                    html: "<video id='video'></video>",
                    flex: 1,
                    listeners: {
                        afterrender: function() {
                            video = document.getElementById("video");
                        }
                    }
                }],
                bbar: [{
                    xtype: "button",
                    text: "Запустить камеру",
                    itemId: "startbutton",
                    enableToggle: true,
                    toggleHandler: function(btn, state) {
                        var streaming = false;
                        var stream;
                        if (state) {
                            navigator.mediaDevices.getUserMedia({ video: true, audio: false })
                                .then(function(stream) {
                                    stream = stream;
                                    video.srcObject = stream;
                                    video.play();
                                })
                                .catch(function(err) {
                                    window.console.error("An error occurred: " + err);
                                });
                            video.addEventListener("canplay", function(ev) {
                                if (!streaming) {
                                    height = video.videoHeight / (video.videoWidth / width);
                                    if (isNaN(height)) {
                                        height = width / (4 / 3);
                                    }
                                    video.setAttribute("width", width);
                                    video.setAttribute("height", height);
                                    streaming = true;
                                }
                            }, false);
                        } else {
                            video.pause();
                            video.src = "";
                            if (stream) {
                                stream.getTracks().forEach(function(track) {
                                    track.stop();
                                });
                            }
                            video.srcObject = null;
                        }
                        this.ownerCt.down("#takePhoto").setDisabled(!state);
                    }
                }, {
                    xtype: "button",
                    text: "Сделать снимок",
                    disabled: true,
                    itemId: "takePhoto",
                    handler: function() {
                        var canvas = document.createElement("canvas");
                        canvas.width = width;
                        canvas.height = height;
                        var context = canvas.getContext("2d");
                        context.drawImage(video, 0, 0, width, height);
 
                        var imageSrc = canvas.toDataURL("image/png");
                        Terrasoft.utils.log(imageSrc);
                        canvas = null;
                    }
                }]
            };
        }
    });
 
    return Terrasoft.USACapturizePhotoModule;
});

 

Нравится

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

Сделал в виде миксина: 

define("CameraPageMixin", [], function() { 
    Ext.define("Terrasoft.configuration.mixins.CameraPageMixin", {
        alternateClassName: "Terrasoft.CameraPageMixin",
 
		afterRender: function() {
            this.callParent(arguments);
            this.webcamStarted = false;
        },
 
	    videoWidth: 500,
	    videoHeight: 380,
	    videoStream: null,
	    containerId: "WebCamModuleContainer",
	    photoContainerId: "PhotoModuleContainer",
 
	    openWebCamClick: function() {
	           try {
	               var videoElement = document.createElement("video");
	               videoElement.setAttribute("autoplay", "true");
	               videoElement.width = this.videoWidth;
	               videoElement.height = this.videoHeight;
 
	               navigator.mediaDevices.getUserMedia({ video: true })
	                   .then(function(stream) {
	                       videoElement.srcObject = stream;
	                       this.videoStream = stream;
 
	                     var container = this.Ext.get(this.containerId);
	                     if (container) {
	                          container.dom.appendChild(videoElement);
	                          this.webcamStarted = true;
	                      } else {
	                          window.console.error("Ошибка: элемент с идентификатором " 
	                          + this.containerId + " не найден в DOM.");
	                }
	                   }.bind(this))
	                   .catch(function(error) {
	                       window.console.error("Ошибка при получении доступа к веб-камере:", error);
	                   }); 
	           } catch (e) {
	                 window.console.error("Произошла ошибка при инициализации веб-камеры:", e);
	           }
	    },
 
	    takePhoto: function() {
	        var videoElement = document.querySelector("video");
	        if (videoElement.srcObject) {
	            var canvas = document.createElement("canvas");
	            canvas.width = this.videoWidth;
	            canvas.height = this.videoHeight;
	            var context = canvas.getContext("2d");
	            context.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
 
	            var photoData = canvas.toDataURL("image/png");
 
	            this.closeWebCamAndRemoveContainer();
	            this.showModalWindow();
 
	        }
	    },
	    closeWebCamAndRemoveContainer: function() {
	        if (this.videoStream) {
	            this.videoStream.getTracks().forEach(function(track) {
	                track.stop();
	            });
	        }
	        var container = this.Ext.get(this.containerId);
	         if (container) {
	             container.dom.remove();
	         }
 
	    },
	    showModalWindow: function() {
	        this.showConfirmationDialog("Не пройдена по техническим причинам?", 
	            this.showModalCallback, 
	            [this.Terrasoft.MessageBoxButtons.NO.returnCode, this.Terrasoft.MessageBoxButtons.YES.returnCode], 
	            null);
	    },
 
	    showModalCallback: function(returnCode) {
	        if (returnCode === this.Terrasoft.MessageBoxButtons.YES.returnCode) {
	            Terrasoft.showInformation("Нажата кнопка ДА");
	        } else if (returnCode === this.Terrasoft.MessageBoxButtons.NO.returnCode) {
	            Terrasoft.showInformation("Нажата кнопка НЕТ");
	        }
	    }
	 });
    return Ext.create(Terrasoft.CameraPageMixin);
});

 

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

Добавил плитку смс сообщения фильтр по этой статье, сама надпись фильтра появляется,

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

но

1. Не могу изменить иконку.

2. Не работает фильтр при нажатии, получаю ошибку(рис1)Изображение удалено.

define("SmsMessageTimelineItemView", ["BaseTimelineItemView"], function() {
 
	Ext.define("Terrasoft.configuration.SmsMessageTimelineItemView", {
		extend: "Terrasoft.BaseTimelineItemView",
		alternateClassName: "Terrasoft.SmsMessageTimelineItemView",
 
		getResultMessageViewConfig: function() {
			return {
				"name": "Message",
				"itemType": Terrasoft.ViewItemType.LABEL,
				"caption": "Message",
				"visible": {
					"bindTo": "Message",
					"bindConfig": {
						"converter": "isNotEmptyValue"
					}
				},
				"classes": {
					"labelClass": ["timeline-text-normal"]
				}
			};
		},
        getMessageViewConfig: function() {
            var config = this.callParent(arguments);
            config.visible = {
                "bindTo": "IsExpanded"
            };
            return config;
        },
		getBodyViewConfig: function() {
			var bodyConfig = this.callParent(arguments);
			bodyConfig.items.unshift(this.getResultMessageViewConfig());
			return bodyConfig;
		}
 
		// endregion
 
	});
});

А вот модель 

define("SmsMessageTimelineItemViewModel", 
["SmsMessageTimelineItemViewModelResources", "BaseTimelineItemViewModel"],
    function() {
        Ext.define("Terrasoft.configuration.SmsMessageTimelineItemViewModel", {
            alternateClassName: "Terrasoft.SmsMessageTimelineItemViewModel",
            extend: "Terrasoft.BaseTimelineItemViewModel"
        });
    });

Вот Json для TimelineTileSetting:

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

А для TimelinePageSetting

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

Нравится

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

Добрый день, Ислам,

 

На скриншоте зафиксирован свал Batch запроса. Проверьте, пожалуйста, ответ, который приходит на этот запрос (в нем может быть стэк, который может подсказать причины ошибки) и тело запроса. Кроме того, ошибка и описание могут залогироваться в Error.log файл в логах приложения, проверьте, пожалуйста, еще и его.

 

С уважением,

Ангелина

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

Как отвязать модуль !css - этот css модуль был удалён из проекта, но при замещение страница пытается его вытянуть и получаю ошибку: fused to apply style from 'http://locahost:89/0/ConnectedDetailCSS.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled. Изображение удалено.

Я заместил страницу, но не могу найти отвязки модуля css!ConnectedDeatailCSS

Нравится

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

Добрый день!

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

1) Убрать зависимость в схеме, где она была объявлена

2) Создать пустой модуль ConnectedDetailCSS

Добрый день!

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

1) Убрать зависимость в схеме, где она была объявлена

2) Создать пустой модуль ConnectedDetailCSS

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

Доброго времени суток, я не могу настроить elasticsearch по этим настройкам я не могу найти  Morphological Analysis Plugin for ElasticSearch как я понял bintray закрыли и по ссылке тоже не получилось собрать russianmorphology. 



Подскажите как мне теперь установить этот плагин для ElasticSearch?

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

Нравится

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

Добрый день!

 

Рекомендуем подключить новую версию глобального поиска доступную по ссылке 

https://academy.creatio.com/docs/user/on_site_deployment/containerized_components/global_search_shortcut/global_search

она обратно поддерживается для вашей версии.

Указанная вами версия не поддерживается.

 

С уважением, 

Антон

Добрый день!

 

Рекомендуем подключить новую версию глобального поиска доступную по ссылке 

https://academy.creatio.com/docs/user/on_site_deployment/containerized_components/global_search_shortcut/global_search

она обратно поддерживается для вашей версии.

Указанная вами версия не поддерживается.

 

С уважением, 

Антон

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

Добрый день

 

Подскажите пожалуйста как активировать права на запуск прав доступа?

 

С правами  администратора не могу выдать доступ на просмотр записей. Выходит сообщение (скрин)

Пытаюсь на выделенные записи с реестра раздела, через действия Настроить права доступа

 

 Помогите плз разобраться

Спасибо

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

Нравится

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

Алевтина, добрый день!

 

Судя по ошибке, у вас деактивирован процесс переопределения прав.

Откройте Библиотеку бизнес-процессов, найдите необходимый процесс и активируйте его.

Kalymbet Anastasia,

Добрый день!

 

Благодарю)

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

Коллеги, добрый день

 

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

Документооборот, маршрут согласования. 

Когда на согласующего падает задача, то планированная дата завершения задачи не соответствует установленному сроку (в часах)

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

 

Может кто нибудь сталкивался с такой проблемой

Заранее спасибо!

Нравится

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

Алевтина, добрый день!

 

Рекомендуем создать обращение для нашей команды поддержки, написав письмо на адрес support@creatio.com.

Так мы сможем получить больше информации и провести полный анализ Вашей проблемы.

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

Добрый день community. Подскажите, кто как учился работать  ExtJS и потом как вы адаптировали свои знания с работой Terrasoft?  Есть проблема роста в разработке. Я и раньше задавал вопрос тут , спасибо Вам многие помогли подсказали и даже пару месяцев поддерживали в вопросах связанных с разработкой. Сейчас лучше, чем в начале пути, но у меня снова руки опушены, чувствую что за год, очень мало знаю. Я начал работать с хорошим знанием Js, но без знания ExtJs, может проблема в этом? Резюмирую свой вопрос:

1) Как мне учить ExtJs (документация ну такое себе)

2) И как применить это в Terrasoft (как понять структуру, я так понял Terrasoft переписал под себя для удобства библиотеку?) 



Спасибо.

Нравится

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

Ислам Ибрагимжанов,

Сейчас с документацией дело получше, чем когда я начинал. Сам обучался на реальных задачах, никаких курсов. Значительная часть кода, не относящаяся к ядру клиентскому никак не минифицирована, не обфусцирована, так что можно пытаться найти уже реализованную аналогичную функциональность. У меня на старте были поверхностные знания JavaScript, до этого несколько лет на C# программировал, так что с серверной частью проще было. Вот с мобильным приложением по-прежнему туго с документацией, очень мало примеров, много подводных камней, некоторые простые доработки для веба в мобилке довольно неочевидным образом делаются, чего-то вообще нет. 

Несколько лет разрабатываю под эту CRM, и могу сказать, что какие-то глубокие познания в ExtJs почти не нужны. На клиентской части, кроме Ext,create, Ext.String.format, Ext.getCmp, ну и this.callParent вряд ли что-то ещё понадобится. Очень редко требуется какое-то более глубокое взаимодействие непосредственно с самим Ext, большинство потребностей покрывается инструментарием, построенном ТС поверх всего этого.

Для мобильного приложения чуть сложнее. Часто приходится определять новые классы через Ext, нужно понимать разницу между override (расширяет существующий класс) и extend (новый класс-наследник). Но тут материала на день изучения. 

Лучше сфокусироваться на изучении инструментария ТС. Сам Ext подучивать по мере возникновения потребностей 

Но вообще, Террасофт переходит на Angular. Насколько нужно в нём разбираться нужно не могу сказать, т.к. не приходилось пока работать с ним.

А что касается проблем с английским, то лучше его подтянуть хотя бы до уровня, чтобы можно было читать документацию, лишним точно не будет. И далеко не только для Ext или Angular

Бершеда Д. Н., 

Благодарю, а сам ТС вам хватило, что есть в документации? И как вы изучили если можно узнать ТС? Проходили их курсы? 



P.S С английский как раз борюсь, думаю в этом году закрою эту проблему.

Ислам Ибрагимжанов,

Сейчас с документацией дело получше, чем когда я начинал. Сам обучался на реальных задачах, никаких курсов. Значительная часть кода, не относящаяся к ядру клиентскому никак не минифицирована, не обфусцирована, так что можно пытаться найти уже реализованную аналогичную функциональность. У меня на старте были поверхностные знания JavaScript, до этого несколько лет на C# программировал, так что с серверной частью проще было. Вот с мобильным приложением по-прежнему туго с документацией, очень мало примеров, много подводных камней, некоторые простые доработки для веба в мобилке довольно неочевидным образом делаются, чего-то вообще нет. 

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

Добрый день мне нужно в созданном мной модуле сделать функцию для bind к кнопке "Добавить". Я делаю расширение от LookupPage. 



Вот весь код: 

 

define("UsrAccountBaseLookupModule", [
        "LookupPage",
        "LookupPageViewGenerator",
        "LookupUtilitiesV2",
        "css!LookupPageCSS"
    ],
    function(LookupPage, LookupPageViewGenerator) {
        return Ext.define("Terrasoft.configuration.UsrAccountBaseLookupModule", {
            alternateClassName: "Terrasoft.UsrAccountBaseLookupModule",
            extend: "Terrasoft.LookupPage",
            render: function() {
                this.callParent(arguments);
                // if()
                this.myRenderLookupView(this.lookupInfo.entitySchema, this.lookupInfo.gridProfile);
            },
            renderLookupView: Terrasoft.emptyFn,
            myRenderLookupView: function(schema, profile){
                var config = this.getLookupConfig(schema, profile);
                var topPanelConfig = LookupPageViewGenerator.generateFixed(config);
                var buttonsConfig;
                _.some(topPanelConfig.items, function(target) {
                    if (target.id === "selectionControlsContainerLookupPage") {
                        _.some(target, function(target) {
                            if (Array.isArray(target)) {
                                buttonsConfig = target;
                                return true;
                            }
                        });
                        return true;
                    }
                });
                _.some(buttonsConfig, function(target) {
                    if (target.caption === "Добавить") {
                        target.enabled = {bindTo:"getViewModelValues"};
                        return true;
                    }
                });
                this.renderLookupControls(config, topPanelConfig);
            },
            getViewModelValues: function() {
                if(Terrasoft.SysValue.CURRENT_USER.value !== "8239c02a-1376-4e23-82f5-d5b142ac16f4") {
                    window.console.log(Terrasoft.SysValue.CURRENT_USER.value !== 
                        "8239c02a-1376-4e23-82f5-d5b142ac16f4");
                    return false;
 
              } else {
                   return this.render();
 
             }
                var values = {
                    canEdit: true,
                };
                return values;
            },
            generateViewModel: function() {
                var viewModel = this.callParent(arguments);
                this.applyViewModelMethods(viewModel);
                return viewModel;
            },
 
            applyViewModelMethods: function(viewModel, scope) {
                Ext.override(viewModel, {
                    onSearchButtonClick: function() {
                        var parentMethod = this.getParentMethod(this, arguments);
 
                        Terrasoft.chain(
                            function(next) {
                                 // Вот тут нужно сделать вызов функции чтобы кнопка Добавить стала активной
                                this.Ext.callback(scope, this.getViewModelValues);
                                next();
                            },
                            parentMethod,
                            this
                        );
                    }
                });
            },
        });
    });

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



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

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

Нравится

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

Добрый день!

Рекомендую сперва проверить работает ли данное замещение кнопки "Добавить". Для этого вместо функции используйте простое значение false. Уже с этого можно делать выводы и искать причину.

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