При запуске приложения всплывает такая ошибка. Собственно, как это фиксить? (установка была выполнена согласно туториалу по установке приложения on-site)Изображение удалено.

Нравится

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

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

Судя по ошибке проблема с redis, либо указаны некорректно параметры подключения, либо нет доступа к нему.

Рекомендую обратиться в тех. поддержку Террасофт - support@terrasoft.ru

 

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

Можно ли как-то продолжить двигаться по процессу после ошибки? В автоматическом или ручном режимах (в журнале процессов)?

Например, не сохранились данные в элементе "добавить данные", допустим, это не критично, можно ли продолжить процесс?

Нравится

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

Добрый день, Алексей!



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



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



Если ошибка возникает на уровне БД (блокировка транзакции, дедлок) возможен риск потери служебных данных. В таком случае продолжить экземпляр процесса не представляется возможным.



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

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

 

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

Нравится

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

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

Получить не хэшированный пароль нельзя.

Можно выгрузить хэша пароля, но раскодировать его нельзя.

Добавить комментарий

Shevchenko Andrey,

Спасибо

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

Коллеги, интересует можно ли ограничить доступ к bpm только по внутренней сети и вывести field sales в открытый доступ?

 

Нравится

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

Если приложение не будет доступно по внешнему адресу, мобильное приложение не сможет синхронизироваться с БД.

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

Добрый день!

Есть БП с текстовым параметром (TextResult), целочисленным параметром (IntResult), идентификатор (AccountId). В БП я задаю им определенные значения, явно отличные от пустой строки, нуля и пустого Guid. После выполнения БП я хочу получить результирующее значение любого параметра.

Пробовал как указано на академии Get запрос делать прямо в строке браузера http://localhost:8082/0/ServiceModel/ProcessEngineService.svc/TestProce…

ответ: http://schemas.microsoft.com/2003/10/Serialization/">null     ---- null, вместо текста который должен был быть результатом.

на запрос http://localhost:8082/0/ServiceModel/ProcessEngineService.svc/TestProce…получаю ответ http://schemas.microsoft.com/2003/10/Serialization/">0   ---- опять ноль, хотя указывал разные целые числа

ну и для Guid ответ http://schemas.microsoft.com/2003/10/Serialization/">"00000000-0000-0000-0000-000000000000"  --- снова ноль.

НО входящие значения параметров БП применяются и всё отлично.

Что за ньюанс такой, кто ведает прошу поделиться знаниями.

Может "Параметр процесса, который хранит результат выполнения процесса" (взято из академии) как-то нужно пометить в БП?

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

 

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

 

Нравится

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

Добрый день, 

Для того что бы получить результирующий параметр необходимо что бы процесс был компилируемый.

Попробуйте проставить признак компилировать и снова выполнить запрос.

Tsopa,

Все верно спасибо.

Tsopa,

а что делать если процесс не компилируется (7.15.3) и в процессе не используется элемент задание-сценарий?

Сейчас используют интерпретируемые процессы, компилируемые остались только старые. А в интерпретируемых возврат значения не предусмотрен. Для обмена информацией либо писать в какую-то таблицу, а потом извне читать по OData, либо вызывать в самом БП веб-сервис системы, с которой идёт интеграция.

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

Всем привет, подскажите как сделать цикл в бизнес процессе?

Задача пробежаться по всем лидам и на каждой итерации выполнить некую логику

Нравится

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

Ну, не знаю что конкретно Вы хотите сделать, но можно создать булевое поле, Читать количество записей, где это поле = false, если такие записи найдены, то выполняете свою логику и ставите в это поле true. Опять идет читка данных из лидов, если опять найдены такие лиды где false - отрабатывает та же логика. Если записей не найдено. завершаете процесс. Надеюсь чем-то помог.

 

Можно сделать блок БП «скрипт» и в С#-коде написать GetEntityCollection, а затем по результату foreach-циклом, как в примере №4 тут.

Но нужно быть осторожным, чтобы всё не повесить длительным выполнением запроса на сервере. Если лидов реально много, можно скомбинировать с прошлым советом и за каждый запуск брать и обрабатывать в цикле первые N ещё не обработанных.

Товарищи спасибо

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

Необходимо реализовать автоматическое добавление полей на карточку по определенному условию. То есть не в diff заранее добавлять, а именно динамически. Условие должно отрабатывать после загрузки страницы.

Нравится

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

Bind Visible по условию чем плох?

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

Создаете Ext класс, например, "Terrasoft. TextEdit"

Ext.create("Terrasoft. TextEdit", {...})

 – примеры можно поискать в коробке. Потом находите компонент, в который хотите добавить новый элемент

var cmp = Ext.getCmp()

В полученном компоненте в свойство items добавляете его

cmp.items.add(«новий компонент»)

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

cmp.reRender()

 

VladKapitanchyk,

Добрый день. Мне надо после загрузки вкладки добавить.

Пример.

{
		"operation": "insert",
		"name": "Tab4040b433TabLabelGridLayoutef7de6d2",
		"values": {
			"itemType": 0,
			"items": [],
			"afterrender": {
				"bindTo": "loadWidgetModule"
			},
			"afterrerender": {
				"bindTo": "loadWidgetModule"
			}
		},
		"parentName": "Tab4040b433TabLabelGroup9e196572",
		"propertyName": "items",
		"index": 0
	},
loadWidgetModule: function (config) {
				debugger;
 
				var cmp =Ext.getCmp("UsrUsrVwSysAccountLog1PageTab4040b433TabLabelGridLayoutef7de6d2GridLayout");// Ext.getCmp("Tab4040b433TabLabelGridLayoutef7de6d2");
				// this.addFields();
				var labelConfig = Ext.create("Terrasoft.Container", {
					id: "headerContainer",
					items: [
						{
							className: "Terrasoft.Label",
							id: "headerLabel",
							selectors: {
								wrapEl: "#headerLabel"
							},
							caption: "Изменение полей",
 
						}
					]
				});
				 cmp.items.add(labelConfig);
				 cmp.reRender();
			},

но при добавлении элемента (items.add) ошибка  message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент  в render

Евгений Волоцкой,

В контейнер нужно тоже передавать объект Ext -Ext.create("Terrasoft.Label"…)

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

Добрый день.

Есть задача добавлять в продукт сопряженные продукты (нечто вроде матрицы). При этом есть требование, чтобы при добавлении сопряженных продуктов были доступны все способы фильтрации и поиска - как в разделе Продукты (в том числе, Группы и Каталог). В связи с этим было принято решение создать страницу CrossProductSectionV2, унаследованную от ProductSectionV2. Эта страница открывается при нажатии нужной копки на странице ProductPageV2. Пробовали два подхода к открытию, но оба сопряжены с определенными проблемами. 

1. Через this.sandbox.loadModule

			addProductsExtended: function() {
				/// <summary>Открывает раздел продуктов для выбора и добавления в матрицу.</summary>
				var parameters = {
					viewModelConfig: {
						NrbBaseProduct: this.getBaseProduct()
					}
				};
 
				var instanceConfig = {
					schemaName: "CrossProductSectionV2",
				    isSchemaConfigInitialized: true,
				    entitySchemaName: "Product",
				    useHistoryState: true,
				    isSeparateMode: true,
				    isInChain: true
				};
				var config = {
					renderTo: "centerPanel",
				    id: this.getCrossProductSectionModuleId(),
				    instanceConfig: instanceConfig,
				    parameters: parameters,
				    keepAlive: true
				};
 
				this.sandbox.loadModule("SectionModuleV2", config); 
 
			},
 
			getCrossProductSectionModuleId: function() {
				/// <summary>Формирует идентификатор модуля для добавления продуктов в матрицу.</summary>
				return this.sandbox.id + "_CrossProductSectionV2";
			},
 
			getBaseProduct: function() {
				/// <summary>Вовзращает идентиификатор базового продукта для матрицы.</summary>
				var value = this.get("Id") || this.get("PrimaryColumnValue");
				var displayValue = this.get(this.primaryDisplayColumnName);
				var baseProduct = {
					value: value,
					displayValue: displayValue
				};
				return baseProduct;
			}

В это случае инициализация базового продукта NrbBaseProduct (к которому привязываем сопряженные) в CrossProductSection происходит без проблем. Но есть ряд проблем с отображением и последующей выгрузкой модуля CrossProductSection.

Немного некорректно отображается содержимое GridUtilsContainer (съедена верхняя часть), также показан какой-то toggle при нажатии на который - чистый лист (хеш при этом сменяется на что-то невразумительное - без имени страницы ProductPageV2)

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

 

 

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

 

Ровно то же самое происходит и при нажатии кнопки Закрыть - разве что toggle также исчезает

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

На кнопку Закрыть в CrossProductSectionV2 повешен простой обработчик

			onCloseButtonCustomClick: function() {
				/// <summary>Обработчки нажатия на кнопку Закрыть.</summary>
 
				this.sandbox.publish("BackHistoryState");
			},

 

2. Другой способ открытия - через PushHistoryState

			addProductsExtended: function() {
				/// <summary>Открывает раздел продуктов для выбора и добавления в матрицу.</summary>
				var parameters = {
					viewModelConfig: {
						NrbBaseProduct: this.getBaseProduct()
					}
				};
				var stateObj;
				var requestUrl;
		  		var params = this.sandbox.publish("GetHistoryState");
				stateObj = {
					schemaName: "CrossProductSectionV2",
				    isSchemaConfigInitialized: true,
				    entitySchemaName: "Product",
				    useHistoryState: true,
				    isSeparateMode: true,
				    isInChain: true,
				    parameters: parameters,
				    id: this.getCrossProductSectionModuleId()
				};
				requestUrl = "SectionModuleV2/CrossProductSectionV2";
 
				this.sandbox.publish("PushHistoryState", {
					hash: requestUrl,
					stateObj: stateObj
				});
			},

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

Также Закрытие, в случае если, открывались и закрывались Группы и/или Расширенная фильтрация произойдет только после n-го нажатия на кнопку Закрыть, где n - число раз когда открывали Группы или Расширенную фильтрацию.

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

Нравится

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

Что в это время отображается в консоли и на панели Network? Все запросы корректны? Ошибок никаких нет?

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

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

Александр, спасибо за ответ. Эту задачу на текущий момент решили способом 2, устранив вот этот момент

Также Закрытие, в случае если, открывались и закрывались Группы и/или Расширенная фильтрация произойдет только после n-го нажатия на кнопку Закрыть, где n - число раз когда открывали Группы или Расширенную фильтрацию.

Устранили путем переопределения пары методов на пустые

			removeCardHistoryState: Terrasoft.emptyFn,
 
			setInitialHistoryState: Terrasoft.emptyFn,

Но дальше  - больше. Теперь хотят, чтобы во всех местах, где есть lookup поля Продукт - была возможность поиска по группам и Каталогу. А если пойти еще далее, то, пожалуй, во всех справочниках, по которым в системе зарегистрирован раздел, чтобы была возможность отображать группы с возможностью управления через lookupListConfig - по аналогии с действиями, которые можно скрыть, указав hideActions: true. Но это уже, пожалуй, идея для будущих улучшений продукта.

Орленко Андрей Николаевич пишет:

Теперь хотят, чтобы во всех местах, где есть lookup поля Продукт - была возможность поиска по группам и Каталогу. А если пойти еще далее, то, пожалуй, во всех справочниках, по которым в системе зарегистрирован раздел, чтобы была возможность отображать группы с возможностью управления через lookupListConfig - по аналогии с действиями, которые можно скрыть, указав hideActions: true. Но это уже, пожалуй, идея для будущих улучшений продукта.

В таком случае стоит завести на этом сайте идею. Просмотрел существующие, вроде бы никто такого не предлагал. 

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

Добрый день! Интересует вопрос, можно ли как-то скрыть всплывающее окно\заменить текст сообщения в случае, если при выполнении чек-ина координаты представителя превышают допустимый радиус. В противном случае представитель будет знать, что его геопозиция фиксируется, а этого хотелось бы избежать.

Нравится

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

Иван, здравствуйте!

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

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

Либо вариант, сделать действие "Чек-ин" обязательное (делается через справочник "Правила полевых продаж" - http://prntscr.com/jjhv8n.

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

Коллеги всем доброго времени суток!

Столкнулся с такой проблемой:

Формируем запрос к БД через ESQ - http://prntscr.com/jj0e03

далее делаем выборку из сформированной коллекции - http://prntscr.com/jj0efz

Однако при выборке вылетает ошибка - http://prntscr.com/jj0et9

Смотрим как сформировался SQL  - http://prntscr.com/jj0fa1

При этом var esqSmsStatus = esq.AddColumn("SmsStatus").Name; равно http://prntscr.com/jj0ka4

Кто с таким сталкивался? Прошу помочь.

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

Нравится

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

Недавно вроде отвечал на подобный вопрос. Попробуйте esq.AddColumn("SmsStatus.Id").Name. 

Чисто опытным путём было выяснено, что простые колонки и колонки, до которых можно просто добраться (пример: колонка Status, справочная. добавляем в запрос - esq.AddColumn("Status"). берём в результатах - p.GetTypedColumnValue<Guid>("StatusId") или p.GetTypedColumnValue<string>("StatusName")). Грубо говоря имеет смысл обозначать через Name только сложные пути, а-ля "Lead.QualifiedContact.Department.Name"

Варфоломеев Данила,

Благодарю!

В серверном коде при работе с этой функцией перед Id нет точки:

Page.DataSource.ActiveRow.GetTypedColumnValue&lt;Guid&gt;("AccountId"));

Отображаемое значение справочного поля тоже получается без точки:

entity.GetTypedColumnValue&lt;string&gt;("FacilityName");

 

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