Не работает changeDetailSubscribeByName

Здравствуйте! Появилась небольшая проблема.

Версия 7.1.0.473

{
                                        name: 'magazineInOpp',
                                        schemaName: 'UsrMagazineInOppDetail',
                                        type: Terrasoft.ViewModelSchemaItem.DETAIL,
                                        filterPath: 'UsrOpportunity',
                                        filterValuePath: 'Id',
                                        caption: 'Выпуски',
                                        visible: true,
                                        leftWidth: '60%',
                                        rightWidth: '40%',
                                        wrapContainerClass: 'control-group-container'
                                       
                                }

...
                        this.methods.init = function() {
                                var typeValue = {displayValue: 'xxxxxxxx', value: '2A5A7645-59E6-DF11-971B-001D60E938C6'};
                                this.set('Type', typeValue);
                               
                                this.changeDetailSubscribeByName('magazineInOpp', function() {
                                        var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
                                                rootSchemaName: 'UsrMagazineInOpp'
                                        });
                                        esq.addColumn('PrimaryAmount');
                                        esq.getEntity(this.get('Id'), function(response) {
                                                if (response.success) {
                                                        var entity = response.entity;
                                                        if (entity) {
                                                                this.set('PrimaryAmount', entity.get('PrimaryAmount'));
                                                                this.RecalcAmount();
                                                        }
                                                }
                                        }, this);
                                });
                        };

После добавление записи на деталь magazineInOpp ничего не происходит. Управление в changeDetailSubscribeByName не приходит. В чем может быть дело??

Нравится

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

Акмаль, добрый день.

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

Максим, а что значит "должна реализовывать CardModule"?

Вот код детали:

define('UsrMagazineInOppDetail', ['ext-base', 'sandbox', 'terrasoft', 'UsrMagazineInOpp', 'UsrMagazineInOppDetailStructure',
	'UsrMagazineInOppDetailResources', 'LookupUtilities'],
	function (Ext, sandbox, Terrasoft, UsrMagazineInOpp, structure, resources, LookupUtilities) {
 
		structure.userCode = function () {
			this.entitySchema = UsrMagazineInOpp;
			this.name = 'OpportunityDetailViewModel';
			this.editPageName = 'UsrMagazineInOppPage';
			this.columnsConfig = [
				{
					cols: 10,
					key: [
						{
							name: {
								bindTo: 'UsrMagazine'
							}
						}
					]
				},
				{
					cols: 8,
					key: [
						{
							name: {
								bindTo: 'UsrOpportunity'
							}
						}
					]
				}
			];
			this.loadedColumns = [
				{
					columnPath: 'UsrMagazine'
				}, {
					columnPath: 'UsrOpportunity'
				}
			];
			this.editPages = [
				{
					caption: 'Добавить выпуски',
					name: 'addMagazineItem',
					UId: '',
					bindTo: 'addMagazine'
				}
			];
 
 
			this.methods.addMagazine = function() {
				this.add(null, function() {
					var config = {
						entitySchemaName: 'UsrMagazine',
						multiSelect: true,
						columns: ['UsrCaption']
					};
					LookupUtilities.ThrowOpenLookupMessage(sandbox, config, this.addCallBack, this,
						this.getCardModuleSandboxId());
				});
			};
			this.methods.addCallBack = function(args) {
				var bq = Ext.create('Terrasoft.BatchQuery');
				var oppId = this.filterValue;
				this.selectedRows = args.selectedRows.getItems();
				this.selectedItems = [];
				this.selectedRows.forEach(function(item) {
					item.UsrOpportunityId = oppId;
					bq.add(this.getMagazineInsertQuery(item));
					this.selectedItems.push(item.value);
				}, this);
				if (bq.queries.length) {
					bq.execute(this.onContactInsert, this);
				}
			};
 
			this.methods.getMagazineInsertQuery = function(item) {
				var insert = Ext.create('Terrasoft.InsertQuery', {
					rootSchemaName: 'UsrMagazineInOpp'
				});
				insert.setParameterValue('UsrMagazine', item.value, Terrasoft.DataValueType.GUID);
				insert.setParameterValue('UsrOpportunity', item.UsrOpportunityId, Terrasoft.DataValueType.GUID);
				return insert;
			};
 
			this.methods.onContactInsert = function() {
				this.isClearGridData = true;
				this.load();
			};
 
		};
 
		return structure;
	});

Кстати, заметил, что управление приходит в changeDetailSubscribeByName при удалении записи детали...

Акмаль, видимо забыли исправить строку:
structure.userCode = function () {
this.entitySchema = UsrMagazineInOpp;
this.name = 'OpportunityDetailViewModel';
...

А "должна реализовывать CardModule" означает, что страница, на которой размещена деталь должна быть схемой представления страницы редактирования (в разделе "Конфигурация" при добавлении схемы выбирается).
Если после исправления опечатки ошибка не исправится, прошу предоставить полный код страницы, на которой деталь расположена.

Андрей, исправил - ничего не изменилось..

Вот код страницы (взято из дебаггера):

var core = require("core");
core.setModuleDescriptor('Opportunity', {path: "../../configuration/entityschema/72764ea448d4329b849e4066b9ad295e"});
core.setModuleDescriptor('GeneralDetails', {path: "../../configuration/8ec08beafecb6ebfc8ec16878fbe6342"});
core.setModuleDescriptor('BusinessRuleModule', {path: "../../configuration/f39269e10ccc645de933bc1398b43ace"});
core.setModuleDescriptor('BaseFiltersGenerateModule', {path: "../../configuration/d1ede5cb3dc78d453a16b11a8f367b0e"});
core.setModuleDescriptor('ConfigurationConstants', {path: "../../configuration/9c278fb714b211a4cb255b8c5e218968"});
core.setModuleDescriptor('UsrOpportunity1PageResources', {path: "../../configuration/ca1d896c770f13ec6f9cd8d87fa0013f"});
define('UsrOpportunity1PageResources', ['terrasoft'], function(Terrasoft) {
var localizableStrings={
	RevenueGroupTitle: 'Доход',
	SourceGroupTitle: 'Источник',
	DueGroupTitle: 'Закрытие',
	ContactAccountRequire: 'Заполнение одного из полей \"Контрагент\"" или \""Контакт\"" является обязательным.'

Здравтсвуйте, Акмаль!
Обнаружил, что у нас есть бэкап этой БД. Проверил - подписка на изменение детали работает, но у Вас есть еще ошибка в changeDetailSubscribeByName. Этот методы выполняется в контексте страницы "UsrOpportunity1Page", таким образом

this.get('Id')

вернет Id продажи, а запрос строится к объекту "UsrMagazineInOpp", поэтому, если Вы ставите точку останова после проверки результата запроса, она не сработает, так как условие response.success будет false. К тому же, у "UsrMagazineInOpp" нет колонки "PrimaryAmount".

И кстати, почему бы Вам до 7.2 не обновиться? Есть же пакет перехода.

"Андрей Каспаревич" написал:Здравтсвуйте, Акмаль!
Обнаружил, что у нас есть бэкап этой БД. Проверил - подписка на изменение детали работает, но у Вас есть еще ошибка в changeDetailSubscribeByName. Этот методы выполняется в контексте страницы "UsrOpportunity1Page", таким образом
this.get('Id')

вернет Id продажи, а запрос строится к объекту "UsrMagazineInOpp", поэтому, если Вы ставите точку останова после проверки результата запроса, она не сработает, так как условие response.success будет false. К тому же, у "UsrMagazineInOpp" нет колонки "PrimaryAmount".

Андрей, код внутри changeDetailSubscribeByName стоял тестовый. И даже если сделать так:

			this.methods.init = function() {
				var typeValue = {displayValue: 'Продажа подписки', value: '2A5A7645-59E6-DF11-971B-001D60E938C6'};
				this.set('Type', typeValue);
				this.changeDetailSubscribeByName('magazineInOpp', function() {
					 var a = 'aaa';
				});
				//this.set('UsrCount', 10);
			};

управление не приходит в changeDetailSubscribeByName после добавления записи на деталь.

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

Вопрос решился добавлением

this.sandbox.publish('DetailChanged', [this.sandbox.id, null]);

после кастомного добавления записи.

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