Коллеги подскажите пожалуйста есть необходимость в окружение добавить пользовательский компонент и получать к нему доступ через Terrasoft.{пользовательский компонент}. 

Трудность заключается в том, что данные компонента находятся в БД и на данный момент получаются с помощью конфигурационного сервиса. Сам компонент заполняется  в callback функции. То есть доступен не сразу, а только после получения ответа от сервиса.

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

Нравится

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

Егор, а в чём отличие Вашего компонента от какой-то стандартной функциональности, например, AcademyUtilities? Там тоже в функции getAcademyUrlFromLookup получают данные из базы по SQ, что происходит не мгновенно.

/**
 * Gets academy URL from lookup.
 * @private
 * @param {Object} config Configuration object.
 * @param {Function} config.callback Callback function.
 */
getAcademyUrlFromLookup: function(config) {
	var cacheItemName = "AcademyURL_" + Terrasoft.currentUserCultureName;
	var getLmsUrlQuery = Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "AcademyURL",
		rowCount: 1,
		serverESQCacheParameters: {
			cacheLevel: Terrasoft.ESQServerCacheLevels.WORKSPACE,
			cacheGroup: "AcademyUtilities",
			cacheItemName: cacheItemName
		}
	});
	getLmsUrlQuery.clientESQCacheParameters = {cacheItemName: cacheItemName};
	getLmsUrlQuery.addColumn("Description", "Description");
	getLmsUrlQuery.getEntityCollection(function(response) {
		var collection = response.collection;
		var academyRootUrl = "";
		if (collection.getCount()) {
			academyRootUrl = collection.first().get("Description");
		}
		Ext.callback(config.callback, this, [academyRootUrl]);
	}, this);
}

Или под компонентом имеете в виду что-то другое, вроде виджета в итогах или iframe на главной странице?

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

Чтобы посмотреть в базе у каких бизнес процессов установлен флаг "Включена трассировка" нужно выполнить следующий запрос:

select ss.Name, ss.Caption
  from SysSchemaUserProperty ssup inner join SysSchema ss
				on ss.Id=ssup.SysSchemaId
		inner join SysPackage sp
			on sp.Id=ss.SysPackageId
			and sp.Name='Здесь имя пользовательского пакета'
 where ssup.Name='IsTracing'
   and ssup.Value='true'

 

Нравится

Поделиться

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

Дополнил ваш код. Хорошая идея.

-- БП. Просмотр включенной трассировки всех пакетов
select 
	 [SysPackage].[Name] [SysPackage_Name]
	,[SysSchema].[Name] [SysSchema_Name]
	,[SysSchema].[Caption] [SysSchema_Caption]
	,[SysSchema].[ModifiedOn] [SysSchema_ModifiedOn]
	,[Contact].[Name] [Contact_Name]
from [SysSchemaUserProperty]
inner join [SysSchema] on [SysSchemaUserProperty].[SysSchemaId]=[SysSchema].[Id]
inner join [SysPackage] on [SysSchema].[SysPackageId]=[SysPackage].[Id]
inner join [Contact] on [SysSchema].[ModifiedById]=[Contact].[Id]
where SysSchemaUserProperty.[Name]='IsTracing' and SysSchemaUserProperty.[Value]='true'
order by [SysPackage].[Name], [SysSchema].[Name]

 

Руслан, спасибо за информацию.

Недавно обсуждали похожее, там приводил примеры, как смотреть этот параметр в таблице SysProcessData, работать с ним путём вызова веб-сервиса и JS-функции для работы с ним.

Спасибо всем за вклад в развитие базы знаний и сообщества.

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

Установил дополнение Advanced excel reports for Creatio на on-site версии 7.16.4.1731.

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

1. При формировании созданного и настроенного отчета зачастую возникают следующие ошибки:

        а) Для ExecuteReader нужно открытое и доступное подключение Connection. Подключение закрыто.

        б) Недопустимая попытка вызвать Read при закрытом устройстве чтения.

        в) Недопустимая операция. Подключение закрыто.

При повторных попытках сформировать процесс проходит успешно (иногда со второй попытки, иногда с 3,4, 5).

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

3. При загрузке любого файла в качестве шаблона (пробовал новосозданный пустой, без форматирования) скачивается копия файла шаблона, без каких-либо данных из системы.

Нравится

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

Проблема известна (уже поднималась неоднократно) , разработчики в курсе, все ждут. Так же висят открытые обращения в ТП

Например: https://community.terrasoft.ru/questions/problemy-funkcionala-v-dopolne…

Хассан, добрый день!

 

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

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

Начиная с версии 7.16.4 была внедрена функциональность безопасной загрузки файлов. Относительно вопроса 3 уточните, вносили ли какие-либо изменения в настройки по безопасной загрузке файлов?

Лазоренко Ирина,

Добрый день!

По второму вопрос - выгружается до 10 записей.

По вопросу настроек безопасной загрузки файлов - из системной настройки “Список запрещенных расширений” были убраны apk и jar, других изменений не было.

Хассан, добрый день!

 

спасибо за уточнения. Указанные вопросы также взяли в работу.

Хассан, добрый день!

 

По поводу ошибки "ExecuteReader requires an open and available Connection. The connection's current state is open." получила текущее обходное решение - отключить настройку в web.config "Feature-UseDisposeUserConnectionOnRequestEnd". Если ваш сайт находится в cloud, обратитесь с этим запросом в службу поддержки.

Лазоренко Ирина,

Добрый день!

в каком из 2 файлов можно отключить настройку? 

Андрей, добрый день!

с 15 ноября выйдет обновление по приложению. Отключение настройки не понадобится.

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

Исходные данные:

1. Страница редактирования продукта ( ProductBase )

2. Схема страницы "Продукты" (Пакет 1)

3. Схема страницы "Продукты" (Пакет 2)

"Пакет 2" зависит от "Пакет 1".

Вопросы:

1. Как правильно создать "3. Схема страницы "Продукты" (Пакет 2)", чтобы видеть все изменения из "2. Схема страницы "Продукты" (Пакет 1)" и из "1. Страница редактирования продукта ( ProductBase )"?

2. Как корректно изменить родителя в "3. Схема страницы "Продукты" (Пакет 2)"?

Изменение поля "Parent.UId" файла "ProductPageV2\descriptor.json" не дало нужный результат.

Нравится

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

Если у Вас зависимости " 1. Страница редактирования продукта ( ProductBase ) " -> " 2. Схема страницы "Продукты" (Пакет 1) " -> " 3. Схема страницы "Продукты" (Пакет 2) ", тогда в " 3. Схема страницы "Продукты" (Пакет 2) " будете видеть все изменения пакетов выше.

2. Изменить родителя лучше через графический интерфейс конфигуратотра, зайдите в модуль и там измените родительский модуль.

Если у Вас зависимости " 1. Страница редактирования продукта ( ProductBase ) " -> " 2. Схема страницы "Продукты" (Пакет 1) " -> " 3. Схема страницы "Продукты" (Пакет 2) ", тогда в " 3. Схема страницы "Продукты" (Пакет 2) " будете видеть все изменения пакетов выше.

2. Изменить родителя лучше через графический интерфейс конфигуратотра, зайдите в модуль и там измените родительский модуль.

Александр Тыра,

Нет доступа к редактированию поля "Родительский объект".

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

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

Добрый день!

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

Спасибо!

Нравится

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

1. Дизайнер системы - Библиотека процессов - Выбрать БП - Свойства - Включить "Включена трассировка"

2. Дизайнер системы -Журнал процессов - Выбрать БП - Открыть - На детали "Элементы процесса" добавить колонку "Создал" - На выбранном шаге нажать кнопку "Показать данные трассировки"

1. Дизайнер системы - Библиотека процессов - Выбрать БП - Свойства - Включить "Включена трассировка"

2. Дизайнер системы -Журнал процессов - Выбрать БП - Открыть - На детали "Элементы процесса" добавить колонку "Создал" - На выбранном шаге нажать кнопку "Показать данные трассировки"

Спасибо, Дамиан! Действительно, оказалось все проще некуда.

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

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

Появилась необходимость выкачивать отчет по лиду в формате Excel по определенному шаблону (скриншот 1), решил воспользоваться дополнением https://marketplace.terrasoft.ru/app/advanced-excel-reports-creatio

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

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

Нравится

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

Илья, 

 

дополнение https://marketplace.terrasoft.ru/app/advanced-excel-reports-creatio не предоставляет возможности настраивать отчеты формата выше. Скорее будет более полезно для формирования выгрузок данных.

 

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

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

Иногда в одном бизнес процессе в базовых элементах "Читать данные" или "Изменить данные" возникает ошибка:

System.InvalidOperationException: Invalid attempt to call Read when reader is closed.

at System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)

at System.Data.SqlClient.SqlDataReader.Read()

at Terrasoft.Core.Entities.EntityCollection.LoadShallow(IDataReader dataReader, Dictionary`2 columnMap, Boolean needClear)

at Terrasoft.Core.Entities.EntityCollection.GetEntitySchemaEntityCollection(UserConnection userConnection, IDataReader dataReader)

at Terrasoft.Core.Entities.EntityCollection.GetEntityCollection(UserConnection userConnection)

at Terrasoft.Core.Process.Configuration.ReadDataUserTask.InternalExecute(ProcessExecutingContext context)

at Terrasoft.Core.Process.ProcessActivity.ExecuteElement(ProcessExecutingContext context)

at Terrasoft.Core.Process.ProcessActivity.Execute(ProcessExecutingContext context)



При нажатие Выполнить элемент процесс нормально идет дальше. Происходит ошибка не всегда, иногда весь процесс нормально идет.

Нравится

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

Странно. Выглядит как исключение в стандартном элементе чтения данных. Воспроизводится всегда при чтении или изменении на одном и том же объекте?

Может, в структуре Вашего БП дело? Если сделать тестовый БП, который состоит только из такого же чтения и запускать его, тоже воспроизводится?

В том объекте нет никаких самодельных встроенных БП?

 

В одном и том же БП на разных объектах (заявка и договор). Воспроизводиться только на среде клиента и только в одном БП.

Возможно, дело в конкретной структуре построенного Вами процесса. Например, если одна ветвь приводит к завершению процесса, а в другой в это время как раз выполнялся этот элемент работы с данными. И в обоих ветвях использовался один Reader, через который идёт работа с базой, в той ветви, которая завершилась раньше, его закрыли. Скорее всего, в скрипте.

Несколько раз такое наблюдалось, но не было порядка воспроизведения на стандартных объектах. Если есть возможность построить такой процесс, покажите или вышлите его схему и текст элементов-скриптов. Или обратитесь в поддержку, предоставив доступ к системе.

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

В посте описана не плохая идея как предотвратить переход на стадию не выбрав причину, или какие либо условие https://community.terrasoft.ru/questions/pokazat-dialog-dlya-podtverzhdeniya-statusa-otmena-v-dcm-razdela-keys#comment-83766 , но к сожалению не описано как именно это выполнить в "save" не получив рекурсию вечную. К автору поста и ответившему на него так и не удалось достучаться.

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

Нравится

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

CheckConfirmationMessage управляет проверять - или нет

 

if (confirmationMessage && this.get("CheckConfirmationMessage")) {
		this.set("CheckConfirmationMessage", false);
		var scopeArguments = arguments;
		this.showConfirmationDialog(confirmationMessage.message, function(result) {
				if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
					this.save(scopeArguments);
				} else {
					this.onDiscardChangesClick();
				}
		}, ["Yes", "No"]);
	} else {
    	this.callParent(arguments);
}

 

 

Владимир Соколов,

 

а как быть с такой комбинацией?

attributes: {
	"CheckConfirmationMessage": {
		dataValueType: Terrasoft.DataValueType.BOOLEAN,
		value: true
	}
},
 
methods: {
	eaqRequestReason: function() {
		var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
			rootSchemaName: "KtBadReasonEndRequest"
		});
		esq.addColumn("Id");
		esq.addColumn("Name");
		var requestInServiceFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
			"KtRequestInService", this.get("KtRequestInService").value);
		var stageFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
			"KtRequestStage", this.get("KtStage").value);
		var recordInactiveFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
				"RecordInactive", false);
		esq.filters.add("requestInServiceFilter", requestInServiceFilter);
		esq.filters.add("stageFilter", stageFilter);
		esq.filters.add("recordInactiveFilter", recordInactiveFilter);
		return esq;
	},
	save: function() {
		var scopeArguments = arguments;
		var esq = this.eaqRequestReason();
		esq.getEntityCollection(function (request) {
			if (request && request.success) {
				var requestLength = request.collection.collection.length;
				if (requestLength > 0 && this.get("CheckConfirmationMessage")) {
					this.set("CheckConfirmationMessage", false);
					this.showConfirmationDialog(resources.localizableStrings.DisqualifyReason, function(result) {
						if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
							this.save(scopeArguments);
						} else {
							this.onDiscardChangesClick();
						}
					}, ["Yes", "No"]);
				} else {
					this.callParent(scopeArguments);
					this.set("CheckConfirmationMessage", true);
				}
			}
		}, this);
	}
}

 

Тут save вроде как с переданным скоупом передается, но выполниться не может

Александр, что значит, «не может выполниться»? Если в функции отладчик поставить, туда заходит?

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

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

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

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

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

Нравится

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

Есть одна неочевидная фича. Если добавить в раздел справочники запись, указав в поле "Объект" ваш объект, а в "Названии" то что вы хотите видеть в справочных окнах, то после перезахода в систему заголовки всех справочников этого объекта поменяются) 

Есть одна неочевидная фича. Если добавить в раздел справочники запись, указав в поле "Объект" ваш объект, а в "Названии" то что вы хотите видеть в справочных окнах, то после перезахода в систему заголовки всех справочников этого объекта поменяются) 

Дмитрий А.,

а если таблица не справочник, и в справочники ее не добавлять?

Александр, попробуйте сделать как в SupervisorSingleWindowPageV2, там тоже меняют этот заголовок окна выбора:

//LookupPrefixCaption = "Выбор: ";
 
/**
 * @inheritdoc BasePageV2#getLookupPageConfig
 * @overridden
 */
getLookupPageConfig: function(args, columnName) {
	var config = this.callParent(arguments);
	var schemaColumn = this.getColumnByName(columnName);
	if (!schemaColumn) {
		return config;
	}
	var prefixCaption = resources.localizableStrings.LookupPrefixCaption;
	switch (columnName) {
		case "QueueEntitySchema":
		case "BusinessProcessSchema":
			config.captionLookup = prefixCaption + schemaColumn.caption;
			break;
		default:
			break;
	}
	return config;
},

 

Александр Тыра,

Для любого объекта в системе можно создать справочное представление. В вашем примере с продажами - точно можно. Добавление справочника в раздел "справочники" - возможность открыть записи объекта в списочном представлении с возможностью редактирования и на сам раздел/объект никак не повлияет.

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

Добрый день.

 

У нас есть раздел "Заказы" с несколькими страницами.

Нужно для определенной страницы скрыть поле.

 

Как это сделать?

Нравится

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

Заходите в мастер раздела Заказы, выбираете страницу на которой надо скрыть поле, нажимаете редактировать. Откроется дизайнер страниц и удаляете его со страницы. Или что то не так понял в постановке вопроса?

Заходите в мастер раздела Заказы, выбираете страницу на которой надо скрыть поле, нажимаете редактировать. Откроется дизайнер страниц и удаляете его со страницы. Или что то не так понял в постановке вопроса?

Алексей Следь, и потом я могу его снова восстановить, если понадобится?

Койкова Ольга,

Да, точно так же заходите и добавляете. Но если надо сделать видимость по условию, то лучше настроить бизнес-правило.

Спасибо большое! Как-то не подумала про это. Сразу в коде пошла искать.

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