Здравствуйте! У меня есть деталь с полями "Застрахование лица" с одним типом данных. При первой загрузке страницы на который расположена деталь вылетает ошибка в 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. Добавил страницу детали. Код:

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;
});

На странице добавил в Dependencies объект детали, назвал зависимость по имени объекта - "UsrInsuredPerson".
3. Заместил ContractPage и добавил объект "UsrInsuredPerson" в Dependencies. Код замещающей страницы:

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;
    });

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

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

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