# BPMN ?
BPMN یا Business Process Model and Notation یا مدل سازی فرایند کسب و کار همان طور که از نامش پیداست استانداردی برای مدل سازی فرایند کسب و کار می باشد
BPMN برای تعیین فرآیندهای فعالیت ها به صورت نمودار های همانند فلوچارت می باشد که شبیه به نمودار جریان و بر اساس زبان مدل سازی یکپارچه UML است
مدل مشترک بین همه کسانی می باشد که می خواهند فرایند خود را شروع کنند و سایر افراد با زبان های مختلف می توانند متوجه فرایند بشوند این مدل، از سال ۲۰۰۴ در دست توسعه و فعال است و اکنون به عنوان راهی برای ترسیم نقشه های فرایند کسب و کار، مورد قبول واقع شده است. به این دلیل که:
- درک آن با یک نگاه ساده و آسان است.
- این مدل دقیق است و با طیف گسترده ای از نمادها برای پوشش هر مورد استفاده می شود.
- این مدل برای آسان سازی فرآیندهای انسان محور و فناوری اطلاعات با دقت مناسبی طراحی شده است.
----
**Pool یا استخر کاری :**
Pool بزرگترین واحد روی نقشه هستند. آنها مناطقی هستند که حاوی Lanes، رویدادها (Events)، وظایف و غیره میباشند. آنها نماینده کسانی هستند که وظیفهای را انجام میدهند. اگر بخواهیم روند پشتیبانی مشتری خود را ترسیم کنیم، یک برای مسیر روند و یک Pool برای مشتری وجود دارد. کار میتواند بین Pool جریان داشته باشد و این نشاندهنده چیزی مانند ارسال پیام به مشتری است.
استفاده دقیق از Pools و Lanes میتواند سلیقهای باشد. چه از Poolهای جداگانه برای نمایندگی بخشهای مختلف شرکت خود استفاده کنید و چه فقط استفاده از Lanes در نظر بگیرید، قوانین سخت و سریعی وجود دارد:
- هر Pool میتواند حداکثر شامل یک فرآیند باشد.
- Poolها نماینده شرکتکنندگان هستند: سازمان ها و یا نهاد ها و یا بخشی که می خواهیم برای آن فرایند ظراحی کنیم
**Lane :**
در هر Pool یا استخر کاری می توان چندین Lane قرار داد و این برای این lane ها می توانند با هم در ارتباط باشند در واقع Lane ها برای جدا سازی بخش های یک سازمان می باشند یا می توان برای هر Lane یک نقش و یا کاربر در یک سازمان در نظر گرفت
فعالیت یا Activity : فعالیت یک اصطلاح عمومی است برای کار هایی که یک شرکت یا سازمان در فرایند انجام می دهد . فعالیت ها در فرایند های استاندارد به صورت نمودار های رقص آرایی مورد استفاده قرار میگیرند
روبداد یا Event : رویداد چیزی است که در طول یک فرایند یا نمودار های رقص آرایی اتفاق می افتد رویداد روی جریان مدل اثر یمی گذارند و معمولا یا دارای یک علت (محرک) یا یم اثر (نتیجه) هستند نمداد رویداد به صورت یک دایرهتو خالی می باشد و در داخل دایره نتایج محرک های متفاوت نمایش داده می شود
رویداد بر اساس اینکه چه زمانی روی جریان اثر می گذارند به سه نوع نقسیم می شوند : شروع ، میانی و پایان
دروازه یا Gateway : دروازه برای کنترل واگرایی و هگرایی جریان های توالی در یک فرایند با یک نمودار رقص آرایی مورد استفاده قرار میگیرد بر این اساس یک دروازه تعیین کننده چند شاخه کردن(تصمیم گیری) انشعاب و ادغام و به هم پیوند زدن مسیر های فرایند است . نشانگر های داخل لوزی مشخص ککنده نوع رفتار کنترلی دروازه ها می باشد
event | BPMN
----|-----
**رویداد شروع** : همانطور که از نام رویداد مشخص است
این رویداد نشان می دهد که در کجا یک فرایند مشخص
و یا نمودار رقص آرایی شروع خواهد شد
**رویداد میانی :** رویداد میانی در میان یک رویداد شروع و پایان
اتفاق می افتد این رویداد روی جریان فرایند یا نمودار رقص آرایی اثر می گذارد اما قادر به شروع فرایند نیست
**رویداد پایانی :** رویداد پایانی نشان می دهد که در کجا یک فرایند با یک نمودار رقص آرایی به پایان می رسد |
**انواع رویداد ها :** رویداد های شروع و بعضی از رویداد های میانی دارای محرک هایی هستند که علت وقوع آن رویداد را تعریف می کنند راه های مختلفی برای راه اندازی این رویداد ها وجود دارد رویداد های پایانی ممکن است نتیجه ای را تعریف کنند که پیامد آن خاتمه مسیر جرایانتوالی باشد .
رویداد های شروع فقط می توانند به محرک ها عکس العمل نشان دهند و رویداد های پایان می توانند نتیجه را ایجاد کنند . اما رویداد میانی می توانند دریافت کننده یا پرتاب کننده محرک ها باشند
----
**انواع دروازه های کنترل (Gateway) :**
نشانگر درون لوزی نشان دهنده نوع رفتار کنترل جریان است
دروازه انحصاری (چند شاخه کردن / تصمیم گیری یا ادغام)
دروازه موازی برای اشنعاب کردن یا به هم پیوند زدن جریان ها استفاده می شود
# محیط طراحی فرایندها
**user task :**
با استفاده از UserTask می توانید فرم مدنظر خود را در طول فرایند به کاربر نشان دهید
برای استفاده از user task ابتدا باید activity را داخل lane قرار دهید سپس با اننخاب گزینه change type می تواند نوع activity را بر روی user task قرار دهید
پس از انتخاب user task با در قسمت تنظیمات موارد مربوط این activity را کامل کنید
**عنوان :** در این قسمت شما می توانید نام activtiy را مشخص کنید (این مورد فقط در مدل سازی فرایند قابل مشاهده می باشد )
**انتخاب ماهیت :** در قسمت انتخاب ماهیت باید فرم را انتخاب کرد
**حالت نمایش :** حالت نمایش می تواند به ۳ مدل جدید ویرایش و نمایش باشد
1 . در حالت جدید فرمی که در فرایند باز می شود بدون اطالاعاتمی باشد و در صورت ثبت فرم به ازای آن یک رکورد جدید در پایگاه داده ذخیره می شود
2 . در حالت ویرایش شما می توانید اطالاعات موجود در فرم که از قبل ذخیره شده را ویرایش کنید و مقدار داده ها در فرم را عوض کنید . در این حالت رکورد جدید در پایگاه داده ایجاد نمی شود و همان رکورد ثبت شده در پایگاه داده به روز رسانی مب شود
3 . درحالت نمایش داده ها در فرم نمایش داده می شود و کاربر که فرم را در حات نمایش باز می کند نمی تواند داده ها را تغییر دهد
**تنطیمات فیلد ها :**
با انتخاب گزینه تنظیمات فیلد ها صفحه زیر برای شما نمایش داده می شود
در این صفحه میتواند نمام فیلدها موجود در فرم را مشاده کنید و تنظیمات مربوط به آن ها را انجام دهید
از مزایای این تنظیمات این است که در هر قسمت از فرایند می تواند یک فرم یا user task تکرار شود بنابراین می توانیم برای هر فرم در هر مرحله تنظیمات مختلفی داشته باشیم
این تنظیمات شامل نوع نمایش ، اجباری بودن پر کردن فیلد ، خواندنی بودن و فعال بودن فیلد را تنظیم نمود همچنین می توان برای فرم مقدار پیش فرض در نظر گرفت که این مقدار پیش فرض می تواند به صورت مقدار ثابت باشد و یا از متغییر دریافت شود یا از تابع دریافت شود
> در صورتی که ما در یک فرایند دو usertask داشته باشیم که هر دو مربوط به یک فرم باشند و بخواهیم اطلاعات ثبت شده در usertask اول را درusertask نمایش بدهیم باید خروجی usertask اول را درون متغییر ریخته و سپس آن متغییر را به id ی که درون تنظیمات فیلد است بدهیم
{.is-success}
**تنظیمات عنوان اختیاری :** با استفاده از این گزینه شما می توانید برای کارتابل فرایند عنوان در نظر بگیرید و آن را به صورت پویا تغییر بدهید به عنوان مثال در عنوان می توایند نام در خواست کننده و شماره در خواست را به صورت پویا درج کنید
**تنظیمات نمایش شرح ارجاع :** در صورت فعال بودن این گزینه شرح ارجاع وارد شده در مرحله قبل به کاربر نمایش داده می شود
**تنظیمات شرح ارجاع :** با فعال کردن این گزینه در پایین فرم یک textbox نمایش داده می شود که شما می توانید در آن متنی را بنویسید که در مرحله بعدی فرایند در بالای صفحه به صورت پیام یا خطا نمایش داده شود
**تنظیمات لغو فرایند :** با فعال کردن این گزینه می توانید در هر مرحله از فرایند آن را لغو کنید
**تنظیمات دکمه ثبت موقت فرم :** در صورت فعال کردن این گزینه داده های ثبت شده در فرم ذخیره می شود و می تواند به فرم ادامه ندهد
**ثابت بودن دکمه های عملیاتی فرم :** با این گزینه شما می توانید در فرم دکمه های کنترلی را ثابت نگه می دارد و فقط فرم و فیلد های آن اسکرول می شود
----
**Service Task :**
با استقاده از service task شما می توانید به منابع داده متصل شوید و عملیات مربوط به منابع داده را انجام بدهید
در زمانی که شما از service task استفاده می کنید باید برای سرویس تسک منبع داده در نظر بگیرید که فعالیت مد نظر را انجام دهد
**عنوان :** عنوانی که در acitivity در مدل سازی فرایند بر روی المان نمایش داده می شود
**توضیحات :** نوشته ای که طراح فرایند می تواند برای آن المان بنویسد این توضیحات برای فردی یا افرادی است که به فرایند رجوع می کند (همانند کامنت ها در برنامه نویسی )
**مدیریت منابع داده :** در این قسمت می توانید منبع داده مورد نظر خود را انتخاب کنید
جهت اطلاع از نحوه استفاده منبع داده می توایند به لینک زیر رجوع کنید :
> **[ایجاد و مدیریت منبع داده](/SystemSetting/Provider)**
**مدیریت پارامتر ها :** در این قسمت شما می توانید به پارامتر های که در مبتع داده خود منظر گرفته اید مقدار دهید
این مقدار ها می تواند مقادیر ثابت باشد و یا مقادیری باشد که درون متغییر های فرایند قرار دارد

در این منو لیست پارامتر های که در منبع داده مشخص است نمایش داده می شود و می توانیم آن ها را مدیریت کنیم

مقدار دهی به پارامتر ها می تواند به چند صورت باشد
1.بدون ورودی : در این صورت به پارمتری که در منبع داده است ورودی خالی یا null برگردانده می شود
2.متغییر : می توانید از متغییر های که در فرایند ساخته اید استقاده کنید و داده های که در متغییر جای گذاری می شود را به پارامتر های منبع داده منتقل کنید
متغییر می تواند به دو صورت پیشرفته یا ساده باشد در صورتی که به صورت باشد اولین مقدار اولین خانه رشته جیسون درون متغییر خوانده می شود و در صورتی که به صورت پیشرفته باشد شما می توانید انتخاب کنید که کدام مقدار از کدام خانه خوانده شود
استفاده از داده های فرم در متغیر:
```yaml
1-FormData['PropertyName']
2-FormData['SubName']
3-FormData
```
استفاده از داده های سرویس در متغیر:
```yaml
1-ServiceData[Index]['PropertyName']
2-ServiceData[Index]
3-ServiceData
```
> FormData و ServiceData به حروف کوچک و بزرگ حساس هستند.
{.is-warning}
>در صورتی که در اطلاعات فرم دادههای زیر مجموعه وجود دارد باید از روش زیر استفاده کنید:
FormData['ParentPropertyName']['ChildPropertyName']
{.is-warning}
> در صورتی که در اطلاعات فرم داده های زیر مجوعه وجود دارد برای دستیابی به کل زیرمجموعه از روش زیر استفاده کنید:
FormData['SubName']
{.is-warning}
> در صورتی که تمام اطلاعات فرم را بخواهید باید از روش زیر استفاده کنید:
FormData
{.is-warning}
> داده ها در متغیرهای سرویس به صورت آرایهای ذخیره میشود. در صورتی که آرایه شما بیش از یک ردیف
باشد میتوانید Index ردیف مورد نظر را وارد نمایید در غیر اینصورت به جای Index مقدار صفر قرار دهید.
ServiceData[0]['PropertyName']
{.is-warning}
>در صورتی که کل آرایه رو بخواهید استفاده کنید لازم است Index ردیف مورد نظر را وارد کنید
ServiceData[Index]
{.is-warning}
>استفاده از کل داده های سرویس
ServiceData
{.is-warning}
>در صورتی که PropertName انتخاب شده به صورت رشته json باشد باید از جدا کننده * (ستاره) استفاده کرد,به طور مثال Content به صورت رشته json است برای دستیبابی به اطلاعات آن باید به صورت زیر اقدام کرد:ServiceData[0]['Content']*['Token']['PrivateToken']
FormData['SubName']*['PropertName']
{.is-warning}
3.مقدار دستی : مقدار ثابت را می توانید به پارامتر داخل منبع داده بدهید
4.مقدار ورودی از تابع : در صورتی که می خواهید از توابع که داخل سیستم های مدیریت پایگاه داده استفاده کنید می توانید نام تابع خود را به همراه پارامتر های آن تابع درون این قسمت قرار دهید که در این صورت مقدار خروجی تابع به پارامتر مبع داده منتقل می شود
-----
**ذخیره در پایگاه داده :** با این گزینه می توان فرایند ایجاد شده را ذخیره کرد برای به و اگر در فرایند تغییری ایجاد کنیم و دوباره ذخیره کنیم نسخه ی دیگری از آن منتشر می شود
**ذخبره به صورت فایل :** ذخیره فرایند به صورت فایل bpmn
**فراخوانی فایل bpmn :** از این طریق می توان فایل bpmn ذخیره شده را فراخوانی کرد در محیط فرایند مشاهده کرد
**مدیریت متغییر ها :** برای ذخیره داده های موجود در سیستم و نگه داری از آن ها می توان آن ها را درون متغییر ها ذخیره کرد و از آن ها در قسمت های دیگر فرایند و activity ها دیگر استفاده کرد برای ایجاد متغییر می توانید از این گزینه استفاده کنید
در این صفحه می توانید متغییر هارا ایجاد کنید
> پس از ایجاد متغییر حتما باید دکمه تایید را بزنید در غیر این صورت متغییر ذخیره نخواهد شد
{.is-warning}
## ایجاد تسک موبایلی
برای ایجاد تسک موبایلی ابتدا باید در فرم ساز پیشرفته فرم مد نظر را ایجاد کرد
- [فرم ساز پیشرفته *نحوه ساخت فرم در فرم ساز پیشرفته*](/graphtutorial/formgenerator/fromgenerator)
{.links-list}
سپس باید در قسمت مدیریت کار و بازرسی کار جدید را ایجاد کرد
- [ایجاد کار جدید *مدیریت کار و بازرسی*](/graphtutorial/workmanagement/workmanagement)
{.links-list}
کلا روی
# لیست و ورژن های فرایند ها
# مدیریت خطاها
# مدیریت تایمر ها
## نصب تایمر ها
برای فعال سازی تایمر در سامانه گراف ابتدا باید وارد نرم افزار iis شد و در قسمت sites ، بر روی سایت مدنظر کلیک راست کرده و از منو Manage WebSite باید Advance Setting را انتخاب کنید که پس از انتخاب صفحه زیر باز می شود
> می توانید از نوار ابزار سمت راست برای ورود به این صفحه استفاده کنید
{.is-info}
سپس در Advanced Setting باید Preload Enabled را برار با True قرار داد
بعد از فعال کردن این مورد وارد Application Pools می شویم
در این صفحه بر روی سامانه ای که قرار است تایمر را بر روی آن فعال کنیم کلیک می کنم
پس از کلیک در قسمت Edit Application Pool باید Advanced Setting را انتخاب کنیم و Start Mode را باید بر روی حالت Always Running قرار بدهیم
سپس باید در پایگاه داده ای که به سامانه متصل است به جدول dbo.SystemConfiguration رجوع کنید و مقدار در این جدول مقدار ItemValue مروبوط به ستونی که ItemKey آن برابر با DynamicTimerConfigs است بروزرسانی کنید و یا در صورتی که این سطر در وجود نداشت آن را درج کنید
در صورتی که این سطر در جدول باشد باید آن را آپدیت کرد و مقدار زیر را برای ستون ItemValue قرار داد
```sql
UPDATE dbo.SystemConfiguration SET ItemValue = N'{"custom.enableTimer":"true","quartz.jobStore.type":"Quartz.Impl.AdoJobStore.JobStoreTX, Quartz","quartz.jobStore.driverDelegateType":"Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz","quartz.jobStore.tablePrefix":"QRTZ_","quartz.jobStore.dataSource":"myDS","quartz.dataSource.myDS.connectionString":"","quartz.dataSource.myDS.provider":"SqlServer","quartz.serializer.type":"json","custom.error.retryInterval":"10","custom.appUser.userName":"BpmsTimer","custom.appUser.password":"123","custom.appUrl.baseUrl":"http://localhost:1221"}' WHERE ItemKey = N'DynamicTimerConfigs';
```
> توجه داشته باشید در قسمت custom.appUrl.baseUrl باید حتما آدرس درست و متناسب با ای پی سیستم یا سرور و پورت سامانه باشد
{.is-warning}
و برای insert کردن هم می توانید از کد زیر استفاده کنید
```sql
INSERT INTO dbo.SystemConfiguration ([Section], [ItemKey], [ItemValue], [Description], [ExtraInformation], [IsActive], [KeyReadonly], [ValueReadonly], [DescriptionReadonly])
VALUES
( 'DynamicTimer', N'DynamicTimerConfigs', N'{"custom.enableTimer":"true","quartz.jobStore.type":"Quartz.Impl.AdoJobStore.JobStoreTX, Quartz","quartz.jobStore.driverDelegateType":"Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz","quartz.jobStore.tablePrefix":"QRTZ_","quartz.jobStore.dataSource":"myDS","quartz.dataSource.myDS.connectionString":"","quartz.dataSource.myDS.provider":"SqlServer","quartz.serializer.type":"json","custom.error.retryInterval":"10","custom.appUser.userName":"BpmsTimer","custom.appUser.password":"123","custom.appUrl.baseUrl":"http://localhost:2569"}', N'تنظیمات کانفیگ داینامیک تایمر کوآرتز', N'', 1, 0, 0, 1 )
```
سپس باید در فایل WebConfig مقدار EnableTimer را برابر با True قرار دهید
پس از نصب تایمر برای بررسی عملکرد تایمر می تواند با وارد کردن ای پی و پورت سامانه پس از آن Timer-Dashboard را استفاده کنید به عنوان مثال :
>
> localhost/Timer-Dashboard
{.is-info}
که صفحه زیر باز می شود که می توانید تایمر های فعال را مشاهده کنید
استفاده دقیق از Pools و Lanes میتواند سلیقهای باشد. چه از Poolهای جداگانه برای نمایندگی بخشهای مختلف شرکت خود استفاده کنید و چه فقط استفاده از Lanes در نظر بگیرید، قوانین سخت و سریعی وجود دارد:
- هر Pool میتواند حداکثر شامل یک فرآیند باشد.
- Poolها نماینده شرکتکنندگان هستند: سازمان ها و یا نهاد ها و یا بخشی که می خواهیم برای آن فرایند ظراحی کنیم
**Lane :**
در هر Pool یا استخر کاری می توان چندین Lane قرار داد و این برای این lane ها می توانند با هم در ارتباط باشند در واقع Lane ها برای جدا سازی بخش های یک سازمان می باشند یا می توان برای هر Lane یک نقش و یا کاربر در یک سازمان در نظر گرفت
فعالیت یا Activity : فعالیت یک اصطلاح عمومی است برای کار هایی که یک شرکت یا سازمان در فرایند انجام می دهد . فعالیت ها در فرایند های استاندارد به صورت نمودار های رقص آرایی مورد استفاده قرار میگیرند
روبداد یا Event : رویداد چیزی است که در طول یک فرایند یا نمودار های رقص آرایی اتفاق می افتد رویداد روی جریان مدل اثر یمی گذارند و معمولا یا دارای یک علت (محرک) یا یم اثر (نتیجه) هستند نمداد رویداد به صورت یک دایرهتو خالی می باشد و در داخل دایره نتایج محرک های متفاوت نمایش داده می شود
رویداد بر اساس اینکه چه زمانی روی جریان اثر می گذارند به سه نوع نقسیم می شوند : شروع ، میانی و پایان
دروازه یا Gateway : دروازه برای کنترل واگرایی و هگرایی جریان های توالی در یک فرایند با یک نمودار رقص آرایی مورد استفاده قرار میگیرد بر این اساس یک دروازه تعیین کننده چند شاخه کردن(تصمیم گیری) انشعاب و ادغام و به هم پیوند زدن مسیر های فرایند است . نشانگر های داخل لوزی مشخص ککنده نوع رفتار کنترلی دروازه ها می باشد
event | BPMN
----|-----
**رویداد شروع** : همانطور که از نام رویداد مشخص است این رویداد نشان می دهد که در کجا یک فرایند مشخص
و یا نمودار رقص آرایی شروع خواهد شد
**رویداد میانی :** رویداد میانی در میان یک رویداد شروع و پایان
اتفاق می افتد این رویداد روی جریان فرایند یا نمودار رقص آرایی اثر می گذارد اما قادر به شروع فرایند نیست
**رویداد پایانی :** رویداد پایانی نشان می دهد که در کجا یک فرایند با یک نمودار رقص آرایی به پایان می رسد |
**انواع رویداد ها :** رویداد های شروع و بعضی از رویداد های میانی دارای محرک هایی هستند که علت وقوع آن رویداد را تعریف می کنند راه های مختلفی برای راه اندازی این رویداد ها وجود دارد رویداد های پایانی ممکن است نتیجه ای را تعریف کنند که پیامد آن خاتمه مسیر جرایانتوالی باشد .
رویداد های شروع فقط می توانند به محرک ها عکس العمل نشان دهند و رویداد های پایان می توانند نتیجه را ایجاد کنند . اما رویداد میانی می توانند دریافت کننده یا پرتاب کننده محرک ها باشند
----
**انواع دروازه های کنترل (Gateway) :**
نشانگر درون لوزی نشان دهنده نوع رفتار کنترل جریان است
دروازه انحصاری (چند شاخه کردن / تصمیم گیری یا ادغام)
دروازه موازی برای اشنعاب کردن یا به هم پیوند زدن جریان ها استفاده می شود
# محیط طراحی فرایندها
**user task :**
با استفاده از UserTask می توانید فرم مدنظر خود را در طول فرایند به کاربر نشان دهید
برای استفاده از user task ابتدا باید activity را داخل lane قرار دهید سپس با اننخاب گزینه change type می تواند نوع activity را بر روی user task قرار دهید
پس از انتخاب user task با در قسمت تنظیمات موارد مربوط این activity را کامل کنید
**عنوان :** در این قسمت شما می توانید نام activtiy را مشخص کنید (این مورد فقط در مدل سازی فرایند قابل مشاهده می باشد )
**انتخاب ماهیت :** در قسمت انتخاب ماهیت باید فرم را انتخاب کرد
**حالت نمایش :** حالت نمایش می تواند به ۳ مدل جدید ویرایش و نمایش باشد
1 . در حالت جدید فرمی که در فرایند باز می شود بدون اطالاعاتمی باشد و در صورت ثبت فرم به ازای آن یک رکورد جدید در پایگاه داده ذخیره می شود
2 . در حالت ویرایش شما می توانید اطالاعات موجود در فرم که از قبل ذخیره شده را ویرایش کنید و مقدار داده ها در فرم را عوض کنید . در این حالت رکورد جدید در پایگاه داده ایجاد نمی شود و همان رکورد ثبت شده در پایگاه داده به روز رسانی مب شود
3 . درحالت نمایش داده ها در فرم نمایش داده می شود و کاربر که فرم را در حات نمایش باز می کند نمی تواند داده ها را تغییر دهد
**تنطیمات فیلد ها :**
با انتخاب گزینه تنظیمات فیلد ها صفحه زیر برای شما نمایش داده می شود
در این صفحه میتواند نمام فیلدها موجود در فرم را مشاده کنید و تنظیمات مربوط به آن ها را انجام دهید
از مزایای این تنظیمات این است که در هر قسمت از فرایند می تواند یک فرم یا user task تکرار شود بنابراین می توانیم برای هر فرم در هر مرحله تنظیمات مختلفی داشته باشیم
این تنظیمات شامل نوع نمایش ، اجباری بودن پر کردن فیلد ، خواندنی بودن و فعال بودن فیلد را تنظیم نمود همچنین می توان برای فرم مقدار پیش فرض در نظر گرفت که این مقدار پیش فرض می تواند به صورت مقدار ثابت باشد و یا از متغییر دریافت شود یا از تابع دریافت شود
> در صورتی که ما در یک فرایند دو usertask داشته باشیم که هر دو مربوط به یک فرم باشند و بخواهیم اطلاعات ثبت شده در usertask اول را درusertask نمایش بدهیم باید خروجی usertask اول را درون متغییر ریخته و سپس آن متغییر را به id ی که درون تنظیمات فیلد است بدهیم
{.is-success}
**تنظیمات عنوان اختیاری :** با استفاده از این گزینه شما می توانید برای کارتابل فرایند عنوان در نظر بگیرید و آن را به صورت پویا تغییر بدهید به عنوان مثال در عنوان می توایند نام در خواست کننده و شماره در خواست را به صورت پویا درج کنید
**تنظیمات نمایش شرح ارجاع :** در صورت فعال بودن این گزینه شرح ارجاع وارد شده در مرحله قبل به کاربر نمایش داده می شود
**تنظیمات شرح ارجاع :** با فعال کردن این گزینه در پایین فرم یک textbox نمایش داده می شود که شما می توانید در آن متنی را بنویسید که در مرحله بعدی فرایند در بالای صفحه به صورت پیام یا خطا نمایش داده شود
**تنظیمات لغو فرایند :** با فعال کردن این گزینه می توانید در هر مرحله از فرایند آن را لغو کنید
**تنظیمات دکمه ثبت موقت فرم :** در صورت فعال کردن این گزینه داده های ثبت شده در فرم ذخیره می شود و می تواند به فرم ادامه ندهد
**ثابت بودن دکمه های عملیاتی فرم :** با این گزینه شما می توانید در فرم دکمه های کنترلی را ثابت نگه می دارد و فقط فرم و فیلد های آن اسکرول می شود
----
**Service Task :**
با استقاده از service task شما می توانید به منابع داده متصل شوید و عملیات مربوط به منابع داده را انجام بدهید
در زمانی که شما از service task استفاده می کنید باید برای سرویس تسک منبع داده در نظر بگیرید که فعالیت مد نظر را انجام دهد
**عنوان :** عنوانی که در acitivity در مدل سازی فرایند بر روی المان نمایش داده می شود
**توضیحات :** نوشته ای که طراح فرایند می تواند برای آن المان بنویسد این توضیحات برای فردی یا افرادی است که به فرایند رجوع می کند (همانند کامنت ها در برنامه نویسی )
**مدیریت منابع داده :** در این قسمت می توانید منبع داده مورد نظر خود را انتخاب کنید
جهت اطلاع از نحوه استفاده منبع داده می توایند به لینک زیر رجوع کنید :
> **[ایجاد و مدیریت منبع داده](/SystemSetting/Provider)**
**مدیریت پارامتر ها :** در این قسمت شما می توانید به پارامتر های که در مبتع داده خود منظر گرفته اید مقدار دهید
این مقدار ها می تواند مقادیر ثابت باشد و یا مقادیری باشد که درون متغییر های فرایند قرار دارد

در این منو لیست پارامتر های که در منبع داده مشخص است نمایش داده می شود و می توانیم آن ها را مدیریت کنیم

مقدار دهی به پارامتر ها می تواند به چند صورت باشد
1.بدون ورودی : در این صورت به پارمتری که در منبع داده است ورودی خالی یا null برگردانده می شود
2.متغییر : می توانید از متغییر های که در فرایند ساخته اید استقاده کنید و داده های که در متغییر جای گذاری می شود را به پارامتر های منبع داده منتقل کنید
متغییر می تواند به دو صورت پیشرفته یا ساده باشد در صورتی که به صورت باشد اولین مقدار اولین خانه رشته جیسون درون متغییر خوانده می شود و در صورتی که به صورت پیشرفته باشد شما می توانید انتخاب کنید که کدام مقدار از کدام خانه خوانده شود
استفاده از داده های فرم در متغیر:
```yaml
1-FormData['PropertyName']
2-FormData['SubName']
3-FormData
```
استفاده از داده های سرویس در متغیر:
```yaml
1-ServiceData[Index]['PropertyName']
2-ServiceData[Index]
3-ServiceData
```
> FormData و ServiceData به حروف کوچک و بزرگ حساس هستند.
{.is-warning}
>در صورتی که در اطلاعات فرم دادههای زیر مجموعه وجود دارد باید از روش زیر استفاده کنید:
FormData['ParentPropertyName']['ChildPropertyName']
{.is-warning}
> در صورتی که در اطلاعات فرم داده های زیر مجوعه وجود دارد برای دستیابی به کل زیرمجموعه از روش زیر استفاده کنید:
FormData['SubName']
{.is-warning}
> در صورتی که تمام اطلاعات فرم را بخواهید باید از روش زیر استفاده کنید:
FormData
{.is-warning}
> داده ها در متغیرهای سرویس به صورت آرایهای ذخیره میشود. در صورتی که آرایه شما بیش از یک ردیف
باشد میتوانید Index ردیف مورد نظر را وارد نمایید در غیر اینصورت به جای Index مقدار صفر قرار دهید.
ServiceData[0]['PropertyName']
{.is-warning}
>در صورتی که کل آرایه رو بخواهید استفاده کنید لازم است Index ردیف مورد نظر را وارد کنید
ServiceData[Index]
{.is-warning}
>استفاده از کل داده های سرویس
ServiceData
{.is-warning}
>در صورتی که PropertName انتخاب شده به صورت رشته json باشد باید از جدا کننده * (ستاره) استفاده کرد,به طور مثال Content به صورت رشته json است برای دستیبابی به اطلاعات آن باید به صورت زیر اقدام کرد:ServiceData[0]['Content']*['Token']['PrivateToken']
FormData['SubName']*['PropertName']
{.is-warning}
3.مقدار دستی : مقدار ثابت را می توانید به پارامتر داخل منبع داده بدهید
4.مقدار ورودی از تابع : در صورتی که می خواهید از توابع که داخل سیستم های مدیریت پایگاه داده استفاده کنید می توانید نام تابع خود را به همراه پارامتر های آن تابع درون این قسمت قرار دهید که در این صورت مقدار خروجی تابع به پارامتر مبع داده منتقل می شود
-----
**ذخیره در پایگاه داده :** با این گزینه می توان فرایند ایجاد شده را ذخیره کرد برای به و اگر در فرایند تغییری ایجاد کنیم و دوباره ذخیره کنیم نسخه ی دیگری از آن منتشر می شود
**ذخبره به صورت فایل :** ذخیره فرایند به صورت فایل bpmn
**فراخوانی فایل bpmn :** از این طریق می توان فایل bpmn ذخیره شده را فراخوانی کرد در محیط فرایند مشاهده کرد
**مدیریت متغییر ها :** برای ذخیره داده های موجود در سیستم و نگه داری از آن ها می توان آن ها را درون متغییر ها ذخیره کرد و از آن ها در قسمت های دیگر فرایند و activity ها دیگر استفاده کرد برای ایجاد متغییر می توانید از این گزینه استفاده کنید
در این صفحه می توانید متغییر هارا ایجاد کنید
> پس از ایجاد متغییر حتما باید دکمه تایید را بزنید در غیر این صورت متغییر ذخیره نخواهد شد
{.is-warning}
## ایجاد تسک موبایلی
برای ایجاد تسک موبایلی ابتدا باید در فرم ساز پیشرفته فرم مد نظر را ایجاد کرد
- [فرم ساز پیشرفته *نحوه ساخت فرم در فرم ساز پیشرفته*](/graphtutorial/formgenerator/fromgenerator)
{.links-list}
سپس باید در قسمت مدیریت کار و بازرسی کار جدید را ایجاد کرد
- [ایجاد کار جدید *مدیریت کار و بازرسی*](/graphtutorial/workmanagement/workmanagement)
{.links-list}
کلا روی
# لیست و ورژن های فرایند ها
# مدیریت خطاها
# مدیریت تایمر ها
## نصب تایمر ها
برای فعال سازی تایمر در سامانه گراف ابتدا باید وارد نرم افزار iis شد و در قسمت sites ، بر روی سایت مدنظر کلیک راست کرده و از منو Manage WebSite باید Advance Setting را انتخاب کنید که پس از انتخاب صفحه زیر باز می شود
> می توانید از نوار ابزار سمت راست برای ورود به این صفحه استفاده کنید
{.is-info}
سپس در Advanced Setting باید Preload Enabled را برار با True قرار داد
بعد از فعال کردن این مورد وارد Application Pools می شویم
در این صفحه بر روی سامانه ای که قرار است تایمر را بر روی آن فعال کنیم کلیک می کنم
پس از کلیک در قسمت Edit Application Pool باید Advanced Setting را انتخاب کنیم و Start Mode را باید بر روی حالت Always Running قرار بدهیم
سپس باید در پایگاه داده ای که به سامانه متصل است به جدول dbo.SystemConfiguration رجوع کنید و مقدار در این جدول مقدار ItemValue مروبوط به ستونی که ItemKey آن برابر با DynamicTimerConfigs است بروزرسانی کنید و یا در صورتی که این سطر در وجود نداشت آن را درج کنید
در صورتی که این سطر در جدول باشد باید آن را آپدیت کرد و مقدار زیر را برای ستون ItemValue قرار داد
```sql
UPDATE dbo.SystemConfiguration SET ItemValue = N'{"custom.enableTimer":"true","quartz.jobStore.type":"Quartz.Impl.AdoJobStore.JobStoreTX, Quartz","quartz.jobStore.driverDelegateType":"Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz","quartz.jobStore.tablePrefix":"QRTZ_","quartz.jobStore.dataSource":"myDS","quartz.dataSource.myDS.connectionString":"","quartz.dataSource.myDS.provider":"SqlServer","quartz.serializer.type":"json","custom.error.retryInterval":"10","custom.appUser.userName":"BpmsTimer","custom.appUser.password":"123","custom.appUrl.baseUrl":"http://localhost:1221"}' WHERE ItemKey = N'DynamicTimerConfigs';
```
> توجه داشته باشید در قسمت custom.appUrl.baseUrl باید حتما آدرس درست و متناسب با ای پی سیستم یا سرور و پورت سامانه باشد
{.is-warning}
و برای insert کردن هم می توانید از کد زیر استفاده کنید
```sql
INSERT INTO dbo.SystemConfiguration ([Section], [ItemKey], [ItemValue], [Description], [ExtraInformation], [IsActive], [KeyReadonly], [ValueReadonly], [DescriptionReadonly])
VALUES
( 'DynamicTimer', N'DynamicTimerConfigs', N'{"custom.enableTimer":"true","quartz.jobStore.type":"Quartz.Impl.AdoJobStore.JobStoreTX, Quartz","quartz.jobStore.driverDelegateType":"Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz","quartz.jobStore.tablePrefix":"QRTZ_","quartz.jobStore.dataSource":"myDS","quartz.dataSource.myDS.connectionString":"","quartz.dataSource.myDS.provider":"SqlServer","quartz.serializer.type":"json","custom.error.retryInterval":"10","custom.appUser.userName":"BpmsTimer","custom.appUser.password":"123","custom.appUrl.baseUrl":"http://localhost:2569"}', N'تنظیمات کانفیگ داینامیک تایمر کوآرتز', N'', 1, 0, 0, 1 )
```
سپس باید در فایل WebConfig مقدار EnableTimer را برابر با True قرار دهید
پس از نصب تایمر برای بررسی عملکرد تایمر می تواند با وارد کردن ای پی و پورت سامانه پس از آن Timer-Dashboard را استفاده کنید به عنوان مثال :
>
> localhost/Timer-Dashboard
{.is-info}
که صفحه زیر باز می شود که می توانید تایمر های فعال را مشاهده کنید