وحدات عامة. استخدام الوحدات ذات القيمة المرجعة يعيد استخدام سياقات مختلفة ووحدات مشتركة

توفر المقالة نظرة عامة مختصرة وميزات لوظائف مثل إعادة استخدام قيم الإرجاع للوحدات النمطية الشائعة.

مشاكل عند العمل مع 1C

في كثير من الأحيان، عند العمل مع برنامج 1C، تحتاج إلى الحصول على القيم المخزنة في قاعدة البيانات، فهي لم تتغير لسنوات. ومن الأمثلة على ذلك قيمة الثوابت. يمكن أن تتضمن مجموعة القيم هذه بشكل مشروط البحث عن أحد عناصر الدليل أو البحث عن عقدة خطة التبادل باستخدام الكود، بالإضافة إلى الحاجة إلى الحصول على قيمة تفاصيل الكائن.

يمكن حل مثل هذه المشكلات بسرعة وسهولة باستخدام النوع التالي من الإنشاءات:

إذا DocumentDate > Constants.StartDateApplicationRegulation1137.Get() ثم

ولكن في كل مرة يتم تنفيذ هذا الكود، يتم الوصول إلى قاعدة البيانات.

يستخدم العديد من المبرمجين الطريقة التالية لإلغاء تحميل قاعدة البيانات. يقومون بتنفيذ طلب واحد فقط إلى قاعدة البيانات وتخزين البيانات التي قد يحتاجون إليها. ومع ذلك، لا يؤدي هذا الأسلوب إلى إلغاء تحميل قواعد البيانات إلى المستوى المطلوب. قد تكون أسباب ذلك ما يلي:

· ليست دورة تنفيذ التعليمات البرمجية واضحة تمامًا (على سبيل المثال، عند نقل المستندات في مجموعات)؛

· الحصول على مجموعة صارمة من البيانات غير المطلوبة في الوقت الحالي يكون في بعض الأحيان مستحيلاً أو يصعب تحقيقه؛

· استخدام البيانات المخزنة مؤقتًا بالفعل في أشكال/مكالمات مختلفة.

وحدة إعادة استخدام القيمة المرتجعة

سيساعد استخدام النماذج التي تعيد استخدام قيم الإرجاع في حل المشكلات الموضحة أعلاه. ما هو؟ هذه وحدة عميل أو خادم شائعة يجب فيها تعيين وظيفة "مدة المكالمة" أو "مدة الجلسة" على إعادة استخدام قيم الإرجاع. تم وصف كافة العمليات والوظائف مباشرة في الوحدة كما كان من قبل.

الميزة التي لا شك فيها لهذه الطريقة هي إرجاع القيمة المخزنة مؤقتًا دون تنفيذ رمز الوظيفة فعليًا. يحدث هذا لجميع الاستدعاءات اللاحقة لوظائف التصدير لهذه الوحدات بعد الاستدعاء الأول. ويمكن ملاحظة نفس التأثير عند قياس الإنتاجية.

عند تنفيذ التعليمات البرمجية، يتم تخزين القيم التي تم إرجاعها مؤقتًا من خلال قيم المعلمات التي تم تمريرها. بهذه الطريقة يحدث ذلك مباشرة عند تنفيذ الكود

Node1 = OurModule.GetExchangeNodeWithAccounting("0001");

Node2 = OurModule.GetExchangeNodeWithAccounting("0002");

تقوم كلا الاستدعاءات بتنفيذ العملية المقابلة وإرجاع مراجع مختلفة. ومع ذلك، في الاستدعاءات اللاحقة، سيتم إرجاع العقد ذات الرمز 0001 أو 0002 دون التسبب في تكرار العملية، وبالتالي دون الوصول إلى قاعدة البيانات.

سيتم تخزين القيم مؤقتًا بشكل منفصل لكل جلسة على كل من العميل والخادم (وهذا يعتمد على الوحدة التي تم إجراء المكالمة منها - العميل أو الخادم). سيعمل كل شيء بشكل لا تشوبه شائبة إذا كانت هناك أي خصوصيات في إعدادات حقوق الوصول أو أي تبعية أخرى للقيمة المستلمة.

عدة ولكن

كما هو الحال مع أي قاعدة، هناك استثناءات لهذه الطريقة. يجب ألا تحدد أنواعًا معقدة في معلمات الدالة، فالأنواع البسيطة مثل التاريخ والرقم وغير المحدد وما إلى ذلك تكفي. يجب ألا تحاول تحديد، على سبيل المثال، بنية أو كائن أو جدول قيم كمعلمات. سوف تحصل على نتائج في المرة الأولى، ولكن في المرة الثانية لن يأتي أي شيء ذي معنى.

يمكن أن تكون قيمة الإرجاع من أي نوع.

بالإضافة إلى ذلك، لا تنس الانتباه إلى حجم البيانات التي تقوم بتخزينها مؤقتًا، نظرًا لأن ذاكرة الخادم، على الرغم من ضخامة حجمها، ليست غير محدودة.

ميزة أو خطأ من 1C

القيم التي يتم إعادة استخدامها لها ميزة مثيرة للاهتمام. يمكننا أن نفترض أن هذه ميزة أو خطأ، ولكن على أي حال فإن الأمر يستحق الاهتمام به.

عند إدخال الكود التالي:

ValueStructure1 = OurModule.GetStructureofAttributesValues(ObjectReference);
ValueStructure1.Name = "اسم جديد";
ValueStructure2 = OurModule.GetStructureofAttributesValues(ObjectReference);

في ValueStructure2.Name بالضبط سيظهر الاسم الجديد. يمكن استخدام ذلك لتحديث القيم التي تم تغييرها بالفعل في قاعدة البيانات، لكن من غير المعروف المدة التي يمكن خلالها القيام بذلك. لأنه عند إنشاء حلول قياسية، لا يمكنك القيام بذلك.

إذا تغيرت البيانات المخزنة مؤقتا

إذا تم تغيير القيم المخزنة مؤقتًا في قاعدة البيانات، فهناك طريقة واحدة فقط لاستخدامها - طريقة UpdateReusedValues. في هذه الحالة، تتم إعادة ضبط إعدادات جميع الوظائف في جميع الوحدات. لا يمكن التحديث بناءً على قيم معلمات أو وظائف أو وحدات محددة.

كيف يتم تنفيذ الاستعلام في حلقة

إذا كنت لا تريد استخدام دالة تعيد استخدام القيم المرجعة، فإليك بعض الأساليب الأكثر إبداعًا لحل المشكلة.

· الإجراءات العالمية التي تعيد تفاصيل الروابط العشوائية.

· إنشاء إجراءات تقوم بإرجاع القيم الثابتة بأسمائها. بالمناسبة، هذه الإجراءات متوفرة في الإصدارات القياسية.

· إرجاع حجم أكبر قليلاً مما هو مطلوب لتقليل عدد المكالمات. على سبيل المثال، إذا كنت تريد الحصول على أسعار لعدة عملات في نفس الوقت، فمن المستحسن استدعاء الوظيفة حسب التاريخ فقط دون تحديد العملات. بعد تلقي جميع الأسعار، حدد العملة المطلوبة الآن وأيها ليست كذلك.

· إنشاء إجراء لتنفيذ الطلب مع تخزين النتيجة الناتجة مؤقتًا في نفس الوقت (معلمات الإدخال - نص الطلب، والعديد من الأسماء وقيم المعلمات).

أود أن أخبركم المزيد عن طريقة أخرى. تعتمد هذه الطريقة على استخدام دالة تحتوي على استدعاء قاعدة بيانات، وإعادة استخدام قيمة الإرجاع مباشرة في حلقة، أي نوع من الاستعلام في حلقة. في بعض الحالات، يمكن لهذا التصميم تحسين الأداء. يجب استيفاء الشرط التالي: يجب أن يكون عدد القيم المختلفة لمعلمات الإدخال التي تمت مواجهتها في الدورة صغيرًا، وقد تم بالفعل الحصول على معظم المجموعات مرة واحدة على الأقل في وقت سابق من هذه الجلسة. يجب أن نتذكر أنه من الصعب للغاية الحصول على مجموعة محددة من مجموعات جميع قيم معلمات الإدخال مسبقًا، وقد تؤدي محاولات الحصول على قيم لجميع المجموعات الممكنة إلى قراءة الكثير من البيانات من قاعدة البيانات.

لقد قدمنا ​​لك نماذج من الوظائف والأساليب فقط. لذلك، قبل استخدامها، قم بتقييم الظروف التي سيعمل فيها الكود الخاص بك.


وحدات 1C العامة- كائن بيانات تعريف التكوين لـ 1C 8.3 و8.2، الذي يخزن رمز البرنامج الذي يتم استدعاؤه غالبًا في التكوين. يمكن استدعاء الوظيفة/الإجراء من أي مكان في التكوين (إذا كان تصديرًا).

كيفية استخدام الوحدة المشتركة

من الممارسات الجيدة وضع إجراء أو وظيفة في وحدة نمطية مشتركة إذا تم استدعاؤها في أكثر من مكان واحد. أولاً، إذا تم تصحيح الإجراء، فيجب تصحيحه في مكان واحد فقط. ثانيًا، يحقق هذا ترتيبًا أكبر في الكود.

من الأمثلة النموذجية للوحدة العامة معالجة الترحيل إلى بعض السجلات، والحصول على مقدار الفرق في أيام العمل، وإعادة حساب أسعار الصرف، وإعادة حساب الكمية/السعر/المبلغ في القسم الجدولي وغيرها من الوظائف.

خصائص الوحدات المشتركة

إحدى الميزات الرئيسية للوحدات المشتركة من الوحدات الأخرى هي أنه لا يمكنك الإعلان عن المتغيرات المشتركة.

احصل على 267 درس فيديو على 1C مجانًا:

دعونا نلقي نظرة فاحصة على لوحة خصائص الوحدة العامة:

  • عالمي- إذا تم تعيين العلامة، تصبح الوظائف والإجراءات من هذه الوحدة متاحة في السياق العالمي. أولئك. يمكن استدعاؤها في أي مكان في التكوين عن طريق الوصول بدون اسم الوحدة المشتركة. ومع ذلك، تمت إضافة شرط - يجب أن تكون أسماء الإجراءات والوظائف في هذه الوحدة المشتركة فريدة ضمن السياق العام.
  • الخادم- يمكن تنفيذ إجراءات ووظائف هذه الوحدة المشتركة على الخادم.
  • الانضمام الخارجي- يمكن تنفيذ أكواد البرنامج الخاصة بهذه الوحدة الشائعة عند الاتصال بمصدر خارجي (على سبيل المثال، COM).
  • العميل (التطبيق المُدار)- يمكن استخدام إجراءات ووظائف هذه الوحدة الشائعة في عميل كثيف في وضع التطبيق المُدار.
  • العميل (التطبيق العادي)- يمكن استخدام أكواد البرنامج الخاصة بهذه الوحدة الشائعة في عميل سميك في وضع التطبيق العادي.
  • مكالمة الخادم- علامة تسمح للعميل باستخدام الإجراءات والوظائف من هذه الوحدة المشتركة.
  • - إذا تم التعيين على True، فسيتم تعطيل التحقق من حقوق الوصول في هذه الوحدة المشتركة.
  • إعادة استخدام- يحدد إعدادات قيم الإرجاع؛ إذا تم تمكين الخيار، فبعد التنفيذ الأول، سيتذكر النظام قيمة معلمات الإدخال هذه وسيعيد قيمة جاهزة. يمكن أن تأخذ القيم التالية: غير مستعمل- اغلق، طوال مدة المكالمة- لمدة إجراء معين، طوال مدة الجلسة- حتى يقوم المستخدم بإغلاق الجلسة (البرنامج).

إذا كنت بدأت في تعلم برمجة 1C، فإننا نوصي بدورتنا المجانية (لا تنس

طباعة (Ctrl+P)

تهدف الكائنات الموجودة في فرع الوحدات العامة في شجرة التكوين إلى احتواء نصوص الوظائف والإجراءات التي يمكن استدعاؤها من أي وحدة تكوين أخرى.
انتباه! يمكن أن تحتوي الوحدة العامة فقط على تعريفات الإجراء والوظيفة.
تعد إجراءات ووظائف الوحدة النمطية المشتركة التي تم تحديد الكلمة الأساسية "تصدير" لها في رؤوسها أحد مكونات السياق العام. يمكن العثور على مزيد من المعلومات حول إجراءات الكتابة في وحدة عامة في قسم "تنسيق النصوص المصدر لوحدات البرنامج" وقسم "المشغلين" في تعليمات اللغة المضمنة.
لتحرير وحدة نمطية شائعة، في لوحة خصائص كائن من النوع Common Modules في نافذة التكوين، في خاصية الوحدة النمطية، انقر فوق الارتباط فتح. سيتم إصدار نص الوحدة العامة للتحرير في محرر النصوص لنظام 1C:Enterprise في وضع تحرير النص لوحدة البرنامج.
الوحدة المشتركة، كونها جزءًا من التكوين، يتم حفظها فقط كجزء من التكوين.
تحدد الخاصية العالمية ما إذا كانت الأساليب المصدرة للوحدة النمطية العامة جزءًا من السياق العام.
إذا تم تعيين الخاصية العامة على True، فستتوفر الأساليب المصدرة للوحدة المشتركة كطرق للسياق العام.
إذا تم تعيين الخاصية العامة على False، فسيتم إنشاء خاصية في السياق العام باسم يطابق اسم الوحدة النمطية الشائعة في بيانات التعريف. هذه الخاصيه للقراؤه فقط. قيمة هذه الخاصية هي كائن GeneralModule. تتوفر الطرق المصدرة لهذه الوحدة الشائعة من خلال هذا الكائن. وبالتالي، فإن الوصول إلى أساليب الوحدات المشتركة غير العامة يبدو مثل XXXXXX.YYYYY، حيث XXXXX هو اسم الخاصية المقابلة لسياق الوحدة المشتركة، وYYYYY هو اسم الطريقة المصدرة للوحدة المشتركة.
مثال:

العمل مع معدات البيع بالتجزئة.ConnectBarcode Scanner();

سياق مختلف ووحدات مشتركة

باستخدام خصائص الوحدات الشائعة وتعليمات المعالج المسبق، يمكنك تنظيم تنفيذ طرق مختلفة للوحدات النمطية الشائعة في السياق المطلوب.
كل خاصية للوحدة المشتركة مسؤولة عن القدرة على تجميع (وتنفيذ) الوحدة المشتركة في سياق معين.
تتوفر الخصائص التالية، وهي المسؤولة عن السياق الذي تتوفر فيه أساليب الوحدة العامة:
العميل (التطبيق العادي)- ستكون أساليب الوحدة المشتركة متاحة للعميل الكثيف في وضع التطبيق العادي؛
● – ستكون طرق الوحدة العامة متاحة للعميل الرقيق وعميل الويب وكذلك للعميل السميك
وضع التطبيق المُدار؛
● الخادم - ستكون أساليب الوحدة المشتركة متاحة على الخادم؛
الانضمام الخارجي- طرق الوحدة المشتركة ستكون متاحة في الاتصال الخارجي.
إذا تم تعيين عدة خصائص في نفس الوقت، فهذا يعني أن أساليب الوحدة المشتركة ستكون متاحة في عدة سياقات.
إذا كانت الوحدة النمطية المشتركة تحتوي على خاصية الخادم وأي مجموعة خصائص أخرى، فهذا يعني أن الوحدة النمطية المشتركة ستكون متاحة في نفس الوقت على الخادم وفي العميل المحدد. من الضروري أن نفهم أنه في الواقع سيكون هذا عدة إصدارات من الكود المترجم (حسب عدد العملاء المحددين والخادم نفسه).
علاوة على ذلك، إذا تم استدعاء طريقة موجودة في هذه الوحدة الشائعة من جانب العميل، فسيتم استخدام نسخة العميل من الوحدة المشتركة، وإذا كانت من الخادم، فسيتم استخدام نسخة الخادم. في هذه الحالة، باستخدام توجيهات المعالج المسبق (انظر هنا لمزيد من التفاصيل)، يمكنك "حماية" الخادم من التعليمات البرمجية التي لا يمكن تنفيذها عليه.
لنلقي نظرة على مثال. في الوحدة المشتركة (التي يمكن تنفيذها على العميل الرقيق وعلى الخادم) توجد طريقة لها سلوك مختلف قليلاً على جانب العميل الرقيق وعلى جانب الخادم. دعونا نرى كيف يمكن القيام بذلك:



#إذا كان ThinClient إذن
// إظهار التحذير
إظهار تنبيه المستخدم("على العميل")؛
#إنهاء إذا
نهاية الإجراء
ثم سيبدو الكود على جانب الخادم كما يلي:
إجراء طريقة CommonModule()يصدّر
// يتم وضع العديد من التعليمات البرمجية المهمة هنا
نهاية الإجراء
وعلى جانب العميل الرقيق، سيبدو الرمز كما يلي:
الإجراء CommonModule طريقة () التصدير
// يتم وضع العديد من التعليمات البرمجية المهمة هنا
// إظهار التحذير
ShowUserAlert("عند العميل");
نهاية الإجراء

هناك عدة طرق لنقل التحكم من العميل إلى الخادم:
● استدعاء طريقة الوحدة المشتركة للخادم.
● في نموذج أو وحدة نمطية للأوامر، قم باستدعاء الأسلوب الذي تسبقه توجيهات الترجمة &OnServer، &OnServerبدون سياق

في الوقت نفسه، من المستحيل استدعاء أساليب الوحدات النمطية الشائعة للعميل (التي لا تحتوي على مجموعة خصائص الخادم) وأساليب العميل لوحدة النموذج أو وحدة الأوامر من إجراءات الخادم. سيعود التحكم إلى العميل بعد اكتمال استدعاء أسلوب الخادم الخارجي.
الاستثناء هو أساليب وحدة النموذج ووحدة الأوامر، والتي تسبقها توجيهات الترجمة &OnClientOnServer, &OnClientOnServerبدون سياق
وينبغي أيضا ذكر النقاط التالية:
● إذا كانت الوحدة النمطية المشتركة متاحة لأكثر من عميل واحد، فعند كتابة تعليمات برمجية للبرنامج، يجب عليك مراعاة الحد الأقصى للقيود التي قد يفرضها العملاء، أو استخدام تعليمات المعالج المسبق "لعزل" التعليمات البرمجية الخاصة بالعميل.
● تكون تعليمات المعالج المسبق منطقية أيضًا عندما تحتوي إحدى الوحدات النمطية الشائعة على عدة سياقات تنفيذ، على سبيل المثال، اتصال خارجي وعميل رفيع، أو (وهو الأكثر شيوعًا) بعض العملاء والخادم. في هذه الحالة، ستقوم تعليمات المعالج المسبق بتأطير التعليمات البرمجية التفاعلية التي لا يمكن استخدامها على الخادم، ولكن يمكن استخدامها على العميل (انظر المثال أعلاه).
لمزيد من المعلومات حول تعليمات المعالج المسبق وتوجيهات التجميع، راجع قسم "تنفيذ الإجراءات والوظائف" في تعليمات اللغة المضمنة.
تهدف خاصية Call Server إلى التحكم في القدرة على استدعاء الأساليب المصدرة للوحدة النمطية المشتركة للخادم من رمز العميل.
إذا تم تعيين الخاصية، فستكون الطرق المصدرة للوحدة النمطية المشتركة للخادم متاحة للاتصال من العميل. إذا لم يتم تعيين الخاصية، فيمكن استدعاء هذه الأساليب المصدرة فقط من الأساليب من جانب الخادم (كل من أساليب الوحدات النمطية المشتركة من جانب الخادم وأساليب جانب الخادم من وحدات النماذج ووحدات الأوامر).
نصيحة . يوصى بتعيين خاصية استدعاء الخادم على False في الحالات التي تحتوي فيها الوحدة النمطية المشتركة للخادم على أساليب لا تريد الاتصال بها من العميل (على سبيل المثال، لأسباب أمنية).
ملحوظة. إذا تم تعيين الخصائص في نفس الوقت العميل (التطبيق العادي), العميل (التطبيق المُدار), الانضمام الخارجي، ثم تتم إعادة تعيين خاصية خادم الاتصال تلقائيًا. إذا تم تعيين خاصية خادم الاتصال، فسيتم إعادة تعيين الخصائص تلقائيًا العميل (التطبيق العادي), العميل (التطبيق المُدار)و الانضمام الخارجي، إذا تم تعيين هذه الخصائص في نفس الوقت.
ملكية ذو امتيازيهدف إلى تعطيل التحكم في حقوق الوصول عند تنفيذ أساليب وحدة مشتركة.
ملحوظة. إذا كان العقار ذو امتيازالمثبتة، ثم يتم تعيين خاصية الخادم تلقائيًا للوحدة النمطية المشتركة ويتم إعادة تعيين الخصائص المتبقية ( العميل (التطبيق العادي), العميل (التطبيق المُدار)وب اتصال خارجي). لا يمكن تنفيذ الوحدة المشتركة المميزة إلا على الخادم.

إعادة استخدام قيم الإرجاع

إذا لم تكن الوحدة المشتركة عمومية، فستصبح خاصية إعادة استخدام قيم الإرجاع متاحة. يمكن لهذه الخاصية أن تأخذ القيم التالية:
● لا تستخدم - لا توجد إعادة استخدام لقيم الإرجاع للوظائف في هذه الوحدة المشتركة.
● لكل مكالمة ولكل جلسة - تستخدم الوحدة المشتركة طريقة لتحديد إعادة استخدام البيانات. جوهر هذه الطريقة هو أنه أثناء تنفيذ التعليمات البرمجية، يتذكر النظام المعلمات ونتائج الوظائف بعد الاستدعاء الأول للوظيفة. عندما يتم استدعاء دالة مرة أخرى بنفس المعلمات، يتم إرجاع القيمة المخزنة (من الاستدعاء الأول) دون تنفيذ الوظيفة نفسها. إذا قامت دالة بتغيير قيم المعلمات أثناء تنفيذها، فلن يؤدي استدعاء الوظيفة مرة أخرى إلى القيام بذلك.
يمكن تسليط الضوء على الميزات التالية لحفظ نتائج المكالمات:
● إذا تم تنفيذ وظيفة على الخادم واستدعائها من رمز الخادم، فسيتم تذكر قيم المعلمات ونتيجة المكالمة للجلسة الحالية على جانب الخادم؛
● إذا تم تنفيذ الوظيفة على عميل سميك أو رفيع، فسيتم تذكر قيم المعلمات ونتائج المكالمة من جانب العميل؛
● إذا تم تنفيذ وظيفة ما على جانب الخادم واستدعائها من رمز العميل، فسيتم تذكر قيم معلمات الاتصال على جانب العميل وعلى جانب الخادم (للجلسة الحالية).
يتم حذف القيم المحفوظة:
● إذا تم ضبط الخاصية على مدة المكالمة:
● على جانب الخادم - عند إرجاع التحكم من الخادم؛
● من جانب العميل - عندما ينتهي إجراء أو وظيفة لغة مدمجة ذات مستوى أعلى (يستدعيها النظام من الواجهة، وليس من إجراء أو وظيفة لغة مدمجة أخرى)؛
● إذا تم تعيين خاصية الوحدة النمطية المشتركة على طوال مدة الجلسة:
● على جانب الخادم – في نهاية الجلسة؛
● من جانب العميل – عند إغلاق تطبيق العميل.
سيتم حذف القيم المحفوظة:
● على الخادم، وفي العميل الكثيف، وفي الاتصال الخارجي، وفي العميل الرقيق، وفي عميل الويب بسرعة اتصال عادية - 20 دقيقة بعد حساب القيمة المخزنة أو 6 دقائق بعد آخر استخدام؛
● في عميل رفيع وعميل ويب بسرعة اتصال منخفضة - بعد 20 دقيقة من حساب القيمة المحفوظة؛
● إذا كان هناك نقص في ذاكرة الوصول العشوائي (RAM) في عملية عمل الخادم؛
● عند إعادة تشغيل سير العمل؛
● عندما يتحول العميل إلى سير عمل آخر.
بعد إزالة القيم، يتم إجراء استدعاء الوظيفة المصدرة كما في الاستدعاء الأول.
لا تؤثر خاصية الوحدات الشائعة هذه على تنفيذ الإجراءات - يتم تنفيذ الإجراءات دائمًا.

إذا تم تعيين وحدة شائعة لإعادة استخدام قيم الإرجاع، فسيتم فرض عدد من القيود على أنواع المعلمات التي يتم تصديرها بواسطة الوظيفة. يمكن أن تكون أنواع المعلمات فقط:
● الأنواع البدائية ( غير محدد، NULL، منطقي، رقم، سلسلة، تاريخ).
● أية إشارات إلى كائنات قاعدة البيانات.
● الهياكل ذات قيم الخصائص للأنواع المذكورة أعلاه. في هذه الحالة، يتم التحكم في هوية المعلمات "بمحتويات" الهياكل.
إذا قامت الدالة المصدرة بإرجاع كائن، فإنها تقوم في الواقع بإرجاع مرجع إلى الكائن المخزن في ذاكرة التخزين المؤقت. إذا تغيرت حالة الكائن بعد تلقي هذا المرجع، فإن الاستدعاء اللاحق لنفس الوظيفة سيعيد مرجعًا إلى الكائن الذي تم تعديله بالفعل دون تنفيذ الوظيفة فعليًا. سيستمر هذا السلوك حتى يتم حذف القيمة المخزنة (لأي سبب). بمعنى آخر، تغيير حالة الكائن الناتج عن استدعاء دالة من وحدة نمطية مشتركة مع إعادة استخدام قيم الإرجاع ليس أساسًا لاستدعاء الوظيفة الفعلي. يجب أن تتذكر أيضًا أن ذاكرة التخزين المؤقت للكائنات التي تم إرجاعها لا تهتم بها
حالة الوضع المميز في وقت استدعاء الوظيفة، مع إعادة استخدام قيم الإرجاع. يمكن أن تؤدي هذه الميزة إلى السلوك التالي:
● تم التنفيذ الفعلي لاستدعاء الوظيفة مع إعادة استخدام قيم الإرجاع (الاستدعاء الأول) مع تمكين الوضع المميز.
● عند تنفيذ إحدى الوظائف، تم استلام كائن لا يمكن استلامه مع تعطيل الوضع المميز.
● تم إجراء الاستدعاءات اللاحقة للوظيفة دون تعيين الوضع المميز.
● ومع ذلك، حتى يتم مسح ذاكرة التخزين المؤقت لكائن الإرجاع أو إجراء الاستدعاء الفعلي مرة أخرى، ستقوم الوظيفة بإرجاع كائن لا يمكن الوصول إليه رسميًا.
● السلوك العكسي صحيح أيضًا، عند إجراء المكالمة الأولى دون تعيين الوضع المميز، وفي الوضع المميز لا يتم إرجاع الكائن الذي كان من الممكن استلامه في الوضع المميز.

إذا كانت الوحدة النمطية المشتركة لها الخاصية إعادة استخدام قيم الإرجاعتم ضبطه على مدة الجلسة، فلا يمكن استخدام قيم النوع في القيم التي يتم إرجاعها بواسطة وظائف هذه الوحدة مدير الجدول الزمني.
إذا تم استدعاء دالة وحدة مشتركة، مع مجموعة إمكانية إعادة الاستخدام، من داخل نفس الوحدة النمطية المشتركة (على سبيل المثال، تسمى GeneralModule)، فيجب مراعاة التحذير التالي: إذا تم استدعاء الوظيفة بالاسم MyFunction() ، سيتم تنفيذ الوظيفة في كل مرة يتم فيها استدعاء الوظيفة. لكي يتم استخدام القيم المخزنة، يجب استدعاء الدالة باسمها الكامل:
GeneralModule.MyFunction().
يقوم أسلوب السياق العام بإزالة كافة القيم المعاد استخدامها، سواء من جانب الخادم أو جانب العميل، بغض النظر عن مكان استدعاء الأسلوب. بعد تنفيذ الطريقة UpdateReusedValues()سيتم تنفيذ استدعاء الوظيفة الأول بالكامل.

في كثير من الأحيان، أثناء تنفيذ البرنامج، يتعين علينا الحصول على القيم المخزنة في قاعدة البيانات ولا تتغير لسنوات. وخير مثال على ذلك هو قيم الثوابت. يمكننا جزئيًا تضمين البحث عن عنصر الدليل أو عقدة خطة التبادل عن طريق الكود، والحصول على قيم تفاصيل الكائن حسب المرجع.

بدون تفكير، يتم حل مثل هذه المشكلات "بسرعة" من خلال إنشاءات مثل:

إذا DocumentDate > Constants.StartDateApplicationRegulation1137.Get() ثم

ونتيجة لذلك، في كل مرة يتم فيها تنفيذ هذا الرمز، تحدث "هزات" في قاعدة البيانات.

يقوم المبرمجون الأكثر دقة بشأن التعليمات البرمجية الخاصة بهم بإجراء استعلام واحد إلى قاعدة البيانات، وتخزين جميع البيانات التي يحتاجون إليها، ولكن هذا الأسلوب لا يؤدي دائمًا إلى التفريغ المطلوب لقاعدة البيانات:

  1. قد تكون دورة تنفيذ التعليمات البرمجية ضمنية (على سبيل المثال، إعادة نشر دفعة من المستندات)
  2. إن الحصول على مجموعة دقيقة من البيانات (لا أكثر ولا أقل) التي ستكون هناك حاجة إليها لاحقًا يكون أمرًا صعبًا أو حتى مستحيلًا في بعض الأحيان.
  3. يجب استخدام القيم المخزنة مؤقتًا في مكالمات/نماذج مختلفة

وحدة إعادة استخدام القيمة المرتجعة

لحل المشكلات الموضحة، يحتوي النظام الأساسي على وحدات نمطية تعيد استخدام قيم الإرجاع. في الواقع، هذه وحدة مشتركة عادية (العميل أو الخادم) مع إعادة استخدام قيمة الإرجاع مضبوطة على "مدة المكالمة" أو "مدة الجلسة". في الوحدة نفسها، يتم وصف الإجراءات والوظائف كالمعتاد.

بيت القصيد هو أنه مع الاستدعاءات المتعددة لوظائف التصدير لهذه الوحدات - يتم إجراء الاستدعاء لأول مرة فعليًا كما نتوقع، وتؤدي جميع الاستدعاءات اللاحقة إلى إرجاع قيمة مخزنة مؤقتًا دون تنفيذ رمز الوظيفة فعليًا. ويمكن ملاحظة هذا التأثير في قياسات الأداء.

يتم تخزين قيم الإرجاع مؤقتًا بشكل طبيعي في سياق قيم المعلمات التي تم تمريرها، أي. عند تنفيذ التعليمات البرمجية

Node1 = OurModule.GetExchangeNodeWithAccounting("0001"); Node2 = OurModule.GetExchangeNodeWithAccounting("0002");

ستقوم كلا الاستدعاءات بالفعل بتنفيذ الإجراء المقابل وإرجاع مراجع مختلفة، والمحاولات اللاحقة للحصول على عقدة بالرمز 0001 أو 0002 ستعيد العقد المقابلة دون استدعاء الإجراء، ونتيجة لذلك، قاعدة البيانات.

يتم تخزين القيم مؤقتًا بشكل منفصل لكل جلسة على العميل أو الخادم (اعتمادًا على ما إذا كانت الوحدة عميلاً أم خادمًا). أولئك. إذا كانت هناك ميزات في تحديد حقوق الوصول أو الاعتماد الآخر للقيمة المستلمة على المستخدم الحالي، فسيعمل كل شيء بشكل صحيح.

ما الذي عليك عدم فعله

هناك قيد واحد. يمكن تحديد الأنواع البسيطة فقط كمعلمات دالة. غير محدد، فارغ، منطقي، تاريخ، سلسلة، رقم، رابط. لا توجد هياكل أو جداول قيم أو كائنات وما إلى ذلك. إذا حاولت تمرير البنية، على سبيل المثال، كمعلمة، فسيعمل كل شيء، ولكن يمكنك نسيان إعادة استخدام القيمة المستلمة.

يمكن أن تكون قيمة الإرجاع من أي نوع.

يجب عليك أيضًا الانتباه إلى حجم البيانات التي تقوم بتخزينها مؤقتًا. من غير المرجح أن تستخدم كل ذاكرة الخادم، ولكن من الجدير بالذكر أن الموارد ليست لانهائية.

علة أو ميزة من 1C

القيم المعاد استخدامها لها خاصية مثيرة للاهتمام. ليس من الواضح ما إذا كان هذا خطأ أم ميزة، ولكن لا يضر معرفة ذلك. إذا قمت بتشغيل الكود التالي:

ValueStructure1 = OurModule.GetStructureofAttributesValues(ObjectReference); ValueStructure1.Name = "اسم جديد"; ValueStructure2 = OurModule.GetStructureofAttributesValues(ObjectReference);

ثم في ValueStructure2.Name سيكون هناك "اسم جديد" بالضبط. من حيث المبدأ، يمكن استخدام هذا لتحديث القيم التي تم تغييرها بالفعل في قاعدة البيانات، ولكن من غير الواضح متى وما إذا كان سيتم إغلاق المتجر أم لا. عند تطوير الحلول القياسية، هذا محظور.

ماذا تفعل عندما تتغير البيانات المخزنة مؤقتًا

توجد طريقة "مشروعة" واحدة فقط للتعامل مع حالة تغيير قيمة مخزنة مؤقتًا في قاعدة البيانات. هذه هي طريقة UpdateReusedValues(). سيتم إعادة تعيين قيم جميع الوظائف لجميع المعلمات لجميع الوحدات. لا يمكنك التحديث بناءً على قيم/وظائف/وحدات معلمات محددة.

وفقا لذلك، بسبب هذا النهج التطوعي، من الضروري استخدام هذه الوظيفة بحذر شديد: النظام بأكمله بعد استخدامه سيعمل بشكل أبطأ بشكل ملحوظ لبعض الوقت.

نحن نتعدى على المقدس: نكتب طلبًا في حلقة

بالإضافة إلى الخيارات الواضحة لاستخدام الدوال مع إعادة استخدام القيم المرجعة، هناك العديد من الأساليب المثيرة للاهتمام والعالمية وغير القياسية، بما في ذلك:

  • كتابة الإجراءات العالمية التي تُرجع تفاصيل الروابط العشوائية (متوفرة في BSP)
  • إجراءات الكتابة التي تُرجع قيمًا ثابتة باسم ثابت (متوفر في معظم المعايير)
  • إرجاع كمية بيانات "أكبر قليلاً" من اللازم لتقليل عدد المكالمات (على سبيل المثال، إذا كنت بحاجة إلى الحصول على أسعار لعدة عملات في وقت واحد، فمن المنطقي استدعاء الوظيفة حسب التاريخ دون تحديد عملة، احصل على أسعار جميع العملات ثم "اكتشف على الفور" أي من العملات مطلوبة الآن)
  • كتابة إجراء ينفذ طلبًا مع التخزين المؤقت للنتيجة (ستكون معلمات الإدخال هي نص الطلب واثنين من أسماء المعلمات وقيمها)

ولكن هناك نهج آخر أريد أن أتناوله بالتفصيل. يتم ذلك باستخدام دالة تحتوي على استدعاء قاعدة بيانات وإعادة استخدام قيمة الإرجاع في حلقة. أولئك. إنه في الواقع طلب في حلقة. بشكل عام، تعلمنا ألا نفعل ذلك، ولكن هناك أوقات يؤدي فيها إنشاء التعليمات البرمجية بهذه الطريقة إلى أداء أفضل إذا:

  1. عدد القيم المختلفة لمعلمات الإدخال التي ستحدث داخل الحلقة صغير وتم الحصول على الغالبية العظمى من المجموعات ذات درجة الاحتمال العالية في وقت سابق من هذه الجلسة.
  2. من الصعب الحصول مسبقًا على مجموعة صارمة من مجموعات قيم معلمات الإدخال التي ستتم مواجهتها في الحلقة، كما أن الحصول على قيم لجميع المجموعات الممكنة من قيم معلمات الإدخال سيؤدي إلى قراءة كمية كبيرة من البيانات من قاعدة البيانات

كما ترون، فإن الصياغة ليست دقيقة وتبدو أشبه بكلمات فراق أكثر من كونها قواعد. لذلك، ضع السياق دائمًا في الاعتبار، وقم بتقييم الصورة الحالية، وفكر في الظروف التي سيعمل بموجبها الكود الخاص بك.

2023 asm59.ru
الحمل والولادة. البيت و العائلة. الترفيه والتسلية