Создание детали с редактируемым реестром

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

Создал деталь: Объект унаследован от базового (2 поля: связь с разделом, поле справочник), схема детали унаследована от "Базовая схема детали с реестром ( NUI )". Зарегестрировал ее в SysDetail, через мастер разделал добавил в раздел. Все работает.
Целью было создать деталь с редактируемым реестром, реализацию и зависимости смотрел в детали "Продукт в заказе", деталь отображается как обычная, видимо что то упустил.

Что нужно сделать что бы создать деталь с редактируемым реестром?

Нравится

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

"Продукт в заказе" (ContractProductDetailV2) обычная деталь с реестром и парой дополнительных методов для пересчета суммы, в которой возможность редактировать объект детали реализована в отдельной, ее собственной карточке, по нажатию кнопки "изменить", как собственно и в большинстве деталей.

Деталь с редактируемым реестром это сложная разработка примером которой является деталь "Деталь графика поставок и оплат" (SupplyPaymentDetailV2), и ее вспомогательные схемы в пакете "Passport".

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

P.S.
Всю информацию по использованию мастеров и дизайнеров вы можете найти в SDK
http://academy.terrasoft.ru/documents/?product=SDK&ver=7.6.0

Нет, вопрос в том "Как создать деталь с редактируемым реестром?" с обычными деталями проблем нет и про изменить я ничего не писал, страницу регестрировал что бы проверить работает ли сама деталь, потом ее удалил (и из БД) так как нужна именно деталь с редактируемым реестром.
Так подскажите как создать деталь с редактируемым реестром? На примере детали "Продукт в заказе" (смотрел в omnichanel) не разобрался.

С версии продукта и стоило начинать, да, в omnichanel эту деталь сделали редактируемой.
Для того, чтобы сделать реестр детали редактируемым, в соответствующей схеме необходимо:
- добавить зависимости от модулей ConfigurationGrid (Конфигурационный реестр), ConfigurationGridGenerator, ConfigurationGridUtilities,
- подключить "миксин" ConfigurationGridUtilites,
- установить аттрибут IsEditable в значение true
- базовому реестру указать свойства:
className: "Terrasoft.ConfigurationGrid",
generator: "ConfigurationGridGenerator.generatePartial",
generateControlsConfig: {bindTo: "generateActiveRowControlsConfig"},
changeRow: {bindTo: "changeRow"},
unSelectRow: {bindTo: "unSelectRow"},
onGridClick: {bindTo: "onGridClick"},
initActiveRowKeyMap: {bindTo: "initActiveRowKeyMap"},
для добавления действий активной записи добавить:
activeRowActions: [...],
activeRowAction: {bindTo: "onActiveRowAction"}

Зависимости нужно указать не только параметром requirejs но и в настройках схемы, в конфигураторе.
Итоговый код простейшей редактируемой детали будет выглядеть следующим образом:

define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator",
		"ConfigurationGridUtilities"], function() {
	return {
		entitySchemaName: "Contact",
		attributes: {
			"IsEditable": {
				dataValueType: Terrasoft.DataValueType.BOOLEAN,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: true
			}
		},
		details: {},
		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
					}
				}
			],
		mixins: {
			ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities",
			OrderUtilities: "Terrasoft.OrderUtilities"
		},
		methods: {}
	};
});

Максим, спасибо, получилось.

"Щиголь Максим" написал:

Здравствуйте, Максим. Подскажите пожалуйста в процессе к детали нужно просто вписать код и всё она заработает, конечно изменив при этом версию схемы детали? Просто в программировании не разбираюсь, пока что. Создал деталь и у неё реестр должен быть редактированным. По возможности схожим с деталью график поставок и оплаты.
Версия bpm'online sales enterprise 7.6

Не совсем понятно, что вы подразумеваете под фразой "в процессе к детали", возможно, вы хотели сказать "в схеме детали". Код конечно, нельзя взять прямо из этой темы, но можно писать по примеру и подобию.
Как минимум на строчке
entitySchemaName: "Contact",
вместо контакта, вам нужно будет указать ваш объект, на основе которого сделана схема вашей детали.

В общем, да, алгоритм достаточно прост, но знания по разработке в bpm'online все же понадобятся. Хотя бы на уровне реализации более простых кейсов из академии. Если в процессе реализации у вас возникнут другие вопросы, пишите, постараемся ответить.

"Щиголь Максим" написал:

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

Как минимум на строчке

entitySchemaName: "Contact",

вместо контакта, вам нужно будет указать ваш объект, на основе которого сделана схема вашей детали.

В общем, да, алгоритм достаточно прост, но знания по разработке в bpm'online все же понадобятся. Хотя бы на уровне реализации более простых кейсов из академии. Если в процессе реализации у вас возникнут другие вопросы, пишите, постараемся ответить.


Да ошибся, извините. Нашёл схему и прописал код, который вы прикрепляли и нужные изменения сделал. Всё заработало спасибо!

Хотел сделать то же самое с деталью продукты в Лиде. Только там чёрт ногу сломит. Добавил данный код, добавил всё чего не хватало, но сама делать теперь не отображается. Код довольно громоздкий. Помогите пожалуйста разобраться с ним

define("LeadProductDetailV2", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities", "configurationEnums"],
function(configurationEnums, ConfigurationGrid, ConfigurationGridGenerator, ConfigurationGridUtilities) {
return {
entitySchemaName: "LeadProduct",
attributes: {
"IsEditable": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: true
}
},
details: {},
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
}
}
],
mixins: {
ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities",
OrderUtilities: "Terrasoft.OrderUtilities"
},
//данный кусочек был добавлен:smile:
methods: {
/**
* Возвращает колонки, которые всегда выбираются запросом
* @return {Object} Возвращает массив объектов-конфигураций колонок
*/
getGridDataColumns: function() {
return {
"Id": {path: "Id"},
"Product": {path: "Product"},
"Product.Name": {path: "Product.Name"}
};
},

/**
* Открывает справочник продуктов
* @private
*/
openProductLookup: function() {
var config = {
entitySchemaName: "Product",
multiSelect: true,
columns: ["Name", "Price", "Currency"]
};
var leadId = this.get("MasterRecordId");
if (this.Ext.isEmpty(leadId)) {
return;
}
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: this.entitySchemaName
});
esq.addColumn("Id");
esq.addColumn("Product.Id", "ProductId");
esq.filters.add("filterLead", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Lead", leadId));
esq.getEntityCollection(function(result) {
var existsProductsCollection = [];
if (result.success) {
result.collection.each(function(item) {
existsProductsCollection.push(item.get("ProductId"));
});
}
if (existsProductsCollection.length > 0) {
var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
existsProductsCollection);
existsFilter.comparisonType = this.Terrasoft.ComparisonType.NOT_EQUAL;
existsFilter.Name = "existsFilter";
config.filters = existsFilter;
}
this.openLookup(config, this.addCallBack, this);
}, this);
},

/**
* @overridden
*/
onCardSaved: function() {
this.openProductLookup();
},

/*
* Открывает справочник продуктов в случае если карточка лида была ранее сохранена
* @overridden
* */
addRecord: function() {
var masterCardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]);
var isNewRecord = (masterCardState.state === configurationEnums.CardStateV2.ADD ||
masterCardState.state === configurationEnums.CardStateV2.COPY);
if (isNewRecord === true) {
var args = {
isSilent: true,
messageTags: [this.sandbox.id]
};
this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
return;
}
this.openProductLookup();
},

/*
* Добавление выбраных продуктов
* @private
* */
addCallBack: function(args) {
var bq = this.Ext.create("Terrasoft.BatchQuery");
var leadId = this.get("MasterRecordId");
this.selectedRows = args.selectedRows.getItems();
this.selectedItems = [];
this.selectedRows.forEach(function(item) {
item.LeadId = leadId;
item.ProductId = item.value;
bq.add(this.getProductInsertQuery(item));
this.selectedItems.push(item.value);
}, this);
if (bq.queries.length) {
this.showBodyMask.call(this);
bq.execute(this.onProductInsert, this);
}
},

/*
* Возвращает запрос на добавление продукта
* @param item {Object} идентификатор лида и выбранный в справочнике продукт {LeadId, value}
* @private
* */
getProductInsertQuery: function(item) {
var insert = Ext.create("Terrasoft.InsertQuery", {
rootSchemaName: this.entitySchemaName
});
insert.setParameterValue("Lead", item.LeadId, this.Terrasoft.DataValueType.GUID);
insert.setParameterValue("Product", item.ProductId, this.Terrasoft.DataValueType.GUID);
return insert;
},

/*
* Загрузка добавленых продуктов в реестр
* @private
* */
onProductInsert: function(response) {
this.hideBodyMask.call(this);
this.beforeLoadGridData();
var filterCollection = [];
response.queryResults.forEach(function(item) {
filterCollection.push(item.id);
});
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: this.entitySchemaName
});
this.initQueryColumns(esq);
esq.filters.add("recordId", Terrasoft.createColumnInFilterWithParameters("Id", filterCollection));
esq.getEntityCollection(function(response) {
this.afterLoadGridData();
if (response.success) {
var responseCollection = response.collection;
this.prepareResponseCollection(responseCollection);
this.getGridData().loadAll(responseCollection);
}
}, this);
},

/*
* Удаление выбранных записей
* @overridden
* */
deleteRecords: function() {
var selectedRows = this.getSelectedItems();
if (selectedRows.length > 0) {
this.set("SelectedRows", selectedRows);
this.callParent(arguments);
}
},

/**
* @inheritdoc Terrasoft.BaseGridDetailV2#getCopyRecordMenuItem
* @overridden
*/
getCopyRecordMenuItem: Terrasoft.emptyFn,

/**
* @inheritdoc Terrasoft.BaseGridDetailV2#getEditRecordMenuItem
* @overridden
*/
getEditRecordMenuItem: Terrasoft.emptyFn,

/**
* @inheritdoc Terrasoft.GridUtilitiesV2#getFilterDefaultColumnName
* @overridden
*/
getFilterDefaultColumnName: function() {
return "Product";
}
},
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "DataGrid",
"values": {
"rowDataItemMarkerColumnName": "Product"
}
},
{
"operation": "merge",
"name": "AddRecordButton",
"values": {
"visible": {"bindTo": "getToolsVisible"}
}
}
]/**SCHEMA_DIFF*/
};
}
);

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

Во вторых миксин OrderUtilities: "Terrasoft.OrderUtilities" тут наверно лишний.
Вот у меня получилось в лидах сделать эту деталь редактируемой, почитайте:

define("LeadProductDetailV2", ["ConfigurationEnums", "ConfigurationGrid", "ConfigurationGridGenerator",
		"ConfigurationGridUtilities"],
	function(configurationEnums) {
		return {
			entitySchemaName: "LeadProduct",
			methods: {
			},
			mixins: {
				ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
			},
			attributes: {
         		"IsEditable": {
            	dataValueType: Terrasoft.DataValueType.BOOLEAN,
            	type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
            	value: true
         		}
      		},
			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*/
		};
	}
);

Здравствуйте.
Пытаюсь добавить деталь в карточку контакт, которая бы хранила информацию о купленых товаров этим контактом.
Сделал как на фото, но почемуто ничего не отобразилось и написало что такая деталь не зарегистрирована. Может я не те поля выбираю или что нужно сделать чтобы продукты появились и их прямо в карточке можна добавлять (как в лидах). Спасибо.

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

Вам необходимо корректно связать деталь с разделом:
В Вашем случае, необходимо, что бы в значении "Колонка детали" была выбрана колонка справочного типа "Контакт"

подробнее про добавление детали по ссылке:
http://academy.terrasoft.ru/documents/docs/product/bpm'online%20sales/t…

создание детали:
http://academy.terrasoft.ru/documents/docs/product/bpm'online%20sales/t…

Это мне нужно создать новую деталь? Просто в "Колонка детали" нету "Контакт"...

Вы можете создать новый объект для справочника, а можете добавить данную колонку в уже существующий объект детали, укажите тип данных - "Справочник", выберите объект справочника -"Контакт"

"Липатов Юрий Сергеевич" написал:

Вы можете создать новый объект для справочника, а можете добавить данную колонку в уже существующий объект детали, укажите тип данных - "Справочник", выберите объект справочника -"Контакт"

Не совсем понимаю про какой обьект детали идет речь? Можете написать более детальнее?

Пожалуйста, обратите внимание на ссылки, которые я Вам написал выше:

"Липатов Юрий Сергеевич" написал:

создание детали:

http://academy.terrasoft.ru/documents/docs/product/bpm'online%20sales/team/7.7.0/BPMonlineHelp/chapter_detail_wizard/chapter_detail_wizard.htm

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