Добрый день! Необходимо с помощью API вывести список контактов и редактировать, удалять их. Вывести получилось, при удалении возникает ошибка "Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера."

Использую http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/WorkWithBpm...
WebResponse response = request.GetResponse() не хочет выполняться. В чем может быть ошибка?
Спасибо.

Нравится

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

Добрый день!
Посмотрите, например Fiddler'ом какой ответ от сервера, ведь 500 - это все что угодно. Далее, 99% что там будет ошибка Method not allowed. Это означает, что у вас включен компонент IIS'а WebDAV. Он запрещает выполнение запросов типа DELETE. Для этого нужно выключить этот компонент

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

Добрый день, коллеги!
Вопрос по продукту 7.7 Bpm online Servise, портал.
Возникла необходимость добавить кастомные сss стили на отнаследованную страницу портала PortalMainPageBuilder.js
Изначально попробовал добавить их во вкладку LESS :

.ts-messagebox-box {
        height: 550px;
        width: 1200px;
}
.ts-messagebox-caption{
        height: 100%;
        width: 100%;
        overflow-y: scroll;
}

на саму станицу был добавлен вывод infoMessege, стили нужны для его изменения:

showInfoMessage: function() {
        var text = "Some text";
        Terrasoft.utils.showMessage({
                caption: text,
                buttons: [{
                        className: "Terrasoft.Button",
                        returnCode: "yes",
                        style: "blue",
                        caption: "ACCEPT",
                        markerValue: "ACCEPT"
                }, {
                        className: "Terrasoft.Button",
                        returnCode: "no",
                        style: Terrasoft.controls.ButtonEnums.style.GREY,
                        caption: "I DO NOT ACCEPT",
                        markerValue: "I DO NOT ACCEPT"
                }],
                defaultButton: 0,
                style: Terrasoft.MessageBoxStyles.BLUE,
                handler: function(buttonCode) {
                        if (buttonCode === "no") {
                                //some action
                        }
                }
        });
}

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

Нравится

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

Влад, для изменения или дополнения стилей отображения в клиентской схеме Вам необходимо создать собственный модуль, затем на вкладке LESS созданного модуля добавить css стили, в которых прописать необходимые изменения. После этого добавить данный модуль в зависимости схемы к которой будут применяться данные css стили с добавлением в начале имени 'css!'.

Есть пример для модуля ComandlineModule:

Создаем модуль ComandlineModuleCss.

На вкладке LESS прописываем стили:

#CommunicationPanelEmailSchemaEmailSearchTextEdit-el{
	background-color: red;
                color: black;
                font-size: 25px;
}

Добавляем его имя в зависимости замещающего модуля CommandLineModule:

define("CommandLineModule", ["CommandLineModuleResources", "StorageUtilities", "ProcessModuleUtilities",
	"performancecountermanager", "TooltipUtilities", "ViewGeneratorV2", "css!ComandlineModuleCss"],
	function(resources, storageUtilities, ProcessModuleUtilities, performanceCounterManager) {

сделал все по Вашему примеру, к сожалению стили не применились. и в консоли на вкладке sources новый модуль (собственный с Less) не загрузился.
Добавляемые селекторы и стили должно быть правильные, потому что если добавить их на прямую в файлик
Terrasoft.WebApp\Resources\ui\Terrasoft\controls\messagebox\messagebox.css
все работает.

Попробуйте по примеру ActivitySectionCSS, все же и на первой вкладке вашего ComandlineModuleCss написать:

define("ComandlineModuleCss", [],
function() {
return {
};
});

Большое спасибо! Этот вариант заработал.

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

Добрый день коллеги!Подсажите пожалуйста, можно ли настроить поле на редактируемом греде, чтобы оно было не look up (выбор справочника в новом окне), а combo box (выпадающим списком)? Спасибо!

Нравится

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

Можно, на подобии того как бизнес правила из страницы редактирования детали распространяются на редактируемый реестр детали, так же распространяются и настройки полей.
Все что вам нужно, что бы деталь была корректно создана мастером деталей, что бы у нее была страница редактирования. На ней вы задаете поля выпадающим списком. Даже через мастер страницы детали это можно сделать.
А потом в схеме детали вы делаете грид редактируемым. И его поля, которые были настроены «списком», будут «списком» и в гриде. Примеры ниже.

------ страница контакта ------
 
define("ContactPageV2", ["ContactPageV2Resources", "GeneralDetails"],
function(resources, GeneralDetails) {
	return {
		entitySchemaName: "Contact",
		details: /**SCHEMA_DETAILS*/{
			"UsrContactInfob66277ee47c9": {
				"schemaName": "UsrSchema1Detail",
				"entitySchemaName": "UsrContactInfo",
				"filter": {
					"detailColumn": "UsrContact",
					"masterColumn": "Id"
				}
			}
		}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "UsrContactInfob66277ee47c9",
				"values": {
					"itemType": 2
				},
				"parentName": "GeneralInfoTab",
				"propertyName": "items",
				"index": 0
			}
		]/**SCHEMA_DIFF*/,
		attributes: {},
		methods: {},
		rules: {},
		userCode: {}
	};
});
 
 
------ схема детали -----------
 
define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator",
	"ConfigurationGridUtilities"], function() {
	return {
		entitySchemaName: "UsrContactInfo",
		attributes: {
			"IsEditable": {
				dataValueType: Terrasoft.DataValueType.BOOLEAN,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: true
			}
		},
		mixins: {
			ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
		},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
            "operation": "merge",
            "name": "DataGrid",
            "values": {
               "className": "Terrasoft.ConfigurationGrid",
               "generator": "ConfigurationGridGenerator.generatePartial",
               "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
               "changeRow": {"bindTo": "changeRow"},
               "unSelectRow": {"bindTo": "unSelectRow"},
               "onGridClick": {"bindTo": "onGridClick"},
               "activeRowActions": [
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "save",
                     "markerValue": "save",
                     "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "cancel",
                     "markerValue": "cancel",
                     "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "remove",
                     "markerValue": "remove",
                     "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                  }
               ],
               "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
               "activeRowAction": {"bindTo": "onActiveRowAction"},
               "multiSelect": false
            }
          }
		]/**SCHEMA_DIFF*/,
		methods: {}
	};
});
 
 
------ схема страницы детали --
 
define("UsrUsrContactInfo1Page", [], function() {
	return {
		entitySchemaName: "UsrContactInfo",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "UsrContact440ad902-7e9b-426d-9162-654b6e410474",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 1,
						"layoutName": "Header"
					},
					"labelConfig": {},
					"enabled": true,
					"bindTo": "UsrContact"
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 0
			},
			{
				"operation": "insert",
				"name": "UsrAccountac6b8364-bd8e-43b7-bd6d-589f7fe300a6",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 2,
						"layoutName": "Header"
					},
					"labelConfig": {},
					"enabled": true,
					"bindTo": "UsrAccount"
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 1
			},
			{
				"operation": "insert",
				"name": "Name9870b437-3b62-4f5e-8879-e5f3d4277114",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "Header"
					},
					"bindTo": "Name"
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 2
			}
		]/**SCHEMA_DIFF*/,
		methods: {},
		rules: {}
	};
});

Здравствуйте Максим! Спасибо за Ваш ответ! Попробовал протестить этот вариант, но не получилось, подскажите пожалуйста, что я упустил...
Пробовал делать на детали "Карьера" на вкладке "место работы".

На замещающую страницу карточки контакта добавил деталь и diff для нее (хотя это наверное не обязательно)

define("ContactPageV2", [],
		function(BaseFiltersGenerateModule, BusinessRuleModule, resources, ConfigurationConstants, ContactCareer) {
			return {
				entitySchemaName: "Contact",
				messages: {},
				attributes: {},
				rules: {},
				details: /**SCHEMA_DETAILS*/{
					ContactCareer: {
						schemaName: "ContactCareerDetailV2",
						filter: {
							masterColumn: "Id",
							detailColumn: "Contact"
						},
						defaultValues: {
							Contact: {
								masterColumn: "Id"
							}
						}
					}
				}/**SCHEMA_DETAILS*/,
				mixins: {},
				methods: {},
				diff: /**SCHEMA_DIFF*/[
					{
						"operation": "merge",
						"parentName": "JobTabContainer",
						"propertyName": "items",
						"name": "ContactCareer",
						"values": {
							"itemType": 2
						}
					}
				]/**SCHEMA_DIFF*/
			};
		});

на замещающей схеме детали все стандартно:

define("ContactCareerDetailV2", ["terrasoft", "ConfigurationGrid", "ConfigurationGridGenerator",
	"ConfigurationGridUtilities"],
		function(Terrasoft) {
			return {
				entitySchemaName: "ContactCareer",
				attributes: {
					"IsEditable": {
						dataValueType: Terrasoft.DataValueType.BOOLEAN,
						type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
						value: true
					}
				},
				methods: {},
				mixins: {
					ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
				},
				diff: /**SCHEMA_DIFF*/[
					{
						"operation": "merge",
						"name": "DataGrid",
						"values": {
							"className": "Terrasoft.ConfigurationGrid",
							"generator": "ConfigurationGridGenerator.generatePartial",
							"generateControlsConfig": {"bindTo": "generateActiveRowControlsConfig"},
							"changeRow": {"bindTo": "changeRow"},
							"unSelectRow": {"bindTo": "unSelectRow"},
							"onGridClick": {"bindTo": "onGridClick"},
							"activeRowActions": [
								{
									"className": "Terrasoft.Button",
									"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
									"tag": "save",
									"markerValue": "save",
									"imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
								},
								{
									"className": "Terrasoft.Button",
									"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
									"tag": "cancel",
									"markerValue": "cancel",
									"imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
								},
								{
									"className": "Terrasoft.Button",
									"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
									"tag": "remove",
									"markerValue": "remove",
									"imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
								}
							],
							"initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
							"activeRowAction": {"bindTo": "onActiveRowAction"},
							"multiSelect": false
						}
					}
				]/**SCHEMA_DIFF*/
			};
		});

И на схеме страницы детали попытался одно из лукапных полей сделать выпадающим списком:

define("ContactCareerPageInContactV2", [], function() {
	return {
		entitySchemaName: "ContactCareer",
		attributes: {},
		methods: {},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "merge",
				"name": "Job",
				"parentName": "Header",
				"propertyName": "items",
				"values": {
					"bindTo": "Job",
					"layout": {
						"column": 0,
						"row": 2,
						"colSpan": 12,
						"layoutName": "Header"
					},
					"labelConfig": {},
					"enabled" : true,
					"contentType": Terrasoft.ContentType.ENUM
				}
			}
		]/**SCHEMA_DIFF*/
	};
});

Здравствуйте, есть два варианта по которым у вас этот код мог не отработать.
Либо страница редактирования все же зарегистрирована не корректно, что можно проверить "отключив" редактируемый реестр, и попробовав добавить запись.
Либо страниц редактирования у объекта ContactCareer несколько.
Для таких случаев вы можете настроить конфиг полей в редактируемом реестре, прямо в схеме детали "ContactCareerDetailV2".

Т.к. редактируемый реестр получает конфиг с помощью метода "generateActiveRowControlsConfig" из "ConfigurationGridUtilities", его можно переопределить прямо на уровне детали. Код метода можно брать из примера, или из своей схемы "ConfigurationGridUtilities" если он будет отличатся, и доработать его чем-то вроде:

if (columnName = "Status") {
cellConfig.contentType = Terrasoft.ContentType.ENUM;
}
Сразу после создания в нем cellConfig.

Где Status - имя колонки которой вы хотите присвоить дополнительный конфиг.

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

define("UsrSchema1Detail", ["terrasoft", "BusinessRulesApplierV2", "ConfigurationEnums", "BusinessRuleModule",
    "GridUtilitiesV2", "ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"], function(
        Terrasoft, BusinessRulesApplier, ConfigurationEnums, BusinessRuleModule) {
    return {
        entitySchemaName: "Activity",
        attributes: {
         "IsEditable": {
            dataValueType: Terrasoft.DataValueType.BOOLEAN,
            type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
            value: true
         }
        },
        mixins: {
         ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
        },
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
            {
            "operation": "merge",
            "name": "DataGrid",
            "values": {
               "className": "Terrasoft.ConfigurationGrid",
               "generator": "ConfigurationGridGenerator.generatePartial",
               "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
               "changeRow": {"bindTo": "changeRow"},
               "unSelectRow": {"bindTo": "unSelectRow"},
               "onGridClick": {"bindTo": "onGridClick"},
               "activeRowActions": [
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "save",
                     "markerValue": "save",
                     "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "cancel",
                     "markerValue": "cancel",
                     "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "remove",
                     "markerValue": "remove",
                     "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                  }
               ],
               "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
               "activeRowAction": {"bindTo": "onActiveRowAction"},
               "multiSelect": false
            }
         }
        ]/**SCHEMA_DIFF*/,
        methods: {
            generateActiveRowControlsConfig: function(id, columnsConfig, rowConfig) {
                this.columnsConfig = columnsConfig;
                var gridLayoutItems = [];
                var currentColumnIndex = 0;
                this.Terrasoft.each(columnsConfig, function(columnConfig) {
                    var columnName = columnConfig.key[0].name.bindTo;
                    var column = this.getColumnByColumnName(columnName);
                    var cellConfig = this.getCellControlsConfig(column);
 
                    cellConfig = this.Ext.apply({
                        layout: {
                            colSpan: columnConfig.cols,
                            column: currentColumnIndex,
                            row: 0,
                            rowSpan: 1
                        }
                    }, cellConfig);
 
                    if (columnName = "Status") {
                        cellConfig.contentType = Terrasoft.ContentType.ENUM;
                    }
 
                    gridLayoutItems.push(cellConfig);
                    currentColumnIndex += columnConfig.cols;
                }, this);
                var gridData = this.getGridData();
                var activeRow = gridData.get(id);
                var rowClass = {prototype: activeRow};
                BusinessRulesApplier.applyRules(rowClass, gridLayoutItems);
                var viewGenerator = this.Ext.create("Terrasoft.ViewGenerator");
                viewGenerator.viewModelClass = {prototype: this};
                var gridLayoutConfig = viewGenerator.generateGridLayout({
                    name: this.name,
                    items: gridLayoutItems
                });
                rowConfig.push(gridLayoutConfig);
            },
        }
    };
});

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

Большое спасибо! второй вариант с добавлением свойства напрямую в cellConfig работает отлично! :twisted:

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

Привет.
Есть POST сервис на C#, который принимает и возвращает json.
Появилась идея, чтоб не регистрировать этот сервис в bpmonline запускать его через бизнес процесс.
Все нормально работает, но вот как передать в БП json тело и получить некий json обратно?
Пока удалось только передать параметры в Url.

Нравится

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

Добрый день,
На данный момент в сервисе ProcessEngineService нет такого метода, который бы позволял передавать параметры из тела POST запроса. Есть похожий метод ExecuteProcessWithResultPost но он устанавливает параметры процесса только из URL.

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

Коллеги, приветствую.

Есть некоторый код простого клиентского модуля, который должен показать простую карточку с текстовым полем и кнопками "Отмена" и "Далее".

 

define("UsrPlanningTasksForCustomer", ["CustomProcessPageV2Utilities"], function() {
        return {
                entitySchemaName: "Contact",
                mixins: {
                        BaseProcessViewModel: "Terrasoft.CustomProcessPageV2Utilities"
                },
                attributes: {
                        "Employee": {
                        caption: { "bindTo": "Resources.Strings.EmployeeCaption" },
                        dataValueType: Terrasoft.DataValueType.TEXT
                        }
                },
                details: {
                },
                methods: {
                        getHeader: function() {
                                return this.get("Resources.Strings.PageHeaderCaption");
                        },
                        onMyCancelButtonClick: function() {
                                this.set("Result", "RejectedByCustomer");
                                this.acceptProcessElement();
                        },
                        onNextButtonClick: function() {
                                this.set("Result", "Next");
                                this.acceptProcessElement();
                        }
                },
                diff:
                [
                       
                        {
                                "operation": "remove",
                                "name": "DelayExecutionButton"
                        },
                        {
                                "operation": "remove",
                                "name": "actions"
                        },
                        {
                                "operation": "remove",
                                "name": "SaveButton"
                        },
                        {
                                "operation": "remove",
                                "name": "CancelButton"
                        },
                        {
                                "operation": "remove",
                                "name": "DiscardChangesButton"
                        },
                        {
                                "operation": "remove",
                                "name": "ViewOptionsButton"
                        },
                        {
                                "operation": "remove",
                                "name": "PrintButton"
                        },
                        {
                                "operation": "remove",
                                "name": "CloseButton"
                        },
                       
                        {
                                "operation": "insert",
                                "parentName": "LeftContainer",
                                "propertyName": "items",
                                "name": "MyCancelButton",
                                "values": {
                                        caption: { "bindTo": "Resources.Strings.MyCancelButton" },
                                        itemType: Terrasoft.ViewItemType.BUTTON,
                                        classes: {textClass: "actions-button-margin-right"},
                                        style: Terrasoft.controls.ButtonEnums.style.RED,
                                        click: {bindTo: "onMyCancelButtonClick"}
                                }
                        },
                        {
                                "operation": "insert",
                                "parentName": "LeftContainer",
                                "propertyName": "items",
                                "name": "NextButton",
                                "values": {
                                        caption: { "bindTo": "Resources.Strings.NextButtonCaption" },
                                        itemType: Terrasoft.ViewItemType.BUTTON,
                                        classes: {textClass: "actions-button-margin-right"},
                                        style: Terrasoft.controls.ButtonEnums.style.GREEN,
                                        click: {bindTo: "onNextButtonClick"}
                                }
                        },
                       
                        {
                        "operation": "insert",
                        "parentName": "Header",
                        "name": "DataGroup",
                        "propertyName": "items",
                        "values": {
                                itemType: Terrasoft.ViewItemType.CONTROL_GROUP,
                                items: [],
                                "caption": {"bindTo": "Resources.Strings.DataGroupCaption"},
                                "layout": { "column": 18, "row": 0, "colSpan": 18 },
                                controlConfig: {collapsed: false}
                        }
                        },
                        {
                        "operation": "insert",
                        "name": "TopCenterInfoBlock",
                        "parentName": "DataGroup",
                        "propertyName": "items",
                        "values": {
                                "layout": { "column": 0, "row": 0 },//, "colSpan": 15 },
                                "itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
                                "items": []
                        }                                      
                ]
        };
});

 

Собственно, кнопки "Отмена" и "Далее" отображаются, но не отображается мое текстовое поле и, ко всему, появляются ряд полей, которые я не определял, как то "Продукт", "Прайс-лист", "Цена", "Валюта", "Налог".

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

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

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

Так, собственно, как текстовое поле добавить примерно понял - нужно добавить соответствующий атрибут и в блоке diff определить контейнер, в него вложить метку и само поле:

attributes: {
	"EmployeeTextField": {
		caption: { "bindTo": "Resources.Strings.EmployeeCaption" },
		dataValueType: Terrasoft.DataValueType.TEXT
	}
}
...
 
diff:
[
	...
	{
		"operation": "insert",
		"parentName": "ProductGeneralInfoBlock",
		"propertyName": "items",
		"name": "PlanningBlock",
		"values": {
			"itemType": this.Terrasoft.ViewItemType.GRID_LAYOUT,
			"layout": { "column": 1, "row": 2, "colSpan": 24 },
			"items": []
		}
	},
	{
		"operation": "insert",
		"parentName": "PlanningBlock",
		"name": "EmployeeLabel",
		"propertyName": "items",
		"values": {
			"itemType": this.Terrasoft.ViewItemType.LABEL,
			"caption": { "bindTo": "Reources.Strings.EmployeeCaption" },
			"layout": { "column": 0, "row": 0, "colSpan": 2 }
		 }
	},
	{
		"operation": "insert",
		"parentName": "PlanningBlock",
		"propertyName": "items",
		"name": "EmployeeTextField",
		"values": {
			"itemType": this.Terrasoft.ViewItemType.TEXT,
			"layout": { "column": 2, "row": 0, "colSpan": 20 }
		}
	}
]

Но как удалить преднастроенные поля?

По всей видимости, нужно пронаследоваться от пустой схемы...

Да, нужно указать родительский объект "Базовая схема карточки ( NUI )"

Думаю как то так.
{
"operation": "remove",
"name": "PlanningBlock"

},

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

При импорте большого обьема данных через C# сервис подвисает bpm.
Для записи и обновления данных в SQL используется CustomQuery.
Сервис запускается через бизнес процесс каждые n минут.
Есть ли возможность использовать bpm во время работы сервиса?

Нравится

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

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

CustomQuery может подвешивать, т.к. запрос блокирует таблицу, с которой работает. Используйте для записи ESQ.

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

При импорте большого обьема данных через C# сервис подвисает bpm.
Для записи и обновления данных в SQL используется CustomQuery.
Сервис запускается через бизнес процесс каждые n минут.
Есть ли возможность использовать bpm во время работы сервиса?

Нравится

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

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

Импорт использует поток пользователя. После начала импорта Вы можете открыть bpm'online в другом браузере или в режиме инкогнито. В результате, в новом браузере/в режиме инкогнито система не будет подвисать.

Решили проблему следующим образом.
Запускаем метод в отдельном потоке.
Вот часть кода. Запускается метод UploadClients().

System.Web.HttpContext httpContext = System.Web.HttpContext.Current;
CultureInfo currentCulture = GeneralResourceStorage.CurrentCulture;
System.Threading.Tasks.Task.Factory.StartNew(() => {
if (httpContext != null) {
System.Web.HttpContext.Current = httpContext;
}
GeneralResourceStorage.CurrentCulture = currentCulture;
try  {
UsrClientsUpload.UploadClients();
}        
 
               catch { }
 
 
});

Добрый день!!!

для импорта большого объема данный я бы создал и использовал отдельный бизнес-процесс. и запускал бы бизнес процесс как отдельный Job. в стандартной конфигурации Sales даже есть пример в разделе Планирование, "Рассчитать факт и потенциал".

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

Здравствуйте, коллеги.

У меня следующая постановка задачи:
1. Организовать лендинг.
2. Создать лида.

Лендинг создал, лида сконфигурировал, пользователя отдельно создал и теперь проблема: не хочет его создавать. Возвращает "Неизвестный идентификатор формы". Но, в лиде этот идентификатор есть, в базе есть и в коде все совпадает.

В итоге: не хватает прав пользователю на доступ к таблице. (Причем там идентификатор формы если нет прав? Ошибку по-человечески сразу описать сложно?)

Внимание, вопрос какие права необходимо выставить пользователю на доступ к Лендингам?

Редактирование в "Конфигуратор"->"Администрирование объектов"->"Лендинги" произвел и добавил как на доступ к объекту, так и на доступ внешнего сервиса.

Нравится

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

Добрый день!

К сожалению, описанной Вами информации недостаточно для проведения анализа. Прошу также сообщить:

1. Текст ошибки(желательно со скриншотом), которая возникает при регистрации лида с лендинга.
2. Версию и название продукта, на котором выполняется настройка лендинга.

Для ускорения решения данного вопроса рекомендуется обратиться в техническую поддержку, отправив письмо с запрошенной информацией на support@terrasoft.ru либо через портал самообслуживания.

Анастасия, вопрос уже решился, спасибо.

Действительно дело было в правах. Я создал для этих действий портального пользователя, а надо было создавать, как "Сотрудник".

Текст ошибки возвращал: "Неизвестный идентификатор формы".

Евгений, спасибо за обратную связь!

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

Накопилось несколько вопросов по BPM Online которых я не нашел подобных вопросов на комюнити(или плохо искал).
1. Несовпадение выполнения кода! Есть кнопка по нажатие на которую выполняется некоторый функционал. Когда просто нажимаю - работает неверно(в коде есть много if конструкций) и идет по неверной ветке. Когда начинаю дебажить в отладчику и просматривать код, то выполняется все верно!!! Я такого больше нигде не видел и не знаю что делать. Могу добавить что много используются запросы в БД. Также заметил что с утра работает одинаково через отладчик и напрямую по нажатию на кнопку. Куш чистил - непомогло.
2. Как вывести значение из функции запроса в главную функцию? вот пример кода:

esq.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.EQUAL, ColumnRole, true));
        var q = 0;
        esq.getEntityCollection(function(response) {
                if (response.success) {
                        var collection = response.collection;
                        if (collection && collection.getByIndex(0)) {
                                this.set("CountRoles", collection.getByIndex(0).get("Id"));
                                q = collection.getByIndex(0).get("Id");
                        }
                }
                return 5;
        }, this);
alert(q);

в отладчику просматриваю вижу что q стает 3(или другой ответ запроса) но по окончанию функции алерт выдает 0. Приходится вытягивать данные через переменную в атрибуте.
3. Какието странные ошибки. Вчера утром срабатывало отлично, теперь ошибки. Прилагаю скрин:


Вот код который делает удаление:

var deleteQuery = Ext.create("Terrasoft.DeleteQuery", {
        rootSchemaName: "UsrSplit"
});
deleteQuery.filters.add("userFilter",
deleteQuery.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,     "UsrInvoice", InvoiceId));
deleteQuery.execute(function() {});

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

Нравится

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

Здравствуйте, Виталий.

1) За данное поведение отвечает JavaScript и браузер и оно никак не относится к функционалу Bpm'online. Судя по тому, что Вы делаете запросы к базе данных и глядя на код написанный в пункте 2, могу предположить что пока Вы стоите в дебагере, функции колбека успевают отработать и Вы видите правильный результат. Без дебага же, выполнение идет дальше не успев дождаться результата выполнения колбека.

2) Результат 0 абсолютно корректен в данном коде. Поскольку функция getEntityCollection вызывается асинхронно - сразу же после ее вызова вызывается alert и выдает 0, не дожидаясь ответа от базы данных. Вернуть значение из колбек функции Вы не сможете, возможно только всю логику встроить в функцию обратного вызова или же использовать атрибут.

3) В данном случае, Вам необходимо проверить какой запрос отправляется в базу данных. Для отладки воспользуйтесь программой sql profiler.

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

Вроде бы решил все проблемы)))
Осталось обновить данные детали, писал так:

this.reloadDetail("имядетали")
this.loadDetail("имядетали")
UpdateDetail
http://www.community.terrasoft.ru/forum/topic/12258

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

this.updateDetail(
      {
          detail: "MyDetailName",//название детали (как описана в карточке)
          reloadAll: true
      }
);
 
this.sandbox.unloadModule(Id);
this.sandbox.loadModule("DetailModuleV2", {
	renderTo: ParentId,
	id: id
});

Даже sandbox передал на деталь сообщение и там вызвал this.reloadGridData(); - далает копии
Как же обновить деталь по нажатии(например) на кнопку в главной карточке

Виталий, вполне достаточно вызвать метод this.updateDetails();

Так, проблему решил. Деталь обновляется!!!
вот так сделал:
отправил sandbox-сообщение на деталь и там
var gridData = this.getGridData();
if (gridData) {
gridData.clear();
this.loadGridData();
}

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

Привязать свой раздел к Активности Задачи.
Как вы знаете по умолчанию в Задачи я могу только сделать связь от Лида до Договора.
Но но своими не могу это сделать.
К примеру мы создали раздел Заявки и хотим чтобы задача была привязана к ней.
Подскажите как это сделать?
Спасибо.

Нравится

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