كيفية فتح نموذج لكائن موجود؟ كيفية ملء نموذج مستند جديد وفتحه برمجياً؟ 1C فتح مستند غير مسجل.

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

السياق العالمي
فيلبروبيرتيفاليويس
بناء الجملة:
ملء قيم الخاصية(<Приемник>, <Источник>, <Список свойств>, <Исключая свойства>)
وصف:
نسخ قيم الممتلكات<Источника>إلى الخصائص<Приемника>. تتم المطابقة عن طريق أسماء الخصائص.

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

&في إجراء العميل EnterRecord()RecordForm = GetForm("Document.Provision of Medical Services.ObjectForm"); fill inPropertyValues(RecordForm.Object,Object,"Date,Specialist,Specialization,Nurse,Execution Status"); // املأ قيم التفاصيل التي تتطابق أسماؤها في كلا المستندين TextStr = Elements.Reception.CurrentData; // بيانات السطر الحالي للوثيقة المصدرProperty Structure = New Structure; // تحتوي البنية على قيم تلك التفاصيل التي يجب ملؤها في نموذج المستند الجديد، ولكنها ليست موجودة في المستند المصدر StructureProperties.Insert("Work Order", Object.Link); PropertyStructure.Insert("ReceptionTime",TexStr.ReceptionTime); ملء inPropertyValues(RecordForm.Object,PropertyStructure,"RecordOrder,AppointmentTime"); EntryForm.Open(); EndProcedure

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

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

الحصول على النموذج () . يفتح()

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

النموذج = GetForm( "المستند. استلام البضائع والخدمات. نموذج المستند") ;
// هنا نقوم بتنفيذ الإجراءات باستخدام النموذج
استمارة. يفتح()؛

يجب أن يؤخذ في الاعتبار أنه عند استلام النموذج، سيتم تنفيذ إجراء حدث آخر عندماCreatedOnServer.

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

1. كيفية فتح نموذج كائن في تطبيق مُدار إذا كان هناك رابط إليه.

في هذه الحالة، كل شيء بسيط للغاية.

RefLink = الدلائل. التسميات. FindByCode("000000001");
OpenValue(RefLink) ؛

2. كيفية فتح نموذج الاختيار ومن ثم الحصول على القيمة المحددة.

هناك وظيفة لهذا أدخل القيمة().تحتوي الدالة على 3 معلمات:

  • المتغير الذي سيتم كتابة القيمة المحددة فيه؛
  • تلميح سيتم عرضه في نافذة الاختيار؛
  • وصف أنواع القيم المحددة. قد يكون هناك عدة أنواع، وفي هذه الحالة سيُطلب منك تحديد نوع قبل تحديد قيمة معينة.

نتيجة لتنفيذ الوظيفة، سيتم فتح نموذج التحديد الافتراضي لكائن من النوع المحدد.

قيمة متغيرة؛
صفيف = صفيف جديد؛
مجموعة مصفوفة. إضافة(نوع( "DirectoryLink.Nomenclature") ) ;
مجموعة مصفوفة. إضافة(نوع( "DirectoryLink.Counterparties") ) ;

TypeDescription= new TypeDescription(Array) ;

Res = EnterValue(Value, "Hint" , TypeDescription) ;

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

تحتوي هذه الوظيفة على عدد غير قليل من المعلمات. دعونا نلقي نظرة على بعض منهم:

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

دعونا نلقي نظرة على كيفية استخدام الوظيفة نموذج مفتوح ()في حالات مختلفة.

3. كيفية فتح شكل كائن موجود

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

&OnClient
أمر الإجراء1 (الأمر)
المعلمة = بنية جديدة؛
معامل. إدراج("مفتاح" , FindC() ) ;
OpenForm(, المعلمة);
EndProcedure

&على الخادم
وظيفة FindC();
إرجاع الدلائل. الأطراف المقابلة. FindByRequisites ("TIN"، "745107734623")
وظيفة النهاية

4. كيفية فتح نموذج كائن جديد

وظيفة بسيطة سوف تفعل هنا نموذج مفتوح ()دون أي معلمات.

&OnClient
أمر الإجراء1 (الأمر)
نموذج مفتوح( "الدليل. الأطراف المقابلة. نموذج الكائن") ;
EndProcedure

5. كيفية فتح نموذج كائن جديد وملئه بناءً على شيء ما

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

&OnClient
أمر الإجراء1 (الأمر)
المعلمة = بنية جديدة؛
معامل. إدراج ("قاعدة"، LinkToBuyerAccount) ؛
نموذج مفتوح( "المستند. مبيعات السلع والخدمات. نموذج الكائن"، معامل) ؛
EndProcedure

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

6. كيفية فتح نموذج وتحديد التحديد عليه

يمكن أن يكون الاختيار في نماذج 1C بسيطًا أو معقدًا. يتضمن الاختيار البسيط تعبيرات مثل المنظمة = Horns and Hooves LLC.يتضمن الاختيار المعقد أنواعًا أخرى من المقارنة، على سبيل المثال. في القائمة. في هذه المقالة سننظر في تنظيم الاختيار البسيط، وسيتم تخصيص مقال منفصل للاختيار المعقد.

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

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

&OnClient
أمر الإجراء1 (الأمر)
المعلمة = بنية جديدة؛

التحديد= الهيكل الجديد؛
اختيار. إدراج ("المالك"، LinkToNomenclature) ؛

معامل. إدراج ("اختيار"، اختيار)؛

نموذج مفتوح( "الدليل.أرقام GTD.نموذج القائمة"، معامل) ؛
EndProcedure

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

للقيام بذلك، سوف تحتاج إلى مفتاح إدخال سجل المعلومات.

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

خوارزمية الافتتاح هي كما يلي:

  1. نقوم بإدخال بيانات مفتاح السجل بالقيم الضرورية في البنية.
  2. نضع الهيكل الناتج في صفيف.
  3. نقوم بإنشاء مفتاح سجل من المصفوفة.
  4. نقوم بتمرير المعلمة إلى النموذج الذي يفتح مفتاحباستخدام مفتاح التسجيل من الخطوة 3 كقيمة.

&OnClient
أمر الإجراء1 (الأمر)
المعلمة = بنية جديدة؛

KeyParameters= هيكل جديد؛
المعلمات الرئيسية. إدراج("التسميات"، LinkToNomenclature) ;
المعلمات الرئيسية. إدراج("PriceType"، LinkToPriceType) ;
المعلمات الرئيسية. إدراج ("الفترة"، التاريخ)؛

KeyArray = صفيف جديد؛
KeyArray. إضافة (معلمات المفاتيح) ؛

مفتاح الإدخال = جديد( "مفتاح تسجيل المعلومات.تسميات الأسعار"، كيايراري) ؛

معامل. إدراج ("مفتاح"، مفتاح التسجيل)؛

نموذج مفتوح( "سجل المعلومات. أسعار التسميات. نموذج السجل"، معامل) ؛
EndProcedure

بيت للمطورين المبتدئين تعلم البرمجة

كيفية فتح نموذج لكائن موجود؟

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

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

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

إذا كنت لا ترغب في فتح النموذج الرئيسي، ولكن النموذج التعسفي لكائن تم إنشاؤه في المكوّن، فبدلاً من الاسم القياسي للنموذج الرئيسي (ObjectForm)، قم بالإشارة إلى كلمة النموذج متبوعة بنقطة - اسم النموذج الذي تم إنشاؤه فيه المكوّن.

على سبيل المثال:

ReferenceToDirectoryElement = Elements.List.CurrentRow; FormParameters = New Structure("Key", ReferenceToDirectoryElement); OpenForm("Directory.Organizations.Form.UniversalObjectForm",FormParameters);

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

OpenValue(Items.List.CurrentRow);

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

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

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