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

На днях возник небольшой вопрос, решить который все никак не представляется возможным.
У нас есть ряд workflow-процессов у которых в свою очередь есть большое кол-во свойств (параметров со значениями) процесса.
К сожалению, в связи с одной пунктуационной ошибки ранее, у некоторых процессов поле Parameters в таблице Workflow стало NULL.

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

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

Спасибо за потраченное на прочтение время

Используется Terrasoft XRM 3.3.2.244 и MS SQL

Нравится

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

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

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

Посмотреть я их, безусловно, могу
И даже могу поднять бэкап БД за период, когда еще были эти параметры у интересного мне процесса
Но хотелось бы попробовать найти чуть более изящное решение
Если оно есть, конечно же

Вопрос скорее в другом
Можно ли как-то получить их скриптом? Например распарсить в tbl_Service поле XMLData у процесса?!
Или, скажем, через функции террасофта можно получить список параметров у определенного шага\процесса?

Иван, посмотреть параметры конкретного дейтсвия можно в ТС Администраторе по правому клику:

а распарсить BLOB в XML можно следующим способом:

CREATE TABLE	#Sample
		(
			BLOB VARBINARY(MAX) NOT NULL
		)
 
INSERT	#Sample
SELECT	0x3C526F772049443D2231223E5065736F2C204D56503C2F526F773E
 
SELECT	*
FROM	#Sample
 
 
ALTER TABLE	#Sample
ADD		MyXML AS CAST(CAST(BLOB AS VARCHAR(MAX)) AS XML)
 
-- Display the result
SELECT	*
FROM	#Sample

Спасибо за крайне развернутый ответ

Но, к сожалению, он не отвечает на вопрос
Можно ли как-то получить список параметров элемента бизнес процесса скриптом?
Например, кнопку сделать в гриде процессов для получения отсутствующих параметров

И распарсить XML представленный как Varbinary или Image тоже не проблема. Вот только Image у элемента Workflow Diagram в tbl_Service не парсится как XML

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

У каждого элемента в процессе есть свой набор параметров + у самого процесса могут быть пользовательские параметры.

В скрипте процесса можно получить список параметров:

var a = DiagramItem.Parameters;
var b = Diagram.Parameters;

установить либо получить значения:

WFGetParamValueDirect(DiagramItem.Parameters, ParamName, 
		DefaultValue);
WFSetParamValueDirect(Params, ParamName, ParamValue, ParamType);

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

Спасибо

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

Столкнулся с проблемой, Если сохранить значение из скрипта "Вопрос пользователю" в параметр бизнес-процесса, то значение не сохраняется. В следующем компоненте значение становится дефолтовым. Версия 3.4.0.115.
Из других компонентов все в порядке

Вот пример:pack.rar
.

Нравится

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

Добрый день, Андрей.
Используйте базовые методы для записи или чтения параметров БП: WFSetParamValue и WFGetParamValue

Пример использования:

function wda_StartProcessOnStart(StartItem) {
	var Diagram = GetDiagramByItem(StartItem);
	var OwnerID = WFGetParamValue(Diagram, 'OwnerID');
	if (!OwnerID) {
		OwnerID = Connector.CurrentUser.ContactID;
		WFSetParamValue(Diagram, 'OwnerID', OwnerID);
	}
}

Добрый день Павел!
Я использовал в том числе и WFSetParamValue и WFGetParamValue из Вопроса пользователю. Результат тот же.

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

Для корректной передачи параметров следует в скрипте элемента процесса указать следующее:

WFConnectParams(ActionItem, 'Test', 'Test');
ActionItem.Parameters('Test').Value = 1;

В этом случае параметр диаграммы будет связан с параметром процесса.

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

В файлике RunSettings.xml есть некоторые полезные параметры, которые могут быть полезными при работе:

GlobalSettingsDirectory=""

Параметр появился в версии 3.4.0. Используется для указания положения глобальных настроек пользователя (файла GlobalConfigs.xml). Он может находится на локальной машине, либо в сети. В случае использования этого параметра с параметром UserSettingsDirectory, в списке конфигураций будут отображаться конфигурации из обоих файлов.

UserSettingsDirectory=""

Указание пути к каталогу пользовательских настроек. Используется для настройки планировщика заданий и web-сервисов.

UserAppDataDirectory=""

Путь к настройкам пользовательских данных. Если не указано, то используется путь по умолчанию %appdata%\Terrasoft\!Version!\
К пользовательским данным относятся кэш, профиль, логи, список конфигураций.

SessionUserName=""

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

SessionPassword=""

Пароль пользователя от имени которого запускается TS

Нравится

Поделиться

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

SessionPassword криптуется? или хранится в открытом виде?

"Владимир Соколов" написал:

SessionPassword криптуется? или хранится в открытом виде?


В открытом.

Также добавлю описание макросов, которые можно использовать:

1) {win} – каталог где установлена ОС
2) {sys} – системный каталог ОС
3) {tmp} – временный каталог ОС
4) {pf} – каталог «Program Files»
5) {usertscrmappdata} – каталог пользователя с данными CRM
6) {userdesktop} – путь к «Рабочему столу»
7) {userstartup} – «домашний» каталог пользователя
8) {tscrm} – каталог где установлена CRM
9) {userprofile} – профиль пользователя CRM
10) {userappdata} – каталог з данными о настройке ПО пользователя.

Замена макросов происходит для следующих параметров:
1) GlobalSettingsDirectory
2) UserSettingsDirectory
3) UserAppDataDirectory

Игорь, спасибо, полезная информация.

Немного поправлю, атрибут GlobalSettingsDirectory появился в последних сборках 3.3.2 и во всех старших версиях.

Здравствуйте, в связи с необходимостью массового развертывания клиента Террасофт, необходимо обеспечить автоматическое задание параметров связи с базой данных на SQL сервере. Прошу предоставить описание полей файла настроек соединения %AppData%\Terrasoft\3.4.0\Settings\Configs.xml с пояснением алгоритмов генерации или показать иной способ автоматической генерации настроек для конкретного пользователя.

Особенно интересует как получаются поля:
UID и ConnectionString (в случае если везде используется доменная авторизация)

Здравствуйте, Антон!

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

ConnectionString - это запакованные параметры подключения к базе данных, информация о пользователе и пароле в них не содержится.

таким образом, можно воспользоваться параметром GlobalSettings и указать путь к файлу Configs.xml на сетевом диске, и задать параметры подключения там.

Либо же, если вариант с сетевым файлом не подходит, достаточно скопировать строки элемента конфигурации всем пользователям, либо (если нет подключений, которые можно было бы перезатереть) - просто поместить файл в папку %AppData%\Terrasoft\3.4.0\Settings\Configs.xml

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

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

К примеру есть карточка, нужно из неё открыть форму, передав в неё параметр из карточки.
Реализовать передачу параметров в окно можно посредством подобного кода:

var EditWindowUSI = WindowUSI;
var Attributes = GetNewDictionary(); //массив атрибутов
Attributes.ADD('RecordID', RecordID);

var DefaultValues = GetNewDictionary(); //массив значений по умолчанию
DefaultValues.ADD('InvoiceDate', InvoiceDate);

ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues);

Нравится

Поделиться

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

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

Второй способ – использовать customData – поле, которое есть на каждой странице:
Чтение\запись на сервере

var customData = ((Page)Page.AspPage).CustomData;
if (customData.ContainsKey("tempData")) {
var tempData = (JObject)customData["tempData"];
if (tempData != null) {
var data = (JObject)tempData[clientId];
if (data != null) {
var jValue = (JValue)data[parameter];
if (jValue != null) {
 jValue.Value = value; // если хотите прочитать, то достаточно убрать эту строчку и прочитать jValue.Value
}}}}

Для работы скрипта нужно подключить в using неймспейс Terrasoft.Common.Json
Здесь clientId – это идентификатор конкретного контрола Page.Control.ClientID, parameter – имя параметра, который мы читаем\записываем, value – значение. jValue.Value типа Object поэтому при чтении надо преобразовать в нужный тип. Можно ли таким образов передавать ссылочные объекты (классы), не уверен, но обычные можно

Чтение\запись этого параметра на клиенте: В нужном месте добавляем скрипт

string Script = @”var ParamValue = {0}.getCustomData('parameter');
{0}.setCustomData('parameter', value);
Page.AddScript(String.Format(Script, Page.Control.ClientID));

‘parameter’ – имя параметра должно совпадать с серверным.
Остальное по смыслу

Нравится

Поделиться

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