При большой нагрузке и большом количестве вызываемых БП (свыше 25000 экземпляров в сутки) начинается их отложенное выполнение. Все БП работают не по расписанию. Очередь Quartz пустая. В журнале процессов сразу появляется запись, когда БП инициируется. Но первый шаг БП выполняется с задержкой в 1+ часов. Пиковая загрузка ЦП приложения не превышает 60%. Загрузка ОЗУ 25%. Не знаете в какой ресурс упирается приложение?

Нравится

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

Добрый день!

Как вы определяете, что очередь Quartz  пуста. Правильно ли я понимаю что записей в таблице QRTZ_FIRED_TRIGGERS нет?
Рекомендую просмотреть также порядок запусков задач планировщика это позволить прояснить алгоритм выполнения задач:
 

declare @timezoneOffsetHours float = 3.0; --set time zone offset here

declare @timezoneOffsetTicks float = 10000000.0 * 60.0 * 60.0 *

@timezoneOffsetHours;

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT

t.[SCHED_NAME],

t.[JOB_NAME],

t.[JOB_GROUP],

t.[TRIGGER_NAME],

t.[TRIGGER_GROUP],

CAST(([NEXT_FIRE_TIME] + @timezoneOffsetTicks)/864000000000.0 - 693595.0 AS

DATETIME) as [NEXT_FIRE_TIME],

CAST(([PREV_FIRE_TIME] + @timezoneOffsetTicks)/864000000000.0 - 693595.0 AS

DATETIME) as [PREV_FIRE_TIME],

([NEXT_FIRE_TIME] - [PREV_FIRE_TIME]) / 600000000.0 [Last repeat interval, min],

t.[TRIGGER_STATE],

t.[TRIGGER_TYPE],

CAST(([START_TIME] + @timezoneOffsetTicks)/864000000000.0 - 693595.0 AS DATETIME)

as [START_TIME],

t.[MISFIRE_INSTR],

st.[REPEAT_COUNT],

st.[REPEAT_INTERVAL] / 1000 / 60 as [REPEAT_INTERVAL, min],

spt.[INT_PROP_1] as [REPEAT_INTERVAL, min],

ct.[CRON_EXPRESSION]

FROM [QRTZ_TRIGGERS] t

left join [QRTZ_SIMPLE_TRIGGERS] st on t.[SCHED_NAME] = st.[SCHED_NAME] and t.

[TRIGGER_NAME] = st.[TRIGGER_NAME] and t.[TRIGGER_GROUP] = st.[TRIGGER_GROUP]

left join [QRTZ_CRON_TRIGGERS] ct on t.[SCHED_NAME] = ct.[SCHED_NAME] and t.

[TRIGGER_NAME] = ct.[TRIGGER_NAME] and t.[TRIGGER_GROUP] = ct.[TRIGGER_GROUP]

left join [QRTZ_SIMPROP_TRIGGERS] spt on t.[SCHED_NAME] = spt.[SCHED_NAME] and t.

[TRIGGER_NAME] = spt.[TRIGGER_NAME] and t.[TRIGGER_GROUP] = spt.[TRIGGER_GROUP]

ORDER BY t.[NEXT_FIRE_TIME] ASC, t.[PRIORITY] DESC

 

Да, в таблицах QRTZ_... 35 записей. Там только БП, которые по расписанию работают и системные процессы, вроде синхронизации с LDAP, EL и т.д. Все остальные БП, которые отрабатывают с задержкой - это БП, в основном, вызываемые с помощью ProcessModuleUtilities из клиентского кода. Запись в Журнале процессов появляется сразу после вызова БП, но сами элементы начинают выполняться спустя некоторое время. От нескольких минут до нескольких часов, в зависимости от того, насколько загружена система.

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

Я пытался с помощью new Select найти значение и сравнить его со строкой, но столкнулся с 2 проблемами.

- Не удается преобразовать тип, даже если я его получил ( я пробовал ExecuteScalar).
- Ошибка преобразования типа, если нет найденого значения.

Как мне реализовать поиск определенного значения в таблице, его получение, проверку, существует ли этой значение и потом получить строку как результат (значение в таблице тоже хранится как строка)

Нравится

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

Артем, добрый день!
Для проверки наличия значений вы можете использовать всё тотже dataReader, вот пример с использованием ExecuteScalar:

var result = "";
bool hasRecord = false;
var select = new Select(UserConnection)
    .Column("CountryId")
    .From("City")
    .Where("Name").IsEqual(Column.Parameter("Sacramento")) as Select;
using (DBExecutor executor = UserConnection.EnsureDBConnection()) {
	using (IDataReader dataReader = select.ExecuteReader(executor)) {
 		while (dataReader.Read()) {
    		hasRecord  = true;
  		}
		if (hasRecord){
			result = select.ExecuteScalar<Guid>().ToString();
		}
 	}
}

 

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

Добрый день!

Хочу отобразить коллекцию в деталь, без сохранения в бд.
Есть коллекция Collection состоящая из полей из разных обьектов, мне удалось ее заполнить данными, но столкнулся с проблемой при заполнении через this.getGridData(), который переопределил, при вызове деталь не заполняется данными.

entitySchemaName: "AllParentImplementationsByService" - обьект с проставленным Поведение->виртуальный, думал это поможет но нет

Как корректно сделать вставку этой коллекции в GridData детали?

Предоставляю мою схему детали :

define("AllParentImplementationsByService_Detail", [
	"ConfigurationGrid",
	"ConfigurationGridGenerator",
	"ConfigurationGridUtilities",
	"ProcessModuleUtilities"
],
	function (
		ProcessModuleUtilities
	) {
		return {
			entitySchemaName: "AllParentImplementationsByService",
			modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
			dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
			mixins: {
				ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities",           	
			},
			businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
			attributes: {
				IsGridEmpty: {
					dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
					value: true
				},
				/**
				* Grid data collection.
				* @type {Terrasoft.BaseViewModelCollection}
				*/
				Collection: {
					dataValueType: Terrasoft.DataValueType.COLLECTION,
					value: this.Ext.create("Terrasoft.BaseViewModelCollection")
				},
				CaseId: {
					dataValueType: Terrasoft.DataValueType.GUID,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "Id"
				},
				CaseNumber: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "CaseNumber" // Номер
				},
				CaseSymptoms: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "CaseSymptoms" //Описание
				},
				TcName: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "TcName" // Тех.карта процесса
				},
				AccountAddress: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "AccountAddress" // Адрес контрагента
				},
				CasereatedOn: {
					dataValueType: Terrasoft.DataValueType.DATE_TIME,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "CasereatedOn" // Дата регистраци
				}
			},
			messages: {},
			details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
			methods: {
				init: function () {
					this.callParent(arguments);
					this.callAllParentImplementationsByServiceProvisionService();
				},
 
				onEntityInitialized: function () {
					this.callParent(arguments);
				},
 
				callAllParentImplementationsByServiceProvisionService: function () {
					this.showBodyMask({
						caption: "callAllParentImplementationsByServiceProvisionService"
					});
					let config = this.getAllParentImplementationsByServiceProvisionServiceConfig();
					this.callService(config, this.allParentImplementationsByServiceProvisionServiceHandler, this);
				},
 
				getAllParentImplementationsByServiceProvisionServiceConfig: function () {
					return {
						serviceName: "AllParentImplementationsByServiceProvisionService",
						methodName: "GetAllParentImplementationsByServiceProvision",
						timeout: 300000,
						data: {
							Id: this.$MasterRecordId
						}
					};
				},
 
				allParentImplementationsByServiceProvisionServiceHandler: function (response) {
					this.hideBodyMask();
 
					var result = JSON.parse(response);
					var resultCollection = Ext.create("Terrasoft.BaseViewModelCollection");
 
					for (var i = 0; i < result.length; i++) {
						if (!result[i].ExeptionMsg) {
                          	const casereatedOnStr = result[i].CasereatedOn;
							const timestamp = parseInt(casereatedOnStr.substring(
                              casereatedOnStr.indexOf('(') + 1, casereatedOnStr.indexOf(')')));
							const date = new Date(timestamp);
							const options = { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute:'2-digit' };
							const formattedDate = date.toLocaleString(options);	
 
							var resultViewModel = Ext.create("Terrasoft.BaseViewModel", {
								values: {
									"CaseId": result[i].CaseId,
									"Number": result[i].CaseNumber,
									"Symptoms": result[i].CaseSymptoms,
									"Name": result[i].TcName,
									"AccountAddress": result[i].AccountAddress,
									"CasereatedOn" : formattedDate
								}
							});
							resultCollection.add(resultViewModel);
						} else {
                          	const casereatedOnStr = result[i].CasereatedOn;
							const timestamp = parseInt(casereatedOnStr.substring(
                              casereatedOnStr.indexOf('(') + 1, casereatedOnStr.indexOf(')')));
							const date = new Date(timestamp);
							const options = { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute:'2-digit' };
							const formattedDate = date.toLocaleString(options);
 
							var resultErrViewModel = Ext.create("Terrasoft.BaseViewModel", {
								values: {
									"CaseId": result[i].CaseId,
									"CaseNumber": result[i].CaseNumber,
									"CaseSymptoms": result[i].CaseSymptoms,
									"TcName": result[i].TcName,
									"AccountAddress": result[i].AccountAddress,
									"CasereatedOn": formattedDate,
									"ExeptionMsg": result[i].ExeptionMsg
								}
							});
							resultCollection.add(resultErrViewModel);
						}
					}
 
					this.set("IsGridEmpty", false);
					this.set("Collection", resultCollection);
					this.getGridData();
				},
 
				getGridData: function () {
					return this.get("Collection");
				},
 
				useVirtualRecord: function () {
					return true;
				},
				/**
				 * @inheritDoc BaseGridDetailV2#getCopyRecordMenuItem
				  * @override
				 */
				getCopyRecordMenuItem: this.Terrasoft.emptyFn,
 
				/**
				 * @inheritDoc BaseGridDetailV2#getEditRecordMenuItem
				 * @override
				 */
				getEditRecordMenuItem: this.Terrasoft.emptyFn,
 
				/**
				 * @inheritDoc BaseGridDetailV2#getDeleteRecordMenuItem
				 * @override
				 */
				getDeleteRecordMenuItem: Terrasoft.emptyFn,
 
				/**
				 * @inheritDoc BaseGridDetailV2#getAddRecordButtonVisible
				 * @override
				 */
				getAddRecordButtonVisible: function () {
					return false;
				},
 
				getAddTypedRecordButtonVisible: function () {
					return false;
				},
 
				getDetailCaption: function () {
					return this.get("Resources.Strings.AllParentImplementationsByServiceDetailLabel");
				}
			},
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "Container",
					"parentName": "Header",
					"propertyName": "items",
					"values": {
						"itemType": this.Terrasoft.ViewItemType.CONTAINER,
						"layout": { "column": 0, "row": 0, "colSpan": 24 },
						"items": []
					}
				},
				{
					"operation": "merge",
					"name": "DataGrid",
					"parentName": "Container",
					"propertyName": "items",
					"values": {
                      	//"generator": "Terrasoft.GridGenerator.generateGrid",
						"itemType": this.Terrasoft.ViewItemType.GRID,
						"type": this.Terrasoft.GridType.LISTED,
						"collection": "Collection",
						"isEmpty": { "bindTo": "IsGridEmpty" },
                      	"captionsConfig": []						
					}
				},
				{
					operation: "insert",
					name: "InfoButton",
					parentName: "ActionButtonsContainer",
					propertyName: "items",
					values: {
						click: { bindTo: "callAllParentImplementationsByServiceProvisionService" },
						itemType: this.Terrasoft.ViewItemType.BUTTON,
						style: this.Terrasoft.controls.ButtonEnums.style.GREEN,
						hint: { bindTo: "showHint" },
						caption: "Test",
					},
				},
			]/**SCHEMA_DIFF*/
		};
	});

 

Нравится

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

Добрый день.
Возможно есть смысл сделать представление?
Логику формирования записей сделать не в вебсервиме и отображение этой коллекции в детале. А сделать объект, который пометить как вьюха, и на SQL написать код, который будет формировать коллекцию. Тогда кроме как вьюхи никакого дополнительного кода не требуется, и будет работать стандартная логика детали.

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

Добрый день! 

При компиляции выпадает ошибка One or more errors occurred. Unexpected character encountered while parsing value: =. Path '', line 0, position 0. 

Менял бины, лечил копированием файлов из Terrasoft.WebApp\bin в папку WorkspaceConsole - не помогло, сейчас взял папку с бинами с рабочей среды 

Ошибка не меняется. Никак не удается понять, что нужно.  

подгрузка загрузка с файловой системы, выдачи прав не помогли

При генерации кода выпадает ошибка 

Нравится

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

Добрый день,

 

Наиболее возможными причинами проблемы являются: 

1) Пустой ParentId для модуля, который должен быть у родителя. Необходимо дополнительно развернуть коробочную БД для проверки с помощью запроса:

SELECT * FROM SysSchema
WHERE ManagerName = 'EntitySchemaManager'
AND ParentId IS NULL

 

Если набор возвращаемых значений на коробке и на сайте с проблемой отличается, то удалите такие объекты из системы (DELETE FROM SysSchema).

 

2) Пустые метаданные для объектов/схем в системе. 

 

SELECT Id, CAST (MetaData AS varchar (MAX)) FROM SysSchema
WHERE CAST (MetaData AS varchar (MAX)) = ''

 

Вы также можете посмотреть в логах приложения в файлах Common и Error log на предмет того, была ли записана дополнительная информация о генерации статики (обычно ошибка должна быть подписана там с подробностями). А также вы можете напрямую отфильтровать все схемы по фильтру "Имеет ошибку" в конфигурации:

 

и посмотрите, есть ли объекты в списке. Если да, то на объекте в "Свойствах" будет заполнено "Последнее сообщение об ошибке":

 

 

 

 

 

Добрый день,

 

Наиболее возможными причинами проблемы являются: 

1) Пустой ParentId для модуля, который должен быть у родителя. Необходимо дополнительно развернуть коробочную БД для проверки с помощью запроса:

SELECT * FROM SysSchema
WHERE ManagerName = 'EntitySchemaManager'
AND ParentId IS NULL

 

Если набор возвращаемых значений на коробке и на сайте с проблемой отличается, то удалите такие объекты из системы (DELETE FROM SysSchema).

 

2) Пустые метаданные для объектов/схем в системе. 

 

SELECT Id, CAST (MetaData AS varchar (MAX)) FROM SysSchema
WHERE CAST (MetaData AS varchar (MAX)) = ''

 

Вы также можете посмотреть в логах приложения в файлах Common и Error log на предмет того, была ли записана дополнительная информация о генерации статики (обычно ошибка должна быть подписана там с подробностями). А также вы можете напрямую отфильтровать все схемы по фильтру "Имеет ошибку" в конфигурации:

 

и посмотрите, есть ли объекты в списке. Если да, то на объекте в "Свойствах" будет заполнено "Последнее сообщение об ошибке":

 

 

 

 

 

Дякую! Питання вирішено

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

Всем привет! Нужна инструкция и скрипт для обезличивания БД Oracle. Заранее благодарен

Нравится

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

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

 

Обратитесь, пожалуйста, напрямую к команде технической поддержки, написав письмо на support@creatio.com. Чтобы мы смогли предоставить Вам нужный скрипт и соответствующую инструкцию.

 

Заранее благодарю!

С уважением, 

Анастасия

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

Добрый день!

Столкнулись с ошибкой при импорте пакета.

Решение экспортировалось в ситеме с версией >8.0.
Импортируется в Creatio Sales 7.17.


Terrasoft.Core.Packages.Exceptions.InvalidDescriptorInFileSystemException: Invalid discripter: 
Чтение свойства "Type" не поддерживается
Путь: UsrTest ---> Terrasoft.Common.InvalidObjectStateException: Чтение свойства "Type" не поддерживается
   at Terrasoft.Core.Packages.PackageFileStorage.Read(DataReader reader, Package package) 
   at Terrasoft.Core.Packages.PackageFileStorage.<LoadPackageDescriptor>b__201_0(JsonDataReader reader, Package package) 
   at Terrasoft.Core.Packages.PackageFileStorage.InitializeDescriptor[T](Action2 initializeDescriptor, String descriptorFilePath, T descriptor) 
   at Terrasoft.Core.Packages.PackageFileStorage.CreatePackageDescriptorBasedOnDirectory(String directoryPath, Action2 initializeDescriptor) 
   --- End of inner exception stack trace --- 
   --- End of inner exception stack trace --- 
   at Terrasoft.Core.AppInstallation.Packages.Operations.PackageZipOperations.ThrowIfPackageStorageItemErrorsExist(PackageStorage packageStorage) 
   at Terrasoft.Core.AppInstallation.Packages.Operations.PackageZipOperations.Load() 
   at Terrasoft.Core.AppInstallation.Packages.Backup.ZipPackageBackupManager.ComposePackages(String sourcePackagesPath, String tempFilesPath) 
   at Terrasoft.Core.AppInstallation.Packages.Backup.ZipPackageBackupManager.CreateBackup(String sourcePackagesPath, String tempFilesPath, String backupPath, String code) 
   at Terrasoft.Core.ServiceModelContract.PackageInstaller.PackageInstallerServiceInternal.<>c__DisplayClass25_0.<CreateBackup>b__0() 
   at Terrasoft.Core.ServiceModelContract.PackageInstaller.BaseInstallerServiceInternal.InvokeWithLogging(Action action) 

Это проблема внутри пакета или же про совместимость систем из которой экспортировали с в которую? Или настройки системы, в которую импортирем?
Как возможно исправить данную ошибку?

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

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

Нравится

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

Добрый день!

Не могли бы вы, пожалуйста, предоставить полный лог установки?

Добрый день!

Обновила вопрос, прикрепила файл. 

Bogdan,

Добрый день!

Обновила вопрос, прикрепила файл. 

Здравствуйте. Как решили вопрос?

Столкнулись с такой-же ошибкой.

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

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

при этом возникла проблема что элемент Считать высчитывает нормально, но использовать полученную сумму не выходит никаким образом, пробовал передавать в заявку деталь

пробовал и разные вариации Функции элемента и разные способы вычитки, менял форматы полей, нигде не срабатывает

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

В чем может проблема с вычиткой общей суммы элемента? 

 

Нравится

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

При попытке отправить email из БП, получаю ошибку.

 

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

 

Код ошибки:

Terrasoft.Mail.Sender.EmailException: Почтовый ящик не существует.

 

Код задания-сценария БП:

var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection", UserConnection));

    var activityEmailSender = new ActivityEmailSender(emailClientFactory, UserConnection);

    activityEmailSender.Send(activityId);

Нравится

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

Добрый день!

Рекомендую проверить значение в поле "Отправитель" (Sender) в созданной активности. В поле Sender должно быть указано значение зарегистрированного почтового ящика в системе с возможностью отправки писем.
Также пользователю, под которым запускается процесс, необходим доступ на отправку писем с ящика.

Добрый день!

Рекомендую проверить значение в поле "Отправитель" (Sender) в созданной активности. В поле Sender должно быть указано значение зарегистрированного почтового ящика в системе с возможностью отправки писем.
Также пользователю, под которым запускается процесс, необходим доступ на отправку писем с ящика.

Алёна Доля,

Огромное спасибо.

Проблема была в общем доступе к ящику

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

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

Сделал angular модуль по инструкции и подбросил его как файловый контент по инструкции и выполнил сборку через WokspaceConsole:

Terrasoft.Tools.WorkspaceConsole.exe -operation=BuildConfiguration -workspaceName=Default -webApplicationPath=C:\inetpub\wwwroot\BPM7172 -destinationPath=C:\inetpub\wwwroot\BPM7172\Terrasoft.WebApp -confRuntimeParentDirectory=C:\inetpub\wwwroot\BPM7172\Terrasoft.WebApp -force=true -logPath=C:\wc\log

 

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

При обновлении пакетов из файловой системы он почему-то потребовал у меня наличие пакета "Desktop" - добавил его.

Структура файлов модуля вот такая:

В descriptor.json:

{
    "bootstraps": [
        "src/js/bootstrap.js"
     ]
}

В bootstrap.js:

(function() {
    require.config({
        paths: {
            "angular-desktop-component": Terrasoft.getFileContentUrl("angular-Desktop", "src/js/angular-desktop-component.js"),
        },
		shim: {
				"angular-desktop-component": {
				deps: ["ng-core"]
			}
		}
    });
})();

Создал далее в пакете "Desktop" модуль "MIDesktopPage", добавил в него код по инструкции:

define("MIDesktopPage", ["angular-desktop-component"], function () {
	/**
	 * @inheritDoc Terrasoft.BaseModule#render
	 * @override
	 */
	return {
		methods: {
			init: function () {
				this.callParent(arguments);
			},
			render: function (renderTo) {
				this.callParent(arguments);
				const component = document.createElement("angular-desktop-component");
				component.setAttribute("id", this.id);
				renderTo.appendChild(component);
			}
		}
	};
});

Вызвал загрузку модуля по кнопке:

callbackDesktop: function (response) {
				this.sandbox.loadModule("MIDesktopPage", {
					id: "selectDataModule_id",
					renderTo: "centerPanel"
				});
			}

В итоге мне выбивает ошибку:

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

Если подбросить компонент по пути выше, то он ругается на MaximumCallStack - сомневаюсь что оно там лежать должно вообще. Прошу помочь разобраться что работает не так и почему, компиляции и прочие манипуляции не помогают. В самом модуле ангуляр ничего нету кроме черного квадрата в css.

Заранее благодарю откликнувшихся.

Нравится

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

Добрый день,

 

Нет, компонент там не должен лежать, откуда он вызывается в консоли (где 404 ошибка). Я тоже при создании компонента получал сначала это сообщение, пока не подключил компонент к модулю AccountSectionV2 с названием, как указано в параметре paths файла bootstrap.js, не обновился из файлового контента и не перезагрузил приложение (тесты проводил на сборке 8.0.2). После этого ошибка пропала и модуль стал грузиться нормально. Так по Вашим скриншотам ошибки не вижу, разве что где-то в названии затесалась какая-то буква ("о" или "а", например) на кириллице.

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

Есть раздел. Как вызвать функцию при переходе в другой раздел.

 

Нравится

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

Т.е. событие при уходе из текущего раздела

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