бизнес-процесс
веб-сервис
7.11
sales

Запускаю из сервиса БП, в котором нет никаких ожиданий.

UserConnection 	userConnection	= HttpContext.Current.Session["UserConnection"] as UserConnection;
var 			manager 		= userConnection.ProcessSchemaManager;
var 			processSchema 	= manager.GetInstanceByName("UsrProcess");
var 			process 		= processSchema.CreateProcess(userConnection);
 
process.SetPropertyValue("ExternalCall", true);
process.Execute(userConnection);

Подскажите, как дождаться завершения БП и прочитать параметры, которые мы имеем в конце выполнения?

Нравится

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

Добрый день!

Данное действие синхронно, т.е. после завершения операции process.Execute(userConnection); уже можно забирать параметры.

Забирать их следующим образом (пример):

res.Success = process.GetPropertyValue("RpSuccess") != null ? (bool)process.GetPropertyValue("RpSuccess") : false;
res.ErrorDescription = process.GetPropertyValue("RpReturnMsg") != null ? (string)process.GetPropertyValue("RpReturnMsg") : "";

 

Добрый день!

Данное действие синхронно, т.е. после завершения операции process.Execute(userConnection); уже можно забирать параметры.

Забирать их следующим образом (пример):

res.Success = process.GetPropertyValue("RpSuccess") != null ? (bool)process.GetPropertyValue("RpSuccess") : false;
res.ErrorDescription = process.GetPropertyValue("RpReturnMsg") != null ? (string)process.GetPropertyValue("RpReturnMsg") : "";

 

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

if (process.Status != ProcessStatus.Running && process.Status != ProcessStatus.Error)

or

if (process.Status == Terrasoft.Core.Process.ProcessStatus.Done)

Как выяснилось, мне нужен интерпретируемый процесс, а там все немного по-другому, а именно

UserConnection 	userConnection	= HttpContext.Current.Session["UserConnection"] as UserConnection;
var manager 		= userConnection.ProcessSchemaManager;
var processSchema 	= manager.GetInstanceByName("UsrPreCreateDealProcess");
var flowEngine 		= new Terrasoft.Core.Process.FlowEngine(userConnection);
Dictionary<string, object> parameter = new Dictionary<string, object>();
parameter.Add("CarId", car_id);
Terrasoft.Core.Process.ProcessDescriptor pd = flowEngine.RunProcess(processSchema, parameter);
if (pd.ProcessStatus == Terrasoft.Core.Process.ProcessStatus.Done)
{
	?????
}

Как вытащить параметры в конце выполнения здесь?

Есть предположение, что копать стоит в сторону FlowEngineStateService, у него есть метод FindProcessComponentSet(Guid processUId), который возвращает инфу о процессе. И там уже забрать параметры

Сидоров Александр В.,

я нашел этот класс, у него есть метод GetParameterValue, но он стабильно возвращает, что параметр не найден по данному пути и возникает (философский) вопрос, что есть Путь? Видимо, это не просто имя. Но товарищи из Террасофта не догадались описать этот момент нигде ни разу.

перепробовал всё с FlowEngineStateService - ничего не работает, написал в ТП

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

ТП ответила, что решения в 7.11 нет. Я так и знал :)) и заранее сделал обходной путь через БД. Заодно полезное для отладки логирование получилось

Показать все комментарии
Схема бизнес процессов и разработка
параметры БП
элементы БП
7.11
sales_enterprise

Добрый день! 

Процесс не удаляется из конфигуратора, возникает ошибка. При генерации приложения, та же самая ошибка

 

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

В БД ничего похожего найти не смог 

Есть какие-нибудь идеи по удалению процесса?



Сам процесс перестал открываться, выбрасывает из конфигуратора на стандартную страницу ошибки

Нравится

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

Добрый день, коллеги! Недавно начал знакомиться с системой, а сейчас встал вопрос с созданием бизнес-процесса.

Хотим создать бизнес-процесс, который будет читать данные по обращению и формировать (POST, xml, json, http) запрос к сторонней системе, у которой api открытые. Знаю, что в 7.13 есть отдельный блок в бизнес-процессе, у нас же версия 7.11 – как мы в ней можем подобное реализовать?

Нравится

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

И в 7,11 есть элемент скрип таск в котором вы можете писать код на c# и отправлять (POST, xml, json, http) запрос к сторонней системе

Пример тут

И в 7,11 есть элемент скрип таск в котором вы можете писать код на c# и отправлять (POST, xml, json, http) запрос к сторонней системе

Пример тут

Очень рекомендую задуматься над обновлением текущей версии bpm'online до последней 7.13.3.

Показать все комментарии
JScript
javascript
method
7.11
sales_enterprise

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



Проблема заключается в следующем:

Расположено две одинаковые детали на одной странице редактирования на разных табах. 

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



 

attributes: {
	"isEngineeringDivision": {
		"dataValueType": Terrasoft.DataValueType.BOOLEAN,
		"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		"value": true
	},
	"isNotEngineeringDivision": {
		"dataValueType": Terrasoft.DataValueType.BOOLEAN,
		"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		"value": true
	}
}
methods: {
	init: function() {
		this.callParent(arguments);
		this.checkEnabledButton();
	},
 
	checkEnabledButton: function() {
		this.sandbox.publish("checkUserInAuPublish", null, ["checkUserInAuPublish"]);
		this.sandbox.subscribe("checkUserInAU", function(result) {
			this.set("isEngineeringDivision", result);
			this.set("isNotEngineeringDivision", result === true ? false : true);
		}, this, ["checkUserInAU"]);
	}
},

 

Нравится

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

Попробуйте по-другому объявить эти детали в блоке details.

Вот аналогичный пример:

            "SamplesDetail": {

                "schemaName": "SampleInKitDetailV2",

                "entitySchemaName": "BTSample",

                "filter": {

                    "detailColumn": "BTKitIDLookup",

                    "masterColumn": "Id"

                },

                "defaultValues": {

                    "BTKitIDLookup": {

                        "masterColumn": "Id"

                    },

                    "BTFromSupply": false

                },

                "filterMethod": "samplesFilter",

               "profileKey": "PatientParametersDetail1"

            },

 

Метод фильтрации в данном случае выглядит так:

            samplesFilterMethod: function(kitId, isSupply) {

                var filterGroup = new Terrasoft.createFilterGroup();

                filterGroup.add("KitId", Terrasoft.createColumnFilterWithParameter(

                    Terrasoft.ComparisonType.EQUAL, "BTKitIDLookup", kitId));

                filterGroup.add("SamplesIsSupply", Terrasoft.createColumnFilterWithParameter(

                    Terrasoft.ComparisonType.EQUAL, "BTFromSupply", isSupply));

                return filterGroup;

            },

Обратите внимание, что в ситуации, если на разные табы добавляется одна и та же деталь, нужно добавить свойство "profileKey" и оно должно отличаться у одинаковых деталей.

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

К сожалению это не помогло

В данный момент детали зависят от разных схем, которые наследуются от одной общей ActivityDetailV2

Добавлены как две разные

Результат один и тот же

 

Попробуйте отладиться.

Уточните, возникают ли какие-то ошибки в консоли?

Также сделайте скриншот, чтобы было понятно, что отображается в первом табе и не отображается во втором.

Алла Савельева,

Нет, все проходит без ошибок, единственное, что результат выполнения не записывается в атрибут, либо же не срабатывает visible и enabled при повторной инициализации детали 

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

Добрый день!

Пытаюсь обновить пакет из хранилища, выдает следующую ошибку - Невозможно установить пакет так как у зависимого пакета не указанно хранилище системы контроля версий. Указать хранилище я не могу. Так как -  Элемент создан сторонним издателем или установлен из файлового архива. Сохранение изменений для данного элемента будет невозможно. Продолжить?

Что можно сделать в данном случае?

Нравится

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

А вы установили на систему, на которой пытаетесь обновиться из SVN тот самый пакет?

Дмитрий А.,

Не до конца понял вопрос. Есть пакет, который наследован от пакета, который установлен как я догадываюсь из файлового архива. В моем пакет хранилище svn привязано, а в родительском его нет. И вот такая ошибка.

Mexanik,

Стенд, с которого фиксировались изменения в хранилище и стенд, на котором вы хотите обновиться из хранилища - это один и тот же стенд?

Так точно. Это один и тот же стенд. Вначале, я зафиксировал в SVN, после чего поправил код, и пытаюсь обновить из хранилища.

Дмитрий А.,

Так точно. Это один и тот же стенд. Вначале, я зафиксировал в SVN, после чего поправил код, и пытаюсь обновить из хранилища.

 

Так точно. Это один и тот же стенд. Вначале, я зафиксировал в SVN, после чего поправил код, и пытаюсь обновить из хранилища.

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

Как убрать действие "Удалить" в детали.

Речь идет о кнопках "Копировать/изменить/удалить" во всплывающем окне детали.



И второе, как удалить их у конкретных орг. ролей., т.е. что бы у указанных орг. ролей не было этих кнопок, у остальных были.

Необходимо забрать доступ к действию "удалить" в  конкретной детали

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

Нравится

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

1)

getDeleteRecordMenuItem: Terrasoft.emptyFn //добавлять на схемы деталей (пример OrderProductDetailV2) в блок methods

2) Можно создать кастомную операцию (права доступа на операции) и проверять есть ли у пользователя доступ к этой операции. Пример проверки доступа к операции:

            setUserOperationRightsForCreateChange: function() {
                var operationsToRequest = [];
                debugger;
                operationsToRequest.push("CanCreateChange");
                RightUtilities.checkCanExecuteOperations(operationsToRequest, function(result) {
                    if (result) {
                        this.set("CanCreateChange", result.CanCreateChange);
                    }
                }, this);
            },

А не проще ли права доступа на удаление в конкретном объекте настроить?

1)

getDeleteRecordMenuItem: Terrasoft.emptyFn //добавлять на схемы деталей (пример OrderProductDetailV2) в блок methods

2) Можно создать кастомную операцию (права доступа на операции) и проверять есть ли у пользователя доступ к этой операции. Пример проверки доступа к операции:

            setUserOperationRightsForCreateChange: function() {
                var operationsToRequest = [];
                debugger;
                operationsToRequest.push("CanCreateChange");
                RightUtilities.checkCanExecuteOperations(operationsToRequest, function(result) {
                    if (result) {
                        this.set("CanCreateChange", result.CanCreateChange);
                    }
                }, this);
            },

А не проще ли права доступа на удаление в конкретном объекте настроить?

Дмитрий А., 

Правильно Вас понял, что при добавлении этого (getDeleteRecordMenuItem: Terrasoft.emptyFn ) в блок methods схемы детали, мы уберем у детали действие удалить?!



А когда вызывать этот метод(getDeleteRecordMenuItem), при каких обстоятельствах?! 

Соломонов Алексей Михайлович,

Посмотрите что делает этот метод в коробке. Он как раз отвечает за добавление пункта меню.

Вызывается в addRecordOperationsMenuItems схемы BaseGridDetailV2

Мы же замещаем эту функцию и ничего в ней не делаем. Соответственно пункт меню не добавится.

В вашем случае можно проверить есть ли доступ на операцию. Если есть, то вызываем

 

this.callParent(arguments);

 

Дмитрий А.,

Схема деталей куда добавляем (getDeleteRecordMenuItem: Terrasoft.emptyFn) должна как-то ссылаться на BaseGridDetailV2  ?

 

 

Добавить комментарий

Соломонов Алексей Михайлович,

Обычно все детали и так унаследованы от нее. Что-то дополнительно делать не нужно. Если вы будете выполнять проверку доступа к операции, то в зависимости нужно добавить зависимость от 

RightUtilities

Пример:

define("ContactSectionV2", ["RightUtilities"], function(RightUtilities) {
 
...
 
}

 

Стандартными методами вы можете запретить удаление из объекта детали для определенных ролей.

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



Хотя, признаю, пользователям было бы удобнее сразу видеть, что они что-то не смогут сделать (добавить, исправить, удалить...)

Дмитрий А.,

 

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

 - Редактируемая деталь документа ( MOBaseSchema )

 - DocumentDetailV2 ( MODocument )



И не имеет ни каких ссылок на BaseGridDetailV2



Так же как и родители.

 

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

scr_section_administering_tab_objects_dtl_operations_access.png

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

Добавить комментарий

Соломонов Алексей Михайлович пишет:

 - Редактируемая деталь документа ( MOBaseSchema )  - DocumentDetailV2 ( MODocument )

А они от чего наследуются? 

Дмитрий А.,

От MODocument, а тот в свою очередь BaseGridDetailV2. С этим благодаря Вам разобрались.



Вы упомянули про проверку.

1)

if (this.$CanManageCaseDetails === true) {

                        this.callParent(arguments);

                    }



2) В свою очередь

this.$CanManageCaseDetails = result.MOCanManageCasePageDetails;





Вы не могли бы пояснить в каких случаях она (1) срабатывает?

Смотрите выше в коде, где result.MOCanManageCasePageDetails заполняют. Название звучит очень похоже на право на операцию у текущего пользователя.

Соломонов Алексей Михайлович,

без полного кода не совсем понимаю о чем речь. 

предлагаю такой вариант:

define("BCSchema1Detail", ["RightUtilities"], function(RightUtilities) {
	return {
		entitySchemaName: "BCPurchasedServices",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		attributes: {
            CanCreateChange: {
                dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
                type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                value: true
            }
		},
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
            init: function() {
                this.callParent(arguments);
                this.setUserOperationRightsForCreateChange();
            },
			setUserOperationRightsForCreateChange: function() {
                var operationsToRequest = [];
                // debugger;
                operationsToRequest.push("CanCreateChange");
                RightUtilities.checkCanExecuteOperations(operationsToRequest, function(result) {
                    if (result) {
                        this.set("CanCreateChange", result.CanCreateChange);
                        console.log(result.CanCreateChange);
                    }
                }, this);
            },
			addRecordOperationsMenuItems: function(toolsButtonMenu) {
				var isDetailEnabled = this.get("IsEnabled");
				if (isDetailEnabled === false) {
					return;
				}
				var copyRecordMenuItem = this.getCopyRecordMenuItem();
				if (copyRecordMenuItem) {
					toolsButtonMenu.addItem(copyRecordMenuItem);
				}
				var editRecordMenuItem = this.getEditRecordMenuItem();
				if (editRecordMenuItem) {
					toolsButtonMenu.addItem(editRecordMenuItem);
				}
				if (this.get("CanCreateChange")) {
					var deleteRecordMenuItem = this.getDeleteRecordMenuItem();
					if (deleteRecordMenuItem) {
						toolsButtonMenu.addItem(deleteRecordMenuItem);
					}
				}
				var recordRightsSetupMenuItem = this.getRecordRightsSetupMenuItem();
				if (recordRightsSetupMenuItem) {
					toolsButtonMenu.addItem(recordRightsSetupMenuItem);
				}
			}
		}
	};
});

Вам надо добавить в Права доступа на операцию новую операцию с именем CanCreateChange. Доступ к этой операции - добавляете нужные роли. Если пользователь попадает в эту роль - увидит кнопку "удалить". Иначе не увидит. После добавления роли нужно перелогиниться.

Дмитрий Антохин пишет:

getDeleteRecordMenuItem: Terrasoft.emptyFn

Дмитрий Антохин,

Сложность возникает с асинхронщиной.

Права проверяются гораздо дольше чем формируются элементы.

В итоге берутся значение из атрибута которое установлено по умолчанию.



 

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

Есть действие по множественному выбору в реестре. 

Проблема в том, что оно должно выполняться для большого кол-ва записей. Если я делаю Действия-Выбрать все, то он мне показывает, например, 4000 записей. Но когда я попадаю в метод обработки действия, то 

var selectedRows = this.get("SelectedRows");
this.showInformationDialog(selectedRows.length.toString());

возвращает кол-во записей, которые отображаются на странице в текущий момент, например, 30. Как мне поймать все записи?

Мне в конечном итоге надо будет передать их на сервер в БП или сервис. Возможно, можно на сервер передать фильтр, по которому этим записи отфильтровались и там выбрать коллекцию?

Есть пример реализации?

Нравится

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

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

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

Григорий Чех,это понятно.

Вопрос в том, как пробросить фильтр в запрос, который выбрал пользователь. Т.е. мне не тупо надо все записи в БД обработать, а те, которые выбраны. А до выбора они могут быть отфильтрованы.

Алексей-Карягин,

Тогда листать постранично по 30 записей и обрабатывать

Григорий Чех,

4000 записей? нет уж, спасибо :)

Нужен другой способ.

Однако действие Delete в разделе работает не со страницей, а именно со всеми записями, кстати

 

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

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

Хочу сделать сабж. Окошко выводится, но список пустой. Что я делаю не так?

Метод onPreparePaymentsList не вызывается, кстати. Ошибок в консоли нет.

define("UsrFlip1Page", ["ServiceHelper", "jQuery", "css!UsrFlip1PageCSS"], function(ServiceHelper, jQuery) {
	return {
		entitySchemaName: "UsrFlip",
		attributes: {
			"PaymentVList": {
				dataValueType: Terrasoft.DataValueType.COLLECTION,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				caption: "Платежи",
				name: "PaymentVList",
				isCollection: true
			}
		},
		details: /**SCHEMA_DETAILS*/{
		},
		diff: /**SCHEMA_DIFF*/[
		]/**SCHEMA_DIFF*/,
		methods: {
			init: function() {
				this.callParent(arguments);
				this.set("PaymentVList", this.Ext.create(Terrasoft.Collection));
			},
 
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.set("ActivePayments", null);
				var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "UsrPayment" });
				esq.addColumn("Id");
				esq.addColumn("UsrBillNumber");
				esq.addColumn("UsrPpNumber");
				esq.addColumn("UsrSum");
				esq.addColumn("UsrType.Name");
				esq.filters.add("filterAuto", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.EQUAL, "UsrAuto", this.get("UsrAutoId").value));
				esq.filters.add("filterStatus", this.Terrasoft.createColumnInFilterWithParameters("UsrStatus.Name",
					["Активный", "Не подтвержден"]));
 
				esq.getEntityCollection(function(result) {
					if (result.success) {
						var PaymentItems = {};
						result.collection.each(function(item) {
							PaymentItems[item.get("Id")] = {
								"value": item.get("Id"),
								"displayValue": item.get("UsrBillNumber") + " / " + item.get("UsrPpNumber") +
									" / " + item.get("UsrSum") + " / " + item.get("UsrType.Name")
							};
						}, this);
 
						var list = this.get("PaymentVList");
						list.loadAll(PaymentItems);
					}
				}, this);
			},
 
			getActions: function() {
				var actionMenuItems = this.callParent(arguments);
				actionMenuItems.addItem(this.getActionsMenuItem(
					{
						"Caption": "Уточнение назначения платежа",
						"Tag": "runPaymentCorrection"
					}
				));
				return actionMenuItems;
			},
 
			onPreparePaymentsList: function() {
				debugger;
			},
 
			runPaymentCorrection: function() {
				if (this.get("PaymentVList").getCount() === 0) {
					Terrasoft.showInformation("По данному авто нет активной оплаты!");
					return;
				}
				debugger;
				Terrasoft.showInputBox("Выберите п/п для уточнения", function(button) {
						Terrasoft.showInformation(button);
					}, ["ok", "cancel"], this, {
					name : {
						caption: "Платежи",
						dataValueType: Terrasoft.DataValueType.ENUM,
						className: "Terrasoft.ComboBoxEdit",
						list: {
							bindTo: "PaymentVList"
						},
						prepareList: {
							bindTo: "onPreparePaymentsList"
						},
						isRequired: true
					}
				},
				{
					defaultButton: 0
				});
			}
		},
		rules: {}
	};
});

 

Нравится

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

Алексей, вот кусок кода, который вы можете использовать для вашей задачи. Были рады помочь.

define("ActivityPageV2", [], function() {
return {
entitySchemaName: "Activity",
rules: {},
messages: {},
details: /*SCHEMA_DETAILS/{}/*SCHEMA_DETAILS/,
attributes: {},
methods: {
 
getActions: function() {
var actionMenuItems = this.callParent(arguments);
actionMenuItems.addItem(this.getActionsMenuItem(
{
"Caption": "Тестовое действие",
"Click":
 
{"bindTo": "statusInputBox"}
}
));
return actionMenuItems;
},
 
statusInputBox: function() {
var caption = "Выбор статуса";
this.set("StatusList", new Terrasoft.Collection());
var controls = {
"ActivityStatus": {
dataValueType: Terrasoft.DataValueType.ENUM,
isRequired: true,
caption: "Статус",
value:
 
{ bindTo: "ActivityStatus" }
,
customConfig: {
list:
 
{ bindTo: "StatusList" }
,
prepareList:
 
{ bindTo: "onPrepareStatusList" }
}
}
};
var statusInputBoxHandler = this.statusInputBoxHandler.bind(this);
Terrasoft.utils.inputBox(caption, statusInputBoxHandler,
[Terrasoft.MessageBoxButtons.OK, Terrasoft.MessageBoxButtons.CANCEL],
this, controls);
Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item)
 
{ item.control.bind(this); }
, this);
},
 
onPrepareStatusList: function() {
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery",
 
{ rootSchemaName: "ActivityStatus" }
);
esq.addColumn("Id");
esq.addColumn("Name");
esq.filters.add("finish", Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "Finish", true));
esq.getEntityCollection(function(result) {
if (result.success) {
var items = {};
result.collection.each(function(item) {
items[item.get("Id")] =
 
{ "value": item.get("Id"), "displayValue": item.get("Name") }
;
}, this);
var list = this.get("StatusList");
list.loadAll(items);
}
}, this);
},
 
statusInputBoxHandler: function(tag, data) {
if (Terrasoft.MessageBoxButtons.OK.returnCode === tag) {
if (Ext.isEmpty(data.ActivityStatus.value)) {
this.showInformationDialog("Нужно что-то выбрать", function()
 
{ this.statusInputBox(); }
);
} else
 
{ this.showInformationDialog(data.ActivityStatus.value.displayValue); }
}
}
 
},
diff: /*SCHEMA_DIFF/[]/*SCHEMA_DIFF/
};
});

 

Маялся уже. Всю голову сломал. Лист не готовится, от вручную указанного кол-ва записей в листе ничего не зависит, "prepareList" не вызывается... Через час плюнул, сделал собственный модуль)

Делал что-то подобное, но через messageBox. Метод в prepareList вызывался (при попытке выбора), как и метод в change.

Тёскин Дмитрий Валерьевич,

а есть пример кода? мне кажется, я уже всё перепробовал

Алексей-Карягин,

Примера кода, к сожалению, не осталось. Попробовал вчера на досуге ваш код поковырять - действительно не работает. Возможно я использовал какой-то кастомизированный messageBox. Единственное, что заметил - у меня ветки объекта prepareList и change были внутри customConfig.

Алексей, вот кусок кода, который вы можете использовать для вашей задачи. Были рады помочь.

define("ActivityPageV2", [], function() {
return {
entitySchemaName: "Activity",
rules: {},
messages: {},
details: /*SCHEMA_DETAILS/{}/*SCHEMA_DETAILS/,
attributes: {},
methods: {
 
getActions: function() {
var actionMenuItems = this.callParent(arguments);
actionMenuItems.addItem(this.getActionsMenuItem(
{
"Caption": "Тестовое действие",
"Click":
 
{"bindTo": "statusInputBox"}
}
));
return actionMenuItems;
},
 
statusInputBox: function() {
var caption = "Выбор статуса";
this.set("StatusList", new Terrasoft.Collection());
var controls = {
"ActivityStatus": {
dataValueType: Terrasoft.DataValueType.ENUM,
isRequired: true,
caption: "Статус",
value:
 
{ bindTo: "ActivityStatus" }
,
customConfig: {
list:
 
{ bindTo: "StatusList" }
,
prepareList:
 
{ bindTo: "onPrepareStatusList" }
}
}
};
var statusInputBoxHandler = this.statusInputBoxHandler.bind(this);
Terrasoft.utils.inputBox(caption, statusInputBoxHandler,
[Terrasoft.MessageBoxButtons.OK, Terrasoft.MessageBoxButtons.CANCEL],
this, controls);
Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item)
 
{ item.control.bind(this); }
, this);
},
 
onPrepareStatusList: function() {
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery",
 
{ rootSchemaName: "ActivityStatus" }
);
esq.addColumn("Id");
esq.addColumn("Name");
esq.filters.add("finish", Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "Finish", true));
esq.getEntityCollection(function(result) {
if (result.success) {
var items = {};
result.collection.each(function(item) {
items[item.get("Id")] =
 
{ "value": item.get("Id"), "displayValue": item.get("Name") }
;
}, this);
var list = this.get("StatusList");
list.loadAll(items);
}
}, this);
},
 
statusInputBoxHandler: function(tag, data) {
if (Terrasoft.MessageBoxButtons.OK.returnCode === tag) {
if (Ext.isEmpty(data.ActivityStatus.value)) {
this.showInformationDialog("Нужно что-то выбрать", function()
 
{ this.statusInputBox(); }
);
} else
 
{ this.showInformationDialog(data.ActivityStatus.value.displayValue); }
}
}
 
},
diff: /*SCHEMA_DIFF/[]/*SCHEMA_DIFF/
};
});

 

Показать все комментарии
widget
виджет
7.11
sales

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

BPM sales 7.11.3

Возможно ли создать следующий виджет:



1. Который мог бы выводить информацию из таблиц, к примеру через esq.

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

3. Виджет не был бы прикреплен к определенной схеме и отображался повсюду.



Как такое, или что-то похожее, можно сделать? 

Приветствуется любая помощь!



 

Нравится

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

Информация о разработке своего виджета есть тут. Но это — для панели итогов. 

В Вашем случае, скорее сего, вместо виджета стоит модифицировать код боковой (LeftPanelTopMenuModule) или верхней (MainHeaderModule) панели и добавить туда вывод нужной информации. 

Или же, если значение числовое, делать ещё одну иконку правой коммуникационной панели (CommunicationPanel) и выводить на неё цифру, подобно количеству писем или звонков.

Зверев Александр, Спасибо! Могли бы вы уточнить где именно стоит делать модификацию, что бы вывести нужную мне информацию?

В одной из упомянутых схем, в зависимости от того, где в интерфейсе должна быть эта информация.

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

Есть примеры кода или мануал создание подобного?

Например, так в коммуникационную панель добавляется кнопка.

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

Спасибо за помощь. :)



P.S. Проверьте ЛС.

В версии 7.13 в верхнюю панель добавили надпись с номером версии. Эта логика реализована в схеме MainHeaderSchema, см. упоминания функции _initConfigurationVersion и атрибута ConfigurationVersion.

На init запускается функция, заполняет атрибут. А у надписей caption привязан к его значению.

Показать все комментарии
RICH_TEXT
InlineTextEditViewGenerator
7.11
studio

Добрый день, коллеги!

Есть потребность текстовое поле с типом RICH_TEXT сделать автоматически расширяемым с помощью InlineTextEditViewGenerator.generate. Но в данной конфигурации у поля пропадает заголовок, а он нужен

{
	"operation": "merge",
	"name": "Description",
	"values": {
		"contentType": this.Terrasoft.ContentType.RICH_TEXT,
		"generator": "InlineTextEditViewGenerator.generate",
		"labelConfig": {
			"visible": true
		}
	}
}

 

В чем может быть проблема? Или есть другое решение?

Нравится

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

Добрый день!

Генератор InlineTextEditViewGenerator не рассчитан на использование со свойством labelConfig. Вы можете реализовать собственный генератор на его основе, либо использовать стандарную панель форматирования для RICH_TEXT.

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