Добрый день.

Подскажите, пожалуйста где хранятся настройки представления Аналитика конкретного раздела? Интересует способ быстро перенести (по типу экспорт-импорт md файлов) эти настройки с одного сервера на другой.

Нравится

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

Делал когда то так:
смотрите файлы

Спасибо, Илья.
Перенес из одной БД в другую. Графики отображаются корректно. Однако, если перейти в меню Показать данные, то ни в одном графике ничего не отображается. Все настройки отображаемых колонок утеряны. Хотелось бы перенести вместе с этими настройками, так как их повторная настройка займет ничуть не меньше времени, чем настройка графиков, да и вероятность ошибок существенна.

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

Стикнувся з наступною задачею. Потрібно добавити кнопку на "CommunicationPanel". Кнопку я додав рис. 1. Автоматично створився контейнер який відмальовується по кліку на кнопку. Підкажіть, будь ласка, як помістити Page в даний контейнер рис. 2.

Нравится

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

Добрый день, коллеги!
Подскажите, в продукте версии 7.8 есть деталь "Структура" , в разделе "Проекты".
Хочу сделать со своей кастомной деталью тоже самое, иерархию.

Пока что добавил вот такой код, к старнице детали:

define("UsrReportingDetailV2", ["ConfigurationEnums", "css!ProjectCSSModule"], function(enums) {
        return {
                entitySchemaName: "UsrReporting",
                attributes: {
                        /**
                         * Отвечает за загруженные уровни иерархии
                         */

                        "expandedElements": {
                                dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT,
                                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
                        },
                        /**
                         * Отвечает за список развернутых элементов,
                         * хранит массив уникальных идетификаторов записей
                         */

                        "expandHierarchyLevels": {
                                dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT,
                                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
                        },

                        /**
                         * Отвечает за хранение разворачиваемого элемента иерархии
                         */

                        "ExpandItemId": {
                                dataValueType: Terrasoft.DataValueType.GUID,
                                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
                        }
                },
                methods: {
                        /**
                         * @overridden
                         */

                        disableGridSorting: Ext.emptyFn,

                        /**
                         * @overridden
                         */

                        sortColumn: Ext.emptyFn,

                        /**
                         * Обнавляет страницы редактирования проекта
                         * @overridden
                         * @private
                         */

                        initEditPages: function() {
                                this.callParent(arguments);
                                debugger;
                                var editPages = this.get("EditPages");
                                var workPage = editPages.collection.items[0];
                                workPage.set("Click", {"bindTo": "addToRootRecord"});
                                workPage.set("Caption", "Super");
                                workPage.set("Visible", true);
                                var childItemId = Terrasoft.utils.generateGUID();
                                var config = {
                                        "Id": childItemId,
                                        "Caption": "Sub",
                                        "Click": {"bindTo": "addToChildRecord"},
                                        "Enabled": {"bindTo": "isSingleSelected"},
                                        "Tag": childItemId,
                                        "SchemaName": "UsrReportingPageV2"
                                };
                                var addToChildMenuItem = this.getActionsMenuItem(config);
                                editPages.add(childItemId, addToChildMenuItem);
                        },
                        /**
                         * Открывает страницу Работы для добавления элемента дочернего элемента выбранной записи
                         * @protected
                         * @virtual
                         */

                        addToChildRecord: function() {
                                var scope = this;
                                var selectedItems = this.getSelectedItems();
                                this.set("ExpandItemId", selectedItems[0]);
                                this.replaceDefaultValue("UsrParent", selectedItems[0]);
                                var masterRecordId = this.get("MasterRecordId");
                                this.addRecord();
                        },
                        /**
                         * Устанавливает значение по умолчанию для параметра страницы редактировани новой записи
                         * @protected
                         * @virtual
                         * @param {String} key Имя параметра
                         * @param {*} value значение параметра
                         */

                        replaceDefaultValue: function(key, value) {
                                var defaultValues = this.get("DefaultValues");
                                var oldValue = defaultValues.filter(function(item) {
                                        return item.name === key;
                                });
                                if (Ext.isEmpty(oldValue)) {
                                        defaultValues.push({
                                                name: key,
                                                value: value
                                        });
                                } else {
                                        Terrasoft.each(oldValue, function(item) {
                                                item.value = value;
                                        });
                                }
                        },
                        /**
                         * Открывает страницу Проекта или Работы для добавления элемента в текущий уровань иерархии
                         * @protected
                         * @virtual
                         * @param {String} typeUId Уникальный идентификатор типа записи проекта
                         */

                        addToRootRecord: function(typeUId) {
                                var masterRecordId = this.Terrasoft.GUID_EMPTY;
                                this.replaceDefaultValue("UsrParent", masterRecordId);
                                this.addRecord();
                        },
                        /**
                         * Обработчик загрузки дочерних элементов. Осуществляет проверку загружености
                         * дочерних элеметов выбранной записи. Запускает загрузку нового уровня.
                         * @protected
                         * @virtual
                         * @param {String} primaryColumnValue Уникальный идентификатор записи
                         * @param {Boolean} isExpanded Признак того, разворачивает или сворачивает пользователь дочерние элеметы
                         * true - если разворачивает, false в обратном случае
                         */

                        onExpandHierarchyLevels: function(primaryColumnValue, isExpanded) {
                                if (!isExpanded || this.isItemExpanded(primaryColumnValue)) {
                                        return;
                                }
                                this.setExpandedItem(primaryColumnValue);
                                this.set("ExpandItemId", primaryColumnValue);
                                this.loadGridData();
                        },

                        /**
                         * Удаляет логику постраничности если загружаются дочерние объекты
                         * @protected
                         * @overridden
                         */

                        initQueryOptions: function() {
                                var parentItem = this.get("ExpandItemId");
                                if (!parentItem) {
                                        var isClearGridData = this.get("IsClearGridData");
                                        if (isClearGridData) {
                                                this.clearExpandHierarchyLevels();
                                        }
                                        this.callParent(arguments);
                                }
                        },
                        /**
                         * Удаляет логику постраничности если загружаются дочерние объекты
                         * @protected
                         * @overridden
                         */

                        initCanLoadMoreData: function() {
                                var parentItem = this.get("ExpandItemId");
                                if (!parentItem) {
                                        this.callParent(arguments);
                                }

                                this.get("expandedElements")["EB64FD9A-DF42-4275-8F1B-0A32ABB68AD5"] = {
                                        page: 0
                                };
                        },
                        /**
                         * Инициализирует параметры детали
                         * @protected
                         * @overridden
                         */

                        initData: function() {
                                this.callParent(arguments);
                                this.set("expandedElements", {});
                                this.set("expandHierarchyLevels", []);
                        },
                },
                diff: /**SCHEMA_DIFF*/[
                        {
                                "operation": "merge",
                                "name": "DataGrid",
                                "values": {
                                        "type": "listed",
                                        "hierarchical": true,
                                        "sortColumnDirection": {"bindTo": "disableGridSorting"},
                                        "hierarchicalColumnName": "ParentId",
                                        "updateExpandHierarchyLevels": {
                                                "bindTo": "onExpandHierarchyLevels"
                                        },
                                        expandHierarchyLevels: {
                                                "bindTo": "expandHierarchyLevels"
                                        },
                                        "listedConfig": {
                                                "name": "DataGridListedConfig",
                                                "items": [
                                                        {
                                                                "name": "UsrFileNameListedGridColumn",
                                                                "bindTo": "UsrFileName",
                                                                "position": {
                                                                        "column": 1,
                                                                        "colSpan": 12
                                                                }
                                                        },
                                                        {
                                                                "name": "UsrDisplayPortalListedGridColumn",
                                                                "bindTo": "UsrDisplayPortal",
                                                                "position": {
                                                                        "column": 21,
                                                                        "colSpan": 4
                                                                }
                                                        }
                                                ]
                                        },
                                        "tiledConfig": {
                                                "name": "DataGridTiledConfig",
                                                "grid": {
                                                        "columns": 24,
                                                        "rows": 3
                                                },
                                                "items": [
                                                        {
                                                                "name": "UsrFileNameTiledGridColumn",
                                                                "bindTo": "UsrFileName",
                                                                "position": {
                                                                        "row": 1,
                                                                        "column": 1,
                                                                        "colSpan": 12
                                                                }
                                                        },
                                                        {
                                                                "name": "UsrDisplayPortalTiledGridColumn",
                                                                "bindTo": "UsrDisplayPortal",
                                                                "position": {
                                                                        "row": 1,
                                                                        "column": 21,
                                                                        "colSpan": 4
                                                                }
                                                        }
                                                ]
                                        }
                                }
                        },
                        {
                                "operation": "insert",
                                "name": "UpButton",
                                "parentName": "Detail",
                                "propertyName": "tools",
                                "index": 0,
                                "values": {
                                        "itemType": Terrasoft.ViewItemType.BUTTON,
                                        "tag": -1,
                                        "imageConfig": {
                                                "bindTo": "Resources.Images.UpImage"
                                        },
                                        "click": {"bindTo": "changePosition"},
                                        "visible": {"bindTo": "getToolsVisible"},
                                        "enabled": {"bindTo": "canChangeSelectedItemPosition"},
                                        "hint": {"bindTo": "Resources.Strings.ChangePositionUpButtonCaption"}
                                }
                        },
                        {
                                "operation": "insert",
                                "name": "DownButton",
                                "parentName": "Detail",
                                "propertyName": "tools",
                                "index": 1,
                                "values": {
                                        "itemType": Terrasoft.ViewItemType.BUTTON,
                                        "tag": 1,
                                        "imageConfig": {
                                                "bindTo": "Resources.Images.DownImage"
                                        },
                                        "click": {"bindTo": "changePosition"},
                                        "visible": {"bindTo": "getToolsVisible"},
                                        "enabled": {"bindTo": "canChangeSelectedItemPosition"},
                                        "hint": {"bindTo": "Resources.Strings.ChangePositionDownButtonCaption"}
                                }
                        },
                        {
                                "operation": "remove",
                                "name": "ViewSortMenu",
                                "parentName": "ViewButton",
                                "propertyName": "menu"
                        }
                ]/**SCHEMA_DIFF*/
        };
});

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

Нравится

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

Может кто то делал подобное

Или как и когда , правильно добавлять в эти объекты ('expandHierarchyLevels', 'expandedElements') Id дочерних записей ?

Роман, все вычисляется напрямую запросом к колонкам UsrPosition и UsrParent.

Пример кода рабочей пользовательской детали:

define("UsrSchema2Detail", ["XRMConstants", "terrasoft", "css!ProjectCSSModule"], function(XRMConstants, Terrasoft) {
	return {
		entitySchemaName: "UsrTestTest",
		messages: {
			"CardModuleEntityInfo": {
				"mode": Terrasoft.MessageMode.PTP,
				"direction": Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		},
		attributes: {
			"expandedElements": {
				dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			},
			"expandHierarchyLevels": {
				dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			},
			"ExpandItemId": {
				dataValueType: Terrasoft.DataValueType.GUID,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			}
		},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
				{
					"operation": "merge",
					"name": "DataGrid",
					"values": {
						"type": "listed",
						"hierarchical": true,
						"sortColumnDirection": {"bindTo": "disableGridSorting"},
						"hierarchicalColumnName": "ParentId",
						"updateExpandHierarchyLevels": {
							"bindTo": "onExpandHierarchyLevels"
						},
						expandHierarchyLevels: {
							"bindTo": "expandHierarchyLevels"
						}
					}
				},
				{
					"operation": "insert",
					"name": "UpButton",
					"parentName": "Detail",
					"propertyName": "tools",
					"index": 0,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"tag": -1,
						"imageConfig": {
							"bindTo": "Resources.Images.UpImage"
						},
						"click": {"bindTo": "changePosition"},
						"visible": {"bindTo": "getToolsVisible"},
						"enabled": {"bindTo": "canChangeSelectedItemPosition"},
						"hint": {"bindTo": "Resources.Strings.ChangePositionUpButtonCaption"}
					}
				},
				{
					"operation": "insert",
					"name": "DownButton",
					"parentName": "Detail",
					"propertyName": "tools",
					"index": 1,
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"tag": 1,
						"imageConfig": {
							"bindTo": "Resources.Images.DownImage"
						},
						"click": {"bindTo": "changePosition"},
						"visible": {"bindTo": "getToolsVisible"},
						"enabled": {"bindTo": "canChangeSelectedItemPosition"},
						"hint": {"bindTo": "Resources.Strings.ChangePositionDownButtonCaption"}
					}
				},
				{
					"operation": "remove",
					"name": "ViewSortMenu",
					"parentName": "ViewButton",
					"propertyName": "menu"
				}
		]/**SCHEMA_DIFF*/,
		methods: {
				disableGridSorting: Ext.emptyFn,
				sortColumn: Ext.emptyFn,
				init: function() {
					this.callParent(arguments);
				},
				initData: function() {
					this.callParent(arguments);
					this.set("expandedElements", {});
					this.set("expandHierarchyLevels", []);
				},
				onDeleted: function(result) {
					this.callParent(arguments);
					if (result.Success) {
						this.reloadGridData();
					}
				},
				clearExpandHierarchyLevels: function() {
					this.set("expandedElements", {});
					this.set("expandHierarchyLevels", []);
					var grid = Ext.getCmp("ProjectDetailV2DataGridGrid");
					if (grid) {
						grid.expandHierarchyLevels = [];
					}
				},
				removeExpandHierarchyLevel: function(itemId) {
					var expandHierarchyLevels = this.get("expandHierarchyLevels");
					this.set("expandHierarchyLevels", Terrasoft.without(expandHierarchyLevels, itemId));
					var grid = Ext.getCmp("ProjectDetailV2DataGridGrid");
					if (grid) {
						grid.expandHierarchyLevels = Terrasoft.without(grid.expandHierarchyLevels, itemId);
					}
				},
				addGridDataColumns: function(esq) {
					this.callParent(arguments);
					this.putParentColumn(esq);
					this.putNestingColumn(esq);
					this.putPositionColumn(esq);
				},
				putParentColumn: function(esq) {
					var parentItem = this.get("ExpandItemId");
					if (parentItem && !esq.columns.contains("ParentId")) {
						esq.addColumn("UsrParent.Id", "ParentId");
					}
				},
				putPositionColumn: function(esq) {
					if (!esq.columns.contains("UsrPosition")) {
						esq.addColumn("UsrPosition");
					}
				},
				putNestingColumn: function(esq) {
					var aggregationColumn = this.Ext.create("Terrasoft.AggregationQueryColumn", {
						aggregationType: Terrasoft.AggregationType.COUNT,
						columnPath: "[UsrTestTest:UsrParent].Id"
					});
					if (!esq.columns.contains("HasNesting")) {
						esq.addColumn(aggregationColumn, "HasNesting");
					}
				},
				getParents: function(primaryValues) {
					var parentPrimaryValues = [];
					var gridData = this.getGridData();
					if (Ext.isEmpty(primaryValues)) {
						return parentPrimaryValues;
					}
					primaryValues.forEach(function(primaryColumnValue) {
						var project = gridData.get(primaryColumnValue);
						var parentPrimaryColumnValue = project.get("ParentId");
						if (parentPrimaryColumnValue) {
							parentPrimaryValues.push(parentPrimaryColumnValue);
						}
					});
					return parentPrimaryValues;
				},
				removeGridRecords: function(primaryColumnValues) {
					var updateNestingCollection = this.getParents(primaryColumnValues);
					this.callParent(arguments);
					var gridData = this.getGridData();
					Terrasoft.each(updateNestingCollection, function(projectId) {
						var count = gridData.filterByFn(function(item) {
							return item.get("ParentId") === projectId;
						}, this).getCount();
						if (gridData.contains(projectId)) {
							this.removeExpandHierarchyLevel(projectId);
							var parent = gridData.get(projectId);
							parent.set("HasNesting", count);
						}
					}, this);
				},
				getExpandedItems: function() {
					return this.get("expandedElements");
				},
				setExpandedItem: function(primaryColumnValue) {
					(this.getExpandedItems()[primaryColumnValue]) = {"page": 0};
				},
				isItemExpanded: function(primaryColumnValue) {
					return Boolean(this.getExpandedItems()[primaryColumnValue]);
				},
				addItemsToGridData: function(dataCollection, options) {
					if (dataCollection.isEmpty()) {
						return;
					}
					var firstItem = dataCollection.getByIndex(0);
					var parentId = firstItem.get("ParentId");
					if (parentId) {
						options = {
							mode: "child",
							target: parentId
						};
						var gridData = this.getGridData();
						var parentObj = gridData.get(parentId);
						if (parentObj) {
							parentObj.set("HasNesting", 1);
						}
						if (!this.isItemExpanded(parentId)) {
							return;
						}
					} else {
						this.set("LastRecord", dataCollection.getByIndex(dataCollection.getCount() - 1));
					}
					this.callParent([dataCollection, options]);
					if (options && (options.mode === "child" || options.mode === "top")) {
						var gridDataChild = this.getGridData();
						var tempCollection = this.Ext.create("Terrasoft.Collection");
						tempCollection.loadAll(gridDataChild);
						this.sortCollection(tempCollection);
						gridDataChild.clear();
						gridDataChild.loadAll(tempCollection);
					}
					this.set("ExpandItemId", null);
				},
				onExpandHierarchyLevels: function(primaryColumnValue, isExpanded) {
					if (!isExpanded || this.isItemExpanded(primaryColumnValue)) {
						return;
					}
					this.setExpandedItem(primaryColumnValue);
					this.set("ExpandItemId", primaryColumnValue);
					this.loadGridData();
				},
				initQueryOptions: function() {
					var parentItem = this.get("ExpandItemId");
					if (!parentItem) {
						var isClearGridData = this.get("IsClearGridData");
						if (isClearGridData) {
							this.clearExpandHierarchyLevels();
						}
						this.callParent(arguments);
					}
				},
				initCanLoadMoreData: function() {
					var parentItem = this.get("ExpandItemId");
					if (!parentItem) {
						this.callParent(arguments);
					}
				},
				changeSorting: function() {
					this.clearExpandHierarchyLevels();
					this.callParent(arguments);
				},
				initQuerySorting: function(esq) {
					var sortedColumn = esq.columns.get("UsrPosition");
					sortedColumn.orderPosition = 0;
					sortedColumn.orderDirection = Terrasoft.OrderDirection.ASC;
				},
				getFilters: function() {
					var parentItem = this.get("ExpandItemId");
					if (parentItem) {
						var parentProjectFilterGroup = this.Terrasoft.createFilterGroup();
						parentProjectFilterGroup.addItem(this.Terrasoft.createColumnFilterWithParameter(
							this.Terrasoft.ComparisonType.EQUAL,
							"UsrParent",
							parentItem,
							Terrasoft.DataValueType.GUID
						));
						return parentProjectFilterGroup;
					} else {
						var filters = this.callParent(arguments);
						if (this.get("DetailColumnName") !== "UsrParent") {
							var group = this.Terrasoft.createFilterGroup();
							group.addItem(filters);
							group.addItem(
								Terrasoft.createColumnIsNullFilter(this.entitySchema.hierarchicalColumnName)
							);
							filters = group;
						}
						return filters;
					}
				},
				isProjectsInRoot: function() {
					return (this.get("DetailColumnName") !== "UsrParent");
				},
				isWorkInRoot: function() {
					return !this.isProjectsInRoot();
				},
				initEditPages: function() {
					this.callParent(arguments);
					var editPages = this.get("EditPages");
					var workPage = editPages.collection.items[0];
					workPage.set("Click", {"bindTo": "addToRootRecord"});
					workPage.set("Caption", "Add");
					workPage.set("Visible", true);
					var childItemId = editPages.collection.items[0].imstanceId;
					var config = {
						"Id": childItemId,
						"Caption": "New",
						"Click": {"bindTo": "addToChildRecord"},
						"Enabled": {"bindTo": "isSingleSelected"},
						"Tag": childItemId,
						"SchemaName": "UsrTestTest1Page"
					};
					var addToChildMenuItem = this.getActionsMenuItem(config);
					editPages.add(childItemId, addToChildMenuItem);
				},
				replaceDefaultValue: function(key, value) {
					var defaultValues = this.get("DefaultValues");
					var oldValue = defaultValues.filter(function(item) {
						return item.name === key;
					});
					if (Ext.isEmpty(oldValue)) {
						defaultValues.push({
							name: key,
							value: value
						});
					} else {
						Terrasoft.each(oldValue, function(item) {
							item.value = value;
						});
					}
				},
				getDetailInfo: function() {
					var detailInfo = this.sandbox.publish("GetDetailInfo", null, [this.sandbox.id]) || {};
					var defaultValues = this.get("DefaultValues");
					detailInfo.defaultValues = defaultValues;
					return detailInfo;
				},
				addToRootRecord: function(typeUId) {
					var masterRecordId = (typeUId === XRMConstants.Project.EntryType.Project)
						? this.Terrasoft.GUID_EMPTY
						: this.get("MasterRecordId");
					this.replaceDefaultValue("UsrParent", masterRecordId);
					this.addRecord(typeUId);
				},
				addToChildRecord: function() {
					var scope = this;
					var selectedItems = this.getSelectedItems();
					this.set("ExpandItemId", selectedItems[0]);
					this.replaceDefaultValue("UsrParent", selectedItems[0]);
					var masterRecordId = this.get("MasterRecordId");
					if (masterRecordId !== null) {
						var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "UsrTestTest"});
						var filter = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
							"Id", masterRecordId, Terrasoft.DataValueType.GUID);
						esq.filters.add("filter", filter);
						esq.getEntityCollection(function(response) {
							if (!response || !response.success) {
								return;
							}
							var result = response.collection;
							result.each(function(resultItem) {
								scope.addRecord('c485c4e3-c0a1-4008-a8fe-054f167d5068');
							});
						}, this);
					} else {
						this.addRecord('c485c4e3-c0a1-4008-a8fe-054f167d5068');
					}
				},
				canChangeSelectedItemPosition: function() {
					var selectedItems = this.getSelectedItems();
					return (!Ext.isEmpty(selectedItems) && (selectedItems.length <= 1));
				},
				changePosition: function() {
					var shift = arguments[3];
					var activeRow = this.getActiveRow();
					var projectId = activeRow.get("Id");
					this.updateProjectPosition(projectId, shift, this.onPositionChanged, this);
				},
				onPositionChanged: function(result) {
					if (!result) {
						return;
					}
					var activeRow = this.getActiveRow();
					var parentId = activeRow.get("ParentId");
					if (!parentId) {
						parentId = this.get("MasterRecordId");
					}
					var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchema: this.entitySchema});
					esq.addColumn("UsrPosition");
					var filter = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
						"UsrParent", parentId, Terrasoft.DataValueType.GUID);
					esq.filters.add("filter", filter);
					esq.getEntityCollection(function(response) {
						if (!response || !response.success) {
							return;
						}
						var gridData = this.getGridData();
						var result = response.collection;
						result.each(function(resultItem) {
							var resultItemId = resultItem.get("Id");
							var newPosition = resultItem.get("UsrPosition");
							var gridRecord = gridData.get(resultItemId);
							gridRecord.set("UsrPosition", newPosition);
						});
						var tempCollection = this.Ext.create("Terrasoft.Collection");
						tempCollection.loadAll(gridData);
						this.sortCollection(tempCollection);
						gridData.clear();
						gridData.loadAll(tempCollection);
					}, this);
				},
				sortCollection: function(collection) {
					collection.sortByFn(function(a, b) {
						var positionA = a.get("UsrPosition");
						var positionB = b.get("UsrPosition");
						var q = positionA - positionB;
						return q === 0 ? 0 : (q) / Math.abs(q);
					});
				},
		}
	};
});

Доброго времени суток.
Недавно столкнулся с такой же задачкой. Вот примерный алгоритм:
1) Отрубить в системных настройках ненавистный префикс "Usr" (необяз. пункт).
2) Создать Объект (род. объект - Базовый объект), заполнить его нужными полями, сохранить, опубликовать.
3) Еще раз открыть объект на редактирование и создать там справочник Parent, род. объект - ставим ссылку на только что созданный объект. В свойствах объекта (справа кнопка списка-свойства-все) в графе "Родитель в иерархии" ставим поле Parent. Сохраняем, Публикуем.
4) Когда заполнять таблицу - решаете сами. Либо в схеме (через InsertQuery), либо через хранимку, либо через С# код. Без разницы (в крайнем случае - this.reloadGridData()). Главное у нужных записей заполнять поле Parent айдишником записи-родителя (тем самым формируя иерархию)
5) Теперь сама схема. Создаем схему. Род. объект - Базовая схема детали с реестром. Код приложу. Там надо поменять название схемы в define, ссылку на entitySchemaName (объект, который мы создали ранее) и ссылку на колонку объекта в putNestingColumn.
6) Все. Теперь добавляем деталь на страницу (из кода. в дизайнере не отобразится, т.к. не зарегистрирована). Если все сделано правильно и карточка загрузилась без ошибок, последний шаг - настроить вывод информации в гриде. Это можно сделать через ToolButton прямо в карточке.

[quote="Мотков Илья"]

Роман, все вычисляется напрямую запросом к колонкам UsrPosition и UsrParent.

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

 message: Uncaught Terrasoft.ItemNotFoundException: Item with key f5695207-a45d-4975-a484-92384cb438d1 Does not exist 

Виртуальный обьект и коллекцию, проверил, все корректно добавляет и удаляет. Уже несколько раз сравниваю с разделом "Проекты" , не могу найти разницу ...
Код схемы:

define("UsrReportingDetailV2", ["XRMConstants","ConfigurationGrid", "ConfigurationGridGenerator", "ProcessModuleUtilities", "ConfigurationGridUtilities", "ConfigurationEnums"], 
	function(XRMConstants, ProcessModuleUtilities, ConfigurationGridUtilities, enums) {
	return {
		entitySchemaName: "UsrReporting",
		messages: {
			"CardModuleEntityInfo": {
				"mode": Terrasoft.MessageMode.PTP,
				"direction": Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		},
		attributes: {
			"isPortal": {
				"dataValueType": Terrasoft.DataValueType.BOOLEAN,
				"value":  false
			},
			"isCRM": {
				"dataValueType": Terrasoft.DataValueType.BOOLEAN,
				"value":  true
			},
			/**
			 * Отвечает за загруженные уровни иерархии
			 */
			"expandedElements": {
				dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			},
			/**
			 * Отвечает за список развернутых элементов,
			 * хранит массив уникальных идетификаторов записей
			 */
			"expandHierarchyLevels": {
				dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			},
			/**
			 * Отвечает за хранение разворачиваемого элемента иерархии
			 */
			"ExpandItemId": {
				dataValueType: Terrasoft.DataValueType.GUID,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			}
		},
		mixins: {
			ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
		},
		methods: {
			disableGridSorting: Ext.emptyFn,
			sortColumn: Ext.emptyFn,
			init: function() {
				this.callParent(arguments);
			},
			initData: function() {
				this.callParent(arguments);
				this.set("expandedElements", {});
				this.set("expandHierarchyLevels", []);
			},
			onDeleted: function(result) {
				this.callParent(arguments);
				if (result.Success) {
					this.reloadGridData();
				}
			},
			clearExpandHierarchyLevels: function() {
				this.set("expandedElements", {});
				this.set("expandHierarchyLevels", []);
				var grid = Ext.getCmp("ProjectDetailV2DataGridGrid");
				if (grid) {
					grid.expandHierarchyLevels = [];
				}
			},
			removeExpandHierarchyLevel: function(itemId) {
				var expandHierarchyLevels = this.get("expandHierarchyLevels");
				this.set("expandHierarchyLevels", Terrasoft.without(expandHierarchyLevels, itemId));
				var grid = Ext.getCmp("ProjectDetailV2DataGridGrid");
				if (grid) {
					grid.expandHierarchyLevels = Terrasoft.without(grid.expandHierarchyLevels, itemId);
				}
			},
			addGridDataColumns: function(esq) {
				this.callParent(arguments);
				this.putParentColumn(esq);
				this.putNestingColumn(esq);
				this.putPositionColumn(esq);
			},
			putParentColumn: function(esq) {
				var parentItem = this.get("ExpandItemId");
				if (parentItem && !esq.columns.contains("ParentId")) {
				esq.addColumn("UsrParent.Id", "ParentId");
				}
			},
			putPositionColumn: function(esq) {
				if (!esq.columns.contains("UsrPosition")) {
					esq.addColumn("UsrPosition");
				}
			},
			putNestingColumn: function(esq) {
				var aggregationColumn = this.Ext.create("Terrasoft.AggregationQueryColumn", {
				aggregationType: Terrasoft.AggregationType.COUNT,
					columnPath: "[UsrReporting:UsrParent].Id"
				});
				if (!esq.columns.contains("HasNesting")) {
					esq.addColumn(aggregationColumn, "HasNesting");
				}
			},
			getParents: function(primaryValues) {
				var parentPrimaryValues = [];
				var gridData = this.getGridData();
				if (Ext.isEmpty(primaryValues)) {
					return parentPrimaryValues;
				}
				primaryValues.forEach(function(primaryColumnValue) {
					var project = gridData.get(primaryColumnValue);
					var parentPrimaryColumnValue = project.get("ParentId");
					if (parentPrimaryColumnValue) {
						parentPrimaryValues.push(parentPrimaryColumnValue);
					}
				});
				return parentPrimaryValues;
			},
			removeGridRecords: function(primaryColumnValues) {
				var updateNestingCollection = this.getParents(primaryColumnValues);
				this.callParent(arguments);
				var gridData = this.getGridData();
				Terrasoft.each(updateNestingCollection, function(projectId) {
				var count = gridData.filterByFn(function(item) {
				return item.get("ParentId") === projectId;
				}, this).getCount();
				if (gridData.contains(projectId)) {
				this.removeExpandHierarchyLevel(projectId);
				var parent = gridData.get(projectId);
				parent.set("HasNesting", count);
				}
				}, this);
			},
			getExpandedItems: function() {
				return this.get("expandedElements");
			},
			setExpandedItem: function(primaryColumnValue) {
				(this.getExpandedItems()[primaryColumnValue]) = {"page": 0};
			},
			isItemExpanded: function(primaryColumnValue) {
				return Boolean(this.getExpandedItems()[primaryColumnValue]);
			},
			addItemsToGridData: function(dataCollection, options) {
				if (dataCollection.isEmpty()) {
					return;
				}
				var firstItem = dataCollection.getByIndex(0);
				var parentId = firstItem.get("ParentId");
				if (parentId) {
					options = {
						mode: "child",
						target: parentId
					};
					var gridData = this.getGridData();
					var parentObj = gridData.get(parentId);
					if (parentObj) {
						parentObj.set("HasNesting", 1);
					}
					if (!this.isItemExpanded(parentId)) {
						return;
					}
				} else {
					this.set("LastRecord", dataCollection.getByIndex(dataCollection.getCount() - 1));
				}
				this.callParent([dataCollection, options]);
				if (options && (options.mode === "child" || options.mode === "top")) {
					var gridDataChild = this.getGridData();
					var tempCollection = this.Ext.create("Terrasoft.Collection");
					tempCollection.loadAll(gridDataChild);
					this.sortCollection(tempCollection);
					gridDataChild.clear();
					gridDataChild.loadAll(tempCollection);
				}
				this.set("ExpandItemId", null);
			},
			onExpandHierarchyLevels: function(primaryColumnValue, isExpanded) {
				if (!isExpanded || this.isItemExpanded(primaryColumnValue)) {
					return;
				}
				this.setExpandedItem(primaryColumnValue);
				this.set("ExpandItemId", primaryColumnValue);
				this.loadGridData();
			},
			initQueryOptions: function() {
				var parentItem = this.get("ExpandItemId");
				if (!parentItem) {
					var isClearGridData = this.get("IsClearGridData");
					if (isClearGridData) {
						this.clearExpandHierarchyLevels();
					}
					this.callParent(arguments);
				}
			},
			initCanLoadMoreData: function() {
				var parentItem = this.get("ExpandItemId");
				if (!parentItem) {
					this.callParent(arguments);
				}
			},
			changeSorting: function() {
				this.clearExpandHierarchyLevels();
				this.callParent(arguments);
			},
			initQuerySorting: function(esq) {
				var sortedColumn = esq.columns.get("UsrPosition");
				sortedColumn.orderPosition = 0;
				sortedColumn.orderDirection = Terrasoft.OrderDirection.ASC;
			},
			getFilters: function() {
				var parentItem = this.get("ExpandItemId");
				if (parentItem) {
					var parentProjectFilterGroup = this.Terrasoft.createFilterGroup();
					parentProjectFilterGroup.addItem(this.Terrasoft.createColumnFilterWithParameter(
						this.Terrasoft.ComparisonType.EQUAL, "UsrParent", parentItem, Terrasoft.DataValueType.GUID));
					return parentProjectFilterGroup;
				} else {
					var filters = this.callParent(arguments);
					if (this.get("DetailColumnName") !== "UsrParent") {
						var group = this.Terrasoft.createFilterGroup();
						group.addItem(filters);
						group.addItem(Terrasoft.createColumnIsNullFilter(this.entitySchema.hierarchicalColumnName));
						filters = group;
					}
					return filters;
				}
			},
			isProjectsInRoot: function() {
				return (this.get("DetailColumnName") !== "UsrParent");
			},
			isWorkInRoot: function() {
				return !this.isProjectsInRoot();
			},
			initEditPages: function() {
				this.callParent(arguments);
				var editPages = this.get("EditPages");
				var workPage = editPages.collection.items[0];
				workPage.set("Click", {"bindTo": "addToRootRecord"});
				workPage.set("Caption", "Add");
				workPage.set("Visible", true);
				var childItemId = editPages.collection.items[0].instanceId;
				var config = {
					"Id": childItemId,
					"Caption": "New",
					"Click": {"bindTo": "addToChildRecord"},
					"Enabled": {"bindTo": "isSingleSelected"},
					"Tag": childItemId,
					"SchemaName": "UsrReportingPageV2"
				};
				var addToChildMenuItem = this.getActionsMenuItem(config);
				editPages.add(childItemId, addToChildMenuItem);
			},
			replaceDefaultValue: function(key, value) {
				var defaultValues = this.get("DefaultValues");
				var oldValue = defaultValues.filter(function(item) {
					return item.name === key;
				});
				if (Ext.isEmpty(oldValue)) {
					defaultValues.push({
						name: key,
						value: value
					});
				} else {
					Terrasoft.each(oldValue, function(item) {
						item.value = value;
					});
				}
			},
			getDetailInfo: function() {
				var detailInfo = this.sandbox.publish("GetDetailInfo", null, [this.sandbox.id]) || {};
				var defaultValues = this.get("DefaultValues");
				detailInfo.defaultValues = defaultValues;
				return detailInfo;
			},
			addToRootRecord: function(typeUId) {
				var masterRecordId = (typeUId === XRMConstants.Project.EntryType.Project)
					? this.Terrasoft.GUID_EMPTY
					: this.get("MasterRecordId");
				this.replaceDefaultValue("UsrParent", masterRecordId);
				this.addRecord(typeUId);
			},
			addToChildRecord: function() {
				var scope = this;
				var selectedItems = this.getSelectedItems();
				this.set("ExpandItemId", selectedItems[0]);
				this.replaceDefaultValue("UsrParent", selectedItems[0]);
				var masterRecordId = this.get("MasterRecordId");
				if (masterRecordId !== null) {
					var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "UsrReporting"});
					var filter = Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.EQUAL, "UsrAccount", masterRecordId, Terrasoft.DataValueType.GUID);
					esq.filters.add("filter", filter);
					esq.getEntityCollection(function(response) {
						if (!response || !response.success) {
							return;
						}
						var result = response.collection;
						result.each(function(resultItem) {
							scope.addRecord('c485c4e3-c0a1-4008-a8fe-054f167d5068');
						});
					}, this);
				} else {
					this.addRecord('c485c4e3-c0a1-4008-a8fe-054f167d5068');
				}
			},
			canChangeSelectedItemPosition: function() {
				var selectedItems = this.getSelectedItems();
				return (!Ext.isEmpty(selectedItems) && (selectedItems.length <= 1));
			},
			changePosition: function() {
				var shift = arguments[3];
				var activeRow = this.getActiveRow();
				var projectId = activeRow.get("Id");
				this.updateProjectPosition(projectId, shift, this.onPositionChanged, this);
			},
			onPositionChanged: function(result) {
				if (!result) {
					return;
				}
				var activeRow = this.getActiveRow();
				var parentId = activeRow.get("ParentId");
				if (!parentId) {
					parentId = this.get("MasterRecordId");
				}
				var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchema: this.entitySchema});
				esq.addColumn("UsrPosition");
				var filter = Terrasoft.createColumnFilterWithParameter(
					Terrasoft.ComparisonType.EQUAL, "UsrParent", parentId, Terrasoft.DataValueType.GUID);
				esq.filters.add("filter", filter);
				esq.getEntityCollection(function(response) {
					if (!response || !response.success) {
						return;
					}
					var gridData = this.getGridData();
					var result = response.collection;
					result.each(function(resultItem) {
						var resultItemId = resultItem.get("Id");
						var newPosition = resultItem.get("UsrPosition");
						var gridRecord = gridData.get(resultItemId);
							gridRecord.set("UsrPosition", newPosition);
						});
						var tempCollection = this.Ext.create("Terrasoft.Collection");
						tempCollection.loadAll(gridData);
						this.sortCollection(tempCollection);
						gridData.clear();
						gridData.loadAll(tempCollection);
				}, this);
			},
			sortCollection: function(collection) {
				collection.sortByFn(function(a, b) {
					var positionA = a.get("UsrPosition");
					var positionB = b.get("UsrPosition");
					var q = positionA - positionB;
					return q === 0 ? 0 : (q) / Math.abs(q);
				});
			},
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "merge",
				"name": "DataGrid",
				"values": {
					"type": "listed",
					"hierarchical": true,
					"sortColumnDirection": {"bindTo": "disableGridSorting"},
					"hierarchicalColumnName": "ParentId",
					"updateExpandHierarchyLevels": {
						"bindTo": "onExpandHierarchyLevels"
					},
					expandHierarchyLevels: {
						"bindTo": "expandHierarchyLevels"
					}
				}
			},
			{
				"operation": "insert",
				"name": "OpenReportButton",
				"parentName": "Detail",
				"propertyName": "tools",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"click": {"bindTo": "openReport"},
					"visible": {"bindTo": "isPortal"},
					"enabled": {"bindTo": "isPortal"},
					"caption": "Open"
				},
				"index": 0
			},
			{
				"operation": "remove",
				"name": "AddRecordButton",
				"values": {
					"visible": {"bindTo": "isCRM"}
				}
			},
			{
				"operation": "insert",
				"name": "UpButton",
				"parentName": "Detail",
				"propertyName": "tools",
				"index": 0,
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"tag": -1,
					"imageConfig": {
						"bindTo": "Resources.Images.UpImage"
					},
					"click": {"bindTo": "changePosition"},
					"visible": {"bindTo": "getToolsVisible"},
					"enabled": {"bindTo": "canChangeSelectedItemPosition"},
					"hint": {"bindTo": "Resources.Strings.ChangePositionUpButtonCaption"}
				}
			},
			{
				"operation": "insert",
				"name": "DownButton",
				"parentName": "Detail",
				"propertyName": "tools",
				"index": 1,
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"tag": 1,
					"imageConfig": {
						"bindTo": "Resources.Images.DownImage"
					},
					"click": {"bindTo": "changePosition"},
					"visible": {"bindTo": "getToolsVisible"},
					"enabled": {"bindTo": "canChangeSelectedItemPosition"},
					"hint": {"bindTo": "Resources.Strings.ChangePositionDownButtonCaption"}
				}
			}
		]/**SCHEMA_DIFF*/
	};
});

Ошибка Uncaught Terrasoft.ItemNotFoundException: Item with key f5695207-a45d-4975-a484-92384cb438d1 Does not exist говорит, что не был найден какой-то элемент.

Уточните, пожалуйста, Вы не удаляли колонки из объекта?

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

Попробуйте заместить метод addItemToGridData следующим образом:

	addItemsToGridData: function(dataCollection, options) {
					if (dataCollection.isEmpty()) {
						return;
					}
					var firstItem = dataCollection.getByIndex(0);
					var parentId = firstItem.get("ParentId");
					if (parentId) {
						options = {
							mode: "child",
							target: parentId
						};
						var gridData = this.getGridData();
						var parentObj = gridData.contains(parentId) ? gridData.get(parentId) : undefined;
						if (parentObj) {
							parentObj.set("HasNesting", 1);
						}
						if (!this.isItemExpanded(parentId)) {
							return;
						}
					} else {
						this.set("LastRecord", dataCollection.getByIndex(dataCollection.getCount() - 1));
					}
					this.callParent([dataCollection, options]);
					if (options && (options.mode === "child" || options.mode === "top")) {
						var gridDataChild = this.getGridData();
						var tempCollection = this.Ext.create("Terrasoft.Collection");
						tempCollection.loadAll(gridDataChild);
						this.sortCollection(tempCollection);
						gridDataChild.clear();
						gridDataChild.loadAll(tempCollection);
					}
					this.set("ExpandItemId", null);
				},

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

define("UsrReportingPageV2", [],
	function() {
		return {
			entitySchemaName: "UsrReporting",
			messages: {},
			attributes: {
				"enabledForPortal": {
					"dataValueType": Terrasoft.DataValueType.BOOLEAN,
					"value":  true
				},
				"visibleEnablePortalBool": {
					"dataValueType": Terrasoft.DataValueType.BOOLEAN,
					"value":  true
				}
			},
			details: /**SCHEMA_DETAILS*/{
				Files: {
					schemaName: "FileDetailV2",
					entitySchemaName: "UsrReportingFile",
					filter: {
						masterColumn: "Id",
						detailColumn: "UsrReporting"
					}
				}
			}/**SCHEMA_DETAILS*/,
 
			mixins: {},
			methods: {
				init: function () {
					var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
						"rootSchemaName": "SysAdminUnit"
					});
					esq.addColumn("Id");
					esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.EQUAL, "Id", Terrasoft.SysValue.CURRENT_USER.value));
					esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.EQUAL, "[SysAdminUnitInRole:SysAdminUnit:Id].SysAdminUnitRoleId",
						"720B771C-E7A7-4F31-9CFB-52CD21C3739F"));
					esq.getEntityCollection(function(result) {
						var isPortalUser = result.success && (result.collection.getCount() === 1);
						this.set("enabledForPortal", !isPortalUser);
						this.set("visibleEnablePortalBool", !isPortalUser);
						if (isPortalUser) this.checkEnabled();
					}, this);
					this.callParent(arguments);
				},
				checkEnabled: function () {
					if (this.get("UsrEnablePortal")) {
 
					}
				},
				onSaved: function() {
					if (Terrasoft.configuration.Storage.hasOwnProperty("newChildReport")) {
						var accountID, parentID;
						var defValues = this.get("DefaultValues");
						for (var i = 0; i < defValues.length; i++) {
							switch (defValues[i].name) {
								case "UsrAccount":
									accountID = defValues[i].value;
									break;
								case "UsrParent": 
									parentID = defValues[i].value;
									break;
							}
						}
						var update = Ext.create("Terrasoft.UpdateQuery", {
							rootSchemaName: "UsrReporting"
						});
						update.setParameterValue("UsrAccount", accountID, Terrasoft.DataValueType.GUID);
						update.setParameterValue("UsrParent", parentID, Terrasoft.DataValueType.GUID);
						var filter = update.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id" , this.get("Id"));
						update.filters.add("FilterId", filter);
 
						update.execute(function(result) {
 
						});
						delete Terrasoft.configuration.Storage.newChildReport;
					}
					this.callParent(arguments);
				}
			},
			diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"name": "UsrDisplayPortal",
		"values": {
			"layout": {
				"colSpan": 12,
				"rowSpan": 1,
				"column": 12,
				"row": 1,
				"layoutName": "Header"
			},
			"enabled": {"bindTo": "enabledForPortal"},
			"visible": {"bindTo": "visibleEnablePortalBool"},
			"bindTo": "UsrDisplayPortal"
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "UsrFileName",
		"values": {
			"layout": {
				"colSpan": 12,
				"rowSpan": 1,
				"column": 0,
				"row": 0,
				"layoutName": "Header"
			},
			"bindTo": "UsrFileName",
			"enabled": {"bindTo": "enabledForPortal"},
			"visible": true
		},
		"parentName": "Header",
		"propertyName": "items",
		"index": 1
	},
	{
		"operation": "insert",
		"name": "HistoryTabContainer",
		"values": {
			"caption": {
				"bindTo": "Resources.Strings.HistoryTabCaption"
			},
			"items": []
		},
		"parentName": "Tabs",
		"propertyName": "tabs",
		"index": 0
	},
	{
		"operation": "insert",
		"name": "Files",
		"values": {
			"itemType": 2
		},
		"parentName": "HistoryTabContainer",
		"propertyName": "items",
		"index": 0
	},
	{
		"operation": "remove",
		"name": "ESNTab"
	},
	{
		"operation": "remove",
		"name": "ESNFeedContainer"
	},
	{
		"operation": "remove",
		"name": "ESNFeed"
	}
]/**SCHEMA_DIFF*/
	};
});
Показать все комментарии

Если Oktell отправляет запрос вида

[
 "phoneevent_ringstarted",
 {
  "qid": "00488421-97E4-443B-81B7-D645E403AEBB",
  "userlogin": "Иванов",
  "userid": "3357F4D2-B37C-4809-9A1A-E4D64808DE1B",
  "chainid": "D6C8232D-4E4A-48BB-954E-C719582A4718",
  "callerlineid": "BC1FD50B-651F-459D-B659-28230E919673",
  "callerlinenum": "13027",
  "callerdirection": "oktell_pbx",
  "callerid": "73439170203",
  "callername": "ОАО Металлург",
  "callerdescription": "Металлоконструкции, изделия из черных и цветных металлов",
  "callerinfo": "Абонент: 315, Задача 'Входящие в call-центр'",
  "callercomment": "Еще что-то об абоненте",
  "calleruserlogin": "",
  "calleruserid": "00000000-0000-0000-0000-000000000000",
  "isextline": true,
  "canfax": true,
  "canvideo": false,
  "isconference": false,
  "confid": "00000000-0000-0000-0000-000000000000",
  "confname": "",
  "confroom": 0,
  "confinviternumber": "",
  "confinviteruserid": "00000000-0000-0000-0000-000000000000",
  "confinviteruserlogin": "",
  "istask": true,
  "taskid": "F94BD1FE-B628-4CC3-B215-F3F84B275EDD",
  "taskname": "Входящие в call-центр"
 }
]

То каким образом подхватить параметр taskname из этого звонка?

Нравится

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

Да, это возможно. Для обработки необходимо внести изменения в схему CTIPanel, подписавшись на событие Call Started.

Событие:

/**
* @event callStarted
* Срабатывает при начале нового вызова.
* @param {Terrasoft.integration.telephony.Call} call Звонок.
*/
"callStarted",

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

Как минимум его добавить объект CTIPanel.

В схеме достаточно много кода, куда конкретно относится данная подписка?

Александр, там есть метод subscribeEvents, который подписывает на события.

Т.е. подписаться таким образом?
{
eventName: "callStarted",
eventHandler: this.CallStarted
},

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

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

Запускаю выгрузку данных через Windows Task Scheduler.
D:\TS\313\Bin\TSClient.exe /wnd=wnd_CompaniesExport /USR="supervisor" /PWD=supervisor /CFG=TS

При этом ничего не происходит. Пробовал то же самое поместить в cmd-файл - не помогло.

Если тоже самое запустить из командной строки, то открывается Launcher-окно, и экспорт происходит успешно.

Есть подозрение, что в режиме Scheduler'а не нравится открытие Launcher-окна. Может, можно как-то без него запускать?

Версия TS 3.3.2.313
Windows Server 2012 R2

Нравится

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

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

Данная функциональность не входит в базовую конфигурацию Terrasoft 3.X.
Вероятнее всего, она была разработана в рамках проектного решения для Вашей компании.

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

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

Добрый день!

Подскажите, каким образом можно найти и переопределить обработчики событий стандартных контролов(например, кнопки Сохранить)?
Возможно ли изменить их стиль?

Спасибо!

Нравится

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

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

По сути это две задачи:
1) Изменить стиль (BasePageV2CSS)
2) Изменить обработчики (метод onCardAction, который вызывается при нажатии на кнопку "Сохранить")

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

Добрый день!
Нужно создать справочник с страницей редактирования.

Был создан скрытый раздел, и добавлен справочник. Но возникает проблема, при попытке открыть справочник открывает:

как видите в адресной строке пишет: LookupSectionModule/ilayDocReportsSection
и не отображаются записи справочника.
Но после нажатия Вид -> Настроить колонки(или Настроить итоги) и возврата с страницы настройки назад:

и в адресной строке теперь пишет: SectionModuleV2/ilayDocReportsSection

Смотрел в базе как зарегистрирован аналогичный справочник "Библиотека блоков контента" не нашел отличий.
:

эти темы смотрел:
https://community.terrasoft.ru/forum/topic/16288
https://community.terrasoft.ru/forum/topic/13139

Нравится

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

Здравствуйте, Дениc!

Если не ошибаюсь, для реализации подобной задачи справочник необходимо регистрировать как отдельный раздел. В Бд есть хранимые процедуры RegisterPage и RegisterSection.

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

"Мотков Илья" написал:

Здравствуйте, Дениc!

Если не ошибаюсь, для реализации подобной задачи справочник необходимо регистрировать как отдельный раздел. В Бд есть хранимые процедуры RegisterPage и RegisterSection.

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

Добрый день, Илья!

Дело в том что как раз через мастер и был создан раздел, и "страницой реестра" была указана секция созданного мастером раздела.

И проблема в том, что при открытии наполнения справочника сначала открывается LookupSectionModule/ilayDocReportsSection, а после открытия страницы настройки колонок открывается уже SectionModuleV2/ilayDocReportsSection.

Здравствуйте,
Отличный вопрос. Виной всему вот этот метод:

Если посмотреть схему секции контент блока, Вы увидите, что он переопределен, это же необходимо сделать и Вам в Вашей странице секции, а так же добавить зависимость:

getProfileKey: function() {
   var currentTabName = this.getActiveViewName();
   var schemaName = this.name;
   return schemaName + this.entitySchemaName + "GridSettings" + currentTabName;
}

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

Добрый день, Максим!
Большое спасибо за ответ!

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

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

Используется BPMonline sales comerce версии 7.6.
В разделе продажи есть стандартные фильтры, при изменении которых фильтруются вывод продаж в гриде, что и сразу отображается. Так же есть в этом разделе кнопка аналитика, где строятся графики и можно писать свои виджеты. Я написал виджет который рисует таблицу с нужными полями. Хочется также применять стандартные фильтры для отображения данных в моей таблице. Собственно вопрос, как получить значения этих фильтров и как правильно обрабатывать событие изменения фильтров для перерисовки моей таблици???

Пример клиентсткого модуля для виджета, который рисует таблицу:

define('SxClientUnitTable', ['ext-base', 'terrasoft', 'sandbox', 'SxClientUnitTableResources', "ChartModuleHelper", "css!SxClientUnitTableCss", "ServiceHelper"],
        function(Ext, Terrasoft, sandbox, resources, ChartModuleHelper, css, ServiceHelper, ConfigurationConstants) {
                function getViewModel() {
                                        return Ext.create('Terrasoft.BaseViewModel', {
                                //todo SysModuleAnalyticsChart deleted
                                                entitySchema: 'Order',
                                                methods: {
                                                        getChart: function(key) {
                                                                sandbox.publish('GenerateChart', key);
                                                        },
                                                        load: function() {

                                                        }
                                                }
                                        });
                                };
                var result = "";
                function generateMainView(renderTo) {
                       
                        var resultConfig = Ext.create('Terrasoft.Container', {
                                id: 'tableOtchetMetkiParamContainer',
                                selectors: {
                                        wrapEl: '#tableOtchetMetkiParamContainer'
                                },
                                renderTo: renderTo
                        });
                        return resultConfig;
                }
                function getInfoMetki(parameters) {

                        var serviceData = {
                                site: parameters[0].toString(),
                                ownerId: parameters[1].toString(),
                                startDate: parameters[2].toString(),
                                dueDate: parameters[3].toString(),
                                countryId: parameters[4].toString()
                        };
                       
                        ServiceHelper.callService("UsrOtchetMetkiGetCollectionConfigurationService", "GetCollectionOtchetMetki",
                                function (response) {
                                debugger
                                        if (response.status == 404) {
                                                this.showInformationDialog("\t Error: \n" + response.message);
                                        }
                                        else if(response.GetCollectionOtchetMetkiResult.length > 0){
                                                result = response.GetCollectionOtchetMetkiResult;
                                                var arrR = result.split(":");
                                                var htmlAdded = ""
МеткаКоличество заказовНа уточнении% уточн.Подтвержденные% Подтв.Завершенные% Заверш.Отмены% Отм.
;
                                                for(var i = 0; i arrR.length - 1; i++){
                                                        //get items
                                                        var strArr = arrR[i].split(" ");
                                                        var metkaOne = strArr[0].replace("{","");
                                                        var metka = metkaOne.replace("}","");
                                                       
                                                        htmlAdded += "" + metka + "" + strArr[1].toString() + ""  + strArr[2].toString() + "" + strArr[3].toString() + "" + strArr[4].toString() + "" + strArr[5].toString() + "" + strArr[6].toString() + "" + strArr[7].toString() + ""  + strArr[8].toString() + "" + strArr[9].toString() + "";
                                                }
                                                //end table
                                                htmlAdded += "";
                                                var el = Ext.get('tableOtchetMetkiParamContainer').setHTML(htmlAdded);
                                                var elemV = Ext.get('Module1');
                                                elemV.toggleCls('my-table');
                                        }
                                        else
                                                result = null;
                                }, serviceData, this);
                }

                var render = function(renderTo) {
                        var viewConfig = generateMainView(renderTo);
                        var viewModel = getViewModel();
                        var filters = getFilteres();
                        var ar = [];
                        ar.push("all");
                        ar.push("all");
                        ar.push("2016-05-01");
                        ar.push("2016-07-04");
                        ar.push("a570b005-e8bb-df11-b00f-001d60e938c6");
                        getInfoMetki(ar);
                       
                       
                        viewConfig.bind(viewModel);
                };
                return {
                        schema: 'Order',
                        methods: {
                               
                                getOrdersForFilter: function(){
                                        var items = [];
                                        var selOrders = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "Order"
                                        });
                                        selOrders.addColumn("SxMark.Name");
                                        selOrders.addColumn("SxCountry.Name");
                                        var filterByUser = Terrasoft.createColumnFilterWithParameter(
                                        Terrasoft.ComparisonType.EQUAL, "SxCountry.Name", "Россия");
                                        selOrders.filters.addItem(filterByUser);
                                        selOrders.getEntityCollection(function (response) {
                                        debugger
                                                if (response.collection.collection.length > 0)
                                                        items = result.collection.getItems();
                                                else
                                                        items = null;
                                        }, this);
                                        return items;
                                },
                                filterChanged: function( filter, eOpts ){
                                        debugger
                                        var c = [];
                                }
                        },
                        userCode: function() {
                               
                        },
                        init: function() {
                                debugger

                        },
                        render: render
                };
        }
)
;

Нравится

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

Скорее всего вам поможет SDK
https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/rabota-s-filtr…
Есть несколько примеров

К сожалению, ширина сайта не позволяет увидеть страницу целиком :(, поэтому скопируйте все содержимое, например в MSWord

Я решил данную задачу при помощи sandbox. Стандартные (Fixed и Custom) фильтры прикреплены к OrderSectionV2 и работать с ними (afterFiltersUpdated - переопределить метод изменение фильтров) только в этой схеме.

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

Добрый день.
На установленном ранее пакете в двух js файлах появилсь необходимость изменить одно условие(убрать знак равно).
Открыл файл чрез метаданные, пакет разницы, изменил его и сохранил. После скомпилировал всё. Почему в SectionBundleModule в браузере не поменялся код?
Что я сделал не так?
На локальной базе сработало.
P.S. bpm 7.7.0.2284

Нравится

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

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

В Web.config ключ UseIncludeDependenciesSources должен стоять в true. Затем, попробуйте пересохранить любую клиентскую схему.

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

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

Нравится

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

Добрый день!
После 7.5 было внесено много исправлений/изменений. Напишите в support для детального анализа.

Оказалось что при сохранении объекта при определенных условиях отрабатывает несколько запросов. Отрабатывают без ошибок, но бп дальше не идет. Если запросы не выполняются - все отлично.

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