آموزش توابع پرکاربرد بیزاجی (Bizagi)
آموزش توابع پرکاربرد بیزاجی (Bizagi) با مثالهای واقعی در گمرک، بورس و لجستیک را در این مقاله به طور کاربردی در وبسایت eBPM توضیح خواهیم داد.
جریمه انبارداری خودکار در گمرک یا اخطار فوری کاهش سرمایه در بورس را بدون یک خط کد پیچیده در بیزاجی پیاده کنید. در این مقاله چندین تابع کاربردی Me و CHelper را با مثال عملی یاد بگیرید. پیشنهاد میشود تا در مورد نرم افزار بیزاجی بیشتر بخوانید
فرض کنید مشتری شما ۱۵ روز است کالایش در گمرک معطل مانده و هر روز جریمه انبارداری به او تعلق میگیرد. یا در یک کارگزاری بورس، ناگهان ارزش پرتفوی مشتری پایین میآید و باید ظرف چند ثانیه اخطار مارجین کال صادر شود، وگرنه ضرر میکند.
این سناریوها با جمع و میانگین ساده در بیزاجی حل نمیشوند. راه حل، توابع (Functions) هستند. همان ابزاری که به شما اجازه میدهند منطق شرطی، محاسبات بینمرحلهای و واکنش بلادرنگ را در فرآیندهای خود پیاده کنید.
در این مقاله، ۱۵ تابع پرکاربرد بیزاجی را مرور میکنیم – با مثال عملی و کدنویسی واقعی. تفاوت حیاتی بین Me و CHelper را یاد میگیرید و میبینید چطور بدون صدها خط کد، فرآیندهای هوشمند و بدون خطا بسازید.
اگر مدلساز فرآیند هستید یا قصد دارید فرآیندهای مالی، لجستیک و تجاری خود را در بیزاجی حرفهای کنید، این مقاله برای شماست.
چرا بدون توابع، مدلسازی فرآیند در بیزاجی ناقص است؟

بیزاجی بدون توابع فقط جمع و میانگین بلد است. اما دنیای واقعی پر از «اگر… آنگاه…»، محاسبات بینمرحلهای و واکنشهای چندثانیهای است.
در ادامه ۵ مشکل واقعی که در پروژههای بیزاجی بارها دیده شده را مرور میکنیم – و دقیقاً نشان میدهیم کدام تابع، کدام مشکل را حل میکند.
- مشکل: اخطار جریمه دیرکرد در گمرک
سناریو: شرکت بازرگانی محمولهای وارد کرده است. تاریخ ورود کالا به گمرک ۲۰ روز پس از تاریخ صدور بارنامه (BL) است، اما سیستم هیچ هشداری نمیدهد.
راهحل با تابع: مقایسه دو تاریخ از دو مرحله متفاوت
تابع مورد نیاز: CHelper (چون داده از دو مرحله میآید)
کد نمونه:
if(WarehouseEntryDate > BlDate.AddDays(15))
{
CHelper.ThrowValidationAlert(“جریمه انبارداری تعلق گرفته است”);
}

2-مشکل: تأخیر در اخطار کاهش ارزش سهام
سناریو: قیمت سهام در بورس ناگهان ۱۰٪ افت میکند. ارزش پرتفوی مشتری به زیر حد مجاز میرسد. سیستم باید ظرف چند ثانیه اخطار «مارجین کال» صادر کند، اما الان نیم ساعت تأخیر دارد.
راهحل با تابع: واکنش بلادرنگ بدون دخالت انسان
تابع مورد نیاز: توابع زیل CHelper که مستقل از مرحله جاری اجرا میشوند.
نکته کلیدی : Me فقط در همان مرحله کار میکند، اما CHelper همیشه بیدار است.
3-مشکل: تغییر یک فرمول، ده جا خطا میدهد
سناریو: فرمول محاسبه حقوق گمرکی تغییر کرده است. شما این فرمول را در ۱۰ جای مدل کپی کردهاید. حالا باید همه را دستی پیدا کنید و اصلاح کنید – حتماً یکی را فراموش خواهید کرد.
راهحل با تابع: یک بار بنویس، صد بار استفاده کن
تابع مورد نیاز: توابع سفارشی (Custom Functions)
کد نمونه:
csharp
// فقط یک بار بنویسید:
public double CalculateCustomDuty(double goodsValue)
{
return goodsValue * 0.32; // ۳۲ درصد حقوق گمرکی
}
// بعد در ۱۰ جای مدل صدا بزنید:
Me.TotalDuty = CalculateCustomDuty(Me.GoodsValue);

4-مشکل: مدیر نمیداند چرا اخطار صادر شده
سناریو: مشتری شکایت کرده که اخطار اشتباه دریافت کرده است. مدیر اجرایی میپرسد «سیستم بر چه مبنایی این اخطار را داده؟» – شما هیچ مدرک یا لاگی ندارید.
راهحل با تابع: شفافیت کامل و قابلیت ردیابی
تابع مورد نیاز: CHelper.trace() برای ثبت لاگ
کد نمونه:
CHelper.trace(“ViolationCheck”, “شرکت ” + companyName + ” دارای پرونده تخلف است”);
// بعداً میتوانید در گزارشها ببینید دقیقاً چه کسی، چه زمانی و چرا اخطار گرفته است
سیستمی که منطقش شفاف نباشد، در بحران فرو میریزد.
5-مشکل: از صفر نوشتن تقویم کاری زمانبر و پرخطاست
سناریو: میخواهید اختلاف روز بین تاریخ ثبت سفارش و تاریخ تحویل را فقط با احتساب روزهای کاری (به جز جمعهها و تعطیلات رسمی) محاسبه کنید. نوشتن این منطق از صفر حداقل ۵۰ خط کد میبرد.
راهحل با تابع: استفاده از توابع آماده و تستشده
تابع مورد نیاز: CHelper.getEffectiveDuration()
کد نمونه:
var workingDays = CHelper.getEffectiveDuration(Me, orderDate, deliveryDate);
// بیزاجی خودش تعطیلات و آخر هفته را از تقویم سازمان کم میکند

توابع بیزاجی هزاران ساعت تست پشت سر دارند. از صفر ننویسید، استفاده کنید.

دو موتور محرک بیزاجی: Me و CHelper
قبل از اینکه سراغ توابع عملی برویم، باید با دو مفهوم بنیادین آشنا شوید. فرق Me و CHelper را با یک تشبیه ساده به خاطر بسپارید:
Me مانند کارمند همان میز است – فقط از وضعیت کاری خودش خبر دارد و فقط به همان مرحله دسترسی دارد.
CHelper مانند مدیر دفتر است – به همه پروندهها، همه مراحل و کل سازمان دسترسی دارد و میتواند بین آنها ارتباط برقرار کند.
جدول مقایسه سریع دو موتور محرک بیزاجی در توابع
| ویژگی | Me | CHelper |
| محدوده دسترسی | فقط همان مرحله جاری | کل فرآیند و تمام مراحل |
| نوع محاسبات | ساده و لحظهای | پیچیده، بینمرحلهای، تاریخی |
| کی به کار میآید؟ | وقتی نیاز به تاریخ شروع تسک، مدت زمان، یا وضعیت فعلی دارید | وقتی میخواهید دو مرحله را مقایسه کنید یا به دادههای کیس دیگر دسترسی داشته باشید |
| مثال واقعی | Me.EntryDate
تاریخ ورود به این مرحله |
CHelper.getEstimatedDate()
محاسبه ضرب الاجل با تقویم کاری |
| سرعت اجرا | بسیار سریع | سریع (با تأخیر محاسباتی قابلقبول) |
مثال واقعی: چرا اینجا باید از تابع CHelper در بیزاجی استفاده کنیم؟
سناریو: در مثال گمرک که گفتیم – «اگر تاریخ ورود به گمرک بیش از ۱۵ روز از تاریخ بارنامه گذشته باشد»
چالش: این دو تاریخ WarehouseEntryDate و BlDate به دو مرحله متفاوت از فرآیند تعلق دارند. مرحله اول «صدور بارنامه» است، مرحله دوم «ورود به گمرک».
چرا Me جواب نمیدهد؟
Me فقط به دادههای همین مرحله جاری دسترسی دارد. وقتی قانون در مرحله «ورود به گمرک» اجرا میشود، Me به تاریخ بارنامه (که در مرحله قبل ثبت شده) دسترسی ندارد.
راهحل با CHelper:
csharp
// این درست است – CHelper به هر دو مرحله دسترسی دارد
var blDate = CHelper.getAttrib(“Shipment”, Me.ShipmentId, “BLDate”);
var entryDate = Me.EntryDate; // یا CHelper.getAttrib مشابه
if(entryDate > blDate.AddDays(15))
{
CHelper.ThrowValidationAlert(“جریمه انبارداری تعلق گرفت”);
}

توابع پرکاربرد Me در bizagi (دسترسی به دادههای مرحله جاری)
تمام توابع زیر فقط به همین مرحله (تسک یا رویداد) دسترسی دارند. اگر به دادههای مراحل دیگر نیاز دارید، باید سراغ CHelper بروید. ( پیشنهاد میشود تا آموزش بیزاجی را در eBPM مشاهده کنید )
دسته اول: اطلاعات کیس (Case)
| تابع | خروجی | کد نمونه |
| Me.Case.Id | شناسه یکتای فنی کیس در دیتابیس | var caseId = Me.Case.Id; |
| Me.Case.CaseNumber | شماره مورد قابل مشاهده برای کاربر (شماره پرونده) | ShowMessage(“پرونده شماره ” + Me.Case.CaseNumber); |
| Me.Case.Creator | نام کاربری (User ID) کسی که کیس را شروع کرده | var startedBy = Me.Case.Creator; |
نکته مهم فرق Case.Id و CaseNumber:
اگر در زیرفرآیند هستید، Me.Case.Id به زیرفرآیند اشاره دارد ولی Me.Case.CaseNumber همچنان شماره فرآیند والد را نشان میدهد.
دسته دوم: اطلاعات تسک (Task)
| تابع | خروجی | کد نمونه |
| Me.Task.Name | نام فنی تسک (همان نامی که در دیتابیس ذخیره شده) | var techName = Me.Task.Name; |
| Me.Task.DisplayName | نام نمایشی تسک (همان چیزی که کاربر روی صفحه میبیند) | ShowMessage(“مرحله جاری:” + Me.Task.DisplayName); |
| Me.Task.EstimatedDurationDate | مدت زمان پیشبینی شده تسک (دقیقه) | if(Me.Task.EstimatedDurationDate > 60) Alert(“تسک طولانی”); |
دسته سوم: زمان و ضربالاجل (Duration & Deadline)
| تابع | کاربرد | کد نمونه |
| Me.Duration | تنظیم مدت زمان پویا برای تسک یا تایمر | Me.Duration = 120; // ۲ ساعت |
| Me.EntryDate | خواندن تاریخ ورود به این مرحله | var start = Me.EntryDate; |
| Me.EstimatedSolutionDate | تنظیم تاریخ سررسید ثابت | Me.EstimatedSolutionDate = DateTime.Now.AddDays(3); |
دسته چهارم: وضعیت تسک (Task Status)
| تابع | خروجی | کد نمونه |
| Me.CanRelease | آیا تسک قابل انتشار و ارسال به مرحله بعد است؟ (true/false) | if(!Me.CanRelease) CHelper.ThrowValidationError(“اطلاعات کامل نیست”); |
مثال واقعی: مدت زمان پویا بر اساس نوع سفر
سناریو: شرکت مسافرتی فرآیند «رزرو بلیط» را طراحی کرده است. اگر مسافر به مقصد بینالمللی سفر کند، فرآیند رزرو ۳ روز زمان میبرد. اگر داخلی باشد، ۱ روز کافی است.
چالش: مدت زمان تسک نباید ثابت باشد. باید بر اساس نوع سفر، پویا تنظیم شود.
راهحل با Me.Duration و Me.EstimatedSolutionDate :
csharp
// این قانون را در رویداد On Enter تسک بنویسید
if(<TravelRequest.Destination.Type> == “International”)
{
Me.Duration = 3; // ۳ روز
Me.EstimatedSolutionDate = DateTime.Now.AddDays(5); // سررسید ۵ روز بعد
}
else
{
Me.Duration = 1; // ۱ روز
Me.EstimatedSolutionDate = DateTime.Now.AddDays(2);
}

// ثبت لاگ برای شفافیت
CHelper.trace(“DurationSet”, “مدت زمان تسک تنظیم شد: ” + Me.Duration + ” روز”);
نکته مهم: تنظیم Me.Duration و Me.EstimatedSolutionDate حتماً باید در رویداد On Enter انجام شود. اگر در جای دیگر بنویسید، تأثیر ندارد.
جدول خلاصه توابع Me (برای مرور سریع)
| دسته | توابع | کاربرد اصلی |
| کیس (Case) | Id, CaseNumber, Creator | شناسایی پرونده و شروعکننده |
| تسک (Task) | Name, DisplayName, EstimatedDurationDate | خواندن اطلاعات مرحله جاری |
| زمان (Time) | Duration, EntryDate, EstimatedSolutionDate | تنظیم و خواندن زمان و ضربالجل |
| وضعیت (Status) | CanRelease | بررسی امکان ارسال به مرحله بعد |
توابع پرکاربرد CHelper (دسترسی به کل فرآیند و فراتر)
برخلاف Me، توابع CHelper به کل فرآیند، کیسهای دیگر، دیتابیس سازمان و حتی تقویم کاری دسترسی دارند.
در اینجا چندین تابع کاربردی را بر اساس سناریوی واقعی دستهبندی کردهایم:
دسته اول: ارتباط بین کیسها (مدیریت پروندههای دیگر)
وقتی در یک فرآیند هستید، اما نیاز دارید به اطلاعات کیس دیگر دسترسی پیدا کنید.
| تابع | کاربرد | کد نمونه |
| CHelper.getCaseById(id) | دریافت اطلاعات یک کیس دیگر با شناسه آن | var otherCase = CHelper.getCaseById(12345); |
| CHelper.NewCase() | ایجاد یک کیس جدید از داخل فرآیند جاری | CHelper.NewCase(“ProcessName”, startData); |
| CHelper.abortProcess() | خاتمه دادن به کیس جاری یا کیس دیگر | CHelper.abortProcess(Me.Case.Id, “تأیید نشد”); |
مثال واقعی: بررسی سابقه تخلف ارزی قبل از تخصیص ارز
سناریو:
یک شرکت واردکننده (مثلاً واردکننده پلیاتیلن از آلمان) از بانک خود درخواست خرید ارز (یورو) برای پرداخت به صادرکننده خارجی میکند.
اما طبق قانون بانک مرکزی: «شرکت واردکننده فقط در صورتی میتواند ارز دریافت کند که هیچ پرونده باز تخلف ارزی در سوابق نداشته باشد.»
چالش:
بانک قبلاً چندین پرونده ارزی برای این شرکت ثبت کرده است. سیستم باید قبل از تخصیص ارز جدید، تمام پروندههای قبلی را بررسی کند و ببیند آیا هیچکدام در وضعیت «تخلف» (Violation) هستند یا خیر.
راهحل با (CHelper.getCaseById):
csharp
// مرحله 1: دریافت لیست شناسه پروندههای قبلی این شرکت
var caseIds = getCompanyActiveCases(Me.CompanyID);
var hasViolation = false;
var violatingCaseNumber = “”;
// مرحله 2: بررسی هر پرونده به صورت جداگانه
for(var i = 0; i < caseIds.Count; i++)
{
// دسترسی به اطلاعات پرونده دیگر با استفاده از getCaseById
var targetCase = CHelper.getCaseById(caseIds[i]);
// مرحله 3: بررسی وضعیت تخلف
if(targetCase.ProcessState == “Violation”)
{
hasViolation = true;
violatingCaseNumber = targetCase.CaseNumber;
CHelper.trace(“ViolationCheck”, “شرکت ” + Me.CompanyName +
” دارای پرونده تخلف به شماره ” + violatingCaseNumber);
break; // نیازی به بررسی بقیه نیست، همین یکی کافی است
}
}
// مرحله 4: تصمیمگیری نهایی
if(hasViolation)
{
Me.AllocationStatus = “Rejected”;
Me.RejectionReason = “وجود پرونده تخلف ارزی باز به شماره ” + violatingCaseNumber;
CHelper.ThrowValidationError(Me.RejectionReason);
}
else
{
Me.AllocationStatus = “Approved”;
CHelper.trace(“Allocation”, “تخصیص ارز برای شرکت ” + Me.CompanyName + ” تأیید شد”);
}

نکته کلیدی مثال:
تابع (CHelper.getCaseById) به شما اجازه میدهد از داخل یک فرآیند جاری، به اطلاعات کیسهای دیگر (حتی کیسهای قدیمی) دسترسی پیدا کنید. این کار با Me غیرممکن است، چون Me فقط به کیس جاری دسترسی دارد.
دسته دوم: خواندن و نوشتن در دیتابیس (Entity Management)
دسترسی مستقیم به جدولهای دیتابیس بیزاجی بدون نیاز به رابط کاربری.
| تابع | کاربرد | کد نمونه |
| CHelper.getAttrib(entity, id, column) | خواندن مقدار یک فیلد از یک رکورد | var price = CHelper.getAttrib(“Product”, 101, “UnitPrice”); |
| CHelper.setAttrib(entity, id, column, value) | نوشتن مقدار در یک فیلد | CHelper.setAttrib(“Order”, 500, “Status”, “Approved”); |
دسته سوم: دریافت کاربران سازمانی
یافتن کاربران بر اساس نقش، موقعیت یا مهارت – بدون نیاز به کدنویسی دستی.
| تابع | کاربرد | کد نمونه |
| CHelper.getUsersForRole(roleName) | تمام کاربران دارای یک نقش خاص | var managers = CHelper.getUsersForRole(“Manager”); |
| CHelper.getUsersForPosition(positionName) | کاربران با یک موقعیت سازمانی خاص | var financeTeam = CHelper.getUsersForPosition(“Finance Officer”); |
| CHelper.getUsersForSkill(skillName) | کاربران دارای یک مهارت خاص | var germanSpeakers = CHelper.getUsersForSkill(“German Language”); |
دسته چهارم: محاسبات زمان کاری (تقویم سازمان)
محاسبه ضربالاجل با در نظر گرفتن تعطیلات و آخر هفته.
| تابع | کاربرد | کد نمونه |
| CHelper.getEstimatedDate(startDate, minutes, calendar) | تاریخ پایان با احتساب تقویم کاری | var deadline = CHelper.getEstimatedDate(DateTime.Now, 480, “StandardCalendar”); |
| CHelper.getEffectiveDuration(startDate, endDate, calendar) | مدت زمان واقعی (ساعت کاری) بین دو تاریخ | var workingDays = CHelper.getEffectiveDuration(start, end, “IRCalendar”); |
| CHelper.IsWorkingDay(date, calendar) | آیا این روز کاری است؟ | if(!CHelper.IsWorkingDay(today, “Standard”)) Alert(“تعطیل است”); |
مثال واقعی: محاسبه ضربالاجل تحویل با احتساب تعطیلات
سناریو:
شرکت لجستیک متعهد میشود سفارش را ظرف ۵ روز کاری (بدون احتساب جمعهها و تعطیلات رسمی) تحویل دهد. امروز چهارشنبه است و فردا تعطیل رسمی دارد.
چالش:
اگر ساده جمع بزنید، ۵ روز بعد = دوشنبه. اما با احتساب تعطیلی فردا و جمعه، تاریخ واقعی تحویل کی میشود؟
راهحل با (CHelper.getEstimatedDate):
csharp
// تاریخ شروع: امروز
var startDate = DateTime.Now;
// مدت زمان: ۵ روز کاری × ۸ ساعت = ۴۰ ساعت کاری
var processingMinutes = 2400; // 40 * 60
// محاسبه تاریخ پایان با تقویم سازمان (که تعطیلات در آن ثبت شده)
var deadline = CHelper.getEstimatedDate(Me, startDate, processingMinutes);
// تنظیم در سیستم
Me.EstimatedSolutionDate = deadline;
// نمایش به کاربر
ShowMessage(“تاریخ تحویل: ” + deadline.ToShortDateString());

// اگر چهارشنبه باشد و فردا تعطیل، تاریخ تحویل میشود سهشنبه هفته بعد
دسته پنجم: تولید شمارههای دنبالهدار (Sequence)
برای فاکتور، شماره پرونده، کد پیگیری و …
| تابع | کاربرد | کد نمونه |
| CHelper.GetNextSeqValueStr(sequenceName) | دریافت مقدار بعدی یک دنباله به صورت متن | var invoiceNo = CHelper.GetNextSeqValueStr(“InvoiceSeq”); |
| CHelper.ResetSequenceValue(sequenceName, value) | بازنشانی دنباله به مقدار مشخص | CHelper.ResetSequenceValue(“InvoiceSeq”, 1000); |
مثال واقعی: تولید خودکار شماره فاکتور
سناریو:
سیستم باید به هر فاکتور یک شماره یکتا اختصاص دهد. این شماره باید ترتیبی باشد و از ۱۰۰۰ شروع شود.
چالش:
اگر دو کاربر همزمان فاکتور ثبت کنند، شمارهها تداخل پیدا نکند و تکراری نباشد.
راهحل با (CHelper.GetNextSeqValueStr):
csharp
// دریافت شماره بعدی (بیزاجی خودش قفل گذاری میکند)
var newInvoiceNumber = CHelper.GetNextSeqValueStr(“InvoiceSequence”);
// اختصاص به فاکتور جاری
Me.InvoiceNumber = “INV-” + newInvoiceNumber;
// مثال خروجی: INV-1001, INV-1002, …

دسته ششم: اعتبارسنجی و اخطار (Validation & Alerts)
جلوگیری از ادامه فرآیند در صورت خطا یا نمایش هشدار به کاربر.
| تابع | کاربرد | کد نمونه |
| CHelper.ThrowValidationError(message) | خطای قرمز – ادامه فرآیند متوقف میشود | CHelper.ThrowValidationError(“کد ملی نامعتبر است”); |
| CHelper.ThrowValidationAlert(message) | هشدار زرد – کاربر میتواند ادامه دهد | CHelper.ThrowValidationAlert(“تاریخ انقضا نزدیک است”); |
| CHelper.IsEmpty(value) و CHelper.IsNull(value) | بررسی خالی یا نال بودن مقدار | if(CHelper.IsEmpty(Me.Description)) Alert(“توضیح الزامی است”); |
دسته هفتم: مدیریت تسکهای کاربران (User Work Items)
برای دریافت لیست تسکهایی که به یک کاربر خاص ارجاع داده شده است – مناسب برای داشبوردهای مدیریتی، گزارشگیری و بررسی بار کاری.
| تابع | کاربرد | توضیحات پارامترها |
| CHelper.GetAssignedWorkItems(workItem, caseId, userId, includeSubProcesses) | دریافت تمام تسکهای ارجاع داده شده به کاربر | پارامتر اول:Me (ثابت) پارامتر دوم: شناسه کیس مورد نظر پارامتر سوم: شناسه کاربر پارامتر چهارم: آیا زیرفرآیندها هم شامل شوند؟ (true/false) |
کد نمونه:
csharp
// دریافت تمام تسکهای کاربر جاری در کیس فعلی و زیرفرآیندهای آنvar userTasks = CHelper.GetAssignedWorkItems(Me, Me.Case.Id, Me.CurrentUserId, true); // نمایش تعداد تسکهای در انتظار کاربرShowMessage(“شما ” + userTasks.Count + ” تسک در انتظار دارید”); // بررسی آیا کاربر تسک خاصی را انجام داده است؟foreach(var task in userTasks){ if(task.Status == “Completed”) { CHelper.trace(“UserActivity”, “کاربر تسک ” + task.Name + ” را انجام داده است”); }}

مثال واقعی: بررسی تسکهای انجامشده توسط کاربر قبل از تأیید نهایی
سناریو:
در یک فرآیند تأیید مدارک بانکی، قبل از اینکه مدیر شعبه تأیید نهایی را انجام دهد، باید مطمئن شود که کاربر «کارشناس اعتبارسنجی» حداقل ۳ تسک در این پرونده انجام داده است.
چالش:
نیاز به دسترسی به تاریخچه تسکهای انجامشده توسط یک کاربر خاص در همان کیس داریم.
راهحل با CHelper.GetAssignedWorkItems():
csharp
// مرحله 1: دریافت تمام تسکهای کاربر “کارشناس اعتبارسنجی” در این کیسvar expertTasks = CHelper.GetAssignedWorkItems( Me, // شیء ICAPIWorkItem جاری Me.Case.Id, // کیس جاری expertUserId, // شناسه کاربر کارشناس false // فقط همین کیس، نه زیرفرآیندها); // مرحله 2: شمارش تسکهای تکمیل شدهvar completedCount = 0;foreach(var task in expertTasks){ if(task.Status == “Completed”) { completedCount++; }} // مرحله 3: تصمیمگیری برای تأیید نهاییif(completedCount < 3){ CHelper.ThrowValidationError(“کارشناس اعتبارسنجی حداقل ۳ تسک را تکمیل نکرده است”);}else{ Me.FinalApproval = “Approved”; CHelper.trace(“FinalApproval”, “شرط تسکهای کارشناس تأیید شد”);}

جدول خلاصه توابع CHelper در بیزاجی (۱۰ تابع پرکاربرد)
| دسته | تابع | یک خط کاربرد |
| ارتباط بین کیسها | getCaseById | دسترسی به پرونده دیگر |
| دیتابیس | getAttrib / setAttrib | خواندن/نوشتن مستقیم در جدولها |
| کاربران | getUsersForRole | یافتن کاربران با نقش خاص |
| زمان کاری | getEstimatedDate | محاسبه ضربالاجل با تقویم کاری |
| دنباله | GetNextSeqValueStr | تولید شماره فاکتور خودکار |
| اخطار | ThrowValidationError | توقف فرآیند با خطا |
| اعتبارسنجی | IsEmpty / IsNull | چک کردن خالی بودن فیلدها |
| مدیریت تسک های کاربران | GetAssignedWorkItems | دریافت لیست تسکهای ارجاع شده به کاربر |
خلاصه نهایی یک نگاه به کل مقاله توابع پرکاربرد در بیزاجی
در این مقاله، با توابع پرکاربرد بیزاجی آشنا شدید. دیدید که چطور توابع، بیزاجی را از یک موتور ساده جمعومیانگین به یک پلتفرم هوشمند برای اتوماسیون فرآیندهای پیچیده تبدیل میکنند.
قانون های اصلی را می توانید به شکل زیر به یاد داشته باشید:
- داده از یک مرحله ← از Me استفاده کنید
- داده از چند مرحله یا کیس دیگر ← از CHelper استفاده کنید
- ترکیب هر دو ← در یک قانون، هم Me و هم CHelper را صدا بزنید
جدول نهایی مقایسه Me و CHelper (نسخه کامل)
| جنبه مقایسه | شیء Me | شیء CHelper |
| محدوده دسترسی | فقط همان تسک/مرحله جاری | کل فرآیند، کیسهای دیگر، Entityها، سازمان |
| نوع محاسبات | ساده و لحظهای | پیچیده، بینمرحلهای، تاریخی |
| آگاهی از بستر (Context) | آگاه از بستر (Context-Aware) | مستقل از بستر (Context-Free) |
| مناسب برای | خواندن تاریخ/وضعیت تسک جاری، تنظیم مدت زمان | محاسبه اختلاف دو مرحله، دسترسی به کیس دیگر، تولید شماره دنبالهدار |
| مثال تابع | Me.EntryDate, Me.Duration, Me.Case.CaseNumber | CHelper.getCaseById(), CHelper.getEstimatedDate(), CHelper.GetNextSeqValueStr() |
| امکان ایجاد کیس جدید | خیر | بله (CHelper.NewCase()) |
| امکان دسترسی به Entityها | خیر | بله (CHelper.getAttrib()) |
| امکان اعتبارسنجی داده | محدود | کامل (CHelper.ThrowValidationError()) |
| سرعت اجرا | بسیار سریع | سریع (با تأخیر محاسباتی قابلقبول) |
تجربه پیشگامان در استفاده از توابع بیزاجی
شرکت پیشگامان با بهرهگیری حرفهای از توابع Me و CHelper در بیزاجی، فرآیندهای پویا و هوشمندی نظیر محاسبه خودکار ضربالاجلها، تولید شمارههای دنبالهدار و مدیریت دسترسی مبتنی بر نقش را در پروژههای متعدد پیادهسازی کرده است. تجربه عملی پیشگامان در این حوزه، مرجعی ارزشمند برای توسعهدهندگان بیزاجی در ایران محسوب میشود.
برای آشنایی با نمونه پروژههای پیادهسازی شده و دریافت مشاوره رایگان، با ما تماس بگیرید.
آیا در پروژه بیزاجی خود به مشکل خوردهاید؟
پیادهسازی توابع پیچیده در بیزاجی نیاز به تجربه و دانش فنی دارد. تیم فنی پیشگامان با سالها تجربه عملی در پروژههای مالی، لجستیک و بورسی، آماده ارائه مشاوره و پیادهسازی است.