Версия 7.8.2.1561
Создал новую деталь без использования мастера деталей.
Зарегистрировал в SysDetail, SysEntityModule, SysModulEdit
Деталь добавляется в карточку через мастер разделов.
Но при попытке настроить отображение полей (Действие "Настроить колонки") появляется ошибка:

Uncaught Ext.JSON.decode(): You're trying to decode an invalid JSON String: undefined

При добавлении полей вручную в DataGrid детали, поля отображаются.

Нравится

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

Здравствуйте, Игорь!

Данная проблема была устранена в следующем релизе. Для решения необходимо обновить приложение на более новую версию или установить пакет с исправлениями. Для выполнения этих действий Вам нужно обратится в поддержку support@terrasoft.ru.

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

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

Нравится

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

Здравствуйте, Михаил.

Вам необходимо:

1) Заместить схему карточки на которой выведена данная деталь.
2) Добавить в секции diff для данной детали свойство visible ссылающееся виртуальный атрибут булевого типа имеющий значение по умолачанию true.
3) Заместить схему детали и добавить обработчик события изменения атрибута GridData

init: function() {
   this.callParent(arguments);
   this.on("change:GridData", function(){
      //some code
   }, this);
}

4) В обработчике (пункт 3) проверять количество элементов в GridData. Если больше нуля - публиковать сообщение.

5) В схеме карточки основываясь на сообщении изменять значение виртуального атрибута.

Сообщения sandbox подробно обсуждались тут.

"Мотков Илья" написал:

Здравствуйте, Михаил.

Вам необходимо:

1) Заместить схему карточки на которой выведена данная деталь.

2) Добавить в секции diff для данной детали свойство visible ссылающееся виртуальный атрибут булевого типа имеющий значение по умолачанию true.

3) Заместить схему детали и добавить обработчик события изменения атрибута GridData

init: function() {

   this.callParent(arguments);

   this.on("change:GridData", function(){

      //some code

   }, this);

}

4) В обработчике (пункт 3) проверять количество элементов в GridData. Если больше нуля - публиковать сообщение.

5) В схеме карточки основываясь на сообщении изменять значение виртуального атрибута.

Сообщения sandbox подробно обсуждались тут.


А есть явный какой-то пример в исходниках чтобы на него акцент делать?

Подобного примера в конфигурации нет. Однако почти в каждой схеме есть примеры создания атрибутов, привязки свойства visible к методу или же атрибуту. Точно так же sandbox повсеместно используеьтся в системе.

К примеру атрибут можно jобьявить следующим образом:

attributes: {
	IsEmailVisible: {
		dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
		type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		value: true
	}
},

Пример привязки видимости детали Email к атрибуту:

{
	"operation": "merge",
	"name": "Email",
	"values": {
		"visible": {
			bindTo: "IsEmailVisible"
		}
	}
},

"Мотков Илья" написал:

4) В обработчике (пункт 3) проверять количество элементов в GridData. Если больше нуля - публиковать сообщение.


А проверять DataGrid по средствам esq или как-то иначе можно? Или можно как то читать то, что находится на самой детали, чтобы каждый раз в базу не ходить?

GridData это атрибут схемы детали. Получить его можно через код:

var gridData = this.get("GridData");

Затем необходимо проанализировать его содержимое. Отладку необходимо провести в отладчике самого браузера.

В целом GridData отвечает за реестр детали.

"Мотков Илья" написал:

GridData это атрибут схемы детали. Получить его можно через код:

var gridData = this.get("GridData");

Затем необходимо проанализировать его содержимое. Отладку необходимо провести в отладчике самого браузера.

В целом GridData отвечает за реестр детали.

init: function() {
	this.callParent(arguments);
	var gridData = this.getGridData();
	this.reloadGridColumnsConfig(true);
	if (gridData && gridData.getCount() > 0) {
		this.sandbox.publish("MessageGridCount", {
			stateObj:
				{
					valuePairs: [{name: "DataGridCount", value: gridData.getCount()}]
				}
		});
	}
}

Поле gridData в консоли указывает что undefined. Как с этим бороться? За пример брал реализацию в BaseGridDetailV2.
Так же ваш пример (var gridData = this.get("GridData");) тоже самое выдает в консоли.

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

afterLoadGridData: function() {
this.callParent(arguments);
var gridData = this.get("GridData");
},

"Максим Шевченко" написал:

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

afterLoadGridData: function() {

this.callParent(arguments);

var gridData = this.get("GridData");

},


Попробовал, но тоже никак.
http://prntscr.com/dy1c0z

Получить значение GridData можно обратившись к атрибуту Collection (this.get("Collection")) или же вызвав метод getGridData который в свою очередь обратится к атрибуту Collection и вернет результат.

Получать актуальное количество записей в GridData возможно заместив обработчик события dataLoaded атрибута Collection. Пример:

onGridLoaded: function() {
this.callParent(arguments);
var count = this.getGridData().collection.items.length;
}

Прошу прощения за неточность. Публиковать сообщение не нужно, по скольку логика добавления записи (как собственно и кнопка +) расположена в BaseGridDetalV2 (элемент AddRecordButton).

"Мотков Илья" написал:

Прошу прощения за неточность. Публиковать сообщение не нужно, по скольку логика добавления записи (как собственно и кнопка +) расположена в BaseGridDetalV2 (элемент AddRecordButton).


Спасибо, но я заодно и с песочницей разобрался, на будущее.

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

Здравствуйте! Продукт sales enterprice 7.9.0.
Необходимо принудительно сортировать записи на детали по колонке "Дата создания" по возрастанию.
При этом пользователь должен иметь возможность сортировать записи по своему усмотрению с помощью стандартных средств сортировки на детали. Но при добавлении новой записи на детали должна снова применяться принудительная сортировка скриптом записей по возрастанию даты создания. Как это реализовать?

Вот код:

details: /**SCHEMA_DETAILS*/{
"UsrCommerceOfferForSale": {
"schemaName": "UsrCommerceOfferForSale",
"entitySchemaName": "UsrOfferForSale",
"filter": {
"detailColumn": "UsrOffers",
"masterColumn": "Id"
},
"filterMethod": "UsrCommerceOfferForSaleFilter"
}
},

methods: {
UsrCommerceOfferForSaleFilter: function() {
var filterGroup = new Terrasoft.createFilterGroup();
filterGroup.add("UsrCommerceOfferForSaleByUsrOffers", Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "UsrOffers", this.get("Id")));
/* Фильтр по одному значению */
filterGroup.add("CreatedOn", Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL,
//Здесь непонятно, как отсортировать по возрастанию даты создания
return filterGroup;
},
}

Нравится

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

Сомневаюсь, что в фильтре можно задавать сортировку. Я бы смотрел:
1) В сторону метода заполнения коллекции GridData в детали. Желательно докопаться до esq запроса в бд и вставить что-то вроде

var col = esq.addColumn("CreatedOn");
col.orderDirection = Terrasoft.OrderDirection.ASC;
col.orderPosition = 0;

2) В описании Grid(опять же в детали) в diff вроде есть

"sortColumn": {"bindTo": "sortColumn"},
"sortColumnDirection": {"bindTo": "GridSortDirection"},
"sortColumnIndex": {"bindTo": "SortColumnIndex"}

Скорее всего и тут можно задать

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

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

Нравится

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

Уважаемые коллеги!

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

Нравится

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

"Ифутин Юрий Борисович" написал:Можно ли обойтись пользовательским настройками без написания кода?

Нет.

Спасибо за лаконичный ответ!

Понял, что нельзя обойтись без кода...

А можно объяснить как можно эту задачу решить при помощи кода и где можно посмотреть аналогичные примеры?...

Переопределяете допустим AccountPageV2 в пакете Order.
Деталь "заказы" добавляется в diff, прописываем св-во visible

{
	"operation": "merge",
	"parentName": "HistoryTabContainer",
	"propertyName": "items",
	"name": "Order",
	"values": {
                "visible": {bindTo: "getDetailVisibility"},
		"itemType": Terrasoft.ViewItemType.DETAIL
	}
}

В методах прописываем что-то вроде:

getDetailVisibility: function() {
         return this.get("IsMain") ? true : false; //IsMain - допустим булево поле в контрагенте, индикатор главной компании
}

В общем все сводится к св-ву visible и написанию нужной функции (анализирует контрагента, будет возвращать true или false в зависимости от условий). Ну или можно все это сделать через атрибут, разница невелика.

Спасибо, Данила!

А вот, к примеру, такая комбинация:
1. Располагаем в разделе сразу 2 детали
2. А вот права раздаем разные. Одни пользователи видят первую деталь, другие пользователи видят вторую деталь, а админ видит все детали.
3. Права раздаем при помощи бизнес-процесса.

Как Вы думаете, можно таким методом воспользоваться?

Никогда не пробовал. Уж слишком муторно через права всё это настраивать. К тому же права, вроде как, нельзя на детали накладывать. Только на поля. Придется раздавать права на объект/таблицу, на которую ссылается деталь. Короче гемор:smile:

Добрый день!
Раздать права доступа на детали не получится.
Можно раздавать права доступа на операции.
В Конфигурации пользовательскими средставми можно добавить пользовательскую операцию и далее обращатся к ней из кода, например во так:
/**
* Название операций.
* @type {Object}
*/
SysAdminOperationCode: {
CAN_DESIGN_PAGE: "CanChangeApplicationTuningMode"
},
Идея состтоит в том, чтобы раздать права доступа на созданную пользовательскую операцию, затем в коде схемы страницы редактирования карточки, на которй выведены детали, добавить атрибут логического (булевского типа), установить для него значение по умолчанию - false, и привязать свойство visible детали к значению данного атрибута. Сам атрибут устанавливать в зависимости от возвращаемого значения метода, проверяющего права пользователей на описанную выше пользовательскую операцию. Этот метод будет в свою очередь использовать методы Сервиса страницы управления правами доступа к записи ("RightsService").
Например, вот так вызывается нужный метод из утилитного сервиса "RightsService":
/**
* Метод вызывает метод веб сервиса с указанными параметрами.
* @param {String} methodName Имя метода веб сервиса.
* @param {Object} data Обьект данных для метода веб сервиса.
* @param {Function} callback Функция обратного вызова.
* @param {Object} scope Объект окружения фукнции обратного вызова.
*/
callServiceMethod: function(methodName, data, callback, scope) {
var requestUrl = Terrasoft.workspaceBaseUrl + "/rest/" + this.serviceName + "/" + methodName;
Terrasoft.AjaxProvider.request({
url: requestUrl,
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
method: "POST",
jsonData: data || {},
callback: function(request, success, response) {
var responseObject = success ? Terrasoft.decode(response.responseText) : {};
callback.call(scope || this, responseObject, success);
},
scope: this
});
}

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

Уважаемые коллеги!Хотелось бы иметь возможность пользовательскими средствами настраивать итоги на детали по примеру настройки итогов в разделе.

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

Здравствуйте, Юрий!

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

Юрий, спасибо за обратную связь. Эта идея принята для реализации в будущих версиях

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

Уважаемые коллеги!

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

Нравится

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

Здравствуйте.
Пользовательскими средствами данную настройку не выполнить. Но, обладая навыками разработки, можно это сделать по аналогии с деталью Продукты в разделе Заказы. Смотрите в схему OrderProductDetailV2 там объявлены как diff-ы для отображения текста итогов. Так и методы общения через sandbox для получения этих данных из основной карточки.

Пора это в идеи кидать

Совершенно с Вами согласен, Владимир!

Разместил эту просьбу в идеях...

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

Создал деталь, унаследовался от FileDetailV2, при обновлении страницы (с очисткой кеша, или без - не имеет значения) файлы не отображаются, выдает ошибку:
GET http://***************/1/Nui/Terrasoft/ImageListViewModel.js?_dc=1480419... 404 (Not Found)
Помогает только релогин, или обновление страницы, на которой нет этой детали.
Такая же проблема наблюдается в стандартной EmailFileDetailV2. Подскажите возможно ли решить.
Версия 7.5.0.1328
P.S. Варианты ответов вроде "в 7.8 такой проблемы нет" не являются решением проблемы.

Нравится

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

Уточните каким образом была создана данная деталь (по возможности прикрепите исходный код схем детали).

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

Уважаемые коллеги!

Подскажите пжл., как показать или скрыть деталь в разделе в зависимости от условий?

Нравится

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

В диффе прописываем к детали

"values": {
            "visible": {bindTo: "myFunc"}
}

В методах

myFunc: function() {
           ......
           return true; //пишем кучу условий. возвращаем true/false
}

Спасибо!

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

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

В версии 7.8.0+ смотрите в сторону детали Email на странице ContactPageV2 - видимость этой детали в системе зависит от типа контакта, например.

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

Добрый день, уважаемые коллеги!

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

Нравится

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

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

Рекомендую посмотреть пример реализации в детали OrderProductPageV2.

Значение поля PrimaryPrice устанавливается методом calculatePrimaryValues:

"PrimaryPrice": {
	dependencies: [
		{
			columns: ["Price", "Amount", "DiscountAmount", "TaxAmount", "TotalAmount"],
			methodName: "calculatePrimaryValues"
		}
	]
}

Сам метод реализован в блоке методов.

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