Доброго времени суток, коллеги! Возникла потребность в очистке БД, объем перевалил за 700гб. Подскажите пожалуйста, из каких таблиц можно удалить записи, чтобы не затронуть общий функционал среды. До этого пробовали удалит из таблицы, где хранятся логи (SysLog, 120 гб), но доступного пространства не увеличилось на 120 гб, а всего лишь на 30 гб. Можно ли использовать shrink? Как правильно сделать оптимизацию БД? 

Нравится

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

Добрый день, Адлет.

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

Ещё рекомендую посмотреть эту статью на Академии.

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

Добрый день. 

 

1. Нужно сделать такую фичу: Есть текстовое поле в объекте, в нем будет записан номер телефона. Нужно добавить возможность при клике на это поле чтобы к номеру который записан, поставился префикс(сам префикс нужно подставить из значения справочника, которое указано в этой же записи в объекте и чтобы пошел вызов уже на телефонию с номером и префиком. То есть нужно сделать поле типа https://prnt.sc/674k8tmq1urH и возможность склеивать с префиксом. Какие стили нужно добавить на поле с номером телефона, чтобы в нем появилась возможность звонка? И какой метод, чтобы склеивать номер после клика на звонок? Есть пример документации или реализации?

 

2. Такая же задача, только для миникарточки клиента https://prnt.sc/sjPhFjMk58Jm Какой метод и схему нужно переопределить, чтобы добавить в миникарточку возможность подставить в номер префикс и отправить запрос на звонок уже с подставленным префиксом к номеру.



Это все относиться к телефонии Asterisk. 

Спасибо!

Нравится

2 комментария
Лучший ответ

Добрый день!

Для первой задачи в diff (в схеме ContactPageV2) для вашего поля нужно добавить следующее параметры:

"values": {
					"showValueAsLink": true,
					"linkclick": {
						"bindTo": "onCallClickWithPrefix"
					},
					"href": {
        				"bindTo": "UsrTestReq",
        				"bindConfig": {"converter": "getUsrTestReqLink"}
					},

При этом в методах нужно добавить:

getUsrTestReqLink: function(value) {
				return {
					url: value,
					caption: value
				};
			},
			onCallClickWithPrefix: function(number) {
				/*
					Getting the needed prefix;
					var prefix = ---
				*/
				number = 'prefix' + number;
				return this.callContact(number, this.$Id, this.$Account);
			}

Для второй задачи рекомендую обратить внимание на уже имеющуюся кнопку звонка в схеме ContactMiniPage пакета CrtUIv2:

{
				"operation": "insert",
				"name": "ContactButtonsContainer",
				"parentName": "HeaderContainer",
				"propertyName": "items",
				"values": {
					"visible": {"bindTo": "isViewMode"},
					"wrapClass": ["header-buttons"],
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"items": [
						{
							"name": "CurrentContactCallButton",
							"itemType": Terrasoft.ViewItemType.BUTTON,
							"imageConfig": miniPageResources.resources.localizableImages.CallButtonImage,
							"extendedMenu": {
								"Name": "Call",
								"PropertyName": "CurrentContact",
								"Click": {"bindTo": "prepareCallButtonMenu"}
							}
						},

При нажатии на номер срабатывает метод extendedCallMenuItemClick схемы CallExtendedMenu, который и вызывает событие звонка через this.sandbox.publish("CallCustomer"

Если вы хотите при нажатии на вашу колонку совершать звонок, то необходимо реализовать похожую логику.

Добрый день!

Для первой задачи в diff (в схеме ContactPageV2) для вашего поля нужно добавить следующее параметры:

"values": {
					"showValueAsLink": true,
					"linkclick": {
						"bindTo": "onCallClickWithPrefix"
					},
					"href": {
        				"bindTo": "UsrTestReq",
        				"bindConfig": {"converter": "getUsrTestReqLink"}
					},

При этом в методах нужно добавить:

getUsrTestReqLink: function(value) {
				return {
					url: value,
					caption: value
				};
			},
			onCallClickWithPrefix: function(number) {
				/*
					Getting the needed prefix;
					var prefix = ---
				*/
				number = 'prefix' + number;
				return this.callContact(number, this.$Id, this.$Account);
			}

Для второй задачи рекомендую обратить внимание на уже имеющуюся кнопку звонка в схеме ContactMiniPage пакета CrtUIv2:

{
				"operation": "insert",
				"name": "ContactButtonsContainer",
				"parentName": "HeaderContainer",
				"propertyName": "items",
				"values": {
					"visible": {"bindTo": "isViewMode"},
					"wrapClass": ["header-buttons"],
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"items": [
						{
							"name": "CurrentContactCallButton",
							"itemType": Terrasoft.ViewItemType.BUTTON,
							"imageConfig": miniPageResources.resources.localizableImages.CallButtonImage,
							"extendedMenu": {
								"Name": "Call",
								"PropertyName": "CurrentContact",
								"Click": {"bindTo": "prepareCallButtonMenu"}
							}
						},

При нажатии на номер срабатывает метод extendedCallMenuItemClick схемы CallExtendedMenu, который и вызывает событие звонка через this.sandbox.publish("CallCustomer"

Если вы хотите при нажатии на вашу колонку совершать звонок, то необходимо реализовать похожую логику.

добрый день.

спасибо за помощь. мы делаем изменения на странице заказов Order и там нету метода 

this.callContact

можете подсказать как получить его в заказе или другой способ?

спасибо!

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

Добрый день! 

 

Просьба подсказать, как в коде делать проверку, входит ли пользователь в список пользователи/роли, который описан в "Доступ по операциям" и привязать эту проверку при нажатии на кнопку. Если нужно в какой-то момент выдать права на кнопку определенному сотруднику, то можно просто добавить в список и проверка будет отработает.

Нравится

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

Добрый день!



Мы проверяем в момент открытия страницы, заполняя атрибут.

А потом уже этот атрибут используем, например, в бизнес-правилах



 

RightUtilities.checkCanExecuteOperation({operation: "UsrCanReadSomething"}, function(result) {
					this.set("UsrCanReadSomething", result);
				}, this);

 

Владимир Соколов,

Спасибо большое! 

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

Кожен раз при компіляції, з'являється вікно з повідомленням, що доступ до файлу web.config у папці Terrasoft.WebApp заборонено. З чим це може бути пов'язано?

Нравится

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

Добрий день!



Уточніть будь ласка, де розгорнутий сайт (локально чи в cloud)?

Bogdan,

cloud

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

Добрый день. Коллеги подскажите как изменить кол-во знаков после запятой до 4 в сводной таблице? На текущий момент отображается только 2 хотя колонки в объекте содержат 4 знака после запятой.

Изображение удалено.

Нравится

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

Добрый день. 



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



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



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



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

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

Добрый день!



Хочу отобразить коллекцию в деталь, без сохранения в бд.

Есть коллекция Collection состоящая из полей из разных обьектов, мне удалось ее заполнить данными, но столкнулся с проблемой при заполнении через this.getGridData(), который переопределил, при вызове деталь не заполняется данными.



entitySchemaName: "AllParentImplementationsByService" - обьект с проставленным Поведение->виртуальный, думал это поможет но нет



Как корректно сделать вставку этой коллекции в GridData детали?



Предоставляю мою схему детали :

define("AllParentImplementationsByService_Detail", [
	"ConfigurationGrid",
	"ConfigurationGridGenerator",
	"ConfigurationGridUtilities",
	"ProcessModuleUtilities"
],
	function (
		ProcessModuleUtilities
	) {
		return {
			entitySchemaName: "AllParentImplementationsByService",
			modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
			dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
			mixins: {
				ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities",           	
			},
			businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
			attributes: {
				IsGridEmpty: {
					dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
					value: true
				},
				/**
				* Grid data collection.
				* @type {Terrasoft.BaseViewModelCollection}
				*/
				Collection: {
					dataValueType: Terrasoft.DataValueType.COLLECTION,
					value: this.Ext.create("Terrasoft.BaseViewModelCollection")
				},
				CaseId: {
					dataValueType: Terrasoft.DataValueType.GUID,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "Id"
				},
				CaseNumber: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "CaseNumber" // Номер
				},
				CaseSymptoms: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "CaseSymptoms" //Описание
				},
				TcName: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "TcName" // Тех.карта процесса
				},
				AccountAddress: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "AccountAddress" // Адрес контрагента
				},
				CasereatedOn: {
					dataValueType: Terrasoft.DataValueType.DATE_TIME,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "CasereatedOn" // Дата регистраци
				}
			},
			messages: {},
			details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
			methods: {
				init: function () {
					this.callParent(arguments);
					this.callAllParentImplementationsByServiceProvisionService();
				},
 
				onEntityInitialized: function () {
					this.callParent(arguments);
				},
 
				callAllParentImplementationsByServiceProvisionService: function () {
					this.showBodyMask({
						caption: "callAllParentImplementationsByServiceProvisionService"
					});
					let config = this.getAllParentImplementationsByServiceProvisionServiceConfig();
					this.callService(config, this.allParentImplementationsByServiceProvisionServiceHandler, this);
				},
 
				getAllParentImplementationsByServiceProvisionServiceConfig: function () {
					return {
						serviceName: "AllParentImplementationsByServiceProvisionService",
						methodName: "GetAllParentImplementationsByServiceProvision",
						timeout: 300000,
						data: {
							Id: this.$MasterRecordId
						}
					};
				},
 
				allParentImplementationsByServiceProvisionServiceHandler: function (response) {
					this.hideBodyMask();
 
					var result = JSON.parse(response);
					var resultCollection = Ext.create("Terrasoft.BaseViewModelCollection");
 
					for (var i = 0; i < result.length; i++) {
						if (!result[i].ExeptionMsg) {
                          	const casereatedOnStr = result[i].CasereatedOn;
							const timestamp = parseInt(casereatedOnStr.substring(
                              casereatedOnStr.indexOf('(') + 1, casereatedOnStr.indexOf(')')));
							const date = new Date(timestamp);
							const options = { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute:'2-digit' };
							const formattedDate = date.toLocaleString(options);	
 
							var resultViewModel = Ext.create("Terrasoft.BaseViewModel", {
								values: {
									"CaseId": result[i].CaseId,
									"Number": result[i].CaseNumber,
									"Symptoms": result[i].CaseSymptoms,
									"Name": result[i].TcName,
									"AccountAddress": result[i].AccountAddress,
									"CasereatedOn" : formattedDate
								}
							});
							resultCollection.add(resultViewModel);
						} else {
                          	const casereatedOnStr = result[i].CasereatedOn;
							const timestamp = parseInt(casereatedOnStr.substring(
                              casereatedOnStr.indexOf('(') + 1, casereatedOnStr.indexOf(')')));
							const date = new Date(timestamp);
							const options = { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute:'2-digit' };
							const formattedDate = date.toLocaleString(options);
 
							var resultErrViewModel = Ext.create("Terrasoft.BaseViewModel", {
								values: {
									"CaseId": result[i].CaseId,
									"CaseNumber": result[i].CaseNumber,
									"CaseSymptoms": result[i].CaseSymptoms,
									"TcName": result[i].TcName,
									"AccountAddress": result[i].AccountAddress,
									"CasereatedOn": formattedDate,
									"ExeptionMsg": result[i].ExeptionMsg
								}
							});
							resultCollection.add(resultErrViewModel);
						}
					}
 
					this.set("IsGridEmpty", false);
					this.set("Collection", resultCollection);
					this.getGridData();
				},
 
				getGridData: function () {
					return this.get("Collection");
				},
 
				useVirtualRecord: function () {
					return true;
				},
				/**
				 * @inheritDoc BaseGridDetailV2#getCopyRecordMenuItem
				  * @override
				 */
				getCopyRecordMenuItem: this.Terrasoft.emptyFn,
 
				/**
				 * @inheritDoc BaseGridDetailV2#getEditRecordMenuItem
				 * @override
				 */
				getEditRecordMenuItem: this.Terrasoft.emptyFn,
 
				/**
				 * @inheritDoc BaseGridDetailV2#getDeleteRecordMenuItem
				 * @override
				 */
				getDeleteRecordMenuItem: Terrasoft.emptyFn,
 
				/**
				 * @inheritDoc BaseGridDetailV2#getAddRecordButtonVisible
				 * @override
				 */
				getAddRecordButtonVisible: function () {
					return false;
				},
 
				getAddTypedRecordButtonVisible: function () {
					return false;
				},
 
				getDetailCaption: function () {
					return this.get("Resources.Strings.AllParentImplementationsByServiceDetailLabel");
				}
			},
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "Container",
					"parentName": "Header",
					"propertyName": "items",
					"values": {
						"itemType": this.Terrasoft.ViewItemType.CONTAINER,
						"layout": { "column": 0, "row": 0, "colSpan": 24 },
						"items": []
					}
				},
				{
					"operation": "merge",
					"name": "DataGrid",
					"parentName": "Container",
					"propertyName": "items",
					"values": {
                      	//"generator": "Terrasoft.GridGenerator.generateGrid",
						"itemType": this.Terrasoft.ViewItemType.GRID,
						"type": this.Terrasoft.GridType.LISTED,
						"collection": "Collection",
						"isEmpty": { "bindTo": "IsGridEmpty" },
                      	"captionsConfig": []						
					}
				},
				{
					operation: "insert",
					name: "InfoButton",
					parentName: "ActionButtonsContainer",
					propertyName: "items",
					values: {
						click: { bindTo: "callAllParentImplementationsByServiceProvisionService" },
						itemType: this.Terrasoft.ViewItemType.BUTTON,
						style: this.Terrasoft.controls.ButtonEnums.style.GREEN,
						hint: { bindTo: "showHint" },
						caption: "Test",
					},
				},
			]/**SCHEMA_DIFF*/
		};
	});

 

Нравится

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

Добрый день.

Возможно есть смысл сделать представление?

Логику формирования записей сделать не в вебсервиме и отображение этой коллекции в детале. А сделать объект, который пометить как вьюха, и на SQL написать код, который будет формировать коллекцию. Тогда кроме как вьюхи никакого дополнительного кода не требуется, и будет работать стандартная логика детали.

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

Добрый день!

Есть деталь, которая строит и отображает поля с esq фильтрами и вычисляемыми полями на странице.

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

Если ли какой то способ сохранить данные поля?

Есть 4 группы полей :

    1. getPreviousValueItemConfig (Старое значение, itemType: this.Terrasoft.ViewItemType.MODEL_ITEM)

    2. getValueItemConfig (Значение, itemType: this.Terrasoft.ViewItemType.MODEL_ITEM) 

    3. getDeltaItemConfig (Дельта, itemType: this.Terrasoft.ViewItemType.MODEL_ITEM) 

    4. getLabelItemConfig 

    

    Поля строятся на основе следующего кода :

...
	methods: {
		/**
		   * Return row view config with delta and previous value columns
		   */
		  getDetailRowItemsWithVirtualColumnsViewConfig: function(item) {
			  const displayColumn = this.getValueType(item.$SpecificationType);
			  const rowViewConfig = [];
 
			  const column = this.findEntityColumn(displayColumn);
			  if (column) {
				  const columnName = column.name;
				  const dataValueType = column.dataValueType;
 
				  const containerItemConfig = {
					  itemType: this.Terrasoft.ViewItemType.GRID_LAYOUT,
					  name: columnName + "-grid-layout",
					  items: [
						  this.getValueItemConfig(columnName, dataValueType, displayColumn),
						  this.getPreviousValueItemConfig(columnName, dataValueType),
						  this.getDeltaItemConfig(columnName, dataValueType),
						  this.getLabelItemConfig(columnName)
					  ],
					  // index: 0
				  };
				  rowViewConfig.push(containerItemConfig);
			  }
 
			  return rowViewConfig;
		  },
 
		  /**
		   * Returns value type.
		   * @public
		   * @return {String} Value type.
		   */
		  getValueType: function(dataType) {
			  switch (dataType.value) {
				  case SpecificationBuilderConstants.SpecificationType.Lookup:
					  return "SpecificationListItem";
				  case SpecificationBuilderConstants.SpecificationType.Text:
					  return "TextValue";
				  case SpecificationBuilderConstants.SpecificationType.Float:
					  return "FloatValue";
				  case SpecificationBuilderConstants.SpecificationType.Integer:
					  return "IntegerValue";
				  case SpecificationBuilderConstants.SpecificationType.Boolean:
					  return "BooleanValue";
				  default:
					  return "";
			  }
		  },
 
		  /**
		   * Returns label config for row
		   * @param {String} columnName
		   * @returns {Object}
		   */
		  getLabelItemConfig: function(columnName) {
			  const labelItemConfig = {
				  itemType: this.Terrasoft.ViewItemType.LABEL,
				  id: columnName + "-label-" + this.Terrasoft.generateGUID(),
				  name: columnName + "-label-" + this.Terrasoft.generateGUID(),
				  caption: {
					  bindTo: "Caption"
				  },
				  layout: {
					  row: 0,
					  column: 0,
					  colSpan: 6,
					  rowSpan: 1
				  }
			  };
 
			  if (columnName !== "BooleanValue") {
				  labelItemConfig.isRequired = {
					  "bindTo": "getControlRequired"
				  };
			  }
			  return labelItemConfig;
		  },
 
		  /**
		   * Returns previous value control config for row
		   * @param columnName
		   * @param dataValueType
		   * @returns {Object}
		   */
		  getPreviousValueItemConfig: function(columnName, dataValueType) {
			  return {
				  itemType: this.Terrasoft.ViewItemType.MODEL_ITEM,
				  dataValueType: dataValueType,
				  id: columnName + "-previousValue-" + this.Terrasoft.generateGUID(),
				  name: columnName + "-previousValue-" + this.Terrasoft.generateGUID(),
				  caption: this.get("Resources.Strings.PreviousValueCaption"),
				  visible: {
					  bindTo: "ControlVisible",
					  bindConfig: {
						  converter: function() {
							  return this.getControlVisible(columnName);
						  }
					  }
				  },
				  layout: {
					  row: 0,
					  column: 6,
					  colSpan: 6,
					  rowSpan: 1
				  },
				  enabled: this.$CanChangeOppProductConditionSpecificationFieldsDetailAttr,
				  bindTo: "PreviousValue"
			  };
		  },
 
		  /**
		   * Returns value control config for row
		   * @param {String} columnName
		   * @param {Terrasoft.DataValueType} dataValueType
		   * @param {String} displayColumn
		   * @returns {Object}
		   */
		  getValueItemConfig: function(columnName, dataValueType, displayColumn) {
			  const valueItemConfig = {
				  itemType: this.Terrasoft.ViewItemType.MODEL_ITEM,
				  dataValueType: dataValueType,
				  id: columnName + "-" + this.Terrasoft.generateGUID(),
				  name: columnName + "-" + this.Terrasoft.generateGUID(),
				  caption: this.get("Resources.Strings.ValueCaption"),
				  layout: {
					  row: 0,
					  column: 12,
					  colSpan: 6,
					  rowSpan: 1
				  },
				  bindTo: displayColumn,
				  enabled: {
					  bindTo: "isEditable"
				  }
			  };
 
			  if (dataValueType === Terrasoft.DataValueType.LOOKUP) {
				  valueItemConfig.contentType = Terrasoft.ContentType.ENUM;
			  }
			  return valueItemConfig;
		  },
 
		  /**
		   * Returns delta value control config for row
		   * @param columnName
		   * @param dataValueType
		   * @returns {Object}
		   */
		  getDeltaItemConfig: function(columnName, dataValueType) {
			  return {
				  itemType: this.Terrasoft.ViewItemType.MODEL_ITEM,
				  dataValueType: dataValueType,
				  id: columnName + "-deltaValue-" + this.Terrasoft.generateGUID(),
				  name: columnName + "-deltaValue-" + this.Terrasoft.generateGUID(),
				  caption: this.get("Resources.Strings.DeltaValueCaption"),
				  visible: { "bindTo": "getIsDeltaVisible" },//isNumberValue,
				  layout: {
					  row: 0,
					  column: 18,
					  colSpan: 6,
					  rowSpan: 1
				  },
				  enabled: this.$CanChangeOppProductConditionSpecificationFieldsDetailAttr,
				  bindTo: "DeltaValue"
			  };
		  }
	}
...

 

Нравится

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

Визуально деталь выглядит так :

Добрый день!

В данном случае боюсь не выйдет определить причину такого поведения без проведения дебага логики этой детали. Со своей стороны скажу, что при изменении поля должен вызываться базовый метод onItemChanged, который отправляет сообщение "itemChanged". Следует проверить путь этого сообщения на наличии препятствий его обработки. Далее стоит проверить логику вызова базового метода onSaved, что он делает и что происходит далее. Точно не скажу в каких конкретно схемах искать данные методы, лучше вбить их в поиск dev tools и поставить брейкпоинты в них и смотреть, что конкретно вызывается и в какой последовательности.

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

Добрый день!

 

Пользуемся Sales Enterprise. Хочу подвязать договоры к Продаже, добавила деталь "Договоры", но когда нажимаешь плюсик для добавления договора, он не подвязывается к текущей продаже. Как исправить?

Нравится

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

Не могли бы вы сделать скриншот настроек добавленой вами детали?

Айгуль, а сам договор создаётся? В нем поле Продажа заполняется при создании новой записи из детали?

В настройках самой детали должны быть корректно указаны связи. 

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

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

Нравится

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

В своём пакете заместить объект активности и во встроенном БП заменить две функции с этой логикой пустыми:

#region Methods: Public
 
//Не записывать в деталь Участников
public override void UpdateParticipantsByOwnerContact() {}
public override void CreateActivityParticipantsFromInsertedValues() {}
 
#endregion

 

Спасибо, попробую ваш вариант

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

Добрый день коллеги, при загрузке раздела дважды возникает ошибка

 

Заголовок для подписи "SymptomsFieldContainer1" не был найден.

Невозможно найти колонку по конфигурации: "{"layout":{"colSpan":24,"rowSpan":1,"column":0,"row":2},"name":"SymptomsFieldContainer1"}" .

 

SymptomsFieldContainer1 это поле типа контейнер для того, чтобы было реализовано новое поле по типу "Описание".

Оно было добавлено в замещающей странице CasePage

{
	"operation": "insert",
	"name": "SymptomsFieldContainer1",
	"values": {
		"layout": {
			"column": 0,
			"row": 2,
			"colSpan": 24,
			"rowSpan": 1,
			"layoutName":"Header"
		},
		"wrapClass": [
			"control-width-15 control-left solution-field-container"
		],
		"itemType": 7,
		"items": []
	},
	"parentName": "CaseInformation_gridLayout",
	"propertyName": "items",
},

Методом проб и ошибок выяснилось, что ошибка возникает дважды на двух старых схемах

Изображение удалено.

При этом CasePage является родительской для всех Page в данном разделе.

Ошибка не возникает на других двух схемах, но при этом видимо конфликтует с старыми.

Нравится

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

Добрый день,

 

Попробовал добавить этот контейнер на демку - никаких ошибок нет. Кроме того, Вы уверены, что у страниц редактирования из Вашего скриншота родитель CasePage, а не BaseModulePageV2 (стандартная для типизированных страниц). Или была дополнительная кастомизация и родитель у страниц менялся? Если так, то можно получить полный код одной из страниц редактирования, открытие которой возвращает ошибку и еще как она влияет на работу сайта помимо того, что контейнер не отображается?

Добавить комментарий

Oleg Drobina,

Спасибо за ваш ответ, визуально проблем выявлено не было, но само наличие ошибки смущает.

Родительская страница у всех CasePage, но при реализации кастомного пакета, этот CasePage был замещен и в нём реализован новый контейнер, прикрепляю код данной страницы

define("CasePage", [], function() {
	return {
		entitySchemaName: "Case",
		attributes: {},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{
			"FileDetailV2fe3b2d92": {
				"schemaName": "FileDetailV2",
				"entitySchemaName": "CaseFile",
				"filter": {
					"detailColumn": "Case",
					"masterColumn": "Id"
				}
			},
			"KnowledgeBaseInCaseDetailfca68878": {
				"schemaName": "KnowledgeBaseInCaseDetail",
				"entitySchemaName": "KnowledgeBaseInCase",
				"filter": {
					"detailColumn": "Case",
					"masterColumn": "Id"
				}
			},
			"VisaDetailV218d4bda2": {
				"schemaName": "VisaDetailV2",
				"entitySchemaName": "ITdsCaseVisa",
				"filter": {
					"masterColumn": "Id",
					"detailColumn": "ITdsCase"
				}
			}
		}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
		methods: {},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "ReclassificationButton",
				"values": {
					"itemType": 5,
					"caption": {
						"bindTo": "Resources.Strings.ReclassificationButtonCaption"
					},
					"click": {
						"bindTo": "onReclassificationButtonClick"
					},
					"enabled": true,
					"visible": true,
					"style": "red",
					"layout": {
						"column": 1,
						"row": 6,
						"colSpan": 1
					}
				},
				"parentName": "LeftContainer",
				"propertyName": "items",
				"index": 10
			},
			{
				"operation": "insert",
				"name": "TestButton1",
				"values": {
					"itemType": 5,
					"caption": "Test",
					"click": {
						"bindTo": "onTestButtonClick1"
					},
					"enabled": true,
					"visible": false,
					"style": "yellow",
					"layout": {
						"column": 1,
						"row": 6,
						"colSpan": 1
					}
				},
				"parentName": "LeftContainer",
				"propertyName": "items",
				"index": 11
			},
			{
				"operation": "insert",
				"name": "NegotiationButton1",
				"values": {
					"itemType": 5,
					"caption": {
						"bindTo": "Resources.Strings.NegotiateButtonCaption1"
					},
					"click": {
						"bindTo": "onNegotiationButtonClick1"
					},
					"enabled": {
						"bindTo": "isNegotiatorSet1"
					},
					"visible": {
						"bindTo": "isNegotiatorSet1"
					},
					"style": "green",
					"layout": {
						"column": 1,
						"row": 6,
						"colSpan": 1
					}
				},
				"parentName": "LeftContainer",
				"propertyName": "items",
				"index": 12
			},
			{
				"operation": "remove",
				"name": "Symptoms"
			},
			{
				"operation": "insert",
				"name": "SymptomsFieldContainer",
				"values": {
					"layout": {
						"column": 0,
						"row": 1,
						"colSpan": 24,
						"rowSpan": 1
					},
					"wrapClass": [
						"control-width-15 control-left solution-field-container"
					],
					"itemType": 7,
					"items": []
				},
				"parentName": "CaseInformation_gridLayout",
				"propertyName": "items",
			},
			{
				"operation": "insert",
				"name": "Symptoms",
				"values": {
					"itemType": 3,
					"dataValueType": 1,
					"contentType": 4,
					"value": {
						"bindTo": "Symptoms"
					},
					"markerValue": "Symptoms",
					"labelConfig": {
						"visible": false
					},
					"controlConfig": {
						"imageLoaded": {
							"bindTo": "onImageLoaded"
						},
						"imagePasted": {
							"bindTo": "onImagePasted"
						},
						"plainTextValue": {
							"bindTo": "NotHtmlNote"
						},
						"images": {
							"bindTo": "Images"
						},
						"plainTextMode": {
							"bindTo": "plainTextMode"
						}
					}
				},
				"parentName": "SymptomsFieldContainer",
				"propertyName": "items"
			},
			{
				"operation": "move",
				"name": "ESNTab",
				"parentName": "Tabs",
				"propertyName": "tabs"
			},
			{
				"operation": "move",
				"name": "TimelineTab",
				"parentName": "Tabs",
				"propertyName": "tabs",
				"index": 3
			},
			{
				"operation": "insert",
				"propertyName": "tabs",
				"parentName": "Tabs",
				"name": "Tabf1d4d2a9TabLabel",
				"values": {
					"caption": {
						"bindTo": "Resources.Strings.TabVisaCaption"
					},
					"items": []
				}
			},
			{
				"operation": "insert",
				"propertyName": "items",
				"parentName": "Tabf1d4d2a9TabLabel",
				"name": "VisaDetailV218d4bda2",
				"values": {
					"itemType": 2,
					"markerValue": "added-detail"
				}
			}
		]/**SCHEMA_DIFF*/
	};
});

 

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