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

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

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

Нравится

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

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

 

Ваш вопрос по нескольким DCM в зависимости от типа записи? Если да, то это настраивается в дизайнере и работает в новых (созданных мастером) разделах. В CasePage тоже по идее должно. Если вопрос как сделать разные наборы для портала и системы – никак. DCM один и он общий для обоих пользователей. Пользователь на портале видит те же шаги, что и пользователь системы. А тип выбирается в зависимости от записи и тоже не зависит от типа пользователя.

Мотков Илья,

Да, по нескольким DCM. В разделе Case  в мастере настроил несколько progressbar в зависимости от значения поля. Для системных пользователей всё работает. Но для портальных пользователей не работает. Отображается progressbar по умолчанию при любом значении указанного поля. Разные наборы для портала и системы мне не нужно делать

Походу проблема, возможно, из-за кастомной разработки. Развернул чистую версию 7.14.3 и там всё корректно работает.

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

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

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

 

([#Читать активность..Первый элемент результирующей коллекции.Дата создания#].AddDays(2)).Day не отрабатывает. Тип данных у меня у даты создания "Дата"

 

Нравится

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

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

 

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

 

2. Можно вычислить нужное значение даты в скрипт таске, например, таким образом:

 

DateTime collectionDate = Get<DateTime>("CollectionDate");
DateTime storageDate = collectionDate.AddDays(6);
Set<DateTime>("StorageDate", storageDate);

 

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

 

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

 

2. Можно вычислить нужное значение даты в скрипт таске, например, таким образом:

 

DateTime collectionDate = Get<DateTime>("CollectionDate");
DateTime storageDate = collectionDate.AddDays(6);
Set<DateTime>("StorageDate", storageDate);

 

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

Использую для запуска БП ProcessModuleUtilities.executeProcess

Нужно подавить уведомление об успешном запуске.

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

Каким штатным образом это можно сделать? Параметр передать?

Нравится

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

Эта функция выглядит так:

/**
 * Launches business process by identifier or name.
 * @param {Object} config Configuration object.
 * @param {String} [config.sysProcessName] Name of the process schema.
 * @param {String} [config.sysProcessId] Unique identifier of the process schema.
 * @param {Object} [config.parameters] Process parameters.
 * @param {Function} [config.callback] Callback function.
 * @param {Object} [config.scope] Callback scope.
 */
executeProcess: function(config) {
	const callback = config.callback || this._executeProcessCallback.bind(this, config);
	const scope = config.scope || this;
	if (config.sysProcessName) {
		this._executeProcessByName(config, callback, scope);
	} else {
		this._executeProcessById(config, callback, scope);
	}
},

Она вызывает вторую, которая и показывает сообщение:

/**
 * @private
 */
_executeProcessCallback: function(config, request, success, response) {
	if (!this.responseCallback(request, success, response)) {
		this.loadSchemaCaptionByName(config.sysProcessName, function(caption) {
	this._showSuccessfullyRunProcessPopup(caption);
		}, this);
	}
},

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

То есть можно попробовать передать в параметре callback пустую функцию или с какими-то своими действиями. 

Пример вызова процесса с добавлением обработчика есть в схеме SystemDesigner, где он выглядит: 

/**
 * Starts OpportunityManagement actualization process.
 * @private
 */
runActualizeOpportunityManagementProcess: function(callback) {
	var processUtils = this.getProcessModuleUtilities();
	this.showBodyMask();
	processUtils.executeProcess({
		sysProcessName: "ActualizeOpportunityManagement",
		callback: function() {
			this.hideBodyMask();
			callback.call(this);
		},
		scope: this
	});
},

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

Эта функция выглядит так:

/**
 * Launches business process by identifier or name.
 * @param {Object} config Configuration object.
 * @param {String} [config.sysProcessName] Name of the process schema.
 * @param {String} [config.sysProcessId] Unique identifier of the process schema.
 * @param {Object} [config.parameters] Process parameters.
 * @param {Function} [config.callback] Callback function.
 * @param {Object} [config.scope] Callback scope.
 */
executeProcess: function(config) {
	const callback = config.callback || this._executeProcessCallback.bind(this, config);
	const scope = config.scope || this;
	if (config.sysProcessName) {
		this._executeProcessByName(config, callback, scope);
	} else {
		this._executeProcessById(config, callback, scope);
	}
},

Она вызывает вторую, которая и показывает сообщение:

/**
 * @private
 */
_executeProcessCallback: function(config, request, success, response) {
	if (!this.responseCallback(request, success, response)) {
		this.loadSchemaCaptionByName(config.sysProcessName, function(caption) {
	this._showSuccessfullyRunProcessPopup(caption);
		}, this);
	}
},

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

То есть можно попробовать передать в параметре callback пустую функцию или с какими-то своими действиями. 

Пример вызова процесса с добавлением обработчика есть в схеме SystemDesigner, где он выглядит: 

/**
 * Starts OpportunityManagement actualization process.
 * @private
 */
runActualizeOpportunityManagementProcess: function(callback) {
	var processUtils = this.getProcessModuleUtilities();
	this.showBodyMask();
	processUtils.executeProcess({
		sysProcessName: "ActualizeOpportunityManagement",
		callback: function() {
			this.hideBodyMask();
			callback.call(this);
		},
		scope: this
	});
},

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

Зверев Александр,не уверен , что так сработает, я делал , что в калл бэеке показывал маску, а сообщением по заверешению бп ее скрывал

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

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

Хочу предзаполнять поля добавляемой записи в детали с редактируемым реестром значениями, вычисленными в коде. Т.е. я не могу в объекте их заполнить системной переменной или константой. Но выглядеть внешне это должно также.

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

Как это сделать?

Нравится

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

Добрый день.

 

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

 

Более подробную информацию Вы сможете найти в этом обсуждении.

Добрый день! Есть 2 варианта.

1) Можете реализовать через бизнес-процесс со стартовым сигналом после добавления/изменения записи, либо же  через событийный слой (перед добавлением/сохранение/изменением)

Нигрескул Алексей,

мне нужно заполнить данные до сохранения. БП не поможет

тогда через событийный слой

Нигрескул Алексей пишет:

тогда через событийный слой

Ссылка: https://academy.terrasoft.ru/documents/technic-sdk/7-13/sobytiynyy-sloy-entity 

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

Алексей-Карягин,

Добрый день! Если внимательно почитать то на событийном слое переопределяете метод OnSaving(), OnUpdating(), OnInserting() при этом подписавшись на события нужного Вам объекта. В данных методах реализуете свою логику в зависимости от потребности, и отработка данных методов происходит ДО сохранения данных в БД, если в результате обработки сохранять не нужно, то просто генерируете throw new Exception("Exception Message"), на клиент Вам

выведется сообщение из Exception и данные в БД не сохраняться.

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

попробуйте подписаться на событие onchange:Field

Добрый день.

 

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

 

Более подробную информацию Вы сможете найти в этом обсуждении.

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

Добрый день!

 

У нас стоит Oktell Call-Centre и стандартный коннектор Oktell от террасофт. 

У нас есть сотрудники, которые используют и стац. телефоны и отдельно софтверный телефон Oktell. 

Но софтфон Oktell не позволяет переносить звонки в bpm. 

Каким образом это можно сделать с помощью других sip-телефонов Microsip, 3CX и др. SIP-телефоны?

Нравится

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

Так в сценарии пост-обработки звонка ложите его в базу bpm! Если надо будет помощь, напишите в скайп dima-tashohlo

Так в сценарии пост-обработки звонка ложите его в базу bpm! Если надо будет помощь, напишите в скайп dima-tashohlo

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

ВРМ запрашивает доступ к камере и микрофону и пользователи как правило его дают. Хочу этим воспользоваться для распознавания QR-кодов.

Например, кнопка в разделе "добавить элемент из QR-кода" - открывается окошко с видом камеры, пользователь подносит QR-код, тот сканируется, распознается и создается новый элемент раздела по параметрам из расшифрованного QR-кода.

Кто-нибудь делал что-нибудь подобное? Есть примеры или , может быть, компоненты? Пусть и платные?

Нравится

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

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

 

А вообще, в QR-кодах записывается обычный URL. Там можно закодировать ссылку на запись в разделе и при считывании кода стандартной функцией телефона перейти прямо в программу (обработка ссылок появилась в 7.14.4).

 

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

 

В этом случае потребуется обращение напрямую к серверу, что вызывает вопрос об авторизации до момента открытия запроса из QR-кода. Или как-то разработать дополнительную логику определённой мобильной карточки, отрабатывающей при её открытии и учитывающей значения полей из своего URL.

Кстати, сделал на библиотеке instascan.js. Кому надо, обращайтесь.

 

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

Есть БП, реагирующий на изменение записи, на несколько полей.

Можно ли внутри БП понять, какое именно поле или поля изменились, т.к. скорее всего будут меняться не все поля???

Нравится

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

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

Инструментами БП, если не ошибаюсь, такое нельзя определить.

как альтернатива можно несколько сигналов стартовых добавить, каждый будет отлавливать свое событие.

Вадим Косарев,

а отловится, если изменилось несколько полей, а не одно?

Нужно делать процесс в объекте на сигнал Saving, где можно сравнивать старые и новые значения. И уже оттуда запускать какую-то логику

Такое можно определить во встроенном БП на событии Saving, там можно прочитать старое (GetTypedOldColumnValue) и новое (GetTypedColumnValue) значение полей до момента записи в базу. А затем полученные значения учитывать на Saved уже после сохранения. Подробнее см. в теме.

Всем спасибо за ответы! Уточню, мне не нужны старые значения, мне просто нужно понять какие поля изменились. Или это же только Saving?

 

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

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

Алексей-Карягин,

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

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

Добрый день,

При попытке нажать на значок трубки выходит сообщение - "Отсутствует подключение к серверу телефонии. Возможно не настроены параметры соединения или сервер телефонии недоступен". Через Infinity Phone звонки идут. Все настройки сделаны согласно инструкции. Где можно точнее узнать в чем причина

Нравится

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

Рустем, обратите ещё внимание на эту статью.

Александр, это я читал и как бы все сделано. Если войти в BPM как Supervisor и нажать F12, то можно увидеть сообщение об ошибке -

all-combined.js:7 2020-04-14 19:02:30,0430 [Telephony] System.Exception: FailedToConnect ---> Terrasoft.Messaging.Common.TelephonyException: FailedToConnect ---> CxConnector.LogonException: Logon failed.  Can not connect to server.

   в CxConnector.CxConnector.CheckLogonResult(LogonResult logonResult, InitializeResult initializeResult, String ErrorDescription)

   в CxConnector.CxConnector.InternalConnect(String ConnectionString, Boolean bDirectLogon, LogonResult& LogonResult, InitializeResult& InitializeResult)

   в CxConnector.CxConnector.InternalConnect(String ConnectionString, Boolean AlwaysKeepConnection)

   в AgatInfinityConnector.BaseConnector.Connect(String connectionString_, Boolean alwaysKeepConnection_)

   в Terrasoft.Messaging.Infinity.InfinityConnectionFactory.ReConnectWithTimeOut(IAgatInfinityConnector connector, String connectionString)

   --- Конец трассировки внутреннего стека исключений ---

Проверьте доступность сервера на который ссылается в сообщении с ошибкой, так же проверьте доступность сервера по порту 2013 и проверьте, чтобы в списке служб Windows была запущена служба TerrasoftMessagingService. Также служба интеграции разрабатывается конкретно под версию Infinity, у Вас версии TerrasoftMessagingService и Infinity могут не соответствовать. Нужную версию по запросу предоставляет поддержка.

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

Александр, поясните пожалуйста вот этот параграф из приведенной вами статьи -

"На стороне bpm'online профиле в странице настройки телефонии указать линию пользователя, у которого есть роль «Оператор» (например, Оператор5), для этого пользователя надо включить клиент с ролью Оператор." Не понята последняя часть -" ...

для этого пользователя надо включить клиент с ролью Оператор."

 

 

Там дальше написано: «Все описанные роли должны быть назначены пользователю на стороне АТС (Infinity)».

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

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

Стоит задача обновить стенд (с этим всё ясно) + сменить продукт с SalesEnterprise на SalesEnterprise_Marketing_ServiceEnterprise.

Попробовал в лоб, вписал в поле "Product" файла downloader.json заданный задачей продукт. Updater.exe выдаёт на такое: "You are using an invalid build type. You need to obtain SalesEnterprise..."

 

Смена продукта "на лету" вообще возможна? Может кто сталкивался? Как решается данный вопрос?

Нравится

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

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

Здравствуйте, Сергей!

Чтобы обновиться на бандл, необходимо и достаточно только установить в конфиге утилиты обновления значение Feature-SkipProductValidation  в true:

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

Приветствую.

Развернул тестовую среду на Windows Server 2012 R2.

При попытке компиляции возникает ошибка

System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified

   at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)

   at Terrasoft.Core.Compilation.ProjectBuilder.BuildInternal(String projectFilePath, String tempPath, BuildCommandParameters parameters)

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

.Net Framework стоит 4.7

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

 

 

Нравится

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