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



По умолчанию как я понял стоит секунд 30, после отваливается с ошибкой "Превышен лимит времени выполнения запроса к серверу приложений статус ответа..."

Вызываю обычный сервис так:

ServiceHelper.callService("ServiceName", "ServiceMethodPost", function(response) {
	window.console.log(response);
}, serviceData, this);

 

Нравится

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

Сериков Асхат Кайратович,

Данный вариант правильный

var config = {
		serviceName: "ServiceName",
		timeout: 100000
	};
var serviceData = {
	phoneNumber: phoneNumber ? phoneNumber : "",
	userName: contact.displayValue,
	email: email ? email : ""
};
ServiceHelper.callService(config, "ServiceMethodPost",  function(response) {
	window.console.log(response);
}, serviceData, this);

Логика ServiceHelper выглядит так:

define("ServiceHelper", ["ext-base", "terrasoft"], function(Ext, Terrasoft) {
 
	/**
	 * ######## ##### ###-#######.
	 * @param {String|Object} config ### ####### ### ######### ###### #######.
	 * @param {String} methodName ### ######.
	 * @param {Function} callback (optional) ####### ######### ######.
	 * @param {Object} data (optional) ###### # ####### #######.
	 * @param {Object} scope (optional) ######## ######.
	 * @return {Object} ######### #######.
	 */
	function internalCallService(config, methodName, callback, data, scope) {
		var serviceName;
		if (config && Ext.isObject(config)) {
			serviceName = config.serviceName;
			methodName = config.methodName;
			callback = config.callback;
			data = config.data;
			scope = config.scope;
		} else {
			serviceName = config;
		}
		var dataSend = data || {};
		var workspaceBaseUrl = Terrasoft.utils.uri.getConfigurationWebServiceBaseUrl();
		var requestUrl = workspaceBaseUrl + "/rest/" + serviceName + "/" + methodName;
		var requestConfig = {
			url: requestUrl,
			headers: {
				"Accept": "application/json",
				"Content-Type": "application/json"
			},
			method: "POST",
			jsonData: Ext.encode(dataSend),
			callback: function(request, success, response) {
				if (!callback) {
					return;
				}
				var responseObject = response;
				if (success) {
					responseObject = Terrasoft.decode(response.responseText);
				}
				callback.call(this, responseObject, success);
			},
			scope: scope || this
		};
		if (config && config.timeout) {
			requestConfig.timeout = config.timeout;
		}
		return Terrasoft.AjaxProvider.request(requestConfig);
	}
 
	return {
		callService: internalCallService
	};
});

 

Добрый день!

Timeout указывается в конфиге вызова сервиса (параметр timeout).

В вашем случае будет так:

var config = {
		serviceName: "ServiceName",
		timeout: 100000
	};
ServiceHelper.callService(config, "ServiceMethodPost",  function(response) {
	window.console.log(response);
}, serviceData, this);

 

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

Спасибо

var serviceData = {
	phoneNumber: phoneNumber ? phoneNumber : "",
	userName: contact.displayValue,
	email: email ? email : ""
};
ServiceHelper.callService("ServiceName", "MethodName", function(response) {
	window.console.log(response);
}, serviceData, this);

В моем случае в serviceData есть другие параметры веб сервиса, их нужно будет в отдельный объект выложить? Не совсем понимаю как БПМ определит что является обычным параметром, а что конфигурационным

Сериков Асхат Кайратович,

Данный вариант правильный

var config = {
		serviceName: "ServiceName",
		timeout: 100000
	};
var serviceData = {
	phoneNumber: phoneNumber ? phoneNumber : "",
	userName: contact.displayValue,
	email: email ? email : ""
};
ServiceHelper.callService(config, "ServiceMethodPost",  function(response) {
	window.console.log(response);
}, serviceData, this);

Логика ServiceHelper выглядит так:

define("ServiceHelper", ["ext-base", "terrasoft"], function(Ext, Terrasoft) {
 
	/**
	 * ######## ##### ###-#######.
	 * @param {String|Object} config ### ####### ### ######### ###### #######.
	 * @param {String} methodName ### ######.
	 * @param {Function} callback (optional) ####### ######### ######.
	 * @param {Object} data (optional) ###### # ####### #######.
	 * @param {Object} scope (optional) ######## ######.
	 * @return {Object} ######### #######.
	 */
	function internalCallService(config, methodName, callback, data, scope) {
		var serviceName;
		if (config && Ext.isObject(config)) {
			serviceName = config.serviceName;
			methodName = config.methodName;
			callback = config.callback;
			data = config.data;
			scope = config.scope;
		} else {
			serviceName = config;
		}
		var dataSend = data || {};
		var workspaceBaseUrl = Terrasoft.utils.uri.getConfigurationWebServiceBaseUrl();
		var requestUrl = workspaceBaseUrl + "/rest/" + serviceName + "/" + methodName;
		var requestConfig = {
			url: requestUrl,
			headers: {
				"Accept": "application/json",
				"Content-Type": "application/json"
			},
			method: "POST",
			jsonData: Ext.encode(dataSend),
			callback: function(request, success, response) {
				if (!callback) {
					return;
				}
				var responseObject = response;
				if (success) {
					responseObject = Terrasoft.decode(response.responseText);
				}
				callback.call(this, responseObject, success);
			},
			scope: scope || this
		};
		if (config && config.timeout) {
			requestConfig.timeout = config.timeout;
		}
		return Terrasoft.AjaxProvider.request(requestConfig);
	}
 
	return {
		callService: internalCallService
	};
});

 

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

Понял, пойду попробую спасибо,

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

В целом все так как вы и сказали, только раз присутствует конфиг, то все остальные параметры(данные, scope, callback) нужно так же перенести в него, иначе они перезатрутся при вызове. Спасибо!

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

Здравствуйте, подскажите, как в версии 7.13.0 можно отключить минимизацию и сборку скриптов в all-combined.js. 

Установка параметра "SeparatedJsFiles" в true в web.config в этой версии не помогает

 

Нравится

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

Добрый день!

Данная тема обсуждалась тут

Добрый день!

Данная тема обсуждалась тут

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

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

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

The type or namespace name 'Http' does not exist in the namespace 'System.Net' (are you missing an assembly reference?) FILE <Название пользовательского Web сервиса>

Данное пространство имён есть в .NetFramework 4.7.

Кто с таким сталкивался?

Нравится

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

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

Добавьте в ваш пользовательский сервис

using System.Net.Http;

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

На эту строчку и ругается компилятор.

Коновалов Игорь,

В 7.13 правда не нахожу библиотеки System.Net.Http.

Могу посоветовать скачать ее и добавить во внешние сборки

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

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

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

О компании

LvBS – школа с европейскими ценностями и подходами, которая развивает открытое и ответственное бизнес-сообщество. Цель Львовской бизнес-школы — содействовать развитию визионеров, которые будут строить украинскую бизнес-среду. Основываясь на уникальном симбиозе бизнес-школы и католического университета, Львовская бизнес-школа берет за основу международность как главный принцип школы, с фокусом на личностном развитии каждого участника программ и мероприятий.

 

Предпосылки внедрения

До внедрения bpm’online сотрудники компании использовали несколько закрытых разрозненных клиентских баз. Это создавало хаотичность хранения информации и делало невозможным стандартизацию процесса. Сложно было собрать информацию об участниках мероприятия, за которое отвечало несколько менеджеров.  Кроме того, это влияло на взаимодействие с клиентами: сотрудники не могли оперативно начать коммуникацию, так как затрачивали дополнительное время на сбор и подготовку информации.

 

Для создания единой среды для обработки информации о взаимодействии с клиентами, ведения мероприятий, сделок и маркетинговых активностей была выбрана платформа bpm’online. Львовская бизнес-школа сделала выбор в пользу сразу двух продуктов — bpm’online sales и bpm’online marketing.

 

Основные задачи внедрения bpm’online:  

  • автоматизация процесса получения новых потребностей клиентов;
  • ведение длинных сделок;
  • выполнение маркетинговых кампаний и рассылок;
  • систематизация наследования информации сотрудниками при смене позиции в компании;
  • составление общей картины работы бизнес-школы для разработки стратегии развития.

 

Выполненные настройки

В первую очередь кастомизирован раздел [Контакты]. С помощью дизайнера страниц созданы колонки для фиксации стоимости обучения для клиента и его реквизиты. Добавлена специальная колонка для менеджеров, в которой содержится информации о правилах расчета и внесения платежей. Добавлены детали «Паспортные данные», «Программы обучения» для добавления информации о программах обучения, стоимости программ, сумме оплаты и остатке необходимого платежа. Деталь «Платежи» позволяет вносить информацию об оплатах клиента.

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

Деталь «История обучения» собирает всю информацию о курсах и программах клиента, а также их статусы.

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

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

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

Короткая продажа предусматривает работу только с лидом, а по кейсу долгосрочного обучения, кроме кейса в лиде, реализован кейс в разделе [Продажи]. Кроме этого, bpm’online автоматически создает продажу на соответствующей стадии лида в зависимости от кейса. 

Case Management призван упрощать работу пользователей. Благодаря этому инструменту при выборе той или иной потребности менеджер знает, что в bpm’online будет предусмотрен алгоритм действий.

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

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

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

 

В продукте marketing используются рассылки и кампании, а также настроены web-формы для получения информации из посадочных страниц сайта компании в bpm’online с последующим автоматическим созданием лида. Благодаря всем этим инструментам упрощен процесс взаимодействия и информирования клиента.

 

Результат

В результате внедрения bpm’online Львовская бизнес-школа получила возможность использовать инструменты продаж и маркетинга в единой ИТ-экосистеме, что решает задачу объединения результатов работы из разных систем. Теперь в истории клиентов содержится как информация о сделках и потребностях клиента, так и об источниках потребностей и другая маркетинговая информация.

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

 

Нравится

Поделиться

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

в карточке контрагента при выстраивании взаимосвязей в виде диаграммы система выдает ошибку SqlException

Из-за чего может быть такое поведение?

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

Нравится

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

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

Как выяснилось, у контрагента в поле Parent был внесён его собственный идентификатор, в результате запрос иерархии взаимосвязей вызывал исключение: "Выполнение инструкции прервано. Максимальная рекурсия 100 была использована до завершения инструкции."

Для исправления ошибки достаточно удалить ссылку на родителя в контрагенте (подставить свой Id):

update Account
  set ParentId = null
  where Id = N'665E1BDF-54FA-4231-BE2D-9D4305D91BE3'

 

Добрый день!

Без логов и информации в консоли трудно что то понять.

Определенно что то не то происходит в RelationshipDiagramService. Далее можно отследить, в каком месте происходит ошибка

Используйте профилировщик sql запросов для нахождения причины SqlException и ее устранения

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

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

Как выяснилось, у контрагента в поле Parent был внесён его собственный идентификатор, в результате запрос иерархии взаимосвязей вызывал исключение: "Выполнение инструкции прервано. Максимальная рекурсия 100 была использована до завершения инструкции."

Для исправления ошибки достаточно удалить ссылку на родителя в контрагенте (подставить свой Id):

update Account
  set ParentId = null
  where Id = N'665E1BDF-54FA-4231-BE2D-9D4305D91BE3'

 

Да, это решило проблему. Спасибо.

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

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

Подскажите, пожалуйста, как в раздел продажи вынести быстрый фильтр по датам (как в активности с - по), который будет фильтровать по полю дата создания ИСТОРИИ СТАДИИ в карточке продажи. 

Как настроить такой фильтр по полю дата в самом разделе знаю, но как именно по полю дата в детали этого раздела.

Т.Е, я хочу в этом фильтре фильтровать записи (продажи) у которых за заданный период есть в истории стадий стадии

Нравится

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

По идее код должен выглядеть таким образом:

 define("OpportunitySectionV2", ["BaseFiltersGenerateModule"], function(BaseFiltersGenerateModule) {
    return {
        entitySchemaName: "Opportunity",
        methods: {
            initFixedFiltersConfig: function() {
                var fixedFilterConfig = {
                    entitySchema: this.entitySchema,
                    filters: [
                        {
                            name: "PeriodFilter",
                            caption: "",
                            dataValueType: this.Terrasoft.DataValueType.DATE,
                            startDate: {
                                columnName: "[OpportunityInStage:Opportunity:Id].StartDate",
                            },
                            dueDate: {
                                columnName: "[OpportunityInStage:Opportunity:Id].StartDate",
                            }
                        },
                    ]
                };
                this.set("FixedFilterConfig", fixedFilterConfig);
            }
        }
    };
});

Но это не будет работать, так как FixedFilterViewV2 не позволит создать элемент с таким id.

Могу предложить 2 варианта:

1) переопределить FixedFilterViewV2 и исправить этот метод. В 7.13.х переопределять модули сложно, но можно

2) настроить и сохранить расширенный фильтр

Смотрите документацию по применению расширенных фильтров

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

Тут фильтр на поля самого раздела, вопрос в том как в разделе добавить этот фильтр но фильтровать по записям детали (по полю дата в детали)

Тогда нужно вам писать свой фильтр который будет отбирать записи с иторией стадий попадающий в диапазон дат

Калушка Д.,

Напишите sql-запрос, который будет выбирать нужные значения из таблицы продаж, а потом этот запрос 'переведите' в програмный код понятный bpm'online.

Его потом и пропишите в конфиге для быстрых фильтров.

По идее код должен выглядеть таким образом:

 define("OpportunitySectionV2", ["BaseFiltersGenerateModule"], function(BaseFiltersGenerateModule) {
    return {
        entitySchemaName: "Opportunity",
        methods: {
            initFixedFiltersConfig: function() {
                var fixedFilterConfig = {
                    entitySchema: this.entitySchema,
                    filters: [
                        {
                            name: "PeriodFilter",
                            caption: "",
                            dataValueType: this.Terrasoft.DataValueType.DATE,
                            startDate: {
                                columnName: "[OpportunityInStage:Opportunity:Id].StartDate",
                            },
                            dueDate: {
                                columnName: "[OpportunityInStage:Opportunity:Id].StartDate",
                            }
                        },
                    ]
                };
                this.set("FixedFilterConfig", fixedFilterConfig);
            }
        }
    };
});

Но это не будет работать, так как FixedFilterViewV2 не позволит создать элемент с таким id.

Могу предложить 2 варианта:

1) переопределить FixedFilterViewV2 и исправить этот метод. В 7.13.х переопределять модули сложно, но можно

2) настроить и сохранить расширенный фильтр

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

Добрый день!

 

Работаю в файловом режиме.

После неловких моих движений стала появляться следующая ошибка:

Exception Message: Операция является недопустимой из-за текущего состояния объекта. Exception Type: Terrasoft.Common.TopologicalSorterLoopsException`1[Terrasoft.Core.Packages.Package] Exception Source: Terrasoft.Common Exception Stack Trace: в Terrasoft.Common.ListGraphNodeUtilities.OrderByTopology[T](IList`1 source) в Terrasoft.Core.Packages.WorkspaceUtilities.GetTopologyPackagePositions(UserConnection userConnection, Guid workspaceId) в Terrasoft.Core.SchemaManager`1.GetTopologyPackagePositions(Guid workspaceId) в Terrasoft.Core.SchemaManager`1.InitializeItems(Guid itemUId) в Terrasoft.Core.Entities.EntitySchemaManager.InitializeItems(Guid itemUId) в Terrasoft.Core.SchemaManager`1.InitializeItems() в Terrasoft.Core.Entities.EntitySchemaManager.Initialize(SchemaManagerProvider provider, SchemaManagerProviderConfigurationElement configuration) в Terrasoft.Core.SchemaManagerProvider.InitializeSchemaManager(String managerName) в Terrasoft.Core.SchemaManagerProvider.GetManager(String managerName) в Terrasoft.Core.UserConnection.GetSchemaManager(String schemaManagerName) в Terrasoft.Core.UserConnection.get_EntitySchemaManager() в Terrasoft.Core.DB.DBSecurityEngine.FindEntitySchemaNameByUId(Guid entitySchemaUId) в Terrasoft.Core.DB.DBSecurityEngine.GetEntitySchemaOperationsRightLevels(String schemaName) в Terrasoft.Core.DB.DBSecurityEngine.GetEntitySchemaOperationsRightLevel(String schemaName) в Terrasoft.Core.DB.DBSecurityEngine.GetIsEntitySchemaDeletingAllowed(String schemaName) в Terrasoft.WebApp.WorkspaceExplorerModule.CheckRights() в Terrasoft.WebApp.WorkspaceExplorerModule.Page_Load(Object sender, EventArgs e) в System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) в System.Web.UI.Control.OnLoad(EventArgs e) в System.Web.UI.Control.LoadRecursive() в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Остановил приложение, затем пул приложений, очистил базу Redis. Запустил все обратно - ошибка не исчезла. Перезапустил службу IIS, то же не помогло. Восстановил резервную копию, так же не помогло. (попробую еще раз)

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

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

Нравится

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

Во второй раз восстановил базу из другой резервной копии. Вышло сообщение о том что рабочее пространство Default не инициализировано. Скомпилировал приложение, пока все работает. 

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

select spd.syspackageid, sp.name, spd.dependonpackageid, sp2.name, spd2.dependonpackageid, sp3.name from SysPackageDependency spd 
inner join syspackage sp on sp.id = spd.syspackageid 
inner join syspackage sp2 on sp2.id = spd.dependonpackageid
inner join SysPackageDependency spd2 on spd2.syspackageid = spd.dependonpackageid
inner join syspackage sp3 on sp3.id = spd2.dependonpackageid where sp.name = 'название менявшегося пакета'

 

Спасибо, Александр, за поддержку! Да, я заметил по логам что компиляция стала уходить в цикл. Решил посмотреть логи продуктовой базы (июнь 2018), нашел там похожее сообщение о том что есть зацикленность в пакетах и успокоился на этом. Но ваш пост пролил свет на путь решения проблемы, буду разбираться дальше.

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

Здравствуйте, есть необходимость переименовать организационную роль all emploees во "Все сотрудники" пока переименовал название роли в тестовой системе, новым пользователям роль присваивается, выдается записям. 



Переименовывал кто-то орг. роль all employees? Будут последствия для системы? 

Нравится

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

Добрый день!

По сути орг. роль - это запись в таблице SysAdminUnit.

И должна быть связка по Id. Так что проблем быть не должно.



PS: поиск по "all emploees" по исходным кодам результата не дает

Добрый день!

По сути орг. роль - это запись в таблице SysAdminUnit.

И должна быть связка по Id. Так что проблем быть не должно.



PS: поиск по "all emploees" по исходным кодам результата не дает

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

Добрый день!

Не удается передать веб-сервису параметры методом POST, БП просто запускается, но не получает параметры. При использовании метода GET ошибок не возникает. использую строку /0/ServiceModel/ProcessEngineService.svc/UsrAddContragentPDZ/RunProcess

 public static void SendData()

        {

            var Request = HttpWebRequest.Create(processServiceUri) as HttpWebRequest;

            Request.Method = "POST";

            Request.Accept = "application/json";

            Request.ContentType = "application/json";

            Request.CookieContainer = AuthCookie;

            CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(processServiceUri));

            string csrfToken = cookieCollection["BPMCSRF"].Value;

            Request.Headers.Add("BPMCSRF", csrfToken);

            using (var requestStream = Request.GetRequestStream())

            {

                using (var writer = new StreamWriter(requestStream))

                {

                    string json = new JavaScriptSerializer().Serialize(new

                    {

                        BossID = "GBO_048845",

                        StatusPDZString = "007C2385-2EDC-402A-B40A-E74625E0E6DD",

                        PDZString = "4098,56"

                    });

                    writer.Write(json);

                    writer.Flush();

                    writer.Close();

                }

            }

Где может быть ошибка?

Нравится

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

Стала проблема получения списка всех Id записей в реестре.

this.getGridData().collection.keys.toString(); - вот это возвращает Id, но возвращает только те, которые видно в реестре, можно ли как то получить все айдишки, которые есть в реестре?

Нравится

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

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

Например, можете собрать все Id с помощью запроса esq следующего вида:

var ids = "";
 
var esq = this.getGridDataESQ();
this.initQueryColumns(esq);
this.initQuerySorting(esq);
this.initQueryFilters(esq);
this.initQueryEvents(esq);
 
esq.getEntityCollection(function(response) {
	if (response.success) {
		response.collection.each(function(item) {
			ids += item.get("Id") + ";";
		});
	}
}, this);

 

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

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

Например, можете собрать все Id с помощью запроса esq следующего вида:

var ids = "";
 
var esq = this.getGridDataESQ();
this.initQueryColumns(esq);
this.initQuerySorting(esq);
this.initQueryFilters(esq);
this.initQueryEvents(esq);
 
esq.getEntityCollection(function(response) {
	if (response.success) {
		response.collection.each(function(item) {
			ids += item.get("Id") + ";";
		});
	}
}, this);

 

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