ابحث عن عمود في جدول القيم 1s. من المهم عدم الخلط بين خاصية الكائن وبين طريقة الكائن.

إليك حقيقة بسيطة للبدء - أمثلة بسيطة للعمل مع جدول القيم:

1. قم بإنشاء جدول للقيم

ValueTable = New ValueTable ؛


2. إنشاء أعمدة في جدول القيم:

ValueTable.Columns.Add ("الاسم") ،
ValueTable.Columns.Add ("اسم العائلة") ؛


3. أضف صفوفًا جديدة باستخدام أسماء الأعمدة:


NewString.Name = "فاسيلي" ؛
NewRow.LastName = "Pupkin" ؛


4. كيفية البحث عن قيمة في جدول القيمة:
من الضروري العثور على صف جدول يحتوي على القيمة المطلوبة.

FoundString = ValueTable.Find (LookupValue) ،


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

FoundString = ValueTable.Find (LookupValue، "المورد ، المشتري") ؛


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

SearchStructure = الهيكل ("الموظف" ، LookupValue) ؛
ArrayFoundStrings = ValueTable.FindStrings (SearchStructure) ،


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

7. كيفية التكرار من خلال جدول القيم بترتيب عشوائي

لكل CurrentRow من ValueTable Loop
تقرير (CurrentLine.Name) ؛
نهاية الدورة

افعل الشيء نفسه باستخدام الفهارس:

SeniorIndex = ValueTable.Count () - 1 ؛
بالنسبة إلى MF = 0 من خلال دورة SeniorIndex
تقرير (ValueTable [Count] .Name) ؛
نهاية الدورة


8. حذف صف جدول قيمة موجود

ValueTable.Delete (RemoveRow) ،

حسب الفهرس

ValueTable.Delete (0) ،


9. حذف عمود موجود من جدول القيم

ValueTable.Columns.Delete (RemoveColumn) ،


حسب الفهرس

ValueTable.Columns.Delete (0) ،

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

10. كيف تملأ جدول القيم إذا كانت أسماء الأعمدة واردة في متغيرات؟

NewRow = ValueTable.Add () ،
NewRow [ColumnName] = القيمة ؛


11. كيف تملأ العمود بالكامل من جدول القيم بالقيمة المطلوبة؟
يجب ملء عمود FiscalAccounting Flag في جدول القيم لجدول القيمة بالقيمة False

ValueTable.FillValue (False، "Fiscal Accounting Flag") ؛


نستخدم طريقة FillValues ​​() لجدول القيم. المعلمة الأولى هي القيمة المراد تعبئتها. المعلمة الثانية هي اسم العمود المعبأ.

12. كيف يتم تعبئة جدول القيم "TableRecipient" ببيانات جدول القيم "SourceTable"؟

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

TableReceiver = TableOriginal.Copy () ،


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

نقل البيانات الجزئي للأعمدة ذات الأسماء المتطابقة:

لكل صف من SourceTable من حلقة SourceTable
FillPropertyValues ​​(NewString ، SourceTableString) ،
نهاية الدورة


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

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

نسخة كاملة من البيانات للأعمدة ذات الأسماء المتطابقة

مماثلColumns = New Array () ،

لكل عمود من SourceTable.Columns Loop
MatchingColumn = TableReceiver.Columns.Find (Column.Name) ،

إذا كان متطابقا<>غير محدد ثم

// احصل على خصائص العمود.
الاسم = Column.Name ؛
ValueType = Column.ValueType ،
العنوان = Column.Title ؛
العرض = Column.Width ؛

// استبدال الأعمدة في الجدول الوجهة.
الفهرس = TableReceiver.Columns.Index (CoincidentColumn) ،

TableReceiver.Columns.Delete (فهرس) ؛
TableReceiver.Columns.Insert (الفهرس ، الاسم ، نوع القيمة ، العنوان ، العرض) ؛

// أضف الاسم التالي للأعمدة المتطابقة إلى المصفوفة.
نفس nameColumns.Add (Column.Name) ،

إنهاء إذا؛

نهاية الدورة

// التكرار خلال صفوف الجدول المصدر.
لكل صف من SourceTable من حلقة SourceTable

// أضف صفًا جديدًا إلى الجدول الوجهة.
NewString = TableReceiver.Add () ،

// املأ القيم في الخلايا المطابقة.
لكل NameColumns من نفس NameColumns Loop
NewString [ColumnName] = SourceTableString [ColumnName] ؛

نهاية الدورة

نهاية الدورة


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

13. كيفية إضافة أعمدة إلى جدول القيم "جدول القيم" مع قيود النوع؟

عند إضافة عمود ، يمكنك ببساطة تحديد اسمه ، ولا تلمس المعامل الثاني لطريقة Add (). في هذه الحالة ، يكون نوع بيانات العمود تعسفيًا.

إضافة عمود بدون تحديد نوع البيانات

// إضافة عمود بدون قيود على النوع.
ValueTable.Columns.Add ("كائن") ،


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

إضافة عمود يحدد نوع البيانات

// القيود على أنواع بيانات العمود:
// فقط عناصر دليل "المقاولون".
ValueTable.Columns.Add ("الحساب" ، وصف نوع جديد ("ReferenceReference.Accounts")) ؛


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

استخدام المؤهلات لتحديد نوع البيانات لعمود جدول القيمة

// تحضير وضبط حدود لبيانات نوع السلسلة.
مؤهلات السلسلة = مؤهلات السلسلة الجديدة (20 ، ValidLength.Variable) ؛
AllowedTypes = NewTypeDescription ("String"، StringQualifiers) ؛
ValueTable.Columns.Add ("NoteStringShort"، ValidTypes) ،


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

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

// امتداد الوصف المستخدم مسبقًا للأنواع.
مؤهلات الأرقام = مؤهلات رقم جديد (10 ، 2 ، علامة صالحة ، غير سلبية) ؛
DateQualifiers = DateQualifiers جديد (DateParts.Date) ،
ExtendedValidTypes = NewTypeDescription (ValidTypes، "Number، Date"، NumberQualifiers، DateQualifiers) ؛

ValueTable.Columns.Add ("ملاحظة" ، ExtendedAllowedTypes) ،

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

ميزات المهمة.

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

FormElements.TableField.CreateColumns () ،

لتلقي جدول القيم الجاهز في النموذج. يبدو أنه يمكن أن يكون أسهل.

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

حل المشكلة.

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

يتم إنشاء جدول في النموذج من خلال وصف جدول القيم كسمة:
ArrayChoiceType = صفيف جديد ؛ ArrayChoiceType.Add (Type ("ValueTable")) ؛ ChoiceTypeDescription = New ChoiceTypeDescription (ChoiceTypeArray) ؛ ArrayAttributes = صفيف جديد ؛ ArrayAttributes.Add (New FormAttribute ("ScheduleTable"، ChoiceTypeDescription، ""، "TRN")) ؛ الآن علينا إنشاء جدول قيمة برمجي يحتوي على البيانات. إذا تم الحصول على جدول القيم من استعلام ، فسيكون كل شيء بالترتيب أكثر أو أقل. إذا تم إنشاء الجدول يدويًا ، فيمكن إنشاء قيمة الأعمدة التي ستحتوي على أرقام أو تواريخ من خلال "وصف الأنواع". خلاصة القول هي أن الأعمدة في جدول القيمة يجب أن يكون لها نوع ما. على سبيل المثال ، إذا كان من المفترض أن يقوم المستخدم بملء البيانات في هذه الأعمدة بشكل تفاعلي ، فلا يمكنك إضافة عمود جدول قيم باسم بسيط ، يجب أن يكون له نوع. ضع في اعتبارك - هذا مهم للغاية. سننقل هذه الأنواع إلى الجدول الموجود في النموذج.
قم بإنشاء جدول يحتوي على عدة أعمدة:
القرص المضغوط = DateQualifiers جديد (DateParts.Time) ، ArrayCD = صفيف جديد ؛ ArrayKD.Add (النوع ("التاريخ")) ؛ TypeDescriptionTime = New TypeDescription (ArrayKD، KD) ؛ TK = جدول جديد للقيمة ؛
TK.Columns.Add ("From"، TypeDescriptionTime) ؛
TK.Columns.Add ("Before" ، TypeDescriptionTime) ؛
TK.Columns.Add ("الاسم") ؛
TK.Columns.Add ("Note") ؛ // الاسم والملاحظة - السلاسل بعد ذلك ، سنملأ جدول برنامجنا TK بالبيانات اللازمة. نحصل على جدول للمعارف التقليدية يحتوي على القيم الضرورية ويكون جاهزًا للنقل إلى سمة النموذج المُنشأ. لكل عمود من TK.Column Loop

ArrayAttributes.Add (New FormAttribute (Column.Name، Column.ValueType، "ScheduleTable")) ؛
نهاية الدورة.
ChangeAttributes (ArrayAttributes) ،
SelectionFieldTable = Elements.Add ("TZN" ، النوع ("FormTable")) ؛
SelectionFieldTable.DataPath = "ScheduleTable" ؛
SelectionFieldTable.Display = DisplayTable.List ،

هنا مزيج بسيط وطاولتنا جاهزة.

لكل عمود من TK.Column Loop

NewElement = Elements.Add (Column.Name ، النوع ("FormField") ، ChoiceFieldTable) ؛
NewItem.View = FormFieldView.InputField ؛
NewItem.DataPath = "ScheduleTable." + العمود. الاسم ؛
NewElement.Width = 10 ؛
نهاية الدورة.

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

ChoiceFieldTable.SetAction ("الاختيار" ، "TCChoice") ؛

للتعامل مع هذا الحدث في شكل إجراء ، يتم كتابة إجراء منفصل:

& AtClient
الإجراء TSNS select (TK ، SelectedRow ، Field ، StandardProcessing)
// معالج أوامر EndProcedure

لاحظ أن معالجات الجدول تطلق على العميل وبالتالي يجب أن يكون لها أمر مؤشر مترجم

& AtClient

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

ValueVFormAttribute (TK، "جدول الجدول") ،

هذا ما لدينا نتيجة لذلك:


وإليك طريقة التعامل مع حدث "Select":



خاتمة.

آمل أن تساعد المقالة هؤلاء المبرمجين 1C الذين بدأوا في إنشاء جداول على النموذج برمجيًا.

يمكنك تنزيل معالجة تقوم برمجيًا بإنشاء جدول قيم ومخرجات إلى نموذج مُدار مع التعليقات لمساعدتك في إنشاء الجداول الخاصة بك.

هناك طريقتان خاصتان للبحث في جدول القيم:

1. البحث

TVHorizon = Directories.Nomenclature.FindBy Name ("Horizon TV") ؛
FoundString = TZNomenclature.Find (TVHorizon) ،
// يمكننا أيضًا تحديد الأعمدة التي يجب البحث فيها لتسريع البحث
FoundString = TKNomenclature.Find (TVHorizon، "Nomenclature") ؛

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

لكي لا تعاني مثل هذا ، هناك الطريقة التالية ، والتي تتيح لك العثور على مجموعة من السلاسل المناسبة:

2. FindStrings


هيكل الاختيار. إدراج ("التسمية" ، TVHorizon) ؛ // أولاً نحدد العمود الذي سيتم البحث فيه ، ثم ما الذي نبحث عنه.

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

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


SelectionStructure = هيكل جديد ؛
هيكل الاختيار. إدراج ("التسمية" ، TVHorizon) ؛
هيكل الاختيار. أدخل ("الكمية" ، 10) ؛
FoundStringArray = TKNomenclature.FindStrings (SelectionStructure) ،

السلبية الوحيدة ، كما ترى ، لا يمكنك استخدام أنواع أخرى من المقارنة غير "متساوية"

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

يسرد جدول واحد البضائع التي سيتم شحنها من المستودع. في جدول آخر - واجب دفع ثمن هذه البضائع.

لذلك ، في 1C ، يحتل العمل مع الجداول مكانًا بارزًا.

تسمى الجداول الموجودة في 1C أيضًا "أجزاء الجدول". الكتب المرجعية والوثائق وغيرها لديهم.

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

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

// الخيار 1 - الوصول التسلسلي إلى نتائج الاستعلام

// الحصول على طاولة
التحديد = Query.Execute (). حدد () ؛
// تجاوز كل صفوف نتيجة الاستعلام بالترتيب
أثناء التحديد. التكرار التالي ()
تقرير (Selection.Name) ؛
نهاية الدورة

// الخيار 2 - التحميل إلى جدول القيم
Query = استعلام جديد ("SELECT Name FROM Directory.Nomenclature") ؛
// الحصول على طاولة
الجدول = Query.Execute (). Upload ().
// ثم يمكننا أيضًا تجاوز جميع الأسطر
لكل صف من Table Loop
تقرير (String.Name) ؛
نهاية الدورة
// أو الوصول إلى السلاسل بشكل تعسفي
String = Table.Find ("مجرفة" ، "الاسم") ؛

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

جدول على النموذج (عميل سميك)

يتعامل المستخدم مع الجدول عند وضعه في النموذج.

لقد ناقشنا المبادئ الأساسية للعمل مع النماذج في الدرس في وفي الدرس

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

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

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

عند اختيار جزء جدولي ، سيضيف 1C نفسه أعمدة إلى الجدول في النموذج. سيتم حفظ السلاسل التي أدخلها المستخدم في هذا الجدول تلقائيًا مع الدليل / المستند.

في نفس خاصية البيانات ، يمكنك إدخال اسم عشوائي وتحديد نوع ValueTable.

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

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

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

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

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

جدول في النموذج (عميل رفيع / مُدار)

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

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

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

ثم اسحب الجدول أيضًا إلى اليسار.

لكي يحتوي الجدول على شريط أوامر ، في خصائص الجدول ، حدد القيم في قسم الاستخدام - موضع شريط الأوامر.

تصدير جدول إلى Excel

يمكن طباعة أي جدول 1C موجود في النموذج أو تحميله إلى Excel.

للقيام بذلك ، انقر بزر الماوس الأيمن فوق مساحة فارغة في الجدول وحدد إظهار القائمة.

في عميل مُدار (رفيع) ، يمكن تنفيذ إجراءات مماثلة باستخدام عنصر القائمة كل الإجراءات / قائمة العرض.

تم النشر في 21 سبتمبر 2011

جدول القيم 1C - الجزء 3. البيانات الوصفية. التكرار على أعمدة جدول القيم

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

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

لذلك ، دعنا ننشئ جدول اختبار لقيم 1C ونملأه:

MyTR = جدول جديد للقيمة ؛ // إنشاء جدول جديد للقيم المخزنة في متغير "MyTR" MyTR.Columns.Add ("اسم العائلة") ؛ // إنشاء العمود "اسم العائلة" MyTR.Columns.Add ("الاسم الأول") ؛ // إنشاء عمود "الاسم" MyTM.Columns.Add ("Patronymic") ؛ // أنشئ عمود "الاسم الأوسط" // أضف الصف الأول إلى جدول القيم لدينا NewRow = MyТЗ.Add () ؛ NewLine.S العائلة = "Chapaev" ؛ NewString.Name = "فاسيلي" ؛ NewString.Patronymic = "إيفانوفيتش" ؛ // أضف السطر الثاني NewLine = MyТЗ.Add () ؛ NewLine.Lastname = "Dzerzhinsky" ؛ NewString.Name = "فيليكس" ؛ NewLine.Patronymic = "Edmundovich" ؛ // أضف السطر الثالث NewLine = MyTR.Add () ؛ NewRow.LastName = "Kotovsky" ؛ NewString.Name = "جريجوري" ؛ NewString.Patronymic = "إيفانوفيتش" ؛

يتكون جدول الاختبار الخاص بنا من ثلاثة أعمدة: الاسم الأول ، والاسم الأخير ، والعائلة ؛ وله ثلاثة أسطر مكتملة بأسماء أبطال الحرب الأهلية.

يتكرر نموذج الكود الأول عبر أعمدة جدول القيمة 1C كمجموعة.

// عرض أسماء جميع أعمدة المعارف التقليدية لكل عمود من حلقة الإخطار الخاصة بأعمدة المعارف التقليدية ("اسم العمود:" + Column.Name) ؛ نهاية الدورة

ستعرض الحلقة الخاصة بنا جميع أسماء الأعمدة في مربع رسالة 1C:

اسم العمود: اسم العائلة اسم العمود: الاسم الأول اسم العمود: الاسم الأوسط

نرى أنه يتم استخدام حلقة مجموعة خاصة للتكرار خلال الأعمدة ، على غرار حلقة تكرار الصف (في المقالة الأخيرة). MyTM.Columns- هذه مجموعة من أعمدة جدول القيم 1C "MoyaTZ". تحتوي المجموعة على كائنات من النوع "ColumnValueTable"كل كائن من هذا النوع هو عمود في جدول القيم ويحتوي على خصائص وطرق. بالإشارة إلى هذه الخصائص والطرق ، نحصل على المعلومات اللازمة حول عمود واحد أو نقوم ببعض الإجراءات الأخرى معه.

على سبيل المثال ، الوصول إلى الممتلكات "اسم" (اسم العمود) نحصل على اسم العمود الحالي.

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

// طباعة أسماء جميع أعمدة المعارف التقليدية لكل عمود MyCurrentColumn من MyTK.Columns Notify Loop ("اسم العمود:" + MyCurrentColumn.Name) ؛ نهاية الدورة

عندما يواجه النظام الفرعي للتنفيذ 1C دورة من هذا النوع ، في كل مسار للدورة ، فإنه يخصص عنصرًا واحدًا من مجموعتنا إلى المتغير بالاسم المحدد ، في هذه الحالة - عنصر واحد من المجموعةأعمدة جدول القيمة MyTM.Columnsثم نشير إلى المتغير الذي يحتوي على العمود الحالي ، ونستخدم الخاصية "اسم".

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

// عرض عدد وأسماء جميع أعمدة جدول القيم لكل عمود من MyTR.Columns LoopColumnNumber = MyTR.Columns.Index (العمود) ؛ // احصل على رقم العمود ColumnName = Column.Name ؛ // الحصول على تقرير اسم العمود ("رقم العمود:" + رقم العمود + "اسم العمود:" + اسم العمود) ؛ نهاية الدورة

سيتم عرض النص في مربع رسالة 1C:

رقم العمود: 0 اسم العمود: اسم العائلة رقم العمود: 1 اسم العمود: الاسم الأول رقم العمود: 2 اسم العمود: الاسم الأوسط

دعنا ننتبه إلى حقيقة أن الأعمدة في جدول القيم 1C مرقمة بدءًا من الصفر ، تمامًا مثل صفوف جدول القيم.

عدد الأعمدة في جدول القيم 1C

لمعرفة عدد الأعمدة في جدول القيمة ، نستخدم طريقة "Number ()" في مجموعة الأعمدة.

عدد الأعمدة = MyTM.Columns.Number () ، تقرير (عدد الأعمدة) ؛

سيتم عرض الرقم "3" على الشاشة. في الواقع ، يوجد في جدولنا ثلاثة أعمدة: "اسم العائلة" ، "الاسم الأول" ، "اسم العائلة"

الحصول على كائن عمود برقمه (الفهرس) والتكرار على الأعمدة باستخدام فهرس العمود

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

لـ SC = 0 By MyTM.Columns.Quantity () - 1 Loop CurrentColumn = MyTM.Columns [SC] ؛ إعلام (CurrentColumn.Name) ؛ نهاية الدورة

على الشاشة سوف نحصل على ما يلي

الاسم الكامل

أعتقد أن هذا المثال كان واضحًا. لجأنا إلى الطريقة كمية()مجموعات الأعمدة " MyTM.Columns.Quantity ()"، وحصل على عدد الأعمدة ، وبدأ حلقة مع عداد من صفرقبل عدد الأعمدة ناقص واحد. داخل الحلقة ، نحصل على كل عمود من مجموعة الأعمدة ونخصص كائن العمود الحالي إلى متغير CurrentColumnبعد ذلك ، المتغير CurrentColumnنصل إلى العقار اسموعرض قيمة هذه الخاصية على الشاشة: إعلام (CurrentColumn.Name) ؛

من المهم عدم الخلط بين خاصية الكائن وبين طريقة الكائن.

الخاصية هي نوع من القيمة الثابتة والوصول إليها مكتوب بدون أقواس ، على سبيل المثال CurrentColumn.Name. الطريقة هي في الأساس إجراء أو وظيفة لكائن ، ودائمًا ما تكتب دعوات الإجراءات والوظائف بأقواس (حتى لو لم تكن هناك معلمات إدخال). على سبيل المثال: MyTM.Columns.Quantity ()

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

هذا ما سيكتبه المترجم الفوري إذا نسيت وضع الأقواس في استدعاء طريقة بطريقة خاطئة MyTM.Columns. الكمية(بدون أقواس بعد "الكمية ()"):

لم يتم العثور على حقل الكائن (العدد)

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

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

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

FirstLine = MyTR ، // احصل على الصف الأول (ترقيم من الصفر) ColumnFirstValue = RowFirst ؛ // احصل على قيمة العمود الأول (ترقيم العمود هو أيضًا من الصفر) تقرير (FirstColumnValue) ؛ // عرض قيمة العمود الأول في الصف الأول من الجدول

ستعرض الشاشة:

تشاباييف

حصلنا أولاً على كائن صف جدول القيمة عن طريق الوصول إلى جدول القيمة باستخدام عامل التشغيل [...]. (إذا نسيت كيفية القيام بذلك ، يمكنك إلقاء نظرة على المقالات السابقة) داخل عامل التشغيل ، مررنا الوسيطة "0". هذا هو فهرس الصف الأول من جدول القيم. FirstLine = MyTR ،

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

دعنا نعقد مثالنا قليلاً:

FirstLine = MyTR ، // احصل على السطر الأول (مرقم من الصفر) تقرير (الخط الأول) ؛ // عرض قيمة العمود الأول في الصف الأول من الجدول Report (FirstRow) ؛ // عرض قيمة العمود الثاني في الصف الأول من الجدول Report (FirstRow) ؛ // عرض قيمة العمود الثالث في الصف الأول من الجدول

الآن قمنا بعرض القيم من جميع الأعمدة الثلاثة للصف الأول من جدول القيم لدينا:

تشاباييف فاسيلي إيفانوفيتش

الآن أقوم بتعديل هذا المثال بشكل أكبر حتى نتمكن من الاستغناء عن المتغير "السطر الأول"

إخطار (MyTM) ؛ // عرض قيمة العمود الأول في الصف الأول من الجدول Report (MyTR) ؛ // عرض قيمة العمود الثاني في الصف الأول من الجدول Report (MyTR) ؛ // عرض قيمة العمود الثالث في الصف الأول من الجدول

ستكون الشاشة هي نفسها.

تشاباييف فاسيلي إيفانوفيتش

لقد رأينا في المثال أعلاه أنه للوصول إلى قيمة موجودة في صف معين وعمود محدد من جدول القيم ، يمكننا استخدام استدعاء متتالي لمشغلين [...] في هذا النموذج: ValueTable [IndexRows] [IndexColumns]

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

بالنسبة إلى RowCount = 0 بواسطة MyTM.Quantity () - 1 Loop // loop through rows For ColumnCount = 0 By MyTM.Columns.Quantity () - 1 Loop // nested loop عبر الأعمدة // احصل على قيمة الخلية (من الصف الحالي والأعمدة الحالية) CellValue = MyTR [RowCount] [ColumnCount] ؛ // عرض رقم الصف ورقم العمود وتقرير قيمة الخلية ("Line #" + RowCount + "العمود #" + ColumnCount + "=" + CellValue) ؛ نهاية الدورة نهاية الدورة

سيتم عرض ما يلي على الشاشة:

خط # 0 عمود # 0 = خط Chapaev # 0 عمود # 1 = خط فاسيلي # 0 عمود # 2 = خط Ivanovich # 1 عمود # 0 = خط Dzerzhinsky # 1 عمود # 1 = خط فيليكس # 1 عمود # 2 = خط Edmundovich # 2 عمود رقم 0 = خط كوتوفسكي رقم 2 عمود رقم 1 = خط غريغوري رقم 2 عمود رقم 2 = إيفانوفيتش

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

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

بالنسبة إلى RowCount = 0 بواسطة MyTR.Quantity () - تقرير حلقة واحدة من خلال الصفوف ("======= Row #" + RowCount + "=======") ؛ للإبلاغ ("") ؛ // line feed (أدخل سطر فارغ) لـ ColumnCount = 0 بواسطة MyTR.Columns.Quantity () - 1 Loop // nested عمود تكرار حلقة // الحصول على قيمة الخلية (من الصف الحالي والعمود الحالي) CellValue = MyTR [RowCount] [ ColumnCount] ؛ // الحصول على اسم العمود ColumnName = MyTR.Columns [ColumnCount] .Name؛ // عرض اسم العمود وتقرير قيمة الخلية (ColumnName + ":" + CellValue) ؛ نهاية الدورة للإبلاغ ("") ؛ // newline (أدخل سطر فارغ) EndCycle ؛

الآن ، على شاشتنا ، بدأت المعلومات تبدو أكثر تمثيلاً:

رقم السطر 0 ======= الاسم الأخير: Chapaev الاسم الأول: Vasily الاسم الأوسط: Ivanovich ======= رقم السطر 1 ======= الاسم الأخير: Dzerzhinsky الاسم الأول: Felix Middle الاسم: Edmundovich ===== == السطر رقم 2 ======= اللقب: Kotovsky الاسم الأول: Grigory Patronymic: Ivanovich

نعم ، لقد نسيت تقريبًا. عند استخدام عاملين [...] [...] في صف واحد ، يمكننا تمرير اسم هذا العمود بدلاً من فهرس العمود: ValueTable [RowIndex] [ColumnName]

بالنسبة إلى RowCount = 0 بواسطة MyTR.Quantity () - تقرير حلقة واحدة من خلال الصفوف ("======= Row #" + RowCount + "=======") ؛ للإبلاغ ("") ؛ // تغذية سطر (إدخال سطر فارغ) بالنسبة إلى ColumnCount = 0 بواسطة MyTR.Columns.Quantity () - 1 حلقة / حلقة متداخلة عبر الأعمدة ColumnName = MyTR.Columns [ColumnCount] .Name ؛ // الحصول على اسم العمود CellValue = MyTR [RowCount] [ColumnName] ؛ //

انتبه إلى السطر المميز بسهم ". في هذا السطر ، بدلاً من فهرس العمود الحالي ، نقوم بتمرير اسم العمود الحالي إلى الوسيطة الموجودة بين قوسين مربعين [...] ستكون النتيجة هي نفسها.

والآن ، الأخير في هذه المقالة.

الاستلام الصحيح لجميع بيانات جدول القيمة 1C ، باستخدام الحلقات للتكرار على مجموعة الصفوف وجمع الأعمدة

لكل دورة CurrentRow From MyTR Loop // دورة عبر تقرير مجموعة السلاسل ("======= Line #" + MyTR.Index (CurrentRow) + "=======") ؛ للإبلاغ ("") ؛ لكل CurrentColumn من MyTR.Columns Loop // حلقة متداخلة من خلال مجموعة الأعمدة ColumnName = CurrentColumn.Name؛ // احصل على اسم العمودCellValue = CurrentRow [ColumnName] ؛ // الحصول على قيمة الخلية حسب العمود NAME Report (ColumnName + ":" + CellValue) ؛ // عرض اسم العمود وقيمة الخلية EndCycle ؛ للإبلاغ ("") ؛ نهاية الدورة

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

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

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

لكل CurrentRow From MyTR Loop // حلقة عبر تقرير الخطوط ("======= Line #" + MyTR.Index (CurrentRow) + "=======" + Symbols.PS) ؛ لكل CurrentColumn من MyTr.Columns Loop // تكرار على أعمدة التقرير (CurrentColumn.Name + ":" + CurrentRow [CurrentColumn.Name]) ؛ نهاية الدورة للإبلاغ ("") ؛ نهاية الدورة

لم يتغير الإخراج على الشاشة ، ويظل كما هو في المثال السابق:

دورة لمدة أسبوعين

"البرمجة في 1C للمبتدئين"

سيتم إرسال الدورة إليك عبر البريد الإلكتروني. كن مبرمجًا من خلال إكمال المهام خطوة بخطوة.

كل ما تحتاجه للمشاركة هو كمبيوتر وانترنت.

دخول مجاني للدورة:

sp-force-hide (display: none ؛). sp-form (display: block؛ background: # eff2f4؛ padding: 5px؛ width: 270px؛ max-width: 100٪؛ border-radius: 0px؛ -moz-border -النصف: 0 بكسل ؛ -webkit-border-radius: 0px ؛ عائلة الخطوط: Arial ، "Helvetica Neue" ، sans-serif ؛ تكرار الخلفية: عدم التكرار ؛ موضع الخلفية: المركز ؛ حجم الخلفية: تلقائي ؛) .sp-form input (display: inline-block؛ opacity: 1؛ visibility: visibility؛). sp-form .sp-form-field-wrapper (margin: 0 auto؛ width: 260px؛). sp-form .sp - التحكم في الشكل (الخلفية: #ffffff ؛ لون الحدود: #cccccc ؛ نمط الحدود: صلب ؛ عرض الحدود: 1 بكسل ؛ حجم الخط: 15 بكسل ؛ المساحة اليسرى: 8.75 بكسل ؛ الحشوة اليمنى: 8.75 بكسل ؛ الحد -النصف: 4 بكسل ؛ -moz-border-radius: 4px ؛ -webkit-border-radius: 4px ؛ height: 35px ؛ width: 100٪ ؛). sp-form .sp-field label (color: # 444444؛ font- الحجم: 13 بكسل ؛ نمط الخط: عادي ؛ وزن الخط: غامق ؛). sp-form .sp-button (border-radius: 4px ؛ -moz-border-radius: 4px ؛ -webkit-border-radius: 4px ؛ لون الخلفية: # f4394c ؛ اللون: #ffffff ؛ العرض: 100٪ ؛ وزن الخط: 700 ؛ نمط الخط: عادي عائلة الخطوط: Arial، "Helvetica Neue"، sans-serif؛ ظل الصندوق: لا شيء -موز بوكس-شادو: لا شيء ؛ -ظل صندوق الويب: لا شيء ؛ الخلفية: التدرج الخطي (إلى الأعلى ، # e30d22 ، # f77380) ؛). sp-form .sp-button-container (text-align: center ؛ width: auto ؛)