• دفتر المبرمج. باستخدام التوجيه "المسموح به" 1C، حدد المسموح به

    21.06.2023

    20.09.2014

    يوجد توجيه "مسموح به" في لغة الاستعلام. وهو مصمم للسماح للنظام الأساسي بتصفية السجلات التي لا يملك المستخدم حقوقًا فيها عند وضع القيود على مستوى سجل قاعدة البيانات.

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

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

    "يختار

    منظمة،

    فردي

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

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

    "يختار

    منظمة،

    فردي

    (يختار

    منظمة

    فردي)

    من سجل التراكمات التسويات المتبادلة

    (أين

    منظمة

    فردي)

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

    يمكنك أن تسأل مرة أخرى - "لماذا لا تستخدم التوجيه المسموح به؟" فهذا يفرض الاختيار على الفور وسيحمي المستخدم من الرسائل غير الضرورية!

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

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

    ولكن كيف يمكنك تجنب خطأ "تعطل" البرنامج إذا لم يكن لديك الحقوق الكافية؟

    نعم، الأمر بسيط جدًا، تحتاج إلى استخدام أمر "Try"، وإليك مثال على ذلك:

    محاولة

    طلب.تشغيل();

    استثناء

    تقرير(وصف الخطأ());

    this.EndAttempt;

    في التقارير التي تستخدم أنظمة التحكم في الوصول، يجب كتابة رمز البرنامج الخاص بتنفيذ التقرير يدويًا، وذلك من خلال المحاولة أيضًا.

    ونتيجة لذلك، لن يتلقى المستخدم بيانات غير صحيحة وسيتلقى رسالة خطأ معقولة.

    يمكنك التعرف على الفروق الدقيقة في إعداد RLS في أقسام منفصلة في مقالتنا.

    ). يتيح لك استخدام هذه الكلمة الأساسية تجنب الأخطاء عند استرداد السجلات التي لا يملك المستخدم حقوقًا لها.

    مشكلة: في بعض الحالات، قد تعتمد نتيجة قيود الوصول إلى البيانات في 1C 8.3 على خطة استعلام نظام إدارة قواعد البيانات (DBMS). تتناول هذه المقالة المواقف المحتملة وتقدم توصيات حول كيفية تجنب ذلك.

    يمكن أن تنشأ مشكلة الاعتماد المحتمل لنتيجة قيود الوصول إلى البيانات على خطة استعلام نظام إدارة قواعد البيانات (DBMS) عند تنفيذ استعلام قاعدة بيانات بدون كلمة رئيسية مسموح، إذا كان لدى المستخدم الحالي قيود على الوصول إلى البيانات ويحتوي الطلب على مقارنة واحدة أو أكثر للنموذج:

    • <Выражение над полями>(في|ليس في) (<Вложенный запрос>)
    • (<Выражение над полями 1>, …, <Выражение над полями N>) (في|ليس في) (<Вложенный запрос>)

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

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

    سبب الاختلافات

    يرجع الاختلاف المحتمل في السلوك إلى تطبيق قيود الوصول إلى البيانات بدون كلمة رئيسية مسموحفي 1C إنتربرايز 8.3.

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

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

    ومع ذلك، عند إنشاء خطة استعلام، قد لا يتلقى نظام إدارة قواعد البيانات العينة الكاملة <Вложенным запросом> ، واستلام فقط تلك السجلات الضرورية بالفعل للتحقق من الحالة في/ليس في. في هذه الحالة، قد ينجح الطلب حتى لو <Вложенного запроса> وكطلب مستقل، يمكن أن يحدث الوصول إلى البيانات المحظورة.

    دعونا نلقي نظرة على مثال بسيط. دع على الطاولة الدليل.الأفراديتم فرض قيود على الوصول إلى البيانات. وفي هذه الحالة الطلب:

    Table.Individual كما الفرد

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

    Table.Individual كما الفرد

    الدليل.الأفراد كجدول)

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

    اتفاقية أداء العمل مع فرد.موظف.فرد

    الوثيقة اتفاقية أداء العمل مع شخص طبيعي كاتفاقية أداء العمل مع شخص طبيعي

    اتفاقية أداء العمل مع الفرد.الموظف.الفرد ب (

    Table.Individual كما الفرد

    Directory.Individuals AS الجدول

    تعد لغة الاستعلام إحدى الآليات الأساسية لـ 1C 8.3 للمطورين. باستخدام الاستعلامات، يمكنك استرداد أي بيانات مخزنة في قاعدة البيانات بسرعة. بناء الجملة الخاص به مشابه جدًا لـ SQL، ولكن هناك بعض الاختلافات.

    المزايا الرئيسية للغة الاستعلام 1C 8.3 (8.2) مقارنة بـ SQL:

    • إلغاء مرجعية الحقول المرجعية (إحالة نقطة واحدة أو أكثر إلى تفاصيل الكائن)؛
    • العمل مع النتائج مريح للغاية.
    • القدرة على إنشاء الجداول الافتراضية.
    • يمكن كتابة الطلب باللغتين الإنجليزية والروسية؛
    • القدرة على حظر البيانات لتجنب الجمود.

    عيوب لغة الاستعلام في 1C:

    • على عكس SQL، في استعلامات 1C لا تسمح بتغيير البيانات؛
    • نقص الإجراءات المخزنة.
    • استحالة تحويل سلسلة إلى رقم.

    دعونا نلقي نظرة على برنامجنا التعليمي المصغر حول التركيبات الأساسية للغة الاستعلام 1C.

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

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

    يختار
    Nomenclature.Name AS اسم التسمية
    من
    Directory.Nomenclature AS التسميات

    بجانب الأمر "SELECT"، يمكنك تحديد الكلمات الرئيسية:

    • متنوع. سيحدد الاستعلام فقط الصفوف التي تختلف في حقل واحد على الأقل (بدون تكرارات).
    • أول ن، أين ن- عدد الصفوف من بداية النتيجة التي يجب تحديدها. في أغلب الأحيان، يتم استخدام هذا البناء بالتزامن مع الفرز (ORDER BY). على سبيل المثال، عندما تحتاج إلى تحديد عدد معين من المستندات الحديثة حسب التاريخ.
    • مسموح. يسمح لك هذا التصميم بالاختيار من قاعدة البيانات فقط تلك السجلات المتوفرة للمستخدم الحالي. استناداً إلى استخدام هذه الكلمة الأساسية، سيتلقى المستخدم رسالة خطأ عند محاولة الاستعلام عن السجلات التي ليس لديه حق الوصول إليها.

    يمكن استخدام هذه الكلمات الرئيسية معًا أو بشكل منفصل.

    من أجل التغيير

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

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

    يختار
    التسويات المتبادلة.الموظف،
    التسويات المتبادلة مبلغ التسويات المتبادلة الرصيد
    من
    سجل التراكمات التسويات المتبادلة مع الموظفين أرصدة AS التسويات المتبادلة
    من أجل التغيير

    أين

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

    فيما يلي مثال لطلب الحصول على أشخاص يمكن الاتصال بهم لوظيفة معينة. تحتوي معلمة التحديد على التنسيق: &ParameterName (اسم المعلمة عشوائي).

    الاختيار (الحالة)

    يتيح لك التصميم تحديد الشروط مباشرة في نص الطلب.

    في المثال أدناه، سيحتوي "الحقل الإضافي" على نص بناءً على ما إذا كان المستند قد تم ترحيله أم لا:

    يختار
    القبولT&U.Link،
    خيار
    عند إجراء القبول T&U
    ثم "لقد تم تمرير الوثيقة!"
    آخر "لم يتم نشر المستند..."
    نهاية كحقل إضافي
    من
    الوثيقة استلام البضائع والخدمات كيفية الاستلام الشروط والأحكام

    ينضم

    تربط الصلات جدولين بناءً على حالة علاقة محددة.

    اتصال يسار/يمين

    جوهر الصلة اليسرى هو أن الجدول المحدد الأول يؤخذ بالكامل والثاني مرتبط به وفقا لحالة الاتصال. إذا لم تكن هناك سجلات مقابلة للجدول الأول في الجدول الثاني، فسيتم استبدال NULL كقيم لها. ببساطة، الجدول الرئيسي هو الجدول الأول المحدد ويتم بالفعل استبدال بيانات الجدول الثاني (إن وجدت) ببياناته.

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

    يختار
    الإيصال&U.التسمية،
    الأسعار.السعر
    من
    الوثيقة استلام البضائع والخدمات البضائع كيفية استلام الشروط والأحكام
    معلومات تسجيل الانضمام الداخلي.تسميات الأسعار.شريحةآخر الأسعار
    إيصال البرنامج وتسمياته = الأسعار.التسميات

    في اليمين، كل شيء هو عكس ذلك تمامًا.

    اتصال كامل

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

    عند استخدام الاتصال الكامل في المثال السابق، سيتم تحديد جميع أصناف الأصناف من مستند "استلام البضائع والخدمات" وجميع الأسعار الأحدث من سجل "أسعار الأصناف". ستكون قيم السجلات غير الموجودة في الجدولين الأول والثاني مساوية لـ NULL.

    صلة داخلية

    الفرق بين INNER JOIN وFULL JOIN هو أنه إذا لم يتم العثور على سجل في أحد الجداول على الأقل، فلن يعرضه الاستعلام على الإطلاق. ونتيجة لذلك، سيتم فقط تحديد عناصر العناصر من المستند "استلام البضائع والخدمات" التي توجد لها سجلات في سجل المعلومات "أسعار العناصر"، إذا قمنا في المثال السابق باستبدال "كامل" بـ "داخلي".

    مجموعة من

    يتيح لك التجميع في استعلامات 1C طي صفوف الجدول (حقول التجميع) وفقًا لخاصية مشتركة معينة (حقول التجميع). لا يمكن عرض حقول التجميع إلا باستخدام الوظائف المجمعة.

    ستكون نتيجة الاستعلام التالي قائمة بأنواع المنتجات مع الحد الأقصى لأسعارها.

    يختار
    ,
    الحد الأقصى (السعر.السعر) AS السعر
    من

    مجموعة من
    الأسعار.التسميات.نوع التسميات

    نتائج

    على عكس التجميع، عند استخدام الإجماليات، يتم عرض كافة السجلات وإضافة صفوف الإجمالي إليها. يعرض التجميع السجلات المعممة فقط.

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

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

    يختار
    الأسعار.التسميات.نوع التسميات AS نوع التسميات،
    الأسعار.السعر AS السعر
    من
    سجل المعلومات أسعار التسميات لقطة لأحدث أسعار AS
    نتائج
    الحد الأقصى(السعر)
    بواسطة
    نوع التسمية

    نأخذ

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

    في المثال أدناه، يتم تحديد الحد الأقصى لأسعار أحد العناصر إذا تجاوزت 1000، ويتم تجميعها حسب نوع العنصر.

    يختار

    الحد الأقصى (السعر.السعر) AS السعر
    من
    سجل المعلومات أسعار التسميات لقطة لأحدث أسعار AS
    مجموعة من
    الأسعار.التسميات.نوع التسميات
    نأخذ
    الحد الأقصى(الأسعار.السعر) > 1000

    ترتيب حسب

    يقوم عامل التشغيل ORDER BY بفرز نتيجة الاستعلام. لضمان عرض السجلات بترتيب متسق، يتم استخدام AUTO ORDER. يتم فرز الأنواع البدائية وفقًا للقواعد المعتادة. يتم فرز أنواع المراجع حسب GUID.

    مثال للحصول على قائمة بالموظفين مرتبة حسب الاسم:

    يختار
    الموظفين.الاسم AS الاسم
    من
    Directory.Employees كيف الموظفين
    ترتيب حسب
    اسم
    طلب تلقائي

    بنيات لغة الاستعلام 1C الأخرى

    • يجمع- نتائج استعلامين في واحد.
    • الجمع بين كل شيء- يشبه COMBINE، ولكن بدون تجميع صفوف متطابقة.
    • طاولة فارغة- يُستخدم أحيانًا عند الانضمام إلى الاستعلامات لتحديد جدول متداخل فارغ.
    • مكان- يقوم بإنشاء جدول مؤقت لتحسين استعلامات 1C المعقدة. تسمى هذه الطلبات بالطلبات المجمعة.

    ميزات لغة الاستعلام

    • سلسلة فرعيةيقتطع سلسلة من موضع محدد إلى عدد محدد من الأحرف.
    • السنة...الثانيةتسمح لك بالحصول على القيمة المحددة لنوع رقمي. معلمة الإدخال هي التاريخ.
    • بداية الفترة ونهاية الفترةتستخدم عند العمل مع التواريخ. تتم الإشارة إلى نوع الفترة (يوم، شهر، سنة، وما إلى ذلك) كمعلمة إضافية.
    • تاريخ الإضافةيسمح لك بإضافة أو طرح وقت محدد من نوع معين من تاريخ (SECOND، MINUTE، DAY، إلخ).
    • الفرقيحدد الفرق بين تاريخين، مع الإشارة إلى نوع قيمة الإخراج (يوم، سنة، شهر، إلخ.).
    • باطليستبدل القيمة المفقودة بالتعبير المحدد.
    • روابط التمثيل والتمثيلالحصول على تمثيل سلسلة للحقل المحدد. تنطبق على أي قيم والقيم المرجعية فقط، على التوالي.
    • النوع، نوع القيميتم استخدامها لتحديد نوع معلمة الإدخال.
    • وصلةهو عامل مقارنة منطقي لنوع قيمة السمة.
    • يعبريستخدم لتحويل القيمة إلى النوع المطلوب.
    • التاريخ والوقتيحصل على قيمة من النوع "التاريخ" من القيم الرقمية (السنة، الشهر، اليوم، الساعة، الدقيقة، الثانية).
    • معنىفي طلب 1C يتم استخدامه للإشارة إلى القيم المحددة مسبقًا - الدلائل والتعدادات وخطط أنواع الخصائص. مثال الاستخدام: " حيث الفرد القانوني = القيمة (التعداد. الفرد القانوني. الفرد)«.

    منشئ الاستعلام

    لإنشاء استعلامات باستخدام 1C، توجد آلية مدمجة مريحة للغاية - مصمم الاستعلام. ويحتوي على علامات التبويب الرئيسية التالية:

    • "الجداول والحقول" - تحتوي على الحقول التي يجب تحديدها ومصادرها.
    • "الاتصالات" - تصف شروط بنية الاتصال.
    • "التجميع" - يحتوي على وصف لهياكل التجميع والحقول المجمعة بناءً عليها.
    • "الشروط" - مسؤولة عن اختيار البيانات في الطلب.
    • "متقدم" - معلمات استعلام إضافية، مثل الكلمات الأساسية للأمر "SELECT"، وما إلى ذلك.
    • "الانضمام/الأسماء المستعارة" - تمت الإشارة إلى إمكانيات الانضمام إلى الجداول وتحديد الأسماء المستعارة (بنية "HOW").
    • "الطلب" هو المسؤول عن فرز نتيجة الاستعلامات.
    • "الإجماليات" - تشبه علامة التبويب "التجميع"، ولكنها تستخدم لبناء "الإجماليات".

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


    طلب وحدة التحكم

    لعرض نتيجة استعلام في وضع المؤسسة بسرعة، أو تصحيح الاستعلامات المعقدة، استخدم . فهو يحتوي على نص الطلب، ويحدد المعلمات، ويعرض النتيجة.

    يمكنك تنزيل وحدة تحكم الاستعلام على قرص ITS أو عبر .

    يمنح كائن التكوين "الدور" مجموعة من الحقوق للعمليات (الإجراءات) على كائنات التكوين.

    دور "الحقوق الكاملة".

    هذا مجرد دور (غير محدد مسبقًا) يتم فيه التحقق من كافة أنواع الحقوق لجميع كائنات التكوين.

    وما يميزه عن الأدوار الأخرى هو وجود حق «الإدارة».

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

    قيود الوصول على مستوى السجل

    أمان مستوى الصف (RLS) – تقييد مستوى السجل.

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

    • الأدوار,
    • معلمات الجلسة،
    • الخيارات الوظيفية،
    • الوحدات المشتركة المميزة,
    • الكلمة الأساسية مسموح بها في لغة الاستعلام.

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

    التنفيذ الفني لقيود الوصول في 1C

    1C ينشئ طلبًا إلى نظام إدارة قواعد البيانات (DBMS). تضيف مجموعة الخادم قسمًا إلى الطلب، والذي يحتوي على نص شرط تقييد الوصول عبر RLS، ثم يتم إرسال هذا الطلب إلى نظام إدارة قواعد البيانات (DBMS)، ويتم إرجاع البيانات المستخرجة إلى عميل 1C.


    هذه الآلية ستعمل لأي طلب من العميل:

    • في التقارير،
    • في القوائم الديناميكية وفي نماذج القائمة العادية
    • في الاستعلامات المخصصة.

    مثل هذا التنفيذ للآلية يؤثر بشكل كبير على الأداء.

    طرق لتجاوز قيود الوصول.

    في العمليات الكبيرة كثيفة الاستخدام للموارد (معالجة إعادة نشر المستندات، على سبيل المثال)، يمكن نقل جزء من التعليمات البرمجية إلى الوحدات المميزة.

    أ) وحدة مميزة هي وحدة شائعة تحمل علامة "مميزة" في الخصائص.

    خصوصيته هي أن التعليمات البرمجية الموجودة فيه يتم تنفيذها دون أي تحكم في حقوق الوصول، بما في ذلك RLS.


    ب) أيضاً ذو امتيازيمكن تشغيل الوضع لوحدات كائن الوثيقة. ويتم ذلك في خصائص الوثيقة، العلم

    • معاملة مميزة عند إجراء
    • الوضع المميز عند إلغاء المعاملة


    ب) الطريقة وضع الامتياز ()

    يسمح لك أمر النظام بجعل جزء من التعليمات البرمجية لأي وحدة مميزة.

    من السطر التالي من التعليمات البرمجية، سيتم تشغيل وضع التنفيذ المميز.

    سيعمل حتى يتم تعطيل هذا الوضع أو حتى نهاية الإجراء / الوظيفة

    (حقيقي)؛

    // سيتم تنفيذ أي تعليمات برمجية هنا بدون التحكم في الحقوق وRLS

    تعيين الوضع المميز(كذب )؛ // أو نهاية الإجراء / الوظيفة

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

    إذا كان في إجراء أو وظيفة تستدعي طريقة تعيين الوضع المميز(خطأ) قام بأكثر من استدعاءات الطريقة تعيين الوضع المميز(صحيح)، فيُطرح الاستثناء

    وظيفة الوضع المميز() تُرجع True إذا كان الوضع المميز لا يزال مُمكّنًا، وFalse إذا تم تعطيله تمامًا. ولا يقوم هذا بتحليل عدد إعدادات الوضع المميز في وظيفة معينة.

    سيتم أيضًا تنفيذ جميع الإجراءات والوظائف المطلوبة في الوضع المميز.


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


    السؤال الذي يطرح نفسه بطبيعة الحال: لماذا إذن يتم وضع قيود الوصول على الإطلاق إذا كان من الممكن تجاوزها بسهولة؟

    الوضع الآمن.

    نعم، يمكنك كتابة معالجة خارجية باستخدام وضع التنفيذ المميز وتفريغ البيانات/التالفة. ولمنع ذلك، يحتوي النظام على طريقة سياق عام

    SetSafeMode().

    الوضع الآمن، من بين أمور أخرى، يتجاهل الوضع المميز.

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

    عند تنفيذ عمليات محظورة، يتم طرح استثناء في وقت التشغيل.

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

    إعداد قيود الوصول

    لا يمكن تكوين RLS إلا للحصول على الحقوق:

    • قراءة (اختيار)
    • إضافة (إدراج)
    • تغيير (تحديث)
    • يمسح

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

    بالنسبة لعملية الإضافةيجب أن يتوافق تقييد الوصول إلى البيانات مع الكائن المخطط كتابته في قاعدة البيانات.

    لعملية التغييريجب أن يتوافق تقييد الوصول إلى البيانات مع الكائن قبل التغيير (حتى تتم قراءة الكائن) وبعد التغيير (حتى تتم كتابة الكائن).

    بالنسبة لجميع الحقوق الأخرى لا يوجد مثل هذا الخيار.

    دعونا نضيف قيدًا جديدًا لحق "القراءة" في دليل "التسميات". سيتم فتح قائمة الحقول التي يمكنك تكوين التقييد الإضافي لها.

    وهذا يعني أنه إذا حاولت الوصول إلى الحقول المحددة، فسيتم تشغيل التقييد، ولكن إذا حاولت الوصول إلى الحقول غير المحددة، فلن يعمل التقييد.

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


    *الميزة: للحصول على حقوق الإضافة والتغيير والحذف:

    • لا يمكن تكوين القيد إلا لجميع الحقول.
    • يمكن أن يكون هناك قيد واحد فقط.

    للحصول على حق "القراءة"، يمكنك تكوين عدة شروط؛ سيتم دمجها مع العامل المنطقي "AND".

    لا يجوز استخدام كافة حقول كائن بيانات القيد الرئيسي في القيود المفروضة على الأنواع التالية من كائنات قاعدة البيانات:

    • في سجلات التراكم، يمكن أن تحتوي قيود الوصول فقط على قياسات للكائن الرئيسي للقيود؛
    • في السجلات المحاسبية، يمكن للقيود فقط استخدام قياسات الميزانية العمومية للهدف الرئيسي للقيود

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

    آلية فرض قيود الوصول.

    أي عملية على البيانات المخزنة في قاعدة بيانات في 1C:Enterprise تؤدي في النهاية إلى استدعاء قاعدة البيانات مع بعض الطلبات لقراءة البيانات أو تغييرها. في عملية تنفيذ الاستعلامات إلى قاعدة البيانات، تفرض الآليات الداخلية لـ 1C:Enterprise قيودًا على الوصول. حيث:

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

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

    يتم دمج القيود المشتقة من دور واحد باستخدام عملية AND.

    يتم دمج القيود المشتقة من أدوار مختلفة باستخدام عملية OR.

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


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

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

    طريقة "كل شيء".

    عند فرض قيود باستخدام طريقة "الكل"، تتم إضافة الشروط والحقول إلى استعلامات SQL حتى يتمكن 1C:Enterprise من الحصول على معلومات حول ما إذا كان قد تم استخدام البيانات المحظورة لمستخدم معين أثناء تنفيذ استعلام قاعدة البيانات أم لا. إذا تم استخدام البيانات المحظورة، فسوف يتعطل الطلب بسبب انتهاك الوصول.

    يتم عرض فرض قيود الوصول باستخدام طريقة "الكل" بشكل تخطيطي في الشكل:


    طريقة "مسموح بها".

    عند تطبيق القيود باستخدام الطريقة "المسموح بها"، تتم إضافة الشروط إلى استعلامات SQL بحيث لا تؤثر السجلات المحظورة للمستخدم الحالي على نتيجة الاستعلام. بمعنى آخر، عند فرض قيود في الوضع "المسموح به"، تعتبر السجلات المحظورة لمستخدم معين مفقودة ولا تؤثر على نتيجة العملية، والتي يتم عرضها بشكل تخطيطي في الشكل:


    يتم فرض قيود الوصول إلى البيانات على كائنات قاعدة البيانات في الوقت الذي يصل فيه 1C:Enterprise إلى قاعدة البيانات.

    في إصدار خادم العميل من 1C:Enterprise، يتم تطبيق القيود على خادم 1C:Enterprise.

    ومع ذلك، لن يعمل هذا الخيار (مسموح به) إذا قمنا في استعلام بالإشارة إلى جدول لم يتم تكوين قيود الوصول له، ولكنه يحتوي على مراجع إلى صفوف الجدول مع القيود المكونة. في هذه الحالة ستظهر نتيجة الاستعلام "<Объект не найден>......" بدلاً من قيمة الحقل المرجعي.


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

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

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

    الممارسة 1. منشئ الاستعلام في إعدادات RLS.

    لنقم بتأليف نص قسم "أين" في الاستعلام عن الدليل. يمكنك استخدام منشئ الاستعلام.
    المصمم لديه مظهر مجردة.


    علامة التبويب "الجداول".

    سيكون الجدول الرئيسي هو جدول الكائن الذي يتم تكوين القيد له.

    يمكنك أيضًا تحديد جداول أخرى وإعداد اتصالات مختلفة بينها في علامة التبويب "العلاقات".

    علامة التبويب "الشروط"

    هنا يمكنك تكوين شروط تقييد الوصول الفعلية

    دعونا نضيف شروطًا إلى سمة "السعر" في دليل التسميات للحصول على حق "القراءة" لجميع حقول الجدول.

    ""التسمية حيث التسمية.السعر> 500""

    دعونا نرى كيف تعمل هذه القاعدة البسيطة. يحتوي جدول الدليل على العناصر التالية:


    بعد إعداد تقييد الوصول، سيعرض الجدول العناصر التي تستوفي الشرط فقط:


    كما اختفت المجموعات. دعونا نغير نص القيد

    “التسمية حيث التسمية.السعر> 500

    أو التسمية. هذه مجموعة"

    حسنا، الآن هذا ما تحتاجه.


    إذا قمت بإزالة عرض حقل "الكود" في إعدادات القائمة، فسيتم عرض جميع عناصر الدليل، أي. التقييد لم ينجح. إذا قمت بتعيين حقل "الرمز" ليتم عرضه، فسيعمل التقييد.


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


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


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

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

    بعد إعداد تقييد الوصول، تغير عرض السطر في قائمة الحقوق - أصبح باللون الرمادي وظهر رمز.

    القيود عند إعداد الوصول (RLS).

    • لا يوجد قسم ملخص.
    • لا يمكن الوصول إلى جداول التسجيل الافتراضية؛
    • لا يمكنك استخدام المعلمات بشكل صريح؛
    • يمكن استخدامها في الاستعلامات المتداخلة أي>/span> أدوات لغة الاستعلام باستثناء:
      • المشغل في التسلسل الهرمي؛
      • النتائج المقترحات؛
      • نتائج الاستعلام المتداخلة يجب ألا يحتوي على أجزاء الجدول>/span>;
      • الجداول الافتراضية، وخاصة الأرصدة والتحولات

    الممارسة 2. التسميات بالسعر الحالي.

    قم بتقييد الوصول إذا كنت تريد عرض العناصر بسعر حالي أكبر من قيمة معينة، على سبيل المثال، 100.

    حل:

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


    قوالب تقييد الوصول.

    الممارسة 3. تقييد "الأطراف المقابلة" من حيث القيمة في ثابت.

    لنقم بإعداد تقييد الوصول لدليل الأطراف المقابلة بناءً على القيمة المخزنة في الثابت.

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

    حل

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

    نرى مشكلة، حيث تتم تصفية دليل الأطراف المقابلة بشكل صحيح، ويتم عرض جميع المستندات التي تحتوي على سمة "الطرف المقابل"، وبعضها يحتوي على روابط "معطلة" في سمة "الطرف المقابل".

    أنت الآن بحاجة إلى تكوين قيود الوصول لجميع الكائنات التي تستخدم رابط "الحسابات". دعنا نعثر عليهم باستخدام خدمة "البحث عن روابط لكائن ما".

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

    أو استخدم نمط قيود الوصول لتجنب مشكلات تكرار التعليمات البرمجية.

    يتم تكوين قوالب تقييد الوصول على مستوى الدور ويمكن استخدامها لأي كائن داخل الدور الذي تم تحريره.

    يمكنك إضافة أي جزء من نص تقييد الوصول إلى القالب. يتم استدعاء القالب باستخدام الرمز "#". على سبيل المثال، #TemplateCounterparty.

    من خلال # في 1C تتم كتابة التعليمات إلى المعالج المسبق. في سياق تنفيذ إعدادات تقييد الوصول، تقوم المنصة باستبدال نص استدعاء القالب بنص القالب.

    دعونا نضيف النص بعد كلمة "أين" إلى قالب "قالب المقاول"، باستثناء النص الخاص بـ EtoGroup.

    المعلمات في قوالب تقييد الوصول.

    دعونا نواصل حل المشكلة 2.

    المشكلة الآن هي أن الجدول الرئيسي في الدليل يسمى "الطرف المقابل"، في مستند "فاتورة الاستلام". يُطلق على الحقل الذي يتم فحصه في الدليل اسم "الرابط"، ويسمى في المستند "الطرف المقابل".

    دعونا نغير اسم الجدول الرئيسي في نص القالب إلى "#CurrentTable"

    "#CurrentTable" هي معلمة محددة مسبقًا.

    ومن خلال النقطة نشير إلى رقم معلمة الإدخال - ".#Parameter(1)

    "#Parameter" هي أيضًا قيمة محددة مسبقًا. يمكن أن تحتوي على عدد عشوائي من معلمات الإدخال. تتم معالجتها عن طريق الرقم التسلسلي.

    في نص قيود الوصول للدليل، نشير إلى ما يلي:

    بالنسبة للوثيقة ما يلي:

    "مبيعات البضائع حيث #TemplateCounterparty ("الطرف المقابل")"

    عند استدعاء قالب تقييد الوصول، يجب تمرير المعلمات إليه كسلسلة فقط، أي بين علامتي اقتباس.

    الجدول الرئيسي - التسميات

    نص القالب هو:

    #CurrentTable حيث #CurrentTable.#Parameter(1) = #Parameter(2)

    يحتوي نص القالب على جزء من النص بلغة تقييد الوصول إلى البيانات وقد يحتوي على معلمات يتم تمييزها باستخدام الرمز "#".

    قد يتبع الرمز "#" ما يلي:

    • إحدى الكلمات المفتاحية:
      • معلمة متبوعة برقم المعلمة في القالب بين قوسين؛
      • CurrentTable – يشير إلى إدراج الاسم الكامل للجدول الذي تم إنشاء القيد له في النص؛
      • اسم الجدول الحالي- يشير إلى إدراج الاسم الكامل للجدول في النص (كقيمة سلسلة، بين علامتي اقتباس) الذي يتم تطبيق التعليمات عليه، في الإصدار الحالي من اللغة المضمنة؛
      • الاسمCurrentAccessRight- يحتوي على اسم الحق الذي تم تنفيذ القيد الحالي عليه: READ، ADD، INSERT، CHANGE، UPDATE، DELETE؛
    • اسم معلمة القالب - يعني إدراج قيد معلمة القالب المقابل في النص؛
    • الرمز "#" - يشير إلى إدراج حرف واحد "#" في النص.

    قد يحتوي تعبير تقييد الوصول على:

    • قالب تقييد الوصول المحدد في التنسيق #TemplateName("قيمة معلمة القالب 1"، "قيمة معلمة القالب 2"،...). يتم وضع كل معلمة قالب بين علامتي اقتباس مزدوجتين. إذا كنت بحاجة إلى تحديد حرف اقتباس مزدوج في نص المعلمة، فيجب عليك استخدام علامتي اقتباس مزدوجتين.
    • الدالة StrContains (WhereWeLook، WhatWeLook). تم تصميم الوظيفة للبحث عن تكرار سلسلة WhatWeLook في سلسلة WhereWeLook. إرجاع True إذا تم العثور على التكرار وإرجاع False بخلاف ذلك.
    • عامل التشغيل + مخصص لتسلسل السلسلة.

    لتسهيل تحرير نص القالب، في علامة تبويب قوالب التقييد في نموذج الدور، انقر فوق الزر تعيين نص القالب. في مربع الحوار الذي يفتح، أدخل نص القالب وانقر فوق موافق.

    لا يمكن تثبيتها باستخدام تعيين المعلمة ()أو شيئا من هذا القبيل.

    المعلمات في هذه الحالة هي:

    • خيارات الجلسة
    • خيارات وظيفية

    تتم قراءة معلمات الجلسة في طلب تقييد الوصول في الوضع المميز، أي دون التحكم في حقوق العمل بها.

    الممارسة 4. الوصول إلى الأطراف المقابلة "الخاصة بك".

    من الضروري تكوين تقييد وصول المستخدم الحالي إلى الأطراف المقابلة "الخاصة به".

    يوجد دليل "المستخدمين"، ودليل "الأطراف المقابلة"، والمستندات التي تحتوي على تفاصيل "الطرف المقابل".

    يجب أن يرى المستخدم الحالي البيانات فقط للأطراف المقابلة التي تم إنشاء اتصال معه.

    يحتاج الاتصال أيضًا إلى التكوين.

    الخيارات الممكنة:

    إقامة اتصالات بين المستخدم والطرف المقابل

    • التفاصيل في دليل الأطراف المقابلة
    • سجل المعلومات

    الحلول الممكنة للمشكلة:

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

    حل.

    لنقم بإنشاء معلمة جلسة جديدة "CurrentUser" وملئها في وحدة الجلسة.

    لنقم بإنشاء سجل للمعلومات "امتثال المديرين والمقاولين"

    لنقم بإنشاء دور جديد وفيه تقييد وصول جديد للمستند "الفاتورة".

    في نص الطلب، سنقوم بربط الجدول الرئيسي بسجل المعلومات الخاص بالحساب = الحساب والمدير = &المستخدم الحالي. نوع الاتصال داخلي.

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

    التحقق - القيود تعمل

    *الميزة: إذا قمت بتغيير قائمة الأطراف المقابلة للمستخدم في السجل، فستدخل قيود الوصول حيز التنفيذ على الفور دون إعادة تشغيل جلسة المستخدم.

    الممارسة 5. تاريخ حظر التغييرات.

    من الضروري تطبيق قيود على تحرير البيانات قبل التاريخ المحدد لحظر التغييرات.
    تحتاج إلى تقييده للمستخدمين.

    لنقم بإنشاء سجل معلومات "تواريخ حظر التغييرات" مع البعد المستخدم، تاريخ الحظر المصدر.

    دعونا نبني منطق الحل بهذه الطريقة:

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

    من الواضح أنه يمكن تكوين مثل هذا القيد لكائنات قاعدة البيانات التي لها موضع ما على محور الوقت. يمكن أن يكون

    • توثيق
    • سجلات المعلومات الدورية

    لنقم بإنشاء دور جديد "القيود حسب تاريخ حظر التغييرات".

    فيه، بالنسبة لوثيقة "فاتورة" "التغيير" الصحيح، سنضيف تقييدًا جديدًا للوصول.

    نحدد الإعداد لجميع الحقول.

    ونص القيد هو:

    ReceiptInvoice FROM Document.ReceiptInvoice AS ReceiptInvoice

    تغيير تواريخ الحظر. تاريخ الحظر AS تاريخ الحظر
    من

    الانضمام الداخلي (حدد
    MAX (تغيير التواريخ المحظورة.المستخدم) كمستخدم
    من
    سجل المعلومات مواعيد حظر التغيير كمواعيد حظر التغيير
    أين
    (تغيير التواريخ المحظورة.User = &CurrentUser
    أو التواريخ ProhibitedChanges.User = VALUE(Directory.users.EmptyLink))) AS VZ_User
    حسب تاريخ حظر التغييرات.User = VZ_User.User) AS NestedQuery
    فاتورة استلام البرنامج. تاريخ> الاستعلام المتداخل. تاريخ الحظر

    دعونا نتحقق - يعمل التقييد.

    استخدام تعليمات المعالج المسبق

    #إذا كان الشرط1 #ثم

    طلب القطعة 1

    #ElseIf Condition2 #ثم

    طلب القطعة 2

    #خلاف ذلك

    طلب القطعة 3

    #إنهاء إذا

    في الظروف، يمكنك استخدام العمليات المنطقية (و، أو، لا، وما إلى ذلك) والوصول إلى معلمات الجلسة.

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

    الجانب السلبي هو أن مُنشئ الاستعلام لن يعمل مع مثل هذا النص.

    *الخصوصية :

    على عكس تعليمات المعالج المسبق للغة المضمنة في نصوص تقييد الوصول، قبل المشغل فأنت بحاجة إلى وضع تجزئة - #ثم

    الممارسة 6. قم بالتبديل إلى "استخدم RLS"

    دعونا نكمل نظام القيود الخاص بنا بمفتاح يعمل على تشغيل/إيقاف استخدام القيود على مستوى السجل.

    للقيام بذلك، سوف نقوم بإضافة ثابت ومعلمة جلسة تسمى "UseRLS".

    لنكتب في وحدة الجلسة لتعيين قيمة معلمة الجلسة من قيمة الثابت.

    لنضيف الكود التالي إلى كافة نصوص تقييد الوصول:

    "#If &UseRLS #Then….. #EndIf"

    نتحقق - كل شيء يعمل.

    ومع ذلك، الآن بعد تشغيل علامة "استخدام الرادار"، لن تدخل التغييرات حيز التنفيذ على الفور. لماذا؟

    لأنه يتم تعيين معلمة الجلسة عند بدء الجلسة.

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


    نهاية الجزء الأول.

       

    17 قاعدة لإعداد الاستعلام الأمثل لبيانات قاعدة بيانات 1C

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

    نص الطلب هو التعليمات التي يجب بموجبها تنفيذ الطلب. يصف نص الطلب ما يلي:

    • جداول قاعدة المعلومات المستخدمة كمصادر بيانات الاستعلام؛
    • حقول الجدول التي تحتاج إلى معالجة في الاستعلام؛
    • قواعد التجميع؛
    • فرز النتائج؛
    • إلخ.

    يتم تجميع التعليمات بلغة خاصة - لغة الاستعلام وتتكون من أجزاء منفصلة - الأقسام والجمل والكلمات الرئيسية والوظائف والعوامل الحسابية والمنطقية والتعليقات والثوابت والمعلمات.

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

    توصيات لكتابة استعلامات قاعدة البيانات بلغة استعلام النظام الأساسي 1C:

    1) قد يحتوي نص الطلب على بيانات تكوين محددة مسبقًا، مثل:

    • قيم التعداد؛
    • البيانات المحددة مسبقًا:
    • الكتب المرجعية؛
    • خطط لأنواع الخصائص.
    • مخططات الحسابات؛
    • خطط لأنواع الحسابات.
    • روابط فارغة؛
    • قيم نقطة مسار العملية التجارية.

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

    مثال على استخدام الحرفي معنى:

    • أين المدينة = VALUE(Directory.Cities.Moscow)
    • أين المدينة = VALUE(Directory.Cities.EmptyLink)
    • WHEREProductType = VALUE(Enumeration.ProductTypes.Service)
    • WHEREMovementType = VALUE(MovementTypeAccumulation.Incoming)
    • حيث RoutePoint = VALUE(BusinessProcess.BusinessProcess1.RoutePoint.Action1

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

    يعمل الطلب التلقائي وفقًا للمبادئ التالية:

    • إذا تم تحديد جملة ORDER BY في الطلب، فسيتم استبدال كل رابط للجدول الموجود في هذه الجملة بالحقول التي يتم فرز الجدول من خلالها افتراضيًا (بالنسبة للكتب المرجعية، هذا هو الرمز أو الاسم، بالنسبة للمستندات - تاريخ الوثيقة). إذا كان الحقل المراد فرزه يشير إلى دليل هرمي، فسيتم تطبيق الفرز الهرمي حسب هذا الدليل.
    • إذا كان الطلب لا يحتوي على جملة ORDER BY، ولكن هناك جملة TOTAL، فسيتم ترتيب نتيجة الاستعلام حسب الحقول الموجودة في جملة TOTAL بعد الكلمة الأساسية BY، بنفس التسلسل، وإذا تم حساب الإجماليات بواسطة الحقول المرجعية، ثم حسب حقول الفرز افتراضيًا للجداول التي تم الرجوع إليها.
    • إذا كان الاستعلام لا يحتوي على جملتي ORDER BY وTOTAL، ولكن هناك جملة GROUP BY، فسيتم ترتيب نتيجة الاستعلام حسب الحقول الموجودة في العبارة بنفس التسلسل، وإذا تم التجميع حسب الحقول المرجعية ، ثم فرز جداول الحقول التي تم الرجوع إليها بشكل افتراضي.
    • إذا كان الاستعلام لا يحتوي على عبارات ORDER BY أو TOTAL أو GROUP BY، فسيتم ترتيب النتيجة حسب حقول الفرز الافتراضية للجداول التي تم تحديد البيانات منها، بالترتيب الذي تظهر به في الاستعلام.
    • إذا كان الاستعلام يحتوي على جملة TOTAL، فسيتم ترتيب كل مستوى إجمالي بشكل منفصل.

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

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

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

    يوجد سجل لتراكم البضائع المتبقية، حيث يحتوي حقل المسجل على نوع مركب. في الطلب، يتم تحديد تاريخ ورقم مستند استلام البضائع، بينما عند الوصول إلى تفاصيل المستند من خلال حقل المسجل، لا تحدث العديد من الاتصالات اليسرى لجدول سجل التراكم مع جداول مستندات المسجل.

    الكود 1C v 8.x حدد
    EXPRESS (البضائع المتبقية. المسجل كمستند. استلام البضائع). رقم AS رقم الإيصال،
    EXPRESS (البضائع المتبقية. المسجل كمستند. استلام البضائع). التاريخ كتاريخ الاستلام
    من
    سجل التراكمات البضائع المتبقية كبضائع باقية

    إذا تم اعتبار تحويل النوع غير ممكن، فستكون نتيجة تحويل النوع هي القيمة باطل.

    5) لا تنسى التعليمات مسموح، مما يعني أن الاستعلام سيحدد فقط السجلات التي يتمتع المستخدم الحالي بحقوقها. إذا لم يتم تحديد هذه الكلمة، فإذا قام الطلب بتحديد السجلات التي ليس لدى المستخدم حقوق لها، فستتم معالجة الطلب مع ظهور خطأ.

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

    Code 1C v 8.x // حدد عدد الحقول والتركيب
    // من الجدول الظاهري Document.Expenditure
    حدد رقم الرابط، الجدول الفارغ. (الرقم، العنصر، الكمية) كتكوين
    من الوثيقة. فاتورة النفقات
    الجمع بين كل شيء
    حدد رقم الرابط، المحتويات (رقم السطر، المنتج، الكمية)
    من Document.Invoice Document.Invoice.Composition.*

    7) لمنع ظهور الأسطر المكررة في نتيجة الاستعلام، يجب عليك استخدام التعليمات متنوع، لأنها أكثر وضوحا ومفهومة، والتعليمات مجموعة منتستخدم للتجميع باستخدام وظائف التجميع. كساتي، عند استخدام الوظائف التجميعية، اقتراح مجموعة منقد لا يتم تحديده على الإطلاق، ولكن سيتم تجميع كافة نتائج الاستعلام في سطر واحد. مثال:

    Code 1C v 8.x // من الضروري معرفة الأطراف المقابلة
    // تم شحن البضائع لهذه الفترة.
    حدد مختلف
    Document.Invoice.Counterparty

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

    الكود 1C v 8.x حدد
    استلام البضائع والخدمات البضائع (SUM (الكمية)، التسمية)،
    استلام البضائع والخدمات الرابط،
    استلام السلع والخدمات
    من
    وثيقة استلام البضائع والخدمات كيفية استلام البضائع والخدمات
    مجموعة من
    استلام البضائع والخدمات البضائع (التسميات)

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

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

    مثال (البحث عن المستندات التي تحتوي على منتج معين في القسم الجدولي):

    تتمثل ميزة هذا الاستعلام عن الاستعلام الموجود في الجدول الثانوي Receipt.Goods في أنه في حالة وجود نسخ مكررة في المستندات، فإن نتيجة الاستعلام سترجع المستندات الفريدة فقط دون استخدام الكلمة الأساسية DIFFERENT.

    11) أحد المتغيرات المثيرة للاهتمام للمشغل B هو التحقق من تضمين مجموعة مرتبة في مجموعة هذه المجموعات (Field1، Field2، ...، FieldN) B (Field1، Field2، ...، FieldN).

    الكود 1C v 8.x حدد
    الأطراف المقابلة. الرابط
    أين
    (Counterparties.Link، Products.Link) ب
    (اختر Sales.Customer، Sales.Product
    من سجل التراكم.المبيعات كمبيعات)
    من
    الدليل.الأطراف المقابلة،
    الدليل.المنتجات

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

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

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

    ليس من الممكن دائمًا للمطور الوصول إلى البيانات التي يستطيع النظام الوصول إليها.

    13) في وضع تشغيل خادم العميل، الوظيفة سلسلة فرعية()يتم تنفيذه باستخدام وظيفة SUBSTRING() الخاصة بعبارة SQL المقابلة التي تم تمريرها إلى خادم قاعدة بيانات SQL Server، والتي تحسب نوع نتيجة وظيفة SUBSTRING() باستخدام قواعد معقدة اعتمادًا على نوع وقيم معلماتها، كما وكذلك حسب السياق الذي يتم استخدامه فيه. في معظم الحالات، ليس لهذه القواعد أي تأثير على تنفيذ الاستعلام، ولكن في بعض الأحيان يكون الحد الأقصى لطول صف النتيجة المحسوب بواسطة SQL Server مهمًا لتنفيذ الاستعلام. من المهم أن تضع في اعتبارك أنه في بعض السياقات عند استخدام الدالة SUBSTRING()، قد يكون الحد الأقصى لطول نتيجتها مساويًا للحد الأقصى لطول سلسلة محدودة الطول، والتي تبلغ 4000 حرفًا في SQL Server. قد يتسبب هذا في تعطل الاستعلام بشكل غير متوقع:

    موفر Microsoft OLE DB لـ SQL Server: تحذير: تعذر على معالج الاستعلام إنتاج خطة استعلام من المحسن لأن إجمالي طول كافة الأعمدة في جملة GROUP BY أو ORDER BY يتجاوز 8000 بايت.

    HRESULT=80040E14، SQLSTATE=42000، أصلي=8618

    14) استخدم بحذر أوفي التصميم أين، نظرًا لأن استخدام شرط OR يمكن أن يجعل الاستعلام أثقل بشكل ملحوظ. يمكن حل المشكلة عن طريق التصميم الجمع بين كل شيء. مثال:

    الكود 1C v 8.x حدد

    من

    أين
    _Demo Contractors.Link =Link1
    الجمع بين كل شيء
    يختار
    _المقاولين التجريبيين.الاسم الكامل
    من
    Directory._Demo الأطراف المقابلة كيفية _Demo الأطراف المقابلة
    أين
    _Demo Contractors.Link = Link2

    15) الحالة ليست فيفي التصميم أينيزيد من وقت تنفيذ الاستعلام، لأن هذا نوع من ليس (OR1 أو 2 ... أورن)، لذلك حاول استخدام الجداول الكبيرة الانضمام الأيسر مع الشرط هو NULL. مثال:

    الكود 1C v 8.x حدد
    _رابط المقاولين التجريبيين
    من
    Directory._Demo الأطراف المقابلة كيفية _Demo الأطراف المقابلة
    مستند الاتصال الأيسر._الطلب التجريبي للمشتري كيفية _الطلب التجريبي للمشتري
    Software _Demo Counterparties.Link = _Demo Order of the Buyer.Counterparty
    أين
    _الأمر التجريبي للمشتري. الطرف المقابل لاغٍ

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

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

    17) إذا لم تستخدم مدير الجدول المؤقت، فلا داعي لحذف الجدول المؤقت بشكل صريح، وسيتم حذفه بعد اكتمال الاستعلام الدفعي، وإلا فيجب عليك حذف الجدول المؤقت باستخدام إحدى الطرق التالية: الأمر هدمفي الطلب، استدعاء الأسلوب TemporaryTableManager.Close().

    بالإضافة إلى الفيديو من Evgeny Gilev: الأخطاء النموذجية عند كتابة الاستعلامات في 1C:

    مقالات مماثلة