Вопрос

Добрый день.

Через бизнес-процесс настраивается Email. При вызове бизнес-процесса передаются параметры для подстановки в Email.

Подстановка текстовых значений - работает. Вопрос в том, возможно ли подставить в URL переменный параметр. К примеру, стороннюю ссылку.

Также, возможно ли подстановка картинки из передаваемого URL в шаблон письма?
К примеру, штрих-код.

У меня такой же вопрос

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

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

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

Подскажите пожалуйста, как передать данные в модальное окно, а также как и где получить их в модальном окне?

Вызов модального окна 
 

var sandbox = this.sandbox;
var config = {
	heightPixels: 300,
	widthPixels: 700
};
var moduleName = "GrsModalModule";
var moduleId = sandbox.id + "_" + moduleName;
var renderTo = ModalBox.show(config, function() {
	sandbox.unloadModule(moduleId, renderTo);
});
sandbox.loadModule(moduleName, {
	id: moduleId,
	renderTo: renderTo,
});

 

У меня такой же вопрос

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

Пример из  TagUtilitiesV2 (заполнение parameters) и вызов модуля

openTagModule: function(config) {
	var scope = config.scope;
	var sandbox = config.sandbox || scope.sandbox;
	var tagModulePageId = this.getTagModulePageId(sandbox);
	this.prepareModalBox();
	var tagModuleConfig = {
		renderTo: this.getGridContainer(),
		id: tagModulePageId,
		parameters: {
			TagSchemaName: config.entityTagSchemaName,
			InTagSchemaName: config.entityInTagSchemaName,
			RecordId: config.entityRecordId
		}
	};
	sandbox.loadModule("TagModule", tagModuleConfig);
},

Пример чтения переданных параметров в модуле TagModule 

createViewModel: function() {
	var viewModel = this.callParent(arguments);
	var parameters = this.parameters;
	if (parameters) {
		viewModel.set("TagSchemaName", parameters.TagSchemaName);
		viewModel.set("InTagSchemaName", parameters.InTagSchemaName);
		viewModel.set("RecordId", parameters.RecordId);
	}
	return viewModel;
}

 

Пример из  TagUtilitiesV2 (заполнение parameters) и вызов модуля

openTagModule: function(config) {
	var scope = config.scope;
	var sandbox = config.sandbox || scope.sandbox;
	var tagModulePageId = this.getTagModulePageId(sandbox);
	this.prepareModalBox();
	var tagModuleConfig = {
		renderTo: this.getGridContainer(),
		id: tagModulePageId,
		parameters: {
			TagSchemaName: config.entityTagSchemaName,
			InTagSchemaName: config.entityInTagSchemaName,
			RecordId: config.entityRecordId
		}
	};
	sandbox.loadModule("TagModule", tagModuleConfig);
},

Пример чтения переданных параметров в модуле TagModule 

createViewModel: function() {
	var viewModel = this.callParent(arguments);
	var parameters = this.parameters;
	if (parameters) {
		viewModel.set("TagSchemaName", parameters.TagSchemaName);
		viewModel.set("InTagSchemaName", parameters.InTagSchemaName);
		viewModel.set("RecordId", parameters.RecordId);
	}
	return viewModel;
}

 

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

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

Пожалуйста, подскажите ответ на следующий вопрос: как можно получить параметр bpResult строкового типа из бизнес-процесса UsrProcess1 (после его выполнения) в исходный код (JS) схемы раздела "Контрагенты" ?

То есть что-то вроде: string result = ProcessModuleUtilities.UsrProcess1.bpResult;

У меня такой же вопрос

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

Какая версия Terrasoft у Вас используется?

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

Коллеги, приветствую.

В бизнес- процессе эмулируется некоторая активность, "отправка СМС".

Я хочу в заголовок записать ряд параметров, например, ФИО, сумму задолженности и пр.

Что- то вроде этого:

"Уважаемый ФИО, у Вас имеется долг в размере ДОЛГ"

Как передать параметры бизнес- процесса в заголовок активности?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

У меня такой же вопрос

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

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

У элемента "Задача" есть параметр Recommendation. Вам необходимо передать значение в него.
Для передачи есть две базовые возможности (+элемент "Задание-сценарий", но это сложный способ):
1) Найти в структуре процесса элемент "Задача" и в элементе "Задача" в параметр Recommendation установить значение по умолчанию
2) Использовать элемент "Формула"

В двух вариантах параметр необходимо заполнить следующим значением:
"Уважаемый "+[#ФИО#]+", у Вас имеется долг в размере "+[#ДОЛГ#]

(отдельный параметры необходимо разделять знаком "+", текст необходимо писать в двойных кавычках, перенос на новую строку осуществляется последовательностью символов \\n

Алексей, спасибо большое! Сейчас попробую.

Супер, работает. Спасибо!

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

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

Интегрируеся с 1С 8.3, нужно динамически установить Договор для Счёта.

Для этого нужно

1. Получить контрагента 1С (т.к. договор его)
2. Получить Основной договор этого контрагента

Контрагента получить легко:
var Contragent = Param.Obj1C.Справочники.Контрагенты.НайтиПо[...];

А вот со вторым вариантом становится веселее. Есть следующая функция:

Param.Obj1C.Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию

Она принимает 4 аргумента: Название, точное совпадение, родителя и владельца

Первое, второе и четвёртое нам известно - это "Основной договор", false и контрагент, которого мы получили выше. Но третьего не дано (sic!). Язык 1С позволяет опускать ненужные параметры, но компилятор Террасофта этого сделать не даёт, так что нужно что-то туда вставить.

Вопрос: что?

Я пробовал null, false, 0, {}, Справочники.Контрагенты.ПустаяСсылка(), ""

Всё время жалуется на несоответствие типов.

У меня такой же вопрос

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

В разных местах предлагают вроде:

ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка())

Не знаю, можно ли вызвать эту функцию из TS.

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

Добрый день!
В бизнес-процессе есть автогенерируемая страница , в которой в качестве элементов созданы два поля типа дата: дата начала(NeedStartDate) и дата окончания(NeedEndDate).
Соответственно на данной странице необходимо будет заполнить эти два поля.

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

У меня такой же вопрос

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

Добрый вечер, Дарья!

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

В случае, если Вы хотите использовать введенные пользователем параметры в элементе "Задание-сценарий", тогда обратиться к параметру Вы можете следующим образом:
AutoGeneratedPageUserTask[N].FieldName,
где AutoGeneratedPageUserTask[N] - название автогенерируемой страницы в процессе (именно название, а не заголовок), а FieldName - код элемента на автогенерируемой странице (задается при создании).

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

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

Вопросы:
1) как правильно вызвать хранимую процедуру
StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "tsp_test") as StoredProcedure;
storedProcedure.PackageName = UserConnection.DBEngine.SystemPackageName;
storedProcedure.Execute();
return true;

подобный скрипт вызывает ошибки синтаксиса..
как правильно оформить вызов хранимой процедуры

2) как правильно передавать параметры входящие в процедуру(вызывать процедуру с параметрами)
и как правильно получить исходящие параметры хранимой процедуры

3) как правильно передавать в скрипте параметры БП во входящие параметры хранимой процедуры

4) где можно в конфигурации стандартной посмотреть вызов хранимой процедуры ( у вас есть несколько хранимых процедур в конфигурации, где можно посмотреть вызов и использование хотя бы одной из них)

У меня такой же вопрос

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

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

1) Правильный вызов процедуры (пример):

DataValueTypeManager dataValueTypeManager = UserConnection.DataValueTypeManager; 
var dateTimeValue = new DateTime(2009, 01, 02, 22, 12, 0);
                    Stream stream = new MemoryStream(Encoding.Unicode.GetBytes("Тест большого бинарного объекта"));
                    var textDataValueType = new TextDataValueType(dataValueTypeManager);
                    var guidDataValueType = new GuidDataValueType(dataValueTypeManager);
                    var integerDataValueType = new IntegerDataValueType(dataValueTypeManager);
                    var floatDataValueType = new Float2DataValueType(dataValueTypeManager);
                    var booleanDataValueType = new BooleanDataValueType(dataValueTypeManager);
                    var dateTimeDataValueType = new DateTimeDataValueType(dataValueTypeManager);
                    var idValue = new Guid("{BCDB8392-55BC-472A-A49D-22A975E0BEF6}");
 
                    StoredProcedure storedProcedure =
                           new StoredProcedure(Page.UserConnection, "tsp_TestStoredProcedure")
                           .WithParameter("IdParameter", idValue)
                           .WithVarParameter("VarIdParameter", idValue, guidDataValueType)
                           .WithParameter("TextParameter", "Украина")
                           .WithVarParameter("VarTextParameter", "Украина", textDataValueType)
                           .WithParameter("IntegerParameter", 10)
                           .WithVarParameter("VarIntegerParameter", 10, integerDataValueType)
                           .WithParameter("FloatParameter", 3.14)
                           .WithVarParameter("VarFloatParameter", 3.14, floatDataValueType)
                           .WithParameter("BooleanParameter", true)
                           .WithVarParameter("VarBooleanParameter", false, booleanDataValueType)
                           .WithParameter("DateTimeParameter", dateTimeValue)
                           .WithVarParameter("VarDateTimeParameter", dateTimeValue, dateTimeDataValueType)
                           .WithParameter("BinaryParameter", stream)
                           .WithVarParameter("VarBinaryParameter", stream)
                           .WithOutputParameter("ResultParameter", textDataValueType) as StoredProcedure;
storedProcedure.PackageName = Page.UserConnection.DBEngine.SystemPackageName;
storedProcedure.Execute();

2. Исходящий параметр .WithOutputParameter
3. Передача параметров в хранимую процедуру описана в первом пункте.
4. Вызов хранимой процедуры, Вы можете посмотреть в BaseAdministrativeGridPage

Спасибо.

по поводу пункта № 1- как правильно вызвать процедуру.

) Вызываю по аналогии в сценарии в БП
(процедура пока без параметров)

StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "tsp_test") as StoredProcedure;
storedProcedure.PackageName = UserConnection.DBEngine.SystemPackageName;
storedProcedure.Execute();
return true;

Выходит ошибка при публикации (см. вложение).
Что не так?

2) по поводу пункта № 3 - не поняла.
Как передать просто параметры входящие - понятно.
Но как в скрипте правильно обратить к параметру бизнес-процесса, чтобы его уже значение передать в параметр хранимой процедуры ?

3) где именно искать вызов хранимой процедуры в BaseAdministrativeGridPage?

1. Код помещенный в БП в ScriptTask:

StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "tsp_test") as StoredProcedure;
storedProcedure.PackageName = UserConnection.DBEngine.SystemPackageName;
storedProcedure.Execute();
return true;
не вызывает ошибки компиляции. Возможно у Вас есть еще какой-то код, который приводит к ошибке?

2. По имени параметра
var temp = ProcessSchemaParameter1

3. Поиском в исходных кодах
Открыть схему. Кнопка «Дополнительно» пункт меню «Открыть исходный код»

Спасибо, я посмотрю

Применение конструкции
.WithOutputParameter("ResultParameter", textDataValueType)
позволяет вызвать процедуру с исходящими параметрами.

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

Добрый день, Дарья!
Вы можете обратиться к значению, используя следующий пример кода:

var resultParameter = (string) storedProcedure.Parameters.FindByName("ResultParameter ").Value;

Добрый день еще раз!
Пытаюсь опять вызвать процедуру согласно инструкции (в БП в задании-сценарии)

DataValueTypeManager dataValueTypeManager = UserConnection.DataValueTypeManager;
var textDataValueType = new TextDataValueType(dataValueTypeManager);

StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "tsp_test")
.WithOutputParameter("res_msg",textDataValueType) as StoredProcedure;

storedProcedure.PackageName = UserConnection.DBEngine.SystemPackageName;
storedProcedure.Execute();
return true;

Текст процедуры выглядит так:

CREATE procedure [dbo].[tsp_test]
as declare @res_msg nvarchar(250);
select @res_msg='1'
select @res_msg as res_msg

Процесс компилируется, но при запуске процесса элемент сценарий завершается с ошибкой

"System.Data.SqlClient.SqlException (0x80131904): Процедуре tsp_test не переданы параметры и аргументы"

О каких параметрах и аргументах может идти речь, если у процедуры этой нет вовсе входящих параметров, которые можно было бы передать?

Причем если вызвать процедуру без исходящего параметра
StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "tsp_test")
as StoredProcedure;

то такой ошибки нет, сценарий выполняется.

Что-то не так с получением исходящего параметра процедуры?

Поняла в чем дело:
чтобы использовать конструкцию .WithOutputParameter("ResultParameter", textDataValueType) as StoredProcedure в скрипте,
необходимо в тексте самой процедуры прописывать параметр как OUTPUT:

CREATE procedure [dbo].[tsp_test]
(@res_msg nvarchar(250) OUTPUT)
as
select @res_msg='1'
select @res_msg as res_msg
return @res_msg

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

OUT | OUTPUT
Показывает, что параметр процедуры является выходным. Используйте параметры OUTPUT для возврата значений в вызвавший процедуру код.
В.Использование выходных параметров (OUTPUT)
В следующем примере создается процедура uspGetList. Эта процедура возвращает список товаров, цена на которые не превышает указанный предел. Данный пример поясняет использование нескольких инструкций SELECT и нескольких параметров OUTPUT. Параметры OUTPUT предоставляют внешней процедуре, пакету или нескольким инструкциям Transact-SQL доступ к значениям, заданным во время выполнения процедуры.

IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL 
    DROP PROCEDURE Production.uspGetList;
GO
CREATE PROCEDURE Production.uspGetList @Product varchar(40) 
    , @MaxPrice money 
    , @ComparePrice money OUTPUT
    , @ListPrice money OUT
AS
    SET NOCOUNT ON;
    SELECT p.[Name] AS Product, p.ListPrice AS 'List Price'
    FROM Production.Product AS p
    JOIN Production.ProductSubcategory AS s 
      ON p.ProductSubcategoryID = s.ProductSubcategoryID
    WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;
-- Populate the output variable @ListPprice.
SET @ListPrice = (SELECT MAX(p.ListPrice)
        FROM Production.Product AS p
        JOIN  Production.ProductSubcategory AS s 
          ON p.ProductSubcategoryID = s.ProductSubcategoryID
        WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);
-- Populate the output variable @compareprice.
SET @ComparePrice = @MaxPrice;
GO

Источник: https://msdn.microsoft.com/ru-ru/library/ms187926.aspx#Parameters

Спасибо, но вопрос не в этом заключался. Процедура, которую вы привели, просто возвращает два параметра выходных, а не выборку данных
А меня интересовало получение результатов выполнения процедуры в скрипте в bpmonline.
Например, процедура возвращает результат выполнения запроса select * from tbl_city
(это просто пример, выборка может быть сложнее), интересовало получение результата выполнения процедуры в bpmonline.
Но, наверное, мой вопрос уже не связан с темой бизнес-процессов - озвучу его в другой теме.
Спасибо

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

Для получения результата запроса из процедуры необходимо в процессе добавить в Usings:
Пространство имен: System.Data.IDataReader
Псевдоним: IDataReader

Вызов процедуры:

StoredProcedure storedProcedure = new StoredProcedure(UserConnection, "Test") as StoredProcedure;
storedProcedure.PackageName = UserConnection.DBEngine.SystemPackageName;
using (var dbExecutor = UserConnection.EnsureDBConnection()) {
            using (IDataReader dataReader = storedProcedure.ExecuteReader(dbExecutor)) {
                        while (dataReader.Read()) {
                                   var valueColumn1 = dataReader.GetValue(0);
                                   var operation = dataReader.GetColumnValue<int>("Operation");
                        }
            }
}

Спасибо

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

Добрый день!
Необходимо применить условие в тексте SQL сервиса ADODataset, который в свою очередь подключается к внешней БД Oracle 8.1. В качестве значения для условия использую параметр.

Значение самому параметру передаю в скрипте до открытия ADODataset:
ADODataset.Parameters.ItemsByName('testparam').ValAsStr = 'WEBDB';

При открытии ADODataset выскакивает ошибка:
"0x8000ffff - TSObjectLibrary.ADODataset: Ошибка открытия источника данных "adods_Test".
Оригинальное сообщение об ошибке: Не удается вновь задать положение в наборе строк"

При этом, если в тексте SQL явно указать значение поля для фильтрации,

то ADODataset открывается и фильтр отрабатывает.

Может кто подскажет, в чём проблема?

У меня такой же вопрос

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

Игорь, какой курсор указан (в свойствах ADODataset)? Если указан серверный, попробуйте заменить на клиентский.

Наталия, огромное спасибо! Помогло!

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

Добрый день!
Пытаюсь тут сделать очень хитрую штучку и никак не получается пока что
Очень нужно сформировать Word-отчет, в который нужно передать переменные и параметры, которые нужно вывести в отчете
Как бы это сделать?
Сам запрос, к сожалению, в виде XML передается в отчет
Движок уже сам разбирает его и формирует результирующий какой-то набор для отчета

Подскажите, пожалуйста, если кто сталкивался

У меня такой же вопрос

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

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

Можете попробовать вклиниться в метод ShowWordReport() в сервисе scr_UserReportCommon, там вызывается ProcessWordReportDataFill() в который передаются значения колонок для макросов, можете добавить необходимые значения и использовать их в качестве макросов в шаблоне отчета.

К сожалению, подобного опыта в поддержке не было, поэтому и примеров предоставить не сможем.

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

Можете попробовать вклиниться в метод ShowWordReport() в сервисе scr_UserReportCommon, там вызывается ProcessWordReportDataFill() в который передаются значения колонок для макросов, можете добавить необходимые значения и использовать их в качестве макросов в шаблоне отчета.

К сожалению, подобного опыта в поддержке не было, поэтому и примеров предоставить не сможем.

Передать параметры действительно получилось через ProcessWordReportDataFill
Там была написана еще процедура, которая подменяла определенные макросы в тексте на переданные элементы из массива

А не подскажите еще? хотелось бы попробовать как-то нарисовать таблицу в Word из террасофта
Но пока не получается
Может кто-то пробовал рисовать в ворде из террасофта ?

Заранее благодарен за ответы

Иван, посмотрите здесь.

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

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

На днях возник небольшой вопрос, решить который все никак не представляется возможным.
У нас есть ряд 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);

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

Спасибо

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