Деталь с полями
Технические вопросы
7.x

Деталь с полями

Здравствуйте! У меня есть деталь с полями "Застрахование лица" с одним типом данных. При первой загрузке страницы на который расположена деталь вылетает ошибка в DetailViewModelGenerator на строке: itemViewModelConfig.columns[entitySchema.primaryColumn.name]. и entitySchema = undefined. Если нажать обновить страница деталь раскрывается нормально. Ошибка вылетает только при первому переходе на эту страницу. Подскажите пожалуйста в чем проблема и как ее решить. Спасибо.

Нравится

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

Здравствуйте, Владимир!
Попробуйте явно в коде детали указать entitySchema, как, например, в детали "Участники активности":

define('ActivityParticipantDetail', ['ext-base', 'terrasoft', 'sandbox', 'ActivityParticipant',
'ConfigurationConstants', 'ActivityParticipantDetailStructure', 'ActivityParticipantDetailResources',
'LookupUtilities'], function(Ext, Terrasoft, sandbox, ActivityParticipant, ConfigurationConstants, structure,
resources, LookupUtilities) {

structure.userCode = function() {
this.entitySchema = ActivityParticipant;
this.name = 'ActivityParticipantDetailViewModel';
...

А также добавить объект детали в зависимости:

Это у меня уже било сделано. Также я пробовал вручную прописывать entitySchema.
if(!InsuredPerson) {
InsuredPerson = Terrasoft.decode("{\"initialConfig\"":{}

Вот код моей детали с полями:

define('UsrInsuredPersonDetail', ['ext-base', 'terrasoft', 'UsrInsuredPerson', 'UsrInsuredPersonDetailStructure',
'UsrInsuredPersonDetailResources'], function(Ext, Terrasoft, UsrInsuredPerson, structure, resources) {

var filterSchemaName;

var getContainerConfig = function(id, styles) {
var container = {
className: 'Terrasoft.Container',
items: [],
id: id,
selectors: {wrapEl: '#' + id}
};
if (styles) {
container.classes = {wrapClassName: styles};
}
return container;
};

structure.userCode = function() {

this.entitySchema = UsrInsuredPerson;
this.name = 'UsrInsuredPersonDetailViewModel';
filterSchemaName = 'Document';

this.name = 'UsrInsuredPersonDetailViewModel';
//this.primaryColumnName = "UsrInsuredPersonField";
this.methods.getCustomItemView = function(viewModel, itemKey, action,types) {

Terrasoft.each(types, function(item) {
item.click = {
bindTo: 'myTypeChanged'
};
});
var columns = viewModel.attributes;
var UsrInsuredPerson = columns[0];

var viewConfig; // = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class');
switch (action) {
case 'add':
case 'copy':
case 'edit':
//var titleConfig = getContainerConfig(itemKey + '-title', 'controlCaption');
viewConfig = getContainerConfig(itemKey + '-view');
var valueConfig = getContainerConfig(itemKey + '-value');

var deleteButtonConfig = {
id: itemKey + '-delete',
className: 'Terrasoft.Button',
classes: {
wrapperClass: 'detail-delete-btn-user-class'
},
imageConfig: resources.localizableImages.DeleteIcon,
style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
selectors: {
wrapEl: '#' + itemKey + '-delete'
},
click: {
bindTo: 'delete'
},
width: '10%'

};

var editConfig = {
id: itemKey + '-edit',
className: 'Terrasoft.TextEdit',

markerValue: UsrInsuredPerson.name,
value: {
bindTo: UsrInsuredPerson.name
},

classes: {
wrapperClass: 'detail-delete-btn-user-class'
},
// style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
selectors: {
wrapEl: '#' + itemKey + '-delete'
}

};

//titleConfig.items.push(deleteButtonConfig);
valueConfig.items.push(deleteButtonConfig,editConfig);
viewConfig.items.push(valueConfig);
break;

case 'view':
viewConfig = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class');

var valueLabel = {
className: 'Terrasoft.Label',
caption: {
bindTo: UsrInsuredPerson.name,
bindConfig: {converter: Terrasoft.getTypedStringValue}
}

};

viewConfig.items.push(valueLabel);
break;
}

return viewConfig;

};

this.loadedColumns = [
{
columnPath: 'Id'
}, {
columnPath: 'UsrInsuredPersonField'
},{
columnPath: 'UsrDocument'
}
];

this.name = 'UsrInsuredPersonDetailViewModel';
this.parentColumnPath = 'Id';
this.filterColumnPath = filterSchemaName;
this.attributes = [{
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'UsrInsuredPersonField',
columnPath: 'UsrInsuredPersonField',
dataValueType: Terrasoft.DataValueType.TEXT,
isRequired: true
},{
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'UsrDocument',
columnPath: 'UsrDocument',
dataValueType: Terrasoft.DataValueType.LOOKUP
}
];

};
return structure;
});

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

BPM Online 7.2.0.1002.

Деталь расположена на ContractPage.
Переход на эту страницу осуществляется в моем HomeDocumentSection.

Владимир, а при переходе просто из раздела "Документы" нормально работает?

Да, при переходе просто из раздела "Документы" работает нормально.
А при переходи из моего HomeDocumentSection работает нормально только после перегрузки страницы.

Здравствуйте, Владимир!
В таком случае, скорее всего, при переходе не из раздела не инициализируется объект или страница детали.
Попробуйте добавить и то, и другое в блок "Dependencies" страницы "ContractPage".

Добавил, но это не помогло осталась та же ошибка.

Владимир, попробовал воспроизвести ошибку. Выполнил следующее:
1. Добавил объект детали:

2. Добавил страницу детали. Код:
[javascript]
define('UsrInsuredPersonDetail', ['ext-base', 'terrasoft', 'UsrInsuredPerson', 'UsrInsuredPersonDetailStructure',
'UsrInsuredPersonDetailResources'], function(Ext, Terrasoft, UsrInsuredPerson, structure, resources) {
var filterSchemaName;
var getContainerConfig = function(id, styles) {
var container = {
className: 'Terrasoft.Container',
items: [],
id: id,
selectors: {wrapEl: '#' + id}
};
if (styles) {
container.classes = {wrapClassName: styles};
}
return container;
};

structure.userCode = function() {

this.entitySchema = UsrInsuredPerson;
this.name = 'UsrInsuredPersonDetailViewModel';
filterSchemaName = 'Document';
this.methods.getCustomItemView = function(viewModel, itemKey, action,types) {

Terrasoft.each(types, function(item) {
item.click = {
bindTo: 'myTypeChanged'
};
});
var columns = viewModel.attributes;
var UsrInsuredPerson = columns[0];

var viewConfig; // = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class');
switch (action) {
case 'add':
case 'copy':
case 'edit':
//var titleConfig = getContainerConfig(itemKey + '-title', 'controlCaption');
viewConfig = getContainerConfig(itemKey + '-view');
var valueConfig = getContainerConfig(itemKey + '-value');

var deleteButtonConfig = {
id: itemKey + '-delete',
className: 'Terrasoft.Button',
click: {
bindTo: 'delete'
}
};

var editConfig = {
id: itemKey + '-edit',
className: 'Terrasoft.TextEdit',
markerValue: UsrInsuredPerson.name,
value: {
bindTo: UsrInsuredPerson.name
}
};

valueConfig.items.push(deleteButtonConfig,editConfig);
viewConfig.items.push(valueConfig);
break;

case 'view':
viewConfig = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class');

var valueLabel = {
className: 'Terrasoft.Label',
caption: {
bindTo: UsrInsuredPerson.name,
bindConfig: {converter: Terrasoft.getTypedStringValue}
}

};

viewConfig.items.push(valueLabel);
break;
}

return viewConfig;

};

this.loadedColumns = [
{
columnPath: 'Id'
}, {
columnPath: 'UsrInsuredPersonField'
},{
columnPath: 'UsrDocument'
}
];
this.parentColumnPath = 'Id';
this.filterColumnPath = filterSchemaName;
this.attributes = [{
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'UsrInsuredPersonField',
columnPath: 'UsrInsuredPersonField',
dataValueType: Terrasoft.DataValueType.TEXT,
isRequired: true
},{
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'UsrDocument',
columnPath: 'UsrDocument',
dataValueType: Terrasoft.DataValueType.LOOKUP
}
];

};
return structure;
});
[/javascript]
На странице добавил в Dependencies объект детали, назвал зависимость по имени объекта - "UsrInsuredPerson".
3. Заместил ContractPage и добавил объект "UsrInsuredPerson" в Dependencies. Код замещающей страницы:
[javascript]
define('ContractPage', ['ext-base', 'terrasoft','sandbox', 'ContractPageStructure','ContractPageResources', 'BusinessRuleModule','ConfigurationEnums'],
function(Ext, Terrasoft,sandbox, structure, resources, BusinessRuleModule,ConfigurationEnums) {
structure.userCode = function() {
this.schema.leftPanel.push({
name: 'UsrInsuredPerson',
schemaName: 'UsrInsuredPersonDetail',
type: Terrasoft.ViewModelSchemaItem.DETAIL,
filterPath: 'UsrDocument',
filterValuePath: 'Id',
caption: 'insured person',
leftWidth: '60%',
collapsed: false,
rightWidth: '40%',
wrapContainerClass: 'control-group-container',
visible: true
});
this.methods.init = function() {
this.setReadOnlyDetails(['UsrInsuredPerson'], true);

};
};
return structure;
});
[/javascript]
4. Пробую воспроизвести путем перехода на страницу редактирования документа напрямую, то есть чищу кэш, вставляю в адресную строку браузера строку вида "http://localhost:7201/0/Nui/ViewModule.aspx#CardModule/ContractPage/edi…" и все загружается без проблем.
Может я что-то упустил при воспроизведении?

Я уже нашел ошибку. Ошибка была в моем HomeDocumentSection с которого осуществляется переход на страницу где расположена деталь. Спасибо за помощь.

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