1c 8 طاولات افتراضية.

توضح المقالة التنفيذ الفعلي للجدول الظاهري لبقايا التكوين العاملة في وضع خادم العميل للعملية باستخدام MS DBMS كمثال. خادم قاعدة البيانات.

القابلية للتطبيق

تتناول المقالة 1C: إصدار منصة المؤسسة 8.3.5.1383. في الإصدار الحالي من النظام الأساسي ، من الممكن إجراء بعض التغييرات في النص الموصوف في المادة ، استعلام T-SQLيتم تنفيذها على جانب خادم DBMS.

جهاز الجدول الافتراضي للمخلفات

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

يختار
السلع,
السلع,
السلع المتبقية
من
سجل التراكم ، مخزون السلع ، الأرصدة(& التاريخ ، المستودع = & المستودع) كيف
السلع

أولا مع طريقة السياق العالمي GetDatabaseStorageStructure ()الحصول على قائمة بجداول قاعدة البيانات التي تخزن بيانات سجل التراكم "مخزون السلع":

فيما يلي تكوين حقول الجدول الرئيسي لسجل التراكم وجدول المجاميع:

تخزين المجاميع لـ هذا السجلتم تكوينه في 1C: وضع Enterprise 8 على النحو التالي:

املأ المعلمات في الطلب المعني على النحو التالي:


تقوم المنصة بتحويل نص الطلب إلى الطلب التالي ، والذي سيتم تنفيذه على خادم DBMS:

يختار
Q_000_T_001.Fld82 ،
Q_000_T_001.Fld83 ،
Q_000_T_001.Fld84 التوازن
من
(حدد Fld82 ،
fld83 ،

من
(حدد Fld82 ،
fld83 ،
SUM (Fld84) AS Fld84Balance
من AccumRgT85
أين الفترة = DATETIME (3999، 11، 1)
و ((Fld83 =))
و (Fld84<>0) و (Fld84<> 0 )
المجموعة حسب Fld82، Fld83
التوازن<> 0
اتحاد الكل
حدد Fld82 ،
fld83 ،
SUM (الحالة عندما يكون نوع السجل = 0 ثم Fld84 ELSE Fld84 END) AS Fld84Balance
من AccumRg81
أين الفترة> = DATETIME (2012، 9، 1)
و الفترة< DATETIME (3999 , 11 , 1 )
ونشط
و ((Fld83 = 9:))
المجموعة حسب Fld82، Fld83
التوازن<>0) ت
المجموعة حسب Fld82، Fld83
التوازن<>0) Q_000_T_001

دعنا نحلل الطلب المستلم بمزيد من التفصيل.

أولاً ، باستخدام الاستعلام الأول المضمن في الصلة ، يتم تحديد البيانات من جدول AccumRgT85 الناتج. يتم الحصول على المجاميع في تاريخ تخزين المجاميع الحالية (11/01/3999) ، يتم فرض شرط إضافي على حقل المستودع (حيث تم استخدام هذا الشرط في معلمات الجدول الافتراضي). بالإضافة إلى ذلك ، يتم إجراء فحص لعدم وجود صفوف بصفر في النتيجة.

يرجى ملاحظة أن التجميع يتم وفقًا للأبعاد المحددة في نص الاستعلام. هذا هو السبب في أن النص الموجود في 1C: لغة استعلام المؤسسة لا تتطلب تجميعًا إضافيًا حسب الأبعاد.

يستخدم استعلام الصلة الثاني جدول حركة السجل AccumRg81. اعتمادًا على نوع الحركة (إذا كان RecordKind يساوي 0 ، فهذا هو التدفق ، وإلا - Outflow) ، يتم وضع علامة في التعبير. تختار المنصة بيانات الفترة من التاريخ المحدد كمعامل جدول افتراضي إلى تاريخ تخزين الإجماليات الحالية (01.11.3999).

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

إذا تم استخدام MS SQL Server DBMS وتم تعيين إزاحة التاريخ لعام 2000 لقاعدة البيانات ، فسيتم تخزين جميع التواريخ مع الإزاحة المحددة ، أي بدلاً من 11/01/3999 سترى 11/01/5999.

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

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

يختار
Q_000_T_001.Fld82 ،
Q_000_T_001.Fld83 ،
Q_000_T_001.Fld84 التوازن
من
(حدد Fld82 ،
fld83 ،
SUM (Fld84Balance) AS Fld84Balance
من
(حدد Fld82 ،
fld83 ،
SUM (Fld84) AS Fld84Balance
من AccumRgT85
أين الفترة = التاريخ (2012، 4، 1)
و ((Fld83 = 9:))
و (Fld84<> 0 )
و (Fld84<> 0 )
المجموعة حسب Fld82، Fld83
التوازن<> 0
اتحاد الكل
حدد Fld82 ،
fld83 ،
SUM (الحالة عندما يكون نوع السجل = 0 ثم Fld84 ELSE - Fld84 END) AS Fld84Balance
من AccumRg81
أين الفترة> = DATETIME (2012، 4، 1)
و الفترة< DATETIME (2012 , 9 , 1 )
ونشط
و ((Fld83 = 9:))
المجموعة حسب Fld82، Fld83
التوازن<>0) ت
المجموعة حسب Fld82، Fld83
التوازن<>0) Q_000_T_001

لاحظ الشرط التالي في نص الطلب.

إذا كانت مشاركتي مفيدة لك ، فلا تنسَ التصويت :-)

فيما يلي أداة قياس لجميع مهام المجموعة(صفحة بها روابط إلى مواضيع المنتدى لكل مهمة)
http://chistov.spb.ru/forum/16-969-1

حسنًا ، الآن تطوراتي وملاحظاتي التي أنشأتها في عملية التحضير.
سأحاول أن أكرر كحد أدنى مع الاثنين المذكورين أعلاه آخرالمنشورات.

اذا هيا بنا نبدأ:


في حالة التسليم عن بُعد ، يجب أن يكون لديك عنصران على سطح المكتب في نهاية الاختبار:

1. التحميل النهائي قاعدة المعلومات(ملف dt)
2. ملاحظة توضيحية

يجب ألا يكون هناك أي شيء آخر ، ولا توجد نسخ وسيطة ، إلخ.

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

ولكن سيتم إخبارك بذلك في التعليمات التي سيتم إعطاؤها لقراءتها قبل الامتحان.
من الأفضل أن تعرف في وقت مبكر)


استخدام استعلامات علامة العطف.

أحيانًا يكون الاتصال به أسرع لوحة مفاتيح إضافيةمن التبديل ذهابًا وإيابًا يوفر الوقت
& = Alt + 38

*************************************************************************************************
استخدام MomentTime () في الاستعلامات

في الاستعلامات الخاصة بسجلات التراكم ، المحاسبة ، كمعامل جدول افتراضي (فترة) ، من الضروري عدم استخدام تاريخ المستند ، ولكن معلمة اللحظة ، والتي يتم تحديدها في الكود كما يلي:

Moment =؟ (PostMode = PostModeDocument.Online ، غير محدد ، MomentTime ()) ،

*************************************************************************************************
عند إنشاء حركات المستند عن طريق السجل ، في بداية إجراء معالجة الترحيل ، من الضروري مسح تحركات المستند الحالي عن طريق السجل.

الكود مثل هذا:

Movements.RegisterName.Write = صحيح ؛ Movements.RegisterName.Clear () ،

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

Movements.RegisterName.Write () ،

أو ، عند تحليل السجلات ، حدد بوضوح حدًا لا يتضمن اللحظة الزمنية للمستند الحالي.

لكن في كل مكان أشرت للتو إلى إنشاء هذه الخطوط الثلاثة دفعة واحدة:

Movements.RegisterName.Write = صحيح ؛ Movements.RegisterName.Clear () ، Movements.RegisterName.Write () ،

*************************************************************************************************
هناك طريقتان لحجب البيانات ، والاختيار بينهما يعتمد على طريقة إجرائها - قديمة أو جديدة:

1) القفل المُدار التقليدي ، الطريقة القديمة لترحيل مستند (كائن DataLock)

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


مثال:

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


1. قم بتعيين القفل باستخدام كائن DataLock
2. اقرأ الباقي
3. التحقق من إمكانية الخصم
4. نشكل حركات ، على سبيل المثال ، نقوم بشطب البضائع
5. بعد ترحيل المستند ، يتم تحرير المنع تلقائيًا (يكون المنع صالحًا في إطار حركة الترحيل ويتم تحريره تلقائيًا بواسطة النظام). أي ليست هناك حاجة لفتح الكائن على وجه التحديد.

2) منهجية جديدة لإجراء الوثائق (باستخدام خاصية LockForChange = True)

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

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

لذا فإن التسلسل هو:
1. للتنقل عبر السجل ، قم بتعيين الخاصية LockForChange = True
2. نشكل حركات - نقوم بشطب البضائع
3. سجل الحركات
4. اقرأ السجل وتأكد من عدم وجود أرصدة سلبية. إذا كان هناك ، ثم شطبوا الفائض ، وإذا لم يكن كذلك ، فكل شيء على ما يرام.

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

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

ألاحظ أيضًا أنه بغض النظر عن الطريقة المختارة ، يجب مسح الحركات قبل العمل معهم (انظر النصيحة السابقة)

*************************************************************************************************
حجب البيانات (طريقة الحجب رقم 1 من الوصف أعلاه)

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

يشبه هذا:

قفل = DataLock جديد ؛ LockElement = Lock.Add ("Accumulation Register.GoodsInWarehouses") ؛ LockItem.Mode = DataLockMode.Exclusive ، LockItem.DataSource = PM ؛ LockElement.UseFromDataSource ("Nomenclature"، "Nomenclature") ؛ Lock.Lock () ،

*************************************************************************************************
من الأفضل تسمية الجزء المجدول من المستندات ببساطة "PM"

الجزء المجدول في 99٪ من المستندات هو جزء واحد. هذا الاسم الموحد أجزاء مجدولةسيساعدك على توفير الكثير من الوقت للأسباب التالية:
1) قصير جدًا - اكتب بسرعة
2) نفس الشيء بالنسبة لجميع المستندات ، لا داعي لأن تتذكر عند كتابة التعليمات البرمجية ما يسمى

*************************************************************************************************
تحقق من نتيجة طلب الفراغ قبل الاختيار أو التحميل إلى المعارف التقليدية.

بشكل عام ، استخدمت أخذ العينات في جميع المهام.

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

ولكن على أي حال ، قبل طريقة Select () ، من الأفضل التحقق من نتيجة طلب الفراغ ، مما يؤدي إلى تقليل الحمل على النظام.

النتيجة = Request.Run () ، If Not Result.Empty () ثم Selection = Result.Select (IteratingQueryResult.By Groupings) ؛ ... إنهاء إذا؛

وفي حال احتجنا إلى الحصول على قيمة واحدة فقط من الطلب
(على سبيل المثال ، فقط طريقة الشطب وفقًا لـ السياسة المحاسبيةالمحددة لهذا العام):

النتيجة = Request.Run () ، If Not Result.Empty () ثم Selection = Result.Select ()؛ Selection.Next () ، طريقة شطب التكلفة = نموذج طريقة شطب التكلفة ؛ إنهاء إذا؛

*************************************************************************************************
وثيقة "العملية" لمهمة BU

تأكد من إنشاء مستند عملية لمهام BU.

نقوم بإيقاف تشغيل التوصيل بشكل عام (في الخصائص "إجراء = رفض") ، نشير إلى ما يجعل الحركات في السجل المحاسبي ، نقوم بسحب الحركات في النموذج.

*************************************************************************************************
المعالجة التشغيلية للوثائق:

لا بد وأن متضمن:
في التشغيل والمحاسبة. يجب تمكين المحاسبة عن المستندات (باستثناء مستند "العملية" ، انظر أدناه).

لا بد وأن أطفئ:
في المهام الحسابية لا معنى لوثيقة كشوف المرتبات.

بالنسبة إلى مستند "العملية" ، يجب تعطيل النشر بشكل عام (في خصائص المستند "Post = Disable") ،
لأنه يكتب فقط البيانات مباشرة إلى السجل عند الكتابة.

*************************************************************************************************
شرط في استعلام مثل "إما المصطلحات المحددة أو أي منها ، إذا لم يتم تحديدها"

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

التسمية = & التسمية OR & التسمية = القيمة (الكتالوج. التسمية. مرجع فارغ)

ولكن سيكون من الأفضل والأكثر صحة تغيير هذه الحالة (شكرًا يوكون):


Query.Text = Query.Text + "WHERE Nomenclature = & Nomenclature"؛

إنهاء إذا؛

مع ظهور نموذج كائن الاستعلام في 8.3.5 ، سيكون من الآمن إضافة شرط:

إذا ValueFilled (التسمية) ثم
Query1.Filter.Add ("Nomenclature = & Nomenclature")؛
Query.SetParameter ("التسمية" ، التسمية) ؛
إنهاء إذا؛

*************************************************************************************************
ربط الجداول في الاستعلامات:

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

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

*************************************************************************************************
باستخدام خطة أنواع الخصائص (PVC):

1. استخدم كآلية لوصف خصائص الأشياء.

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

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

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

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

2. استخدام PVC لإنشاء آلية فرعية لسجل المحاسبة .

2.1. نقوم بإنشاء أنواع PVC من Subconto.

2.2. نقوم بإنشاء دليل ثانوي Subconto Values ​​(كما هو الحال مع الخصائص ، سيحتوي على قيم فرعية إذا لم يكن هناك أي منها في الأدلة الأخرى).

2.3 يتم الاتصال باستخدام مخطط الحسابات.

*************************************************************************************************
موارد السجل المحاسبي:

توازن كمية،
الكمية - خارج الميزانية العمومية والمرتبطة بعلامة المحاسبة الكمية

*************************************************************************************************
الجداول الافتراضية لسجل المحاسبة:

معدل دوران حساب واحد
TurnoversDtKt: التحولات بين بعض الحسابات ، أي جميع المعاملات نفسها للفترة.

*************************************************************************************************
محاسبة العملات على السجلات المحاسبية - كيفية التنفيذ:

نقوم بإنشاء علامة "عملة" محاسبية في مخطط الحسابات.
في سجل المحاسبة ، نقوم أيضًا بإنشاء:
- بعد العملة (حظر القيم الفارغة ، غير الميزانية ، علامة المحاسبة - العملة)
- مورد CurrencyAmount (غير الميزانية العمومية ، علامة المحاسبة - العملة ، سيخزن المبلغ بالعملة ، أي 100 دولار على سبيل المثال)
الجميع.

هكذا هيكل السجل:

قياسات:
- عملة
موارد
- كمية
- المبلغ (المبلغ بالروبل)
- CurrencyAmount (المبلغ بالعملة)

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

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

خلاف ذلك ، لن نحصل على شريحة من الأحدث ، ولكننا نحصل على آخر سجل بقيمة المورد المحدد - قد لا يكون الأخير في مجموعة القياسات

*************************************************************************************************
معنى المورد والسمة في سجل الحساب

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

وقيمة السمة متاحة فقط في الجدول الحقيقي لسجل الحساب ، وهي ليست في الجداول الافتراضية.

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

*************************************************************************************************
تفصيل فترة صلاحية الإجازة حسب الشهر عند كتابة مجموعات سجل السجل ،
إذا تم تحديد الإجازة في المستند في سطر واحد لعدة أشهر دفعة واحدة في سطر واحد:

StartDateCurMonth = StartMonth (CurStringBasicAccruals.ActionPeriodStart) ، EndDateCurMonth = EndMonth (CurStringBasicAccruals.ActionPeriodStart) ، CurrentMonth = التاريخ ؛ حسب التاريخ<= НачалоМесяца(ТекСтрокаОсновныеНачисления.ПериодДействияКонец) Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодДействияНачало = Макс(ДатаНачалаТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияНачало); Движение.ПериодДействияКонец = КонецДня(Мин(ДатаОкончанияТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияКонец)); Движение.ПериодРегистрации = Дата; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаОсновныеНачисления.Подразделение; Движение.Сумма = 0; Движение.КоличествоДней = 0; Движение.График = ТекСтрокаОсновныеНачисления.График; Движение.Параметр = ТекСтрокаОсновныеНачисления.Параметр; Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(Дата, -3)); Движение.БазовыйПериодКонец = КонецДня(КонецМесяца(ДобавитьМесяц(Дата, -1))); ДатаНачалаТекМесяца = НачалоМесяца(ДобавитьМесяц(ДатаНачалаТекМесяца, 1)); ДатаОкончанияТекМесяца = КонецМесяца(ДатаНачалаТекМесяца); КонецЦикла; КонецЕсли;

*************************************************************************************************
بناء مخطط جانت:

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

& إجراء AtClient إنشاء (الأمر) GenerateAtServer () ؛ EndProcedure & AtServer Procedure GenerateAtServer () DG.Clear () ؛ DG.Update = خطأ ، Запрос = Новый Запрос("ВЫБРАТЬ |ОсновныеНачисленияФактическийПериодДействия.Сотрудник, |ОсновныеНачисленияФактическийПериодДействия.ВидРасчета, |ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало КАК ПериодДействияНачало, |ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец КАК ПериодДействияКонец |ИЗ |РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия КАК ОсновныеНачисленияФактическийПериодДействия |ГДЕ |ОсновныеНачисленияФактическийПериодДействия.ПериодДействия МЕЖДУ &ДатаНачала И &ДатаОкончания ") ؛ Query.SetParameter ("StartDate"، Period.StartDate) ؛ Query.SetParameter ("EndDate"، Period.EndDate) ؛ التحديد = Query.Execute (). حدد () ؛ بينما Sample.Next () Loop Point = DG.SetPoint (Selection.Employee) ؛ السلسلة = DG.SetSeries (Selection.Calculation Type) ؛ القيمة = DG.GetValue (نقطة ، سلسلة) ؛ الفاصل الزمني = Value.Add () ، Interval.Start = Sample.PeriodActionStart ؛ Interval.End = Sample.PeriodActionEnd ؛ نهاية الدورة DG.Update = صحيح ؛ EndProcedure

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

*************************************************************************************************
معالجة سجلات "ستورنو" في مهام التسوية:

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

RecordsAdditions = Movements.BasicAccruals.GetAdditions () ، // لا تحتاج إلى تسجيل الحركات للحصول على المكمل

لكل TekLine من حلقة RecordAddition
سجل = Movements.BasicAccruals.Add () ،
FillPropertyValues ​​(سجل ، CurrentString) ،
Record.RegistrationPeriod = CurrentString.RegistrationPeriodStorno ،
Record.ActionPeriodStart = CurrentString.ActionPeriodStartReverse ،
Record.ActionPeriodEnd = CurrentString.ActionPeriodEndReverse ،
نهاية الدورة

وعند حساب السجلات ، أدخل الشيكات:

If CurrentMovement.Reversal ثم
CurrentMovement.Amount = - CurrentMovement.Amount ؛
إنهاء إذا؛

*************************************************************************************************
كيفية تحديد ما يجب تضمينه في الاستحقاقات الرئيسية ، وماذا - للإضافات في مهام الحساب.

لكن هذا ليس واضحًا دائمًا بنسبة 100 ٪ ، فهناك حالات أكثر تعقيدًا ، على الرغم من وجود عدد قليل منها.
(على سبيل المثال ، المكافأة التي تعتمد على عدد أيام العمل في الشهر هي OH).

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

مثال على OH:
- مرتب
- شيء يتم حسابه من عدد أيام العمل (ولهذا تحتاج إلى استخدام جدول): إما في فترة الصلاحية (كمرتب) أو في فترة الأساس

رسوم إضافية:
ما يعتبر إما من المبلغ المستحق ، أو العمل (وليس القاعدة!) الوقت ، أو لا يعتمد على الإطلاق - هذا إضافي. رسوم.

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

أو بعبارة أخرى:

إذا كان RT يستخدم معيارًا زمنيًا ، فيجب تضمين فترة الصلاحية لـ RT.

*************************************************************************************************
إضافة خيار في شكل قائمة للكتاب المرجعي "Nomenclature" القدرة على فتح قسم المساعدة المدمج "العمل مع الكتب المرجعية".

قم بتشغيل الأمر التالي في النموذج:

& AtClient
تعليمات الإجراءات (الأمر)
OpenHelp ("v8help: // 1cv8 / EnterprWorkingWithCatalogs")؛
EndProcedure

يتم تعريف سطر القسم على النحو التالي:
انتقل إلى المعلومات المرجعية لكائن التكوين (في أداة التهيئة) ، واكتب كلمة ، وحددها ، وانتقل إلى قائمة العناصر / الارتباط وحدد القسم المطلوب من تعليمات 1C ، وبعد ذلك يتم إدراج الرابط تلقائيًا. يبدو الأمر معقدًا ، لكنه سهل من الناحية العملية.

*************************************************************************************************
تنفيذ التفاعل بين النماذج ، على سبيل المثال ، الاختيار:

1. من النموذج الحالي ، افتح النموذج المطلوب باستخدام طريقة "OpenForm ()" ، كمعامل ثانٍ نقوم بتمرير البنية بالمعلمات (إذا لزم الأمر). كمعامل ثالث ، يمكننا تمرير رابط لهذا النموذج - ThisForm.

2. في النموذج المفتوح في معالج "OnCreateOnServer ()" ، يمكننا التقاط المعلمات التي تم تمريرها في الخطوة 1 من خلال "Parameters. [ParameterName]". سيكون النموذج الذي أدى إلى فتح هذا النموذج متاحًا من خلال المعرف "المالك" (إذا كان ، بالطبع ، محددًا في الفقرة 1).

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

*************************************************************************************************
دورة حياة معلمات الشكل

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

*************************************************************************************************
باستخدام واجهة تاكسي

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

*************************************************************************************************

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

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

قررت المساهمة ووصف سمات اللغة التي لم يتم تناولها في المقالات أعلاه. المقال موجه للمطورين المبتدئين.

1. البناء "من".

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

اختر الدليل. البنوك. *

يختار جميع الحقول من دليل البنوك. ويشبه الاستعلام:

حدد البنوك. * من الدليل .. البنوك AS البنوك

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

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

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

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

3. الحصول على تمثيل نصي لنوع المرجع. "العرض" البناء.

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

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

4. شرط أخذ عينات البيانات حسب النموذج.

على سبيل المثال ، تحتاج إلى الحصول على الهواتف المحمولة للموظفين من النموذج (8 -123-456-78-912). للقيام بذلك ، تحتاج إلى وضع الشرط التالي في الطلب:

حدد الموظف ، الاسم ، الموظف ، الهاتف كهاتف من الدليل. الموظفون كموظفين حيث الهاتف مثل "_-___-___-__-__"

الحرف "_" هو خدمة ويستبدل أي حرف.

5. الاستخدام المتزامن للمجاميع والتجمعات.


غالبًا ما يتم استخدام الإجماليات جنبًا إلى جنب مع التجميعات ، وفي هذه الحالة يمكن حذف الوظائف التجميعية في الإجماليات.

حدد Services.Organization AS منظمة ، خدمات ، التسمية AS ، مجموع (خدمات. مبلغ المستند) كمستند من المستند ، خدمات مثل خدمات مجموعات حسب الخدمات ، منظمة ، خدمات ، نتائج التسمية حسب عام ، منظمة ، تسمية

في هذه الحالة ، سيعود الطلب تقريبًا مثل هذا الطلب:

اختر الخدمات ، المنظمة AS ، التنظيم ، الخدمات ، التسمية AS التسمية ، الخدمات ، مبلغ المستند AS مبلغ المستند من المستند.

سيؤدي الاستعلام الأول فقط إلى طي السجلات التي لها نفس التسمية.

6. الحقول المشتقة.

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

طلب:

يمكن تمثيلها على النحو التالي:

حدد الدفع ، الرابط ، الدفع ، المنظمة ، الدفع ، المنظمة ، المنظمات. الوحدة الإدارية من Document.Payment AS طريقة الدفع LEFT JOIN Directory.Organizations AS Organization Software Payment.Organization = Organization.Link

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

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

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

يجب أن تحد من نوع مسجل الحقل المركب:

حدد EXPRESS (المدفوعات غير المخصصة. المسجل كمستند. الدفع). التاريخ ، ..... من سجل التراكم. المدفوعات غير المخصصة كمدفوعات غير مخصصة

7. البناء "أين"

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

مثال. من الضروري تحديد جميع العملاء من دليل العميل وبالنسبة للعملاء الذين لديهم مستند دفع بقيمة السمة "Organization" = & Organization ، قم بعرض مستند "الدفع" ، بالنسبة لأولئك الذين لا يقومون بعرضه.

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

حدد Payment.Reference as payment. ////////////////////////////////////////////////////// / ////////////////////////////// SELECT Clients.Reference AS Client، ISNULL (topayments.Payment، "") AS Payment FROM الدليل. العملاء AS Clients LEFT JOIN

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

حدد Clients.Reference، Payment.Reference FROM Directory.US_Subscribers AS ST_Subscribers LEFT JOIN Document.Payment AS Payment SOFTWARE (Clients.Reference = Payment.Client AND Payment.Client.Name LIKE "Sugar Bag") GROUP by Clients.Reference، Payment. وصلة

8. ينضم مع الجداول المتداخلة والظاهرية

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

على سبيل المثال ، نحتاج إلى الحصول على مبلغ الرصيد للتاريخ الحالي لبعض العملاء.

حدد UnallocatedPayBalances.Customer، UnallocatedPaymentsRemains.AmountBalance FROM (حدد العملاء ، قم بالإشارة إليه كمرجع من الدليل.

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

حدد Clients.Link AS ارتباط وضع العملاء من الدليل. العملاء كعملاء حيث
Clients.Link B (العملاء) ؛ ////////////////////////////////////////////////////// / ////////////////////// SELECT tClients.Reference، UnallocatedPaymentsBalances.SumBalance، from tClients AS tClients LEFT JOIN Accumulation Register. tClients.Reference from tClients)) AS UnallocatedPaymentsBalances ON tClients.Reference = UnallocatedPaymentsBalances.Clients

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

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

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

حدد Clients.Link كربط وضع العملاء من الدليل. العملاء كعملاء فهرس حسب الارتباط حيث
Clients.Link B (العملاء) ؛ ////////////////////////////////////////////////////// / ////////////////////////////// SELECT UnallocatedPayments.AmountBalance، UnallocatedPayments.Customer as Customer PUT the Balance of Accumulation Register.UnallocatedPayments. أرصدة (، العميل في (حدد tClients.Reference من tClients)) AS UnallocatedPaymentsBalances ؛ ////////////////////////////////////////////////////// / ////////////////////////////// حدد tClients.Reference، thenRemains.SumRemainder AS SumRemainder FROM tClients AS tClients.Reference = tRemainders .عميل

9. التحقق من نتيجة الاستعلام.

قد تكون نتيجة تنفيذ الاستعلام فارغة ؛ للتحقق من القيم الفارغة ، استخدم الإنشاء:

RequestRes = Request.Execute () ، إذا reQuery.Empty () ثم إرجاع ؛ إنهاء إذا؛

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

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

طلب = طلب جديد ؛ Query.Text = "SELECT | Clients.Link، | Clients.Date of Birth | FROM | Directory.Clients AS Clients | WHERE | Clients.Link = & Client" ؛ لكل صف من TableClients Loop Query.SetParameter ("العميل" ، العميل) ؛ QueryResult = Query.Execute (). حدد () ، نهاية الدورة

سيوفر هذا النظام من تحليل الطلب في حلقة.

11. البناء "HAVING".

بناء نادر جدًا في الاستعلامات. يسمح لك بفرض شروط على قيم الدوال المجمعة (SUM ، MINIMUM ، AVERAGE ، إلخ). على سبيل المثال ، تحتاج إلى تحديد هؤلاء العملاء فقط الذين تجاوز مبلغ دفعهم في سبتمبر 13000 روبل. إذا كنت تستخدم شرط "WHERE" ، فسيتعين عليك أولاً إنشاء جدول مؤقت أو استعلام متداخل ، وتجميع السجلات هناك حسب مبلغ الدفع ثم فرض شرط. سيساعد البناء "HAVING" على تجنب ذلك.

حدد الدفع ، العميل ، المبلغ (السداد ، المبلغ) كمبلغ من المستند ، الدفع كدفعة شهرية (تاريخ الدفع) = 9 مجموعات مدفوعة ، العميل لديه مبلغ (دفعة ، المبلغ)> 13000

في المنشئ ، كل ما عليك فعله هو الانتقال إلى علامة التبويب "الشروط" وإضافة شرط جديد وتحديد مربع الاختيار "مخصص". ثم اكتب فقط المبلغ (المبلغ المدفوع)> 13000


12. قيمة لاغية

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

لنلقي نظرة على مثال.

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

حدد "لا مدفوعات" كسمة ، NULL AS المستند PUT للمدفوعات ؛ ////////////////////////////////////////////////////// / /////////////////////////////// SELECT Clients.Link AS Client، Payment.Link AS الدفع وضع tClientPayment من الدليل. العملاء AS LEFT LEFT JOIN Document.Payment AS عملاء برامج الدفع. Link = Payment.Shareholder؛ ////////////////////////////////////////////////////// / /////////////////////////////// SELECT tClientPayment.Customer FROM tClientPay AS tClientPayment INTERNAL JOIN topayments AS topayments بواسطة tClientPayment.Payment = topayments. وثيقة

انتبه إلى الجدول المؤقت الثاني tCustomerPayment. بالضم الأيسر ، أحدد جميع العملاء وجميع المدفوعات لهؤلاء العملاء. بالنسبة للعملاء الذين ليس لديهم مدفوعات ، سيكون حقل "الدفع" فارغًا. باتباع المنطق ، في الجدول المؤقت الأول "topayments" قمت بتعيين حقلين ، أحدهما فارغ ، والثاني هو السطر "ليس له مدفوعات". في الجدول الثالث ، انضممت إلى جدولي "tClientPayment" و "tPayment" بواسطة حقلي "الدفع" و "المستند" بربط داخلي. نعلم أنه في الجدول الأول ، يكون حقل "المستند" فارغًا ، وفي الجدول الثاني يكون أولئك الذين ليس لديهم مدفوعات في حقل "الدفع" فارغًا أيضًا. ما الذي سيعيد لنا مثل هذا الاتصال؟ ولن يعيد أي شيء. لأن المقارنة NULL = NULL لا يتم تقييمها إلى True.

لكي يعيد الاستعلام النتيجة المتوقعة إلينا ، نعيد كتابتها:

حدد "لا توجد مدفوعات" AS تسجيل ، VALUE (مستند. دفع. مرجع فارغ) كوثيقة PUT to Payments ؛ ////////////////////////////////////////////////////// / /////////////////////////////// SELECT Clients.Reference AS Client، ISNULL (Payment.Reference، VALUE (Document.Payment .EmptyReference)) كيفية وضع tClientPayment من Directory.Clients مثل Clients LEFT JOIN Document.Payment AS Payment ON Clients.Reference = Payment.Shareholder؛ ////////////////////////////////////////////////////// / /////////////////////////////// SELECT tClientPayment.Customer FROM tClientPay AS tClientPayment INTERNAL JOIN topayments AS topayments بواسطة tClientPayment.Payment = topayments. وثيقة

الآن ، في الجدول المؤقت الثاني ، أشرنا إلى أنه إذا كان حقل "الدفع" فارغًا ، فإن هذا الحقل = مرجع فارغ لمستند الدفع. في الجدول الأول ، قمنا أيضًا باستبدال NULL بمرجع فارغ. يتم الآن تضمين الحقول غير الفارغة في الاتصال وسيعيد الاستعلام النتيجة المتوقعة.

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

13. ميزة التصميم غير الموثقة "اختر متى ... ثم ... النهاية".

في حالة ضرورة وصف بنية "الشروط" في الطلب ، فإننا نستخدم الصيغة القياسية:

حدد الاختيار WHEN Users.Name = "Vasya Pupkin" ثم "موظفنا المفضل" ELSE "لا نعرف هذا" END AS Field1 من Directory.Users AS Users

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

حدد الشهر (US_Consumption Calculation_Turnover Schedule.Calculation Period) عند 1 ثم "يناير" عند 2 ثم "فبراير" عند 3 ثم "مارس" عند 4 ثم "أبريل" عند 5 ثم "مايو" عند 6 ثم "يونيو" عند 7 ثم " يوليو "عند 8 ثم" أغسطس "عند 9 ثم" سبتمبر "عند 10 ثم" أكتوبر "عند 11 ثم" نوفمبر "عندما ينتهي" ديسمبر "12 بعد ذلك بشهر

الآن لا يبدو التصميم مرهقًا ويمكن إدراكه بسهولة.

14. تنفيذ الاستعلام دفعة.


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

حدد Users.Link AS الاسم ، Users.Date الميلاد ، Users.Role أدخل المستخدمين من Directory.Users AS Users ؛ ////////////////////////////////////////////////////// / /////////////////////////////// SELECT tuUsers.Name، tuUsers. تاريخ الميلاد من tuUsers AS tuUsers GROUP BY tuUsers. الاسم ، المستخدم ، تاريخ الميلاد ، ////////////////////////////////////////////////////// / /////////////////////////////// حدد wUsers.Name ، wUsers.Role FROM wUsers AS wUsers GROUP BY wUsers.Name ، تاريخ الميلاد

tPackage = Request.ExecutePackage () ،

TP_BirthDate = tPackage.Unload () ،
TP_Roles = tPackage.Unload () ،

كما نرى ، يمكن تنفيذ الاستعلام دفعة واحدة والعمل مع النتيجة كمصفوفة. في بعض الحالات ، مريحة للغاية.

15. الشروط في طلب دفعة

على سبيل المثال ، لدينا طلب مجمّع ، حيث نحصل أولاً على الحقول: "الاسم ، وتاريخ الميلاد ، والرمز" من دليل "المستخدمون" ونريد الحصول على سجلات بشرط في هذه الحقول من دليل "الأفراد".

حدد Users.Individual.Name AS الاسم والمستخدمين. ////////////////////////////////////////////////////// / //////////////////////////////// حدد الأفراد.ربط كأفراد من الدليل. الأفراد كأفراد

يمكنك تطبيق شروط مثل هذا:

أين الأفراد. كود في (اختر TueUsers.Code من TuUsers) والأفراد. الاسم في (حدد TueUsers.Code من TuUsers) والأفراد. تاريخ الميلاد في (حدد TueUsers. تاريخ الميلاد من TuUs)

وهذا ممكن مثل هذا:

أين (الأفراد ، الكود ، الأفراد ، الاسم ، الأفراد ، تاريخ الميلاد) في (اختر TueUsers.Code ، TueUsers.Name ، TueUsers ، TueUsers ، the Birth from TueUsers)

وتأكد من اتباع القواعد.

16. Call Query Builder عن "الشرط" في استعلام الدُفعة

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

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

غالبًا ما يتم اختلاق الاستعلامات أثناء التنقل وتعمل فقط على عرض "الحيل" التي كنت أفكر فيها.

كنت أرغب في التفكير في استخدام الفهارس في الاستعلامات ، لكنه موضوع واسع بشكل مؤلم. سأضعه في مقال منفصل ، أو سأضيفه هنا لاحقًا.

محدث 1. الفقرات 11 ، 12
تحديث 2. البنود 13،14،15،16

كتب مستخدمة:
1C: لغة استعلام Enterprise 8 - E.Yu. خروستاليف
التطوير المهني في نظام 1C: Enterprise 8.

عند تنظيم العينات في مشاكل حقيقية ، في الغالبية العظمى من الحالات ، يتم تنظيم اختيار البيانات وفقًا لمعايير معينة.

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

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


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

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

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

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

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

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

ما هو الفرق بين قيم معامل الجدول الظاهري "طريقة الإلحاق"؟
عندما يتم تعيين ComplementMethod على "الحركات" ، سيتم إرجاع الفترات التي كانت فيها تحركات فقط. عند تعيين "حدود الحركات والفترة" ، سيتم إضافة سجلين إلى الحركات المذكورة أعلاه: الحركات في بداية ونهاية الفترة المحددة في معلمات BT. سيكون حقل "المسجل" فارغًا لهذين السجلين.

المعلومات مأخوذة من الموقع

سجلات التراكمفي 1C: ينقسم نظام المؤسسة إلى نوعين: سجلات التراكم بقايا الطعاموسجلات التراكم الثورات.

يتم تحديد نوع السجل عند إنشائه في أداة التهيئة

كما يوحي الاسم ، تم تصميم بعضها لتلقي أرصدة لتاريخ معين ، والثاني لتلقي معدل دوران لفترة محددة. اعتمادًا على نوع سجل التراكم ، تنشئ منصة 1C: Enterprise مجموعة مختلفة من الجداول الافتراضية. في هذه المقالة ، سننظر في العمل مع جداول افتراضية لسجلات التراكم. للقيام بذلك ، سننشئ سجلاً لتراكم الأرصدة - السلع البقاياوسجل تراكم رقم الأعمال - دوران البضائع.

الآن دعونا نلقي نظرة على الجداول الافتراضية التي توفرها المنصة لكل من هذه السجلات.

سجل دوران

للتوضيح ، دعنا نفتح ونرى الجداول المتاحة للتسجيل دوران البضائع. هذا هو جدول السجل نفسه - دوران البضائع، الموجود فعليًا في قاعدة البيانات ، وجدول افتراضي واحد - دوران البضائع

كل شيء واضح مع الجدول القياسي. دعونا نلقي نظرة فاحصة على الواقع الافتراضي.

تحولات الجدول الافتراضي

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

دع سجلنا يحتوي على الإدخالات التالية

دعنا نعود إلى منشئ الاستعلام ونبدأ بمجرد الاختيار من الجدول دوران البضائعجميع المجالات

وفقًا لذلك ، سيبدو الطلب على النحو التالي:

اختر السلع ، التحولات ، التحولات.

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

أي أننا تلقينا معدل دوران في سياق البضائع والمستودعات طوال الوقت. لنفترض أننا لسنا مهتمين بالمستودعات ونريد الحصول على معدل دوران فقط في سياق البضائع.

للقيام بذلك ، استبعد البُعد من الاستعلام مخزون

اختر السلع ، التحولات ، التحولات ، المنتج ، السلع ، التحولات ، التحولات ، الكمية ، التحولات من السجل ، التراكم ، السلع ، التحولات ، التحولات (،) السلع ، التحولات ، التحولات

ونتيجة لذلك سيكون لدينا سطرين فقط

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

بعد ذلك ، سيأخذ استعلامنا الأصلي الشكل التالي

اختر السلع

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

بالنسبة لأولئك الذين بدأوا للتو في العمل مع الجداول الافتراضية ، غالبًا ما يكون من المغري ضبط التحديد بالطريقة المعتادة بدلاً من استخدام المعلمات:

من سجل التراكم ، السلع ، التحولات ، التحولات (،) البضائع

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

بعد ذلك ، نلاحظ أن حقلاً ظهر في حقول الجدول فترة.

بإضافته إلى الحقول المحددة ، نحصل على نص الاستعلام التالي:

اختر السلع ، التحولات ، التحولات ، الفترة ، السلع ، التحولات ، التحولات ، المستودعات ، السلع ، التحولات ، التحولات ، المنتجات ، السلع ، التحولات ، التحولات ، الكمية ، التحولات من سجل التراكم ، السلع ، التحولات ، التحولات (، الشهر ،) السلع ، التحولات ، التحولات

نقوم بتنفيذ الطلب:

وبالتالي ، خلال الفترة الزمنية المحددة ، يمكننا تقسيم معدل الدوران إلى فترات زمنية أصغر وفقًا للتردد المحدد.

سجل تراكم الرصيد

تمامًا كما هو الحال مع السجل العكسي ، دعنا نرى في منشئ الاستعلام الجداول الافتراضية المتاحة لسجل تراكم الرصيد

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

تحولات الجدول الافتراضي

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

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

أرصدة الجدول الظاهري

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

لنفكر في مثال صغير. لدينا إدخالات التسجيل التالية:

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

حدد GoodsRemainsRemains.Warehouse ، GoodsRemainsRemains.Product ، GoodsRemainsRemains.Quantity التوازن من سجل التراكم.

وبعد تنفيذها نحصل على النتيجة التالية

طاولة افتراضية

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

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



تحميل...
قمة