Нужно при создании лида проверить есть ли уже компания комбинацией БИН и города. Сделал через валидацию, данные читаются все с базы нормально, но проблема в правильном построении callback функции, так как JS пока запускает проверку в базе уже отвечает return в валидацию. PsCode - это БИН поле, City - это города поле

setValidationConfig: function() {
	this.callParent(arguments);
	this.addColumnValidator("PsCode", this.validateCodePlusCity);
},
validateCodePlusCity : function() {
	var invalidMessage = this.get("Resources.Strings.CodePlusCityErrorMessage");
	var code = this.get("PsCode");
	var city = this.get("City");
	if (!code) {
		code = "";
	}
	if (!city) {
		city = "";
	}
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Account"});
	esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
	esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
		"Code", code));
	esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
		"City.Id", city.value));
	esq.getEntityCollection(function(result) {
		if (result.success) {
			invalidMessage = "";
		}
	}, this);
	return {
		invalidMessage: invalidMessage
	};
}

 

Нравится

4 комментария
Лучший ответ
Попробуйте примерно так:

setValidationConfig: function() {
	this.callParent(arguments);
	this.validateCodePlusCity(function(invalidMessage) {
		//Здесь доступно значение invalidMessage
		this.addColumnValidator("PsCode", invalidMessage);
	}, this);
	
},
validateCodePlusCity : function(callback, scope) {
	var invalidMessage = this.get("Resources.Strings.CodePlusCityErrorMessage");
	var code = this.get("PsCode");
	var city = this.get("City");
	if (!code) {
		code = "";
	}
	if (!city) {
		city = "";
	}
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Account"});
	esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
	esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
		"Code", code));
	esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
		"City.Id", city.value));
	esq.getEntityCollection(function(result) {
		if (result.success) {
			invalidMessage = "";
			Ext.callback(callback, scope, [invalidMessage]);
		}
	}, this);
}

 

В esq.getEntityCollection нужно передавать функцию которая обработает результат выборки, в вашем случае скорее всего выдаст сообщение об неуникальности лида! Смотрите асинхронные события JS

Те обработка полученных в запросе данных идет асинхронно!

 

 

 

 

Попробуйте примерно так:

setValidationConfig: function() {
	this.callParent(arguments);
	this.validateCodePlusCity(function(invalidMessage) {
		//Здесь доступно значение invalidMessage
		this.addColumnValidator("PsCode", invalidMessage);
	}, this);
	
},
validateCodePlusCity : function(callback, scope) {
	var invalidMessage = this.get("Resources.Strings.CodePlusCityErrorMessage");
	var code = this.get("PsCode");
	var city = this.get("City");
	if (!code) {
		code = "";
	}
	if (!city) {
		city = "";
	}
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Account"});
	esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
	esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
		"Code", code));
	esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
		"City.Id", city.value));
	esq.getEntityCollection(function(result) {
		if (result.success) {
			invalidMessage = "";
			Ext.callback(callback, scope, [invalidMessage]);
		}
	}, this);
}

 

Если вам нужно валидейтить перед сохранением то имхо лучше использовать asyncValidate Пример ниже callback нужно передать в esq.getEntityCollection.  Если нужно проверять при изменении, можно создать виртуальную колонку и при смене города или БИН менять ее значение в зависимости от результата проверки. А в  setValidationConfig проверять результат проверки уникальности города из виртуальной колонки. Если не получится пишите.

asyncValidate: function(callback, scope) {
    this.callParent([function(response) {
        if (!this.validateResponse(response)) {
            return;
        }
        Terrasoft.chain(
            function(next) {
                this.myValidationMethod(function(response) {
                    if (this.validateResponse(response)) {
                        next();
                    }
                }, this);
            },
            function() {
                callback.call(scope, response);
            },
        this);
    }, this]);
}

 

Спасибо! Отличные ответы, думаю применить теперь еще в других частях кода их.

Показать все комментарии
Мобильное приложение
7.12
sales

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

 

Каким образом возможно переименовать название поля в Мобильном приложении?

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

Заранее спасибо.

Нравится

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

Точно не помню, но попробуйте посмотреть в Дизайнере системы - Дизайнер мобильной версии, выбираете нужное рабочее пространство, раздел и там смотрите, что можно с полем сделать.

В «Мастере мобильного приложения» можно только выбирать поля, уже существующие в объекте. Соответственно, чтобы переименовать, нужно менять в самом объекте раздела, его в дизайнере (или в переводах, нужно смотреть). Но так поле переименуется везде.

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

Добрый день, есть 2 вкладки, одну из которых необходимо скрывать при условии. Но при удалении выделенной вкладки из коллекции tabscollection почему то остаются элементы этой текущей вкладки.

var TabCandidatesList = tabsCollection.contains("TabCandidatesList") ? tabsCollection.get("TabCandidatesList"):false;
if (!TabCandidatesList) 
     tabsCollection.insert(0, "TabCandidatesList", Terrasoft.TabCandidatesList);

var TabConditions = tabsCollection.contains("TabConditions") ? tabsCollection.get("TabConditions"):false;
if (TabConditions) {
	Terrasoft.TabConditions = TabConditions;
	tabsCollection.removeByKey("TabConditions");
}

Как это можно сделать правильно? Хотелось бы при изменении условия вставить вкладку и сразу отобразить ее.

Нравится

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

В твоем случае возможно лучше делать так...

//hide
closeTabs: function() {
	var tabsCollection = this.get("TabsCollection");
	tabsCollection.eachKey(function(tabName, tab) {
		var tabContainerVisibleBinding = tab.get("Name");
		this.set(tabContainerVisibleBinding, false);
		}, this);
	},
//activate
setActiveTab: function(activeTabName) {
	this.closeTabs();
	this.set("ActiveTabName", activeTabName);
	this.set(activeTabName, true);
},

 

Вы не удаляйте вкладку, а скрывайте ее:



 

init: function() {   

this.callParent(arguments);

var scope = this;

require(["jQuery"], function() {

  scope.hideTabs();

});

},



hideTabs: function() {

$(document).bind("DOMNodeInserted", function(e) {

  if (e.target.id === "Нужный контейнер") {

   var tabs = Ext.getElementById("Нужный элемент");

   var tab = Ext.get(tabs.children[1]);

   if (Условие при котором скрывать) {

    tab.setWidth(0);

    tab.hide();

   }

   else {

    tab.setWidth("auto");

    tab.show();

   }

  }

}.bind(this));

}

 

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

mcNosferatum,

может быть обновиться до 7.12.4 и использовать это 

http://prntscr.com/kr0luu ?

Попробуй так активировать вкладку

var activeTabName = "GeneralMacrosTab";
this.set("ActiveTabName", activeTabName);
this.set(activeTabName, true);

 

В твоем случае возможно лучше делать так...

//hide
closeTabs: function() {
	var tabsCollection = this.get("TabsCollection");
	tabsCollection.eachKey(function(tabName, tab) {
		var tabContainerVisibleBinding = tab.get("Name");
		this.set(tabContainerVisibleBinding, false);
		}, this);
	},
//activate
setActiveTab: function(activeTabName) {
	this.closeTabs();
	this.set("ActiveTabName", activeTabName);
	this.set(activeTabName, true);
},

 

Литвинко Павел,

Спасибо! Подкорректировал Ваш код и свой и вышло то что нужно)

Показать все комментарии
MemoryStream
pdf
загрузка файлов
7.12
sales

Пользователь нажимает кнопку/действие - идет вызов Исходного кода. Там вылолняется работа и возвращает MemoryStream(это файл ПДФ)

Как теперь сделать чтобы этот файл или скачался или отобразился в новой странице?

Нравится

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

Как то так:

var response = System.Web.HttpContext.Current.Response;
	response.ClearContent();
	response.ContentType = "application/pdf";
	response.AddHeader("Content-Disposition", "inline; filename=" + docName);
	response.AddHeader("Content-Length", docStream.Size);
	response.BinaryWrite((byte[])docStream);
	response.End();

 

Как то так:

var response = System.Web.HttpContext.Current.Response;
	response.ClearContent();
	response.ContentType = "application/pdf";
	response.AddHeader("Content-Disposition", "inline; filename=" + docName);
	response.AddHeader("Content-Length", docStream.Size);
	response.BinaryWrite((byte[])docStream);
	response.End();

 

Григорий Чех,

Благодарю, вот в итоге рабочий код:

var response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.ContentType = "application/pdf";
response.AddHeader("Content-Disposition", "inline; filename=Ведомость расчетов с клиентом.pdf");
response.AddHeader("Content-Length", f.GetLongLength(0).ToString());
response.BinaryWrite(f);
response.End();

f - это тип byte[]

Рад что у вас получилось smiley

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

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

message: Uncaught Terrasoft.InvalidOperationException: SvnSystemException. Can't open file 'C:\Windows\TEMP\1\SBORKI-TS_Developer\Default\Svn\Supervisor\servers'



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

Нравится

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

Проблема была в правах доступа. После переименования папки "1" была создана новая, с нормальными правами.

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

Добрый день.

Я могу создать при помощи мастера раздела новую сущность и при этом она будет отображена в интерфейсе bpmonline. А если я создал сущность в конфигураторе, при редактировании своего пакета, как мне эту сущность отобразить в интерфейсе, например, в виде реестра? Существует ли простой способ это сделать? Ведь я не могу в мастере раздела указать уже существующую сущность при создании раздела. Заранее спасибо за ответ. 

Нравится

2 комментария
воронка продаж
7.12
sales

Можно ли настроить воронку продаж, чтобы сумма показывалась по "Сумме продажи", а не по "Бюджету клиента"?Изображение удалено.

Нравится

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

Если не трогать системные представления то посмотрите в сторону как изменить расчеты в воронке продаж

А через представление не пробовали?

Григорий Чех,

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

Если не трогать системные представления то посмотрите в сторону как изменить расчеты в воронке продаж

Да, не тривиально... Вообще, я не понимаю, почему воронку решили строить по бюджету клиента...

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

Перестал работать поиск дублей при сохранении записи "Контакт", "Контрагент", хотя поиск дублей через действия раздела работает корректно.

Признак правила поиска "Использовать правило при сохранении" установлен.

Провел отладку: метод findDuplicates() модуля DuplicatesSearchUtilitiesV2 корректно передает данные в DeduplicationService.FindDuplicatesOnSave()

В свою очередь метод сервиса FindDuplicatesOnSave вызывает метод DeduplicationProcessing.FindDuplicates, из которого идет обращение к хранимой процедуре tsp_FindDuplicates.

Код хранимой процедуры не отличается от кода этой же процедуры на чистой базе.

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

В чем может быть проблема? Есть подозрение, что проблема появилась после перехода на версию 7.12

Нравится

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

Для включения поиска дублей при сохранении необходимо открыть Дизайнер системы -> Правила поиска дублей, выбрать необходимое правило и установить признак Проверять при сохранении.

Рекомендую использовать правила поиска по нескольким полям, это позволит избежать проблем с производительностью и выбором записей при сохранении(меньше записей будет в выборке).

Если это сделано, дело ещё может быть в том, что в разделе Контакты есть несколько карточек редактирования. Работа в таком режиме была исправлена в 7.12.2.



Рекомендуем обновить до версии 7.12.2, после обновления проблема будет решена. А на версии 7.12.3 также работает поиск дублей при сохранении при создании контакта через мини-карточку.

Мотков Илья пишет:

Дизайнер системы -> Правила поиска дублей

А что делать, если в дизайнере системы на 7.16 нет "Правила поиска дублей"? Где оно включается?

Показать все комментарии
email
ActionsDashboard
7.12
sales

Коллеги, добрый день.

После обновления на 7.12.3.980 возникла ошибка при отправлении писем с панели "Следующий шаг".

Выяснилось, что наряду с  полем Recepient  появилось новое поле Recipient (https://yadi.sk/i/P3g6M4wf3aeEfg). 

И именно заполнение этого поля требуется при отправке письма.



Зачем добавлено это поле? 

Как быть с обращениями клиентов об ошибках при отправке, если схема EmailMessagePublisherPage дорабатывалась на основе поля Recepient?

Нравится

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

Правильно пишется «Recipient», лучше привязываться к нему. Видимо, не сразу заметили и исправили. А в объекте оставили старое, чтобы не сломать связь с полем в таблице базы.

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

Добрый день, коллеги!

Как вы добиваетесь в английской версии bpm'online того, чтобы в фильтрах Week начинался не с воскресенья, а с понедельника?

Спасибо

Нравится

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

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

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

В данном случае можно было бы сразу предусмотреть возможность 'более гибкой' работы с этой функциональностью!  

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

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

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

В данном случае можно было бы сразу предусмотреть возможность 'более гибкой' работы с этой функциональностью!  

Да, некоторые вещи в системе непонятно почему захардкодены...

Уже в версии 7.12.3 получили какие-то изменения, но опять привязали Европу к американским стандартам :(



Елена Левцова,

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

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