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

 

Есть необходимость скопировать раздел для его дальнейшей модификации. Исходній раздел также нужен, потому редактирование исходного раздела проблемму не решит. Если кто то делал буду благодарен!

Нравится

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

Какой раздел типовой поставки Вам необходимо скопировать ?

Севостьянов Илья Сергеевич,

Проект

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

Вы можете выгрузить все схемы раздела в виде MD-файлов.

1) в каждой схеме Вам необходимо произвести генерацию нового UUID и заменить существующий в специальном параметре UId (откройте MD-файл в текстовом редакторе и поймете о чем я говорю), а так же произвести замену старого на новый в других схемах раздела (кое-где может использоваться - причем замену по всему тексту схем)

2) Каждую схему необходимо переименовать - например добавив префикс, новое имя необходимо так же и самой схеме указать в специальном параметре (аналогично UId).

3) Далее Вам необходимо из раздела-донора скопировать все тексты SQL-сценариев, и сохранить их в виде sql-файлов (далее при установке будет проще из из файлов грузить нежели копипастить в новые скрипты) название файлов можете давать по аналогии с копируемыми скриптами + префикс.

В тексте скриптов Необходимо произвести замену имен таблиц "без префикса" на "с префиксом", причем только тех что присутствуют в схемах (ранее выгруженных, т.е. схемах которые вы копируете).

Внимание! именно имен таблиц, не затрагивая имена колонок.

 

4) Далее Вам необходимо изучить привязанные данные, часть из них отвечает за регистрацию раздела в системе.

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

В отношении остальных данных, изучив их вы поймете надо ли что-то воспроизводить.

 

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

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

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

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

Решение начал с добавления custom-бизнес правила на событие Load. И в нём просто попробовал без всяких условий удалить деталь со страницы методом

Terrasoft.sdk.Details.remove

К сожалению, результат выполнения виден только при последующих открытиях карточки, а не сразу.

Есть ли другие решения?

Нравится

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

Для скрытия детали по условию, необходимо в расширить метод shouldHidePanelItem

 

Пример:

 

Ext.define("ContactPreviewPage.View", {

extend: "Terrasoft.view.BasePreviewPage",



xtype: "contactpreviewpageview",

config: {

id: "ContactPreviewPage"

},



/**

* @inheritdoc

* @protected

* @overridden

*/


shouldHidePanelItem: function(loadedRecord, component) {

var detailName = component.config.name;

if (detailName === "MyDetailName" && Ext.isEmpty(loadedRecord.get("MyColumn"))) {

return true;

} else {

return this.callParent(arguments);

}

}

});

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

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

Добрый день.

Есть задача добавить поле в этот справочник.

В Сам объект добавили, а вот с деталью уже проблемка.

Вывести колонку можно. Но как сделать так чтобы она была редактируемой?

Нравится

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

А в чем проблема? Добавили в объект LeadType новую справочную колонку на Продукт. Добавили в лукапах лукап от объекта LeadType вывили там свою колонку что добавили, все, готово, ее можно редактировать прямо в секции этого справочника.

О какой детали речь? Покажите пожалуйста скриншоты если проблема еще актуальна.

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

Всем доброго времени суток.

Версия 7.10.

Вопрос в целом относится к доработке контролов даты и времени, которые я уже поднимал в предыдущих своих темах.

В общем, в diff страницы есть вот такой мерж:

{
				"operation": "merge",
				"name": "StartDate",
				"values": {
					"isUseDisabled": true,
					"timeInterval": 60, 
					//"activityOwner": {"bindTo": "ownerId"},
				}
			},

ownerId в свою очередь - виртуальная колонка-строка:

"ownerId": {
				"dataValueType": Terrasoft.DataValueType.TEXT,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"value":""
			},

timeInterval, isUseDisabled, activityOwner - добавлял сам для последующего использования в соответствующих методах ViewGenerator. Логическое и численное значение передаются нормально. Но при подключении последнего пункта, привязанного к виртуальной колонке, в консоль вываливается ошибка в файле core.js:

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

С чем связана такая ошибка? Как правильно привязать параметр?

Нравится

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

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

посмотрите в сторону метода:

getBindConfig: function() {

в baseedit.js

Для того что бы ваши свойства поддерживали биндинг, необходимо что бы они были корректно настроены на байндинг,

и к примеру в button.js там этот метод переопределен и список свойств доступных к бинденку расширен,

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

Илья, спасибо, помогло.

Есть ещё один в принципе, связанный вопрос..Вот есть у нас класс ActivitySectionGridRowViewModel. Если я в какой-либо из функций этой схемы выведу значение this, то там будет список values - доступных колонок объекта Activity.

Как добавить ещё одну колонку, к примеру, Owner?

 

UPD: Вопрос решён. Нужно было в getGridDataColumns в схеме ActivitySection добавить ссылку на соответствующую колонку.

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

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

Нравится

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

День добрый! 

Скрипт по апдейту значений из продукта в заказе продуктов в счете (через график поставок и оплат) лежит в схеме OrderAmountHelper.

Удачи!

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

При изменении детали "продукты в заказе" с редактируемым реестром необходимо пересчитать поля в заказе. Для этого я колбеком на сохранении продукта в заказе повесил отправку сообщения на страницу заказа для запуска процесса пересчета. При этом пересчет работает через раз: иногда считает правильно, иногда считает абсолютно неадекватные числа. В чем дело? Может быть сигнал на пересчет сделать другой?

Нравится

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

Добрый день, Лев!

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

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

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

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

Решил действовать через встроенные БП на событие "Перед сохранением".

БП получился простым,

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

но почему то процесс сохранения не прерывается.

Если условие выполняется, то генерится сигнал тот же самый, который был на входе (UsrParametersOfContractsSaving), по умолчанию - останов (TerminateEvent).

Условие элементарное

Entity.GetTypedColumnValue("UsrStartDate") < Entity.GetTypedColumnValue("UsrEndDate").

Отладка как то не проясняет ситуацию. Может кто сталкивался с данной ситуацией?

Нравится

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

Павел, добрый день! Для решения указанной задачи ПРАВИЛЬНЕЕ использовать не встроенные процессы, а клиентский код. Пример можно посмотреть на странице активности (там проверяется, что завершение не может быть меньше начала). Серверный код не стоит использовать, если в результате проверки необходимо запретить клиенту сохранить запись.

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

Юлия, спасибо за ответ. Действительно, я рассматривал вариант отмены на клиенте. С редактируемым реестром более менее работать научился. Но здесь проблема в том, что это справочник. То есть страница редактирования не персональная, а общая. Поэтому и выбрал встроенные БП. Но там, похоже ничего не получится... А задача действительно - запретить изменение полей, а не делать промежуточные вычисления.

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

Сформулирую как я понял задачу:

На странице есть поле. Поле ссылается на справочник. В справочнике есть следующие поля:

  • Название (то, что будет отображаться на странице)
  • Дата начала
  • Дата завершения

На странице есть также поле с типом "Дата" (назовем его "Валидатор"). Необходимо, чтобы выполнялась проверка находится ли значение, указанное в поле "Валидатор" в интервале ["Дата начала", "Дата завершения"].

Правильное решение - отфильтровать список значений справочника, отображая только те значения, которые можно указать.

Есть два решения задачи:

Алексей, здравствуйте.

Задача в следующем. Есть справочник, в котором есть поля Название, Дата начала, Дата окончания. Справочник редактируется в разделе Дизайнер системы - справочники. В этом справочнике необходимо контролировать, чтобы дата окончания не была меньше даты начала. Чтобы при попытке сохранить запись справочника производилась проверка и запись справочника не сохранялась бы при невыполнении условия.

"Для решения указанной задачи ПРАВИЛЬНЕЕ использовать не встроенные процессы, а клиентский код."



- я извиняюсь, а почему это "ПРАВИЛЬНЕЕ"? Потому, что заморачиваться не хочется? А если мне нужно обезопасить данные, чтобы сотрудник не "нахимичил"? Ваша валидация, которая "ПРАВИЛЬНЕЕ", обходится средствами браузера на раз-два. И действительно "ПРАВИЛЬНЕЕ" было бы организовать валидацию на стороне сервера перед сохранением.

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

* Во первых, сообщение ошибки вылезет пользователю на экран в информационном окошке , так что можете сообщить, что не так.

* Во вторых, сохранения точно не произойдёт.

* В третьих, такую проверку пользователь точно не обойдёт.

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

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

Есть конструкция:

select * from UsrDocument

INNER JOIN UsrDocumentPackage on UsrDocument.UsrPackageCPId=UsrDocumentPackage.UsrCPId

where UsrDocumentPackage.UsrCodeId = 'e06c50cb-ac4c-41ce-9493-033e4b54ea14'

которую нужно вынести в filterGroup.

filterGroup.add(

                "UsrPackageFilterLogistics",

                Terrasoft.createColumnFilterWithParameter(

                Terrasoft.ComparisonType.EQUAL,

                "UsrDocumentPackage.UsrCode",

                "00e6efc8-cc7e-4ac7-af41-6310bb5110e8"));

не работает, как это правильно сделать?

 

 

Нравится

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

Вам необходимо использовать синтаксис ESQ-запроса во втором аргументе, для присоединения таблицы, см. https://academy.terrasoft.ru/sites/default/files/documents/docs/technic/SDK/7.9.0/BPMonline_development_guide.pdf

стр. 389 - 391

А лучше прямо с 371-ой страницы.

В Вашем случае строка ESQ запроса повторяющая ваш SQL-заспрос будет выглядеть так (Учитывая что текущая схема UsrDocument, а это может быть не так):

 

[UsrDocumentPackage:UsrCP:UsrPackageCP].UsrCode

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

В конечном варианте Ваш фильтр будет выглядеть вот так

filterGroup.add(
  "UsrPackageFilterLogistics",
   Terrasoft.createColumnFilterWithParameter(
      Terrasoft.ComparisonType.EQUAL,
      "[UsrDocumentPackage:UsrCP:UsrPackageCP].UsrCode",
      "00e6efc8-cc7e-4ac7-af41-6310bb5110e8"
   )
);

 

Севостьянов Илья Сергеевич,

Большое спасибо за пояснения, всё получилось.

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

Всем доброго времени суток.

Версия 7.10.

Вопрос такой - к примеру, есть стандартная колонка даты, которая выводится на страницу примерно так:

{
						"operation": "insert",
						"parentName": "GeneralInformationBlock",
						"propertyName": "items",
						"name": "Date",
						"values": {
							"bindTo": "Date",
							"layout": {"column": 12, "row": 0, "colSpan": 12},
							"dataValueType": Terrasoft.DataValueType.DATE
						}
					},

В соседней теме https://community.terrasoft.ru/questions/mozno-li-zamestit-kontrol#comm…, что стандартный конфиг для контрола даты генерится в схеме ViewGeneratorV2, в методе generateDateEdit, где вызывается контрол DateEdit.

У меня есть свой контрол UsrDateEdit, который имеет некоторые отличия от стандартного DateEdit (нужно для задачи). Как его правильно подключить, чтобы он работал только для конкретных полей (замещение всего ViewGeneratorV2 в этом случае не подходит - оно даёт изменения для всех полей дат). Насколько я понимаю, для этого нужно добавить "UsrDateEdit" в define и что-то в diff. Вопрос - что именно?

Также было бы интересно заодно узнать, как сделать аналогичную замену для случая, когда подключается сразу два блока с датами, связанных в периоде StartDate - DuteDate, как например в мини-карточке при создании Активности ActivityMiniPage. 

Спасибо.

Нравится

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

Добрый день, ответ на ваш вопрос есть в самом первом комментарии темы на которую вы ссылаетесь:

{
   "operation": "merge",
   "name": "Schedule",
   "values": {
      "className": "Terrasoft.UsrReg",
   }
},

Где Terrasoft.UsrReg - и есть альтернативное имя вашего контрола.

Мотков Илья,

Илья, спасибо, действительно проглядел этот момент.

И всё-таки хотел бы уточнить вторую часть вопроса: если я хочу заменить генерацию дат в блоке диапазона внутри MiniPageDatePeriodGenerator, где там следует вызывать изменённый генератор дат?

Внутри этого блока?

this.generateDateTimeEdit({
							bindTo: itemName,
							name: itemName,
							visible: visible,
							controlConfig: timeEditConfig
						})

 

Заместил MiniPageDatePeriodGenerator, в замещении скопипастил код оригинала, + добавил в объект при вызове generateDateTimeEdit параметр isUseMyControl: true.

Далее в генераторе ViewGeneratorV2 в методе generateDateEdit проверяю isUseMyControl и в зависимости от значения использую UsrDateEdit или оригинальный DateEdit.

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

Вопрос - что именно могло отвалиться? Сам файл MiniPageDatePeriodGenerator остался почти без изменений, кроме добавления одного параметра.

UPD: нашёл ошибку, просто надо было изначально создать свой генератор, а не замещать существующий.

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

Всем доброго времени суток.

Есть контрол календарика: https://academy.terrasoft.ru/jscoresdk/#!/api/Terrasoft.controls.DatePi…

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

define("UsrDateControl", [], function() {
 
	Ext.define("Terrasoft.controls.UsrDate", {
		extend: "Terrasoft.DatePicker",
		alternateClassName: "Terrasoft.UsrDate",
 
		show: function(){
			this.callParent(arguments);
			console.log("open datepicker");
		},
 
	});
 
});

Попробовал - но не работает.. возможно ли вообще такое замещение?

Изначальная идея - добавить возможность блокировать выбор определённых дат.

Нравится

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

Было бы здорово, если бы на Marketplace появились custom-контролы

Вам поможет вот эта, ранее поднимаемая мною тема.

https://community.terrasoft.ru/questions/rassirit-logiku-susestvuusego-klassa-extjs-v-bpm

 

Севостьянов Илья Сергеевич пишет:

Вам поможет вот эта, ранее поднимаемая мною тема.

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

 

//Контрол
define("UsrRegControl", ["schedule-edit"], function() {
 
	Ext.define("Terrasoft.controls.UsrReg", {
		extend: "Terrasoft.ScheduleEdit",
		alternateClassName: "Terrasoft.UsrReg",
 
		renderSchedulerItems: function(){
			this.callParent(arguments);
			console.log("RENDER");
		},
	});
 
});
 
//Подключение
define("ActivitySectionV2", ["UsrRegControl"],
	function() {
		return {
 
			entitySchemaName: "Activity",
 
			methods: {},
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "merge",
					"name": "Schedule",
					"values": {
						"className": "Terrasoft.UsrReg",
					}
				},
 
			]/**SCHEMA_DIFF*/
		};
	}
);

Проблема в том, что datepicker - слишком много где используется, и даже не подключается явно в нужных схемах, по сути привязан к типу колонки "Дата и время". Вопрос - где тогда его заменять?

И ещё вопрос - можно ли где-нибудь посмотреть про override, как правильно его использовать?

Вот, например, сделал свой модуль:

 

define("UsrDatePicker", [], function() {
 
	Ext.define("Terrasoft.controls.UsrDatePicker", {
		override: "Terrasoft.DatePicker",
		alternateClassName: "Terrasoft.UsrDatePicker",
 
/* здесь взял полностью содержимое контрола из https://academy.terrasoft.ru/jscoresdk/source/datepicker.html#Terrasoft-controls-DatePicker + добавил на init и getTplData console.log("test") */
 
	});
 
});

Но такое впечатление, что замещения не произошло - ни одного лога не вывелось при открытии/изменении значения календаря.

Где-то ещё что-то нужно подключить?

Здравствуйте. Если Вам нужно заместить везде станд. контрол даты, то посмотрите на схему "ViewGeneratorV2", он занимается генерацией стандартных конфигов для контролов. В нем есть метод "generateDateEdit", который генерирует view-конфиг для контрола даты, можете заместить эту схему и в этом методе заменить класс "Terrasoft.DateEdit" на свой.

Колебянов Виталий Романович пишет:

Виталий Романочив, здравствуйте.

Спасибо за подсказку, я сделал свою версию модуля DateEdit - UsrDateEdit, скопировал в него текст оригинального DateEdit, и заместил схему ViewGeneratorV2 - это сработало. Но мне нужно заместить не  DateEdit, а DatePicker, который вызывается внутри UsrDateEdit:

 

createDatePicker: function() {
		var datePicker = this.datePicker = Ext.create("Terrasoft.UsrDatePicker", {
			renderTo: Ext.getBody(),
			parentEl: this.wrapEl,
			date: this.value
		});
		datePicker.on("dateSelected", this.onDateSelected, this);
		datePicker.on("currentDateSelected", this.onDateSelected, this);
	},

Вот сейчас если я так укажу, то на Ext.create("Terrasoft.UsrDatePicker" падает ошибка (календарик не показывается): GET https://0418605-sales-enterprise-demo.bpmonline.com/0/Nui/Terrasoft/Usr… 404 (Not Found)

Как мне заместить именно сам календарик DatePicker?

UsrDatePicker - пока по сути тот же DatePicker, только везде где в коде встречается DatePicker дописал Usr.

Все создаваемые файлы в пакете Custom.

Судя по всему, ошибка возникает потому, что замещения не были подгружены в память. Как вариант, вы можете заместить BootstrapModule следующим образом:

 

define("BootstrapModules", function() {
	return {
		"LookupUtilitiesV2": {},
		"ConfigurationEnumsV2": {},
		"ConfigurationConstantsV2": {},
		"DashboardFunnelEnums": {},
		"StructureExplorerUtilitiesV2": {},
		"UsrDatePicker": {},
		"UsrDateEdit": {}
	};
});

 

Смородинов Денис,

Скорее всего проблема в том, что вы не добавили свой "UsrDatePicker" в зависимость UsrDateEdit, т.е. должно быть так:

define("UsrDateEdit", ["UsrDatePicker"], function() {
......
});

 

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