تخصیص کنترل کننده رویداد با استفاده از اشتراک رویداد. همه اشتراک‌های رویداد اشتراک در رویداد 1s 8.3 پردازش می‌شود

هنگامی که کاربر هر اقدامی را انجام می دهد، پلت فرم 1C رویدادهای برنامه را تولید می کند. به عنوان یک قاعده، نه یک رویداد، بلکه یک زنجیره کامل از رویدادها ایجاد می شود. وظیفه برنامه نویس قرار دادن صحیح است کد برنامهدر رویدادها برای دستیابی به رفتار مورد انتظار از برنامه. با این حال، به دلایل ذکر شده در زیر، انجام این کار برای یک برنامه نویس تازه کار 1C آسان نخواهد بود.

رویدادها را می توان به شکل کنترل شده تولید کرد: در ReadingOnServer، OnCreatingOnServer، OnOpening و غیره.

رویدادها در یک فرم کنترل شده بر روی مشتری و روی سرور ایجاد می شوند: BeforeRecord، BeforeRecordOnServer.

رویدادها در ماژول های مختلف فراخوانی می شوند: ElementForm، ObjectModule، ManagerModule.

برخی از رویدادها را می توان چندین بار فراخوانی کرد اگر چندین عنصر دایرکتوری در لیست وجود داشته باشد، به عنوان مثال: ProcessingGetView.

یک فرم مدیریت شده را می توان در نتیجه اقدامات مختلف کاربر باز کرد و زنجیره تماس های رویداد متفاوت خواهد بود. هر یک از اقدامات کاربر زیر با دایرکتوری یک فرم مدیریت شده را باز می کند: ایجاد یک عنصر جدید، کپی کردن یک عنصر، تغییر یک عنصر دایرکتوری موجود.

رویدادها همچنین توسط عناصر فرم ایجاد می شوند: هنگام افزودن یک ردیف به قسمت جدولی، هنگام ویرایش یک ردیف در قسمت جدولی، هنگام فعال کردن یک ردیف یا فیلد، هنگام انتخاب یک مورد جستجو در قسمت ورودی و غیره.

برای درک بهتر منطق و توالی رویدادهای آغاز شده، می توانید از توسعه "مطالعه رویدادها" پیوست شده به این مقاله استفاده کنید. با دانستن زمینه تماس رویداد، توالی رویدادها و اقداماتی که کاربر انجام خواهد داد، درک بهتری از مدیریت رویداد برای قرار دادن کد برنامه شما در کدام کنترلر رویداد آسانتر خواهد بود.

دستورالعمل استفاده از برنامه Event Study

برنامه Event Study رویدادهایی را نشان می دهد که پلت فرم 1C در طی اقدامات تعاملی کاربر ایجاد می کند. اصل کار به شرح زیر است: کاربر دایرکتوری را باز می کند، برنامه زنجیره رویدادها را نشان می دهد. کاربر یک آیتم دایرکتوری را برای حذف علامت گذاری می کند و برنامه توالی رویدادهایی را که رخ می دهد نمایش می دهد. رویدادها به طور پیش فرض با کمی تأخیر 3 ثانیه نمایش داده می شوند، این برای جداسازی یک زنجیره از رویدادها از زنجیره رویدادهای دیگر ضروری است. بنابراین، باید اقدامات تعاملی را "آهسته" انجام دهید.

همه رویدادها در یک پنجره ویژه "آخرین رویدادها" نمایش داده می شوند. در اینجا می توانید ضبط رویداد را فعال یا غیرفعال کنید. به طور پیش فرض، ضبط رویداد در اولین باز شدن فعال است. من به شما توصیه می کنم برای مشاهده راحت رویدادها، بلافاصله هنگام شروع برنامه، پنجره "آخرین رویدادها" را به پایین صفحه پین ​​کنید.

خود برنامه نمی تواند تعیین کند که چه اقدامی باعث زنجیره رویدادها شده است اقدامات اخیربرای مثال، «فرم فهرست دایرکتوری باز است»، «یک عنصر در فهرست دایرکتوری برای حذف علامت گذاری شده است» و غیره. این کار تجزیه و تحلیل اقدامات و رویدادها را آسان تر می کند.

رویدادها برای اشیایی که در بخش «ردیابی رویداد» قرار گرفته اند ثبت و نمایش داده می شوند، مشروط بر اینکه ضبط رویداد در فرم «رویدادهای اخیر» فعال باشد.

تمام رویدادهای ضبط شده را می توان از طریق "گزارش رویداد" که در بخش "سرویس" قرار دارد مشاهده کرد.

برای پاک کردن سریع تمام اقدامات و رویدادهای ضبط شده، در بخش "سرویس"، "پاک کردن رویدادها و اقدامات" را انتخاب کنید.

در طول توسعه یا اصلاح راه حل های کاربردیدر پلتفرم 1C:Enterprise 8.x اغلب انجام برخی موارد ضروری است اقدام استانداردبرای گروهی از اشیاء پیکربندی (به عنوان مثال، دایرکتوری ها). به منظور توصیف نکردن اقدامات انجام شده در ماژول هر شی، توسعه دهنده می تواند از مکانیزم پلت فرم استاندارد - اشتراک رویداد استفاده کند.

اشتراک‌های رویداد به شما امکان می‌دهند رویدادهای اشیاء پیکربندی، مانند فهرست‌ها، اسناد، پلان‌های نوع مشخصه و موارد دیگر را رهگیری کنید. امروز در مقاله موضوع دنباله اجرای کنترل کننده های اشتراک رویداد را در نظر خواهیم گرفت و همچنین رفتار پلتفرم را با چندین اشتراک رویداد برای یک اقدام (به عنوان مثال هنگام ضبط) تجزیه و تحلیل خواهیم کرد.

رفتار استاندارد

اجازه دهید مثال ما از یک دایرکتوری خاص "SimpleDirectory" استفاده کند. دارای اشتراک رویدادهایی است که برای هر رویداد ایجاد شده است که توسعه دهنده می تواند در آن دخالت کند. رویه های کنترل کننده رویداد در ماژول مشترک سرور مربوطه قرار دارند.

ترتیب تماس با کنترل کننده های اشتراک مانند رفتار استاندارد پلت فرم هنگام کار با این شی است. از آنجایی که در مثال ما در حال بررسی کار با یک دایرکتوری هستیم، پیشنهاد می‌کنم طرح فراخوانی کنترل‌کننده‌ها را بسته به عملکرد یک شی در نظر بگیریم (به تصویر بعدی نگاه کنید).

همانطور که می بینیم، در مرحله اولیه، کنترل کننده رویداد "ProcessingFill" (برای ایجاد یک عنصر جدید) یا "در کپی کردن" (برای ایجاد یک عنصر بر اساس عنصر موجود) فراخوانی می شود. در هر دو مورد، پس از فراخوانی گرداننده‌های نام‌گذاری شده، رویه OnInstallNewCode اجرا می‌شود، جایی که توسعه‌دهنده می‌تواند پیشوندی را در کد تنظیم کند یا رفتار پلتفرم را هنگام تخصیص کد جدید لغو کند.

هنگام ضبط یک عنصر دایرکتوری، آیا عنصر جدیدیا موجود، سه کنترل کننده نامیده می شوند: "ProcessingFillCheck" (در این مرحله کنترل کننده می تواند صحت داده های وارد شده را بررسی کند و در صورت وجود خطا از نوشتن خودداری کند)، "BeforeWrite" (تا زمانی که شی در پایگاه داده نوشته شود، می توانید مقادیر جزئیات را تنظیم کنید و بررسی کنید کدام - شرایط اضافی) و سپس "OnRecord" (یک رکورد در پایگاه داده ایجاد شده است، اما تراکنش بسته نشده است، توسعه دهنده می تواند داده ها را پس از ثبت بررسی کند و در صورت لزوم، معامله را لغو کنید).

رویداد "BeforeDelete" تنها در صورتی رخ می دهد که یک شی به طور مستقیم از پایگاه اطلاعاتی حذف شود. به طور معمول، هیچ کاربری اجازه حذف مستقیم بدون بررسی یکپارچگی ارجاع را ندارد. حذف همیشه باید با استفاده از پردازش "حذف اشیاء علامت گذاری شده" انجام شود. در مورد دوم، کنترل کننده "BeforeDelete" نیز فراخوانی می شود.

بنابراین، اگر یک آیتم دایرکتوری ایجاد کنیم و آن را در پایگاه اطلاعاتی بنویسیم، پلتفرم کنترل‌کننده‌های رویداد زیر را به ترتیب مشخص شده فراخوانی می‌کند:

در مورد سایر اشیاء پیکربندی، عملکرد مکانیسم اشتراک رویداد مشابه خواهد بود، فقط رویدادها و ترتیب آنها ممکن است متفاوت باشد. برای جزئیات بیشتر به راهنمای نحو مراجعه کنید.

طرف بدون سند

حال بیایید به یک موقعیت جالب توجه کنیم. بیایید بگوییم که برای دایرکتوری ما "SimpleDirectory" سه اشتراک در رویداد "BeforeRecord" تعریف شده است:

فکر می‌کنید به چه ترتیبی گردانندگان این اشتراک‌ها فراخوانی می‌شوند؟ حدس نزنیم من نتیجه ضبط عنصری را ارائه می دهم که در آن کنترل کننده برای هر اشتراک پیامی با نام اشتراک فراخوانده شده را نمایش می دهد (به تصویر زیر مراجعه کنید).

از روی تصویر، حدس زدن اینکه ترتیب فراخوانی رویه‌های کنترل کننده اشتراک رویداد با ترتیب اشیاء فراداده در شاخه «اشتراک‌های رویداد» مطابقت دارد، دشوار نیست. این ویژگی در هیچ منبع مرجعی در پلتفرم 1C:Enterprise توضیح داده نشده است، بنابراین هنگام استفاده از آن در پیکربندی باید مراقب باشید، زیرا ویژگی‌های غیر مستند ممکن است از نسخه‌ای به نسخه 1C: Enterprise تغییر کند و در عین حال در آن وجود نداشته باشد. لیست تغییرات برنامه

عقب نشینی

ممکن است بپرسید: "چرا چندین اشتراک برای یک رویداد شی پیکربندی ایجاد کنیم؟" پاسخ ساده است. اگر چندین نفر در توسعه شرکت داشته باشند، تداخل در مکانیسم های ایجاد شده یکدیگر می تواند منجر به عملکرد نادرست برنامه شود. در چنین مواردی، منطقی ترین کار ایجاد اشتراک رویدادهای جداگانه برای هر توسعه دهنده مطابق با وظیفه در دست است. البته این امکان وجود دارد که در آینده آنها را در یک رویه مدیریت واحد ترکیب کنند.

هنگام کار با پایگاه اطلاع رسانی 1C اغلب نیاز به پیوند وجود دارد الگوریتم جدیدبه یک رویداد مرتبط با تغییر در یک شی. در نسخه 7 برنامه، برای راه اندازی هندلر نیاز به بازنویسی بود کد منبعبرنامه ای که منجر به بروز مشکل در هنگام به روز رسانی پیکربندی شد.

پس از تجزیه و تحلیل بازخورد کاربران، هشت توسعه‌دهنده یک شی جدید به نام «اشتراک رویداد» را پیاده‌سازی کردند. در این مقاله سعی خواهیم کرد تا آشکار کنیم:

  • راه اندازی اشتراک ها؛
  • خلقت؛
  • ویژگی های عملکرد.

یک اشتراک جدید ایجاد کنید

مانند هر شیء فراداده دیگری، اشتراک یک رویداد در 1C از پیکربندی اضافه می شود.

این عناصر در شاخه درخت "عمومی" قرار دارند (شکل 1).

برای اضافه کردن یک کنترل کننده جدید باید:


شکل 3

برای جلوگیری از مشکلات به‌روزرسانی، بهتر است برای پیشرفت‌های خود ماژول مشترک خود را ایجاد کنید که فقط شامل رویه‌ها و عملکردهای شما باشد.

ویژگی های عملکرد اشتراک ها

یکی از سؤالات اصلی که برای کاربرانی که شروع به کار با شی «اشتراک رویداد» می کنند، مطرح می شود، سؤال از ترتیب فراخوانی رویه ها است. اغلب این همان جایی است که خطاها به دلیل این واقعیت است که این روش کار نمی کند یا فقط هر چند وقت یکبار کار می کند.

با استفاده از مثال رویه AtWrite() برای هر سند، می توانید ترتیب فراخوانی کنترل کننده ها را مشاهده کنید.

بنابراین، اگر در ماژول شیء سند، این رویه وجود داشته باشد و به موازات آن پردازشی از اشتراک فراخوانی شود و همان رویداد را پردازش کند، ابتدا ماژول سند پردازش می شود. اگر در حین اجرای AtRecord() در ماژول سند، پارامتر Rejection به دلایلی مقدار True را بگیرد، اشتراک تضمین می شود که کار نمی کند.

در مواردی که چندین شیء اشتراک وجود دارد که برای یک منبع و یک رویداد یکسان هستند، ردیابی ترتیب اجرا بسیار دشوار است. و اگر در حین اجرای حداقل یک کنترل کننده یک استثنا مطرح شود، برخی از رویه ها اجرا نشده باقی می مانند.

بنابراین، توالی پردازش را می توان به صورت زیر مشخص کرد:

  1. رویدادهای ماژول شی پردازش می شوند.
  2. اشتراک های مرتبط با نوع داده فعلی پردازش می شوند.
  3. کد محدود شده به نوع عمومی در حال پردازش است.

بسیار مهم است که به یاد داشته باشید که در هیچ موردی نباید کدی را وارد کنید که داده های شی منبع را در رویه های اجرا شده در حین ضبط تغییر دهد. بهتر است از چنین کدهایی در رویه های BeforeWrite استفاده شود.

کنترل کننده رویداد باز فرم

افزایش محبوبیت فرم های کنترل شده، مورد استفاده در نسخه 8 برنامه، و همچنین مشکلات مربوط به به روز رسانی این اشیاء در حین ذخیره تغییرات خود، به این واقعیت منجر شد که با شروع پلت فرم 8.2.15، رویداد FormReceivingProcessing در برنامه ظاهر شد. اینجاست که می توانید کدی را وارد کنید که فرم های استاندارد را تغییر داده و جایگزین کند.

برخی از ویژگی های این هندلر:

  • اگر فرم استانداردی که باید باز شود در پیکربندی دقیق مشخص شده باشد، رویداد فعال نخواهد شد.
  • رویداد فقط برای فرم های مدیریت شده قابل اجرا است.
  • ماژول عمومی حاوی این کنترلر نه تنها باید ویژگی "Server" را داشته باشد، بلکه باید دارای یک چک باکس در قسمت "Call Server" باشد.

توجه به این نکته مهم است که این اشتراک نه برای یک شی خاص، بلکه برای مدیر آن فراخوانی می شود، یعنی فیلد منبع باید حاوی این کلمه باشد (شکل 4).

شکل 4

به طور خلاصه، می خواهم بگویم که "اشتراک رویداد" یک ابزار بسیار مفید و ضروری برای توسعه دهنده است که به توسعه دهنده اجازه می دهد بدون دخالت عمده در پیکربندی به اهداف و اهداف خود دست یابد.