Добрый день!

Делаю иерархическую деталь. Не работает отображение записей в детали. 

*Запрос отправляется.

*Ответ приходит.

*В объекте, по которому делается деталь, "Родитель иерархии" указан.

 

Код детали: 

define("NorbitContactProductDetail", ["ConfigurationGrid", "ConfigurationGridGenerator",
	 "ConfigurationGridUtilities"], function() {
	return {
		entitySchemaName: "NorbitContactProduct",
		messages: {},
		mixins: {},
		attributes: {},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			/**
			 * Скрыть кнопку "Добавить".
			 */
			/*{
				"operation": "remove",
				"name": "AddRecordButton"
			},*/
			
			/**
			 * Подключение иерархии детали.
			 */
			{
				"operation": "merge",
				"name": "DataGrid",
				"values": {
					"visible": true,
					"type": "listed",
					"hierarchical": true,
					"hierarchicalColumnName": "NorbitParentContactProduct",
					"useLevelRendering": true
				}
			},
		]/**SCHEMA_DIFF*/,
		methods: {

			addGridDataColumns: function (esq) {
			   this.callParent(arguments);
				if (!esq.columns.contains("Name")) {
					esq.addColumn("Name");
				}
				if (!esq.columns.contains("NorbitCount")) {
					esq.addColumn("NorbitCount");
				}
				if (!esq.columns.contains("NorbitParentContactProduct")) {
					esq.addColumn("NorbitParentContactProduct");
				}
			},

			
			/**
			 * Скрыть пункт меню "Копировать".
			 */
			getCopyRecordMenuItem: Terrasoft.emptyFn,
			
			/**
			 * Скрыть пункт меню "Изменить".
			 */
			getEditRecordMenuItem: Terrasoft.emptyFn,
			
			/**
			 * Скрыть пункт меню "Удалить".
			 */
			getDeleteRecordMenuItem: Terrasoft.emptyFn,
		}
	};
});

 

Нравится

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

Александр, смотрю в существующих схемах деталей, например, в ProjectStructureDetailV2:

"hierarchicalColumnName": "ParentId", 

Может, и у Вас надо было писать не NorbitParentContactProduct, а NorbitParentContactProductId?

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

Продскажите, может кто знает как решить проблему со связанными таблицами?

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

 

Вижу два решения задачи:

1) Вариант 1:

 - Создаем три таблицы: базовый справочник "Продукты", базовый объект "Деталь 1" с колонкой привязки к "Продукты", базовый объект "Деталь 2" с колонкой привязки к "Деталь 1".

- Создаем справочник на основе объекта "Продукты", деталь с добавлением из справочника на основе объекта "Деталь 1", деталь с добавлением из справочника на основе объекта "Деталь 2".

- Сталкиваемся с проблемой не рабочей делали "Деталь 2" так как для открытия окна добавления данных из "Деталь 1" необходимо с базовой колонкой текстового типа ("Отображаемое значение")!

2) Вариант 2:

- Создаем три таблицы: базовый справочник "Продукты", базовый объект "Деталь 1" с колонкой привязки к "Продукты" и колонкой "Зарезервировано" (что бы можно было отмечать значения что попадут далее в третью деталь).

- Создаем справочник на основе объекта "Продукты", деталь с добавлением из справочника на основе объекта "Деталь 1", деталь с добавлением из справочника на основе объекта "Деталь 1" (тут нам и пригодилась колонка "Зарезервировано" так как по ней и будет фильтр и мы просто проставляем значение в эту колонку, а точнее по колонке "Заявка" и "Зарезервировано").

- Сталкиваемся с проблемой не рабочей делали "Деталь 2" так как для открытия окна добавления данных из "Деталь 1" необходимо с базовой колонкой текстового типа ("Отображаемое значение")! Была идея сделать Вью для отображения не достающего текстового поля, которое заполнять из колонки "Продукты.Название".

Нравится

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

Александр, что-то мне не вполне понятно по структуре того, что хотите отобразить. Вы хотите две детали в разделе продуктов или в каком-то другом разделе, которые связывают его с продуктами (вроде раздела «Договоры» и детали развязки «Продукты в договоре»)? Как между собой связаны раздел и первая деталь, раздел и вторая, первая со второй?

 

Сами по себе двухуровневые детали обсуждались тут, тут и тут, но готового описания реализации не видно. Но в 7.Х, в отличие от прошлых версий, детали располагаются одна над другой, так что важнее сначала понять, что хотим отобразить, а потом искать техническую реализацию, через view или как-то ещё.

Зверев Александр,

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

Зверев Александр,

Тут вопрос не столько в настройке привязки деталей к разделу, сколько в логике выбора записей. Это можно сделать модификацией лукапа второй детали, чтобы там фильтр оставлял только пригодные для выбора записи. Либо вместо лукапа сделать в первой детали, где весь доступный выбор, кнопку или действие, при запуске которого выбранная на первой детали запись обрабатывается, по ней создаётся запись на второй.

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

Добрый вечер.

 

Возникла следующая проблема.

Создал деталь. Зарегистрировал ее в разделе. После хотел добавить поле в деталь. Перехожу в Настроить деталь. Но объект пропал и в страницу перейти не могу.

 

Как можно решить данную проблему?

Прикрепленные файлы

Нравится

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

Сергей, а объект реально создался? Проверьте в разделе «Конфигурация» (в старом интерфейсе). Возможно, после создания ещё не публиковался? Если такой объект есть, можно выбрать из списка в настройках детали его название снова и сохранить.

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

Добрый день.

 

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

https://academy.terrasoft.ru/documents/administration/7-16/sozdanie-novoy-detali

и добавил в раздел, как указано здесь.

https://academy.terrasoft.ru/documents/administration/7-16/dobavlenie-sushchestvuyushchey-detali-na-stranicu-zapisi

Создаю запись детали, но они не сохраняются.

В детали два поля справочник и дробное число.

 

Можете подсказать, как это можно решить?

 

Заранее благодарю.

Нравится

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

Скорее всего у вас не правильно указаны либо отсутствуют поля для связи записи в разделе и детали. Проверьте это дополнительно.

Добрый вечер.

У меня была подобная проблема из-за того, что у схемы таблицы детали не было указано поле для отображения.

Проверьте, указано ли у Вас в схеме таблицы поле для отображения:

Сидоров Александр Валерьевич, Алла Савельева,

 

Спасибо за ваши ответы!

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

 

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

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

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

Нравится

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

Баубек, а в консоли есть какие-то ошибки? Одно из двух, или кнопки нет, если ошибка возникла где-то в коде перед её отрисовкой, или дело действительно в правах. В схеме BaseGridDetailV2 в пакете NUI есть только одна явная проверка на портальность пользователя в функции getRecordRightsSetupMenuItemVisible, ещё несколько таких проверок есть в BaseGridDetailV2 в пакете SSP. Ещё права для портальных нужно задавать на каждый объект, добавляя их ещё в специальный справочник. В этой теме было очень похожее на Ваш вопрос поведение системы, так и не ясно, помогло ли добавление всех используемых объектов в справочник или дело было в чём-то другом.

Зверев Александр,

Здравствуйте, спасибо за ответ. В консоли ошибок нет, просто исчезает кнопка добавления записи. Я принудительно вывел кнопку добавления записи и тогда он выдает ошибку. В скриншоте к данному вопросу показано что переменнаю editPage равна значению undefined. В метод getOpenCardConfig передаются три аргумента и у рабочей детали второй аргумент "typeColumnValue" равна "00000000-0000-0000-00000000". А у детали с проблемой равна null. Я не понял в какой справочник добавлять права для редактирования/добавления записи.

Я имел в виду справочник «Список объектов доступных портальному пользователю», но туда добавляют не записи, а объекты. Возможно, у Вас там не всё, что связано с этой деталью, нет какого-то объекта справочного поля, на ней используемого?

И в обычной настройке прав права на операцию добавления по объекту этой детали должны быть явно даны для роли «Все пользователи портала».

Зверев Александр,

Дело в том что с редактируемым реестром все работает, если убрать ред.реестр то перестает работать и кнопка добавления исчезает. Я все права доступа к обьекту дал портальным пользователям. Но увы это не работает.

А на этой же детали в поднятой в облаке демке  тоже такое наблюдается? Это стандартная деталь или самодельная? Слишком мало информации, но, кажется, где-то нет какого-то права.

Зверев Александр,  

это среда разработки, Версия 7.15.1.1295, обьект и деталь кастомные

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

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

{
	"operation": "insert",
	"parentName": "Detail",
	"propertyName": "tools",
	"name": "AddRecordButton",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"click": {"bindTo": "addRecord"},
		"visible": {"bindTo": "getAddRecordButtonVisible"},
		"enabled": {"bindTo": "getAddRecordButtonEnabled"},
		"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
		"imageConfig": {"bindTo": "Resources.Images.AddButtonImage"},
		"clickDebounceTimeout": 1000
	}
},

За её видимость отвечает функция:

getAddRecordButtonVisible: function() {
	const isDetailEnabled = this.get("IsEnabled");
	if (isDetailEnabled === false) {
		return false;
	}
	const canEditMasterRecord = this.get("CanEditMasterRecord");
	if (this.Ext.isBoolean(canEditMasterRecord) && !canEditMasterRecord) {
		return false;
	}
	const editPages = this.getEditPages();
	const toolsVisible = this.getToolsVisible();
	const editPagesCount = editPages.getCount();
	return toolsVisible
		? ((editPagesCount === 1) || (this.getIsEditable() && (editPagesCount === 0)))
		: toolsVisible;
},

Возможно, при выполнении под портальной условие отрицательное из-за значений, которые возвращают this.getEditPages(),  this.getToolsVisible(), getIsEditable() или this.getEditPages().getCount(). Более точно можно выяснить, проведя в браузере отладку этой и вызываемых функций.

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

Добрый день.

Например имеется объект UsrEntity. Хочу открыть справочник для добавления элемента на деталь с возможностью выбора из списка этого объекта. Но, чтобы в списке НЕ БЫЛО тех элементов, которые удовлетворяют условию UsrEntity.UsrA in existedA && UsrEntity.UsrB in existedB && UsrEntity.UsrC in existedC. Пока вижу только один путь это создать представление в SQL и открывать это представление. А возможно ли сделать подобный фильтр на фронте? Может быть есть возможность сделать кастомный фильтр и вставить в конфиг при открытии справочника?

Нравится

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

Решил задачу. Можно же просто UsrEntity.UsrA not in existedA || UsrEntity.UsrB not in existedB || UsrEntity.UsrC not in existedC.

Но так как по колонке A, я уже фильтровал, достаточно было только B и C. А ещё засунул в группу фильтров, другую группу фильтров. Не знал, что так можно

addRecord: function () {
					let activeRowId = this.get("ActiveRow");
					if (!activeRowId) {
						return;
					}
 
					const gridData = this.getGridData();
					let rowData = gridData.get(activeRowId).values;
					if (rowData.IDSBParent){
						activeRowId = rowData.IDSBParent.value;
						rowData = gridData.get(activeRowId).values;
					}
 
					let filterCollection = Terrasoft.createFilterGroup();
					const productFilter = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
						"IDSBProductId", rowData.IDSBProduct.value);
					filterCollection.add("productFilter", productFilter);					
 
					let existed = [];
					gridData.collection.items.forEach(function(item){
						if (!item.values.IDSBParent){
							return;
						}
 
						if (item.values.IDSBParent.value !== activeRowId){
							return;
						}
 
						existed.push(item.values);
					}, this);
 
					let notExistedFilterCollection = Terrasoft.createFilterGroup();
					notExistedFilterCollection.logicalComparisonTypes = Terrasoft.LogicalOperatorType.OR;
 
					let existsWarehouseFilter = Terrasoft.createColumnInFilterWithParameters("IDSBWarehouseId", existed.map(item => item.IDSBWarehouse.value));
					existsWarehouseFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;
					notExistedFilterCollection.add(existsWarehouseFilter);
 
					let existsPercentFilter = Terrasoft.createColumnInFilterWithParameters("IDSBPercent", existed.map(item => item.IDSBPercent));
					existsPercentFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;
					notExistedFilterCollection.add(existsPercentFilter);
 
					filterCollection.add("notExistedFilterCollection", notExistedFilterCollection);
 
					const config = {
						entitySchemaName: "IDSBVwExpiredRemaining",
						multiSelect: true,
						columns: ["IDSBWarehouseId", "IDSBProductId", "IDSBPercent"],
						filters: filterCollection
					};
 
					this.openLookup(config, this.IDSBAddSelectedProducts, this);
				},

 

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

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

Подскажите каким образом можно реализовать подобный список, который заполнялся бы значением справочника?

Нравится

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

в diff
{
                "operation": "merge",
                "name": "AddTypedRecordButton",
                "parentName": "Detail",
                "propertyName": "tools",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "controlConfig": {
                        "menu": {
                            "items": {"bindTo": "addMenuItems"}
                        }
                    },
                "visible": true,
                "enabled": true
                }
            },

methods

init: function() {
                this.callParent(arguments);
                this.initAddMenuItems();
            },
            initAddMenuItems: function() {
                var addMenuItems = Ext.create("Terrasoft.BaseViewModelCollection");
                addMenuItems.add("addContactItem", this.Ext.create("Terrasoft.BaseViewModel", {
                    values: {
                        "Caption": {"bindTo": "Resources.Strings.AddContactCaption"},
                        "Click": {"bindTo": "addRecipient"},
                        "Tag": "addContact"
                    }
                }));
                addMenuItems.add("addbytemplateItem", this.Ext.create("Terrasoft.BaseViewModel", {
                    values: {
                        "Caption": {"bindTo": "Resources.Strings.AddByTemplate"},
                        "Click": {"bindTo": "addRecipient"},
                        "Tag": "addbytemplate"
                    }
                }));
                this.set("addMenuItems", addMenuItems);
            },

 

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

Подскажите, почему у меня не получается добавить участников в деталь "Участники встречи" 

При добавлении участник не появляется в детали.

Нравится

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

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

 

эта деталь отображает участников встречи. Заполните поле Встреча в протоколе и на детали автоматически отобразятся ее участники. Соответственно рекомендую как и ранее добавлять участников в разделе Активности.

 

Если такой вариант не удобен, уточните ваш кейс.

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

Добрый день!
Я создал свою деталь на основе статьи из wiki https://academy.terrasoft.ru/documents/technic-sdk/7-15/detal-s-redaktiruemym-reestrom 

Возникла проблема с регистрацией детали.
Выполнил скрипт добавления в таблицу [SysDetail]
 

DECLARE 
    -- Название схемы представления создаваемой миникарточки.
    @ClientUnitSchemaName NVARCHAR(100) = 'UsrTariffsForAddDetail',
    -- Название схемы объекта, к которому привязывается миникарточка.
    @EntitySchemaName NVARCHAR(100) = 'UsrAdduser',
    -- Название детали.
    @DetailCaption NVARCHAR(100) = 'Услуги.'

INSERT INTO SysDetail(Caption, DetailSchemaUId, EntitySchemaUId)
VALUES(@DetailCaption,
     (SELECT TOP 1 UId
      from SysSchema
      WHERE Name = @ClientUnitSchemaName),
      (SELECT TOP 1 UId
      from SysSchema
      WHERE Name = @EntitySchemaName))

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

Нравится

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

Сделайте полную компиляцию, очистите Redis. Но если честно, то советовал бы Вам создавать через мастер деталей, а потом просто в Detail модуле прописать код для редактирования в реестре. Это избавит вас от регестрации через базу, да и от колег слышал что у них бывало что проблемы в с использованием потом (хотя думаю они что-то просто забыли), но все же так экономине время и все точно работает так как мастер еще и кеш чистит потом. Только не забудьте переименовать модели созданные мастером и если будет после переименования ругаться по перекомпилируйте тоже

Александр Тыра,

Добрый день! полная компиляция и очистка кэша не помогла.

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

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

Всем добрый день!

Друзья, подскажите, пожалуйста, кто-нибудь работал с деталью на странице портала самообслуживания?

Для бандла service сейчас пытаюсь реализовать деталь с редактируемым реестром, чтобы можно было указывать в заявке несколько значений из справочника. Всем известно, что, когда пытаешься добавить в деталь новое значение, то вызывается метод, который сохраняет родительскую запись, так как запись детали обязательно должна быть связана с родительской записью. Можно как-то добавить в деталь запись, не вызывая метод, который сохраняет родителя, но при этом, чтобы после сохранения родителя, в детали все корректно связалось? Как-то же это реализовано для файлов например.

Нравится

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

Это ещё реализовано и в Средствах связи

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

В средствах связи, схеме ContactCommunicationDetailV2 добавленные и удалённые складываются в две коллекции Collection и DeletedItems и при сохранении из них извлекаются и идут на сервер одним составным запросом:

deleteItem: function(item) {
	var deletedItems = this.get("DeletedItems");
	var collection = this.get("Collection");
	collection.removeByKey(item.get("Id"));
	deletedItems.addItem(item);
},
 
addItem: function(tag) {
	if (this.get("IsDetailCollapsed")) {
		return;
	}
	var communicationTypes = this.get("CommunicationTypes");
	var communicationType = communicationTypes.get(tag);
	var newItem = this.Ext.create("Terrasoft.BaseCommunicationViewModel", {
		entitySchema: this.entitySchema,
		columns: this.columns
	});
	newItem.set("CommunicationTypes", communicationTypes);
	newItem.sandbox = this.sandbox;
	newItem.setDefaultValues(function() {
		newItem.set("CommunicationType", {
			value: communicationType.get("Id"),
			displayValue: communicationType.get("Name")
		});
		newItem.set("Contact", {
			value: this.get("MasterRecordId")
		});
		var itemKey = newItem.get("Id");
		var collection = this.get("Collection");
		collection.add(itemKey, newItem);
		this.changeCardPageButtonsVisibility(true);
	}, this);
	return newItem;
},
 
...
 
getDeleteItemsQueries: function() {
	var deletedItems = this.get("DeletedItems");
	var deleteQueries = [];
	deletedItems.each(function(item) {
		var primaryColumnValue = item.get(item.primaryColumnName);
		var deleteQuery = item.getDeleteQuery();
		deleteQuery.enablePrimaryColumnFilter(primaryColumnValue);
		deleteQueries.push(deleteQuery);
	}, this);
	return deleteQueries;
},
 
getSaveItemsQueries: function() {
	var collection = this.get("Collection");
	var saveQueries = [];
	collection.each(function(item) {
		if (item.isChanged() && item.validate()) {
			saveQueries.push(item.getSaveQuery());
		}
	}, this);
	return saveQueries;
},
 
...
 
save: function() {
	var restrictionsQuery = this.getSaveRestrictionsQuery();
	var queries = restrictionsQuery ? [restrictionsQuery] : [];
	var saveQueries = this.getSaveItemsQueries();
	queries = queries.concat(saveQueries);
	var deleteQueries = this.getDeleteItemsQueries();
	queries = queries.concat(deleteQueries);
	if (Ext.isEmpty(queries)) {
		this.publishSaveResponse({
			success: true
		});
		return true;
	}
	var batchQuery = Ext.create("Terrasoft.BatchQuery");
	Terrasoft.each(queries, function(query) {
		batchQuery.add(query);
	}, this);
	batchQuery.execute(this.onSaved, this);
	return true;
},
 
onSaved: function(response) {
	var message = response.ResponseStatus && response.ResponseStatus.Message;
	if (response.success && !message) {
		var deletedItems = this.get("DeletedItems");
		var collection = this.get("Collection");
		collection.each(function(item) {
			item.isNew = false;
			item.changedValues = null;
		}, this);
		deletedItems.clear();
		this.publishSaveResponse(response);
	} else {
		this.publishSaveResponse({
			success: false,
			message: this.getValidationMessage(message)
		});
	}
},

 

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