Добрый день!

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

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

Открываю метаданные страницы и вижу что с этим ID как раз прописан удаленный параметр данной страницы. Вопрос: как решить данную проблему и обновить список параметров для страницы?

Нравится

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

Добрый день, Дмитрий!



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

Пробовали удалить из процесса и добавить заново элемент с данной преднастроенной страницей?

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

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

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

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

С уважением,
Александр

Нравится

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

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

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

Благодарю!
Получилось!

Спасибо.

Нам вдвойне приятно получать от клиентов такой фидбек!

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

Есть вопрос, кто сталкивался с этой проблемой прошу помочь
Создал параметр в БП LeadID, дал значения новый идентификатор лида, при создании лида в БП присвоил полю Id значение LeadID, потом в другой карточке сделал изменения и записал в поле лид значение LeadID. Но туда ничего не записывается, в чем проблема?

Нравится

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

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

Не могли Вы поподробнее описать момент:

"Радчук Виталий Владимирович" написал:

Создал параметр в БП LeadID, дал значения новый идентификатор лида, при создании лида в БП присвоил полю Id значение LeadID

Уточните, пожалуйста, зачем такая реализация? При добавлении лида элементом "Добавить данные" Id генерируется автоматически. У элемента "Добавить данные" есть параметр "Id созданной записи" - в этом параметре хранится сгенерированный Id. Значение этого параметра Вы сможете потом записать в другие сущности.

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

В таком случае сделайте наоборот:
1) Создайте параметр бизнес процесса (с типом уникальный идентификатор)
2) После каждого элемента "Добавить данные", который создает лид, используйте элемент "Формула", чтобы заполнить созданный параметр значением Id созданной записи.

В результате, у Вас в параметре будет хранится корректное значение Id лида.

что может значить эта ошибка?
process_obrabotki_zvonkov_error.txt

"Радчук Виталий Владимирович" написал:
The INSERT statement conflicted with the FOREIGN KEY constraint "FKkw7kQYErf0GdDIOp9FOjniv8". The conflict occurred in database "BPMOnline", table "dbo.SysProcessData", column 'Id'.

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

Вот скрин процесса

Пришлите, пожалуйста, настройки элемента "А) Добавить лид".

Хмм убрал условный поток и по умолчанию от начального элемента, а в замен поставил обычный - все начало работать нормально...

еще вопрос...
сделал как сказали:

первая и третья ветки нормально заполняют поле лид в звонок, а во второй ветке лид создается но не записывается в поле лид карточки звонка. В журнале показывает что элемент "Добавить звонок к созданному лиду" отрабатывает. В чем может быть причина?

Виталий,

Предлагаю убедится, какое именно значение передается в поле Лид карточки Звонка. Для этого добавьте во второй ветке автогенерируемую страницу. С помощью элемента Формула передавать на автогенерируемую страницу Id созданного лида.
Также после создания лида попробуйте добавить таймер с задержкой в 1 секунду, после чего передавать значение Id в карточку звонка.

"Зарицкий Олег Васильевич" написал:Виталий,

Предлагаю убедится, какое именно значение передается в поле Лид карточки Звонка. Для этого добавьте во второй ветке автогенерируемую страницу. С помощью элемента Формула передавать на автогенерируемую страницу Id созданного лида.
Также после создания лида попробуйте добавить таймер с задержкой в 1 секунду, после чего передавать значение Id в карточку звонка.


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

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

Возможно, не новый вопрос ]||||||[, но никак не удается передать внутри БП массив с ID-шниками как параметр.
Заполняется массив в одном скрипте, использовать надо в другом элементе-скрипте. Пытаюсь создать параметр с типом Объект (Entity) так ругается при попытке передачи туда массива.
Очень не хочется пользоваться строкой неограниченной длины с парсингом ее по необходимости... некрасиво это и если ID-шников много не факт что работать будет корректно.
Подскажите, какой тип параметра БП использовать и как туда закинуть массив?

Нравится

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

Здравствуйте.
Есть специальный тип - массив:

На самый крайний случай, можно записать в атрибут глобального объекта Connector:

Connectror.Attributes('myArray') = myArray;
var myArrayNew = Connectror.Attributes('myArray'); 

"Олейник Дмитрий" написал:Здравствуйте.

Форум BPMonline 5.x

Саша, спасибо.

Александр, для BPM создайте параметр, и не меняйте его тип. Он по умолчанию создается как Object (внимание не как Object (Entity) - это другой тип данных). При этом, если Вы изменили тип - в списке Вы его уже не найдете.

А если ничего не менять, то такой код работает:

string[] strArr = new string[10];
array = strArr;

Где array - параметр с типом Object.

"Олейник Дмитрий" написал:Александр, для BPM создайте параметр, и не меняйте его тип. Он по умолчанию создается как Object (внимание не как Object (Entity) - это другой тип данных).

Значит, не показалось мне что оно сработало ровно один раз пока я не стал менять тип и перекомпилировал систему...
Дмитрий, ну это же не правильно как-то :smile:
Может разработчикам запрос на изменение с любым пусть низким приоритетом создать чтобы в список тот "просто объект" добавить для 5ки?

Александр, вопрос передал.

"Олейник Дмитрий" написал:Александр, вопрос передал.

Дмитрий, спасибо!

И вновь продолжается бой...
Передал я массив в параметр.
Пытаюсь к нему обратиться в другом элементе.
Вот так, например:

foreach (var i in SomeParameterArray.Length) {

где SomeParameterArray и есть параметр бп с типом объект...
и ругается оно, и не компилируется
'object' doesn't contain definition for 'Length' and no extension method 'Length' ...

Поэтому теперь надо разбираться, как же к этому переданному массиву обратиться... :sad:

Александр, во-первых, цикл foreach должен выглядеть так:

foreach (var i in SomeParameterArray) {

А в данном случае, скорее всего это не сработает и нужно приведение типов:

string[] strArr = new string[100];
ArrayParam = strArr;
IEnumerable<string> enumerable = ArrayParam as IEnumerable<string>;
foreach (var s in enumerable)
{
//своя логика
}

"Андрей Каспаревич" написал:Александр, во-первых, цикл foreach должен выглядеть так:
foreach (var i in SomeParameterArray) {

Ошибся :redface:

Сейчас еще поэкспериментирую

"Олейник Дмитрий" написал:Вопрос передал.

Дмитрий, а есть ли какиенибудь результаты? Тоже столкнулись с такой проблеммой.

Илья, в каком смысле? Всё работает и сейчас - создаете объект с типом Object, затем записываете в него массив.
При обращении, не забудьте привести тип Object к Array.

"Олейник Дмитрий" написал:Александр, для BPM создайте параметр, и не меняйте его тип. Он по умолчанию создается как Object (внимание не как Object (Entity) - это другой тип данных). При этом, если Вы изменили тип - в списке Вы его уже не найдете.

Я так понимаю Илья Т. пишет именно об этом, что нельзя данный тип назначить повторно, что есть баг

Тут я согласен, хоть, согласитесь, он и не критичен.

Создали действие процесса, а в нем параметр и по умолчанию создается тип String, создать параметр с типом Object невозможно.

"Олейник Дмитрий" написал:он и не критичен

Согласен :smile:
"Илья Т." написал:Создали действие процесса, а в нем параметр и по умолчанию создается тип String, создать параметр с типом Object невозможно.

В режиме редактирования метаданных поменяйте тип параметра "DataValueType" на "84ed6865-9692-4c98-aaed-4d15b96a95c2" ручками и затем сохраните и опубликуйте

Ручками и так поменяли. Но это не правильно. Так можно сказать, а зачем нужен редактор? Пишите метаданные в блокноте.

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

Добрый день!
Возникла такая необходимость, печатать напрямую отчет fast report из скрипта заранее указав кол-во копий и без окошка выбора параметров печати.
Реализация следующая:
1. В скрипте TS передаю аттрибутом в отчет кол-во копий и вызываю print:
ReportPreviewer.ComponentsByName('frpMain').Report.Attributes('Copies') = 5;
ReportPreviewer.ComponentsByName('frpMain').PreviewReport();
ReportPreviewer.ComponentsByName('frpMain').Print();
2. В отчете создал переменную Copies, в скрипте отчета выполняюю след. действия:
function frxReportOnStartReport(Sender)
{
var Copies = ;
Report.EngineOptions.DestroyForms = false;
if (Copies != null) {
Report.PrintOptions.ShowDialog = false;
Report.PrintOptions.Copies = Copies;
}
ShowMessage(Report.PrintOptions.Copies);
}
Из дизайнера отчета эта конструкция с доп. условием (else Report.PrintOptions.Copies = 3) отрабатывает правильно, при ShowDialog = true, по умолчанию стоят 3 копии.
При вызове печати из формы отчета, если заменить в коде Print() на Show() тоже все работает правильно.
Но при печати без показа отчета стоят параметры по умолчанию.
В чем может быть дело? Заранее благодарен..

Нравится

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

Иван, без предварительного показа вероятнее всего не получится распечатать отчет с заданным количеством копий (так как не срабатывают все скрипты отчета).
Попробуйте обходной вариант - показать окно и сразу же закрыть его. Похожий вопрос обсуждался здесь: http://www.community.terrasoft.ua/forum/topic/3389

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

Прочел sozdat_svoe_okno_filtracii_dlya_otcheta.doc (указано в https://community.terrasoft.ua/forum/topic/6590 ). Создал собственное окно фильтрации. Дошел успешно до "После этого переменная будет доступна в отчете и Вы ее сможете вытянуть в отчет."
Переменная доступна, в отчете могу ее разместить, но мне нужно из этого окна часть переменных выводить на страницах отчета, а часть использовать как параметры при фильтрации в запросе.

wnd_ReportScoreboard - собственное окно фильтрации
wnd_ReportScoreboardScript - скрипты к нему
sq_ReportScorecard - запрос к отчету
в нем :Parameters
:OrderStartDate
:OrderFinishDate
Мне надо присвоить OrderStartDate значение из edtDateStart (IDataTimeControl в окне wnd_ReportScoreboard) и OrderFinishDate присвоить значение из edtDateАштшыр (IDataTimeControl в окне wnd_ReportScoreboard)
Как это можно сделать для отчета на fastreport?

Нравится

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

Возьмите как пример лучше отчет Прайс-лист (Offerings\Reports\Offering Price\fr_ReportOfferingsPrice). Для этого отчета есть свое окно фильтрации wnd_FilterOfferingPrice. В этом окне применение фильтров реализовано более корректно, чем в указанном Вами документе. Обязательно обратите внимание на параметры регистрации отчета.
Если не разберетесь с примером - пишите.

Спасибо за совет. Разобрался. Работает.

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

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

Как решить эту задачу, используя блок "Отправка E-mail" в бизнес-процессе.
В частности, какие параметры нужно указать в самом блоке,
и где, в какой момент заполнять параметры "ответственный", "автор" - кому отправить
и id задачи, по которой нужно отправить информацию?

Спасибо.

Нравится

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

Здравствуйте, Дарья.

Отправил ответ Вам на e-mail.

"Олейник Дмитрий" написал:

Отправил ответ Вам на e-mail.

С уважением,
Олейник Дмитрий
Эксперт 3-й линии поддержки


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

В качестве решения предлагается использовать SendEmailByTemplate из scr_MailUtils:

Отправлять примерно так:

var AddressList = [];
var OwnerID = Dataset.Values('OwnerID');
GetMailAddressesByContactID(OwnerID, AddressList);
var TemplateID = GetSystemParameterValueEx('IncidentEmailByContactTemplateID');
if (IsEmptyGUID(TemplateID)) {
   return;
}
var ID = Dataset('ID');
SendEmailByTemplate(TemplateID, {RecordID: ID, Address: AddressList,
    Silent: true, AutoSend: true});
Показать все комментарии

Задача: Есть отчет, появляется окно выбора даты, выбираем дату, данные в отчете FastReport фильтруются по этой дате.

Пусть у нас есть таблица с данными tbl_frDate

SELECT * FROM tbl_frDate

1
И мы хотим создать отчет FastReport отфильтровав данные по дате, для этого мы создали SQ для получения данных
2

3

4

5

6

Параметр MyDate, мы используем для фильтрации, его и будем передавать в отчет

На основании sq создаем Dataset ds_frDate:
7

Создаем отчет FR, подключаем созданные Dataset
8
В самом дизайнере FR, для тестирования положим несколько Memo (предварительно добавив Master Data в дизайнер)

9
Далее, добавим обработчик события на OnPreview созданного нами отчета (fr_frDate)
10

Дату правильно всего передавать в атрибуты самого отчета ReportPreviewer.Report
В событии fr_frDateOnPrepare мы еще не видим данные с окна фильтрации,а вот в fr_frDateOnPreview видим,

function fr_frDateOnPreview(ReportPreviewer) {
 var DatasetNameStr = "ds_frDate"; //датасет в котором мы хотим делать фильтр по дате (необходимо помнить о том, что у отчета может быть несколько датасетов)
 var str = ReportPreviewer.DatasetUSIList.CommaText; //в строчке ReportPreviewer.DatasetUSIList.CommaText передаются USI датасетов, через запятую
 var ReportDatasetUSI =  str.substr(str.indexOf(DatasetNameStr), DatasetNameStr.length);
 var Dataset = ReportPreviewer.DatasetByUSI(ReportDatasetUSI);

                var val = GetAttribute(ReportPreviewer.Report,'TestDate');
                ApplyDatasetFilter(Dataset, 'MyDate', val, true);
}

Саму переменную, мы также можем получить в FastReport объявив ее следующим образом
11

12

Кстати, в самом дизайнере можем проверять значение следующим образом

[IIF(TSDataset1."MyDate"> TestDate>,TSDataset1."MyDate">,'')]

Как прикрепить окно фильтрации к отчету описано в инструкции Создать свое окно фильтрации для отчета.doc

В самом окне фильтрации параметр передаем так:

//-----------------------------------------------------------------------------
// wnd_FilterWindowTestScript
//-----------------------------------------------------------------------------

function SaveDatePeriod() {
        var ReportPreviewer = Self.Attributes('ReportPreviewer');
                ReportPreviewer.Report.Attributes('TestDate')  = edtDate.Value;
}  


function btnCancelOnClick(Control) {
         Self.Close();
}    


function btnOKOnClick(Control) {
                SaveDatePeriod();      
                SendNotify(Self, MSG_OK);
}

Все сервисы в архиве

Нравится

Поделиться

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

pls password для frpar.rar

Добрый день!

Файл без пароля.

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

Добрый день!
Есть бизнес-процесс, который стартует в разделе "Проекты" по кнопке "Запустить процесс" следующим образом:

var Dataset = dlData.Dataset;
var ParamNames = new Array();
ParamNames[0] = 'OpportunityID';
var ParamValues = new Array();
ParamValues[0] = Dataset.Values('ID');
WFStartByID("{96A6BC55-B2F9-499C-A2E0-66FD2DF13B32}", ParamNames, ParamValues);

Запускается задача ( 1 шаг бизнес-процесса). Необходимо, чтобы в эту задачу ( только в эту) в качестве даты начала и даты завершения брались значения из специальных полей в проекте.
Подскажите, пожалуйста как можно это сделать ( пробовали передавать эти значения аналогично ParamNames[0] = 'OpportunityID' - не получилось)
Версия Террасофта 3.0.4.118 Х25

Нравится

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

Дарья, попробуйте передавать эти значения в параметры, как и OpportunityID (например, с названиями StartDate и DueDate), а при обработке события OnExecute элемента wa_TaskAction проверять название элемента и в зависимости от него устанавливать даты начала и завершения задач:

function wa_TaskActionOnExecute(WorkflowAction, ActionItem, ItemDataset,
		IsComplete, ResultLinkCodes) {
	.........
	var DefaultValues = GetNewDictionary();
	DefaultValues.Add('Title', ActionItem.Caption);
	DefaultValues.Add('WorkflowItemID', ItemID);
	if (ActionItem.Name == '<Название задачи - первого элемента БП>') {
		var Diagram = GetDiagramByItem(ActionItem);
		var ExecuteDate = WFGetParamValue(Diagram, 'StartDate');
		var DueDate = WFGetParamValue(Diagram, 'DueDate');
		DefaultValues.Add('StartDate', ExecuteDate);
		DefaultValues.Add('DueDate', DueDate);
	} else {
		var ExecuteDate = ItemDataset.ValAsDateTime('ExecuteDate');
		var ExecuteAfterTimeTypeID = 
			WFGetParamsMapItemValue(ActionItem, 'ExecuteAfterTimeTypeID');
		var ExecuteAfterTimeValue = 
			parseInt(WFGetParamsMapItemValue(ActionItem, 'ExecuteAfterTimeValue'));
		ExecuteDate = WFCalcExecuteTime(ExecuteDate, ExecuteAfterTimeTypeID, 
			ExecuteAfterTimeValue);
		ExecuteDate = ExecuteDate.getVarDate();
		DefaultValues.Add('StartDate', ExecuteDate);
		var ExecuteTimeTypeID = 
			WFGetParamsMapItemValue(ActionItem, 'ExecuteTimeTypeID');
		var ExecuteTimeValue = 
			parseInt(WFGetParamsMapItemValue(ActionItem, 'ExecuteTimeValue'));
		var DueDate = WFCalcExecuteTime(ExecuteDate, ExecuteTimeTypeID, 
			ExecuteTimeValue);
		DefaultValues.Add('DueDate', DueDate.getVarDate());
	}
	..........
}

Спасибо.
Скажите, пожалуйста, надо ли подключать дополнительные скрипты?
Сейчас возникает ошибка
на строчке var Diagram = GetDiagramByItem(ActionItem);
"Предполагается наличие объекта"

Должен быть подключен скрипт scr_WorkflowUtils.

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

function GetDiagramByItem(DiagramItem) {
	return DiagramItem.ParentItems.ParentDiagram;
}

Либо вместо вызова var Diagram = GetDiagramByItem(ActionItem); вставьте такую строчку:

var Diagram = ActionItem.ParentItems.ParentDiagram;
Показать все комментарии

Помогите разобраться с хранимой процедурой:

В ХП передается ID документа(@DocID) и сумма заголовков подчиненных документов (@child) для записи в поле ChildDocSum tbl_Document

ALTER PROCEDURE [dbo].[doc_child]
@DocID uniqueidentifier,
@child nvarchar(2000)
AS
BEGIN
UPDATE tbl_Document
SET ChildDocSum = @child
WHERE ID = @DocID
END

Запускаю я ее из скрипта следующим образом:
var Params = System.CreateObject('TSObjectLibrary.Parameters');
AddParameter(Params, pdtGUID, ParentID).Name = 'DocID';
AddParameter(Params, pdtString, ChildParentTitle).Name = 'child';
var SQL = "exec doc_child :DocID, child";
Connector.DBEngine.ExecuteCustomSQL(SQL, Params);

но вместо суммы заголовков подчиненных документов, сформированных в переменной ChildParentTitle в tbl_Document записывается строка child.

В чем может быть дело? В передаче параметров в ХП или в самой процедуре?

Версия TSCRM 3.3.1.72 на MSSQL2005

Нравится

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

Юрий, Вы пропустили двоеточие:
var SQL = "exec doc_child :DocID, :child";

Юрий, еще как вариант запустить профайлер и посмотреть реальный запрос к серверу при запуске ХП. А какой смысл этой процедуры? Это можно сделать простым Update.

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

Сервис UpdateQuery. Но действительно могут быть нюансы насчет доступа. Тогда Вам необходимо еще раздать доступ public на запуск ХП.

Действительно дело было в двоеточии.
Александр, большое спасибо.

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