1c संरचना में किसी फ़ील्ड की उपस्थिति की जाँच करें

💖क्या आपको यह पसंद है?लिंक को अपने दोस्तों के साथ साझा करें

शायद आप में से कई लोगों को किसी फॉर्म पर किसी निश्चित तत्व की उपस्थिति की जांच करने का काम करना पड़ा होगा, या लेआउट क्षेत्र पर एक आवश्यक पैरामीटर उपलब्ध है या नहीं। दुर्भाग्य से, प्लेटफ़ॉर्म इस कार्य को करने के लिए मानक तरीके प्रदान नहीं करता है।

"संरचना" प्रकार के मानों के लिए, "संपत्ति ()" विधि उपलब्ध है:

परीक्षण संरचना = नई संरचना; परीक्षण संरचना। सम्मिलित करें ("टेस्टकी", "टेस्टवैल्यू"); IsValueTestKey = TestStructure('TestKey'); // परिणामस्वरूप, वेरिएबल "IsValueTestKey" में TRUE मान होगा

यदि हम इसी प्रकार लेआउट क्षेत्र पर किसी प्रपत्र तत्व या पैरामीटर के अस्तित्व के बारे में पता लगाने का प्रयास करते हैं (उदाहरण के तौर पर), तो यह निम्नलिखित त्रुटि का कारण बनेगा:

त्रुटि विवरण से, आप देख सकते हैं कि प्रबंधित प्रपत्र तत्वों (आइटम चर) के संग्रह में संपत्ति() विधि नहीं है। यही बात प्लेटफ़ॉर्म द्वारा समर्थित अधिकांश संग्रहों पर लागू होती है।

कुछ संग्रहों के लिए, जैसे "टेबलफ़ील्ड कॉलम", "मेटाडेटा एलिमेंट्स कलेक्शन", "फाइंड()" विधि उपयोग के लिए उपलब्ध है, जिसका पहला पैरामीटर खोजे जाने वाले तत्व का नाम है। यदि मान नहीं मिलता है तो विधियाँ पाए गए तत्व को या "अनिर्धारित" लौटा देती हैं। इस प्रकार, खोज विधि का उपयोग करके, आप उन संग्रहों के लिए एक विशेष संपत्ति की उपस्थिति निर्धारित कर सकते हैं जो इसके साथ काम करने का समर्थन करते हैं।

लेकिन अगर संग्रह ऊपर वर्णित समान तरीकों के साथ काम करने का समर्थन नहीं करता है तो क्या करें। ऐसे मामलों में, इस प्रकार के डेटा के साथ काम करने के एक बिल्कुल अलग तरीके की आवश्यकता होती है।

आज लेख में हम एक सार्वभौमिक दृष्टिकोण के बारे में बात करेंगे जो आपको किसी भी 1C:एंटरप्राइज़ 8.x डेटा प्रकार के मूल्य में किसी संपत्ति की उपस्थिति निर्धारित करने की अनुमति देता है।

इसे कैसे क्रियान्वित करें

मैं किसी भी मूल्य प्रकार पर किसी संपत्ति की उपस्थिति निर्धारित करने के लिए एक सार्वभौमिक फ़ंक्शन लिखने का प्रस्ताव करता हूं और फिर एक छोटे उदाहरण के साथ इसका उपयोग करने के लिए आगे बढ़ता हूं।

प्रस्तावित दृष्टिकोण का कार्य "FillPropertyValues()" विधि और "संरचना" प्रकार वाले एक चर के उपयोग पर आधारित है। निम्नलिखित सूची इस फ़ंक्शन के लिए प्रोग्राम कोड दिखाती है:

// चर: // // 2. संपत्ति का नाम - वांछित संपत्ति युक्त "स्ट्रिंग" प्रकार का एक चर// फ़ंक्शन वेरिएबलकंटेन्सप्रॉपर्टी (वेरिएबल, प्रॉपर्टीनाम) यदि स्ट्रक्चरचेक[प्रॉपर्टीनेम] = शून्य है तो गलत लौटें; अन्यथा सत्य लौटें; अगर अंत ; अंतकार्य

सैद्धांतिक रूप से, सूची पर टिप्पणियों से सब कुछ स्पष्ट है। ध्यान देने योग्य एकमात्र बात यह है कि यदि कोई संपत्ति पाई जाती है और उसका मूल्य शून्य है, तो फ़ंक्शन अभी भी कहेगा कि ऐसी कोई संपत्ति नहीं है। ऐसे मामलों में, आपको एक अतिरिक्त चेक बनाने की आवश्यकता है।

मामले का अध्ययन

उदाहरण के तौर पर, परीक्षण कॉन्फ़िगरेशन में हम कई विवरणों के साथ दस्तावेज़ "TestDocument" जोड़ेंगे। इसके फॉर्म में संबंधित फॉर्म तत्व जोड़े गए हैं।

"तत्व नाम" फ़ील्ड में, प्रपत्र तत्व का नाम दर्ज करें। खोज बटन पर क्लिक करने से वह फ़ंक्शन निष्पादित होता है जिसे हमने पहले बनाया था। कमांड निष्पादित करने के बाद, प्रोग्राम उपयोगकर्ता को सूचित करता है कि खोज सफल रही। निम्नलिखित सूची कमांड हैंडलर कोड और प्रॉपर्टी खोज प्रक्रिया को दर्शाती है।

& क्लाइंट प्रक्रिया पर FindCommand(कमांड) यदि वेरिएबल में संपत्ति (तत्व, तत्व नाम) शामिल है तो चेतावनी (" तत्व " " " + तत्व नाम + " " " मिला! " ) ; अन्यथा चेतावनी(" तत्व " " " + तत्व नाम + " " " नहीं मिला!" ) ; EndIf ; EndProcedure // किसी भी डेटा प्रकार के मूल्य पर गुणों की उपस्थिति की जांच के लिए सार्वभौमिक फ़ंक्शन// चर: // 1. वेरिएबल - किसी भी प्रकार का एक वेरिएबल जिसके लिए किसी संपत्ति की उपस्थिति की जांच करना आवश्यक है // 2. संपत्ति का नाम - वांछित संपत्ति युक्त "स्ट्रिंग" प्रकार का एक चर// और क्लाइंट फ़ंक्शन पर वेरिएबलकंटेन्सप्रॉपर्टी(वेरिएबल, प्रॉपर्टीनाम) // एक कुंजी ("प्रॉपर्टीनेम" वेरिएबल का मान) और एक शून्य मान के साथ परीक्षण के लिए संरचना आरंभ करेंसंरचना जांच = नई संरचना; संरचना जांच. सम्मिलित करें (संपत्तिनाम, शून्य) ; // निर्मित संरचना को पारित चर मान से भरेंफ़िलप्रॉपर्टीवैल्यूज़(स्ट्रक्चरचेक, वेरिएबल); // यदि किसी संरचना संपत्ति का मान शून्य रहता है, तो आवश्यक संपत्ति नहीं मिली, और इसके विपरीत।यदि स्ट्रक्चरचेक[प्रॉपर्टीनाम] = शून्य है तो गलत लौटें; अन्यथा सत्य लौटें; अगर अंत ; अंतकार्य

आप कॉन्फ़िगरेशन का परीक्षण कर सकते हैं लिंक से डाउनलोड करें.

संक्षेप

लेख में वर्णित दृष्टिकोण आपको किसी भी प्रकार के संग्रह में गुणों की उपस्थिति की जांच करने की अनुमति देता है। प्रपत्र तत्व, मेटाडेटा संग्रह, लेआउट विकल्प और भी बहुत कुछ। प्रदर्शन पर कोई नकारात्मक प्रभाव नहीं पड़ता. प्लेटफ़ॉर्म के किसी भी संस्करण पर काम करता है।

पी.एस. जैसा कि एल्कॉम ने नोट किया है, मैं GUID का उपयोग करके प्रोग्राम कोड प्रदान करता हूं।

// किसी भी डेटा प्रकार के मूल्य में गुणों की उपस्थिति की जांच करने के लिए सार्वभौमिक फ़ंक्शन // चर: // 1. चर - किसी भी प्रकार का एक चर जिसके लिए किसी संपत्ति की उपस्थिति की जांच करना आवश्यक है // 2. संपत्ति का नाम - वांछित संपत्ति युक्त "स्ट्रिंग" प्रकार का एक चर // &क्लाइंट फ़ंक्शन पर वेरिएबल कॉन्टेन्स प्रॉपर्टी (वेरिएबल, प्रॉपर्टी नाम) // कुंजी के साथ परीक्षण के लिए संरचना शुरू करें ("प्रॉपर्टी नाम" वेरिएबल का मान) और एक का मान मनमाना GUID" और GUIDCheck = नया अनोखा पहचानकर्ता; StructureCheck = नई संरचना; StructureCheck.Insert(PropertyName, GUIDCheck); // हम निर्मित संरचना को पारित चर मान से भरते हैं fillPropertyValues(StructureCheck, Variable); // यदि संरचना के लिए मान संपत्ति शून्य रहती है, तो आवश्यक संपत्ति नहीं मिली, और इसके विपरीत। यदि स्ट्रक्चरचेक[प्रॉपर्टीनाम] = GUIDचेक तो गलत लौटें; अन्यथा सही लौटें; एंडइफ; एंडफंक्शन

संरचना और मिलान एक प्रकार की तालिका है जिसमें दो कॉलम होते हैं: कुंजी और मान। "कुंजी" कॉलम उस अनुक्रमित तत्व को संग्रहीत करता है जिसे खोजा जा रहा है। खोज तत्व स्वयं "मान" फ़ील्ड में स्थित है। खोज प्रदर्शन के संदर्भ में किस तंत्र का उपयोग करना बेहतर है? आइए प्रयोगों की एक श्रृंखला संचालित करें।

आइए उत्पादों की एक निर्देशिका बनाएं और इसे 20,000 वस्तुओं से भरें। आगे, एक सरल प्रक्रिया का उपयोग करके, हम इन सभी तत्वों का डेटा संरचना और पत्राचार में लिखेंगे। पहले प्रयोग में, हम कुंजी में मिलान के लिए एक लिंक और संरचना के लिए एक नाम लिखेंगे। दूसरे माप में, हम कुंजी के रूप में दोनों वर्गों के नाम का उपयोग करेंगे। तीसरे में, संरचना कुंजी के लिए नाम चुना जाता है, और मिलान के लिए एक संख्यात्मक फ़ील्ड चुना जाता है।

मिलान और संरचना के लिए कुंजी द्वारा मान देखने की प्रक्रिया की सूची नीचे दी गई है।

प्रक्रिया SearchValueByKey(ForMatch, Key) यदि ForMatch है तो वापस SearchedMatch[ Key] ; ElseSearchValue = अपरिभाषित; आवश्यक संरचना. संपत्ति (कुंजी, खोज मूल्य); वापसी खोज मूल्य; प्रक्रिया का अंत

पहले प्रयोग के लिए निम्नलिखित परिणाम प्राप्त हुए:

जैसा कि हम देख सकते हैं, अनुपालन काफी बड़े अंतर से जीतता है। संरचना के लिए खोज का समय लगभग 1/4 गुना धीमा दिखाया गया है।

दूसरे प्रयोग के बाद स्थिति नाटकीय रूप से बदल गई:

कुंजी में "स्ट्रिंग" प्रकार के पैरामीटर से मिलान करने के लिए खोज का समय संरचना से लगभग दोगुना है।

तीसरे प्रयोग में, अनुपालन फिर से हावी हो गया।

अनुपालन ने इस कार्य को छह गुना से भी अधिक तेजी से पूरा किया।

इस प्रकार, हम यह निष्कर्ष निकाल सकते हैं कि स्ट्रिंग प्रतिनिधित्व का उपयोग करके मूल्यों की खोज के लिए संरचना सबसे उपयुक्त है, क्योंकि यह डेटा प्रकार विशेष रूप से स्ट्रिंग कुंजियों के लिए विशिष्ट है। हालाँकि, यदि आप कुंजी के लिए अन्य प्रकारों का उपयोग कर सकते हैं, जैसे "संख्या" या "संदर्भ", तो सर्वोत्तम परिणाम एक मिलान द्वारा दिखाए जाते हैं। यह निश्चित रूप से उत्तर देना संभव नहीं है कि वास्तव में ऐसा क्यों है, क्योंकि गहरे प्रयोगों की प्रणाली बंद रहती है।

प्रोग्रामिंग भाषा 1C 8.3 और 8.2 में संरचना "कुंजी" और "मान" जोड़े का एक सेट है। "कुंजी" फ़ील्ड में एक स्ट्रिंग प्रकार होता है, जबकि "मान" फ़ील्ड किसी भी डेटा प्रकार को स्वीकार कर सकता है। आमतौर पर प्रक्रियाओं के बीच मापदंडों के एक सेट को संग्रहीत और स्थानांतरित करने के लिए उपयोग किया जाता है।

1C प्रोग्रामिंग भाषा में एक संरचना "नई" संरचना का उपयोग करके दो तरीकों से बनाई जा सकती है।

पहला तरीका:

संरचना = नई संरचना;
Structure.Insert('ParameterKey1', 'ParameterValues ​​​​No.1');
Structure.Insert('ParameterKey2', 'ParameterValues ​​​​No.2');

दूसरा तरीका:

संरचना = नई संरचना ("पैरामीटरकी1, पैरामीटरकी2", "पैरामीटरवैल्यू नंबर 1", "पैरामीटरवैल्यू नंबर2");

दोनों विधियाँ उस संरचना का निर्माण करेंगी जिसे डिबगिंग से स्क्रीनशॉट में देखा जा सकता है:

1सी पर 267 वीडियो पाठ निःशुल्क प्राप्त करें:

परिवर्तन

आप "इन्सर्ट()" विधि का उपयोग करके किसी संरचना को जोड़ या बदल सकते हैं।

Structure.Insert('KeyName', KeyValue);

यदि आपको पुरानी कुंजी का मान बदलने की आवश्यकता है, तो उसका नाम दर्ज करें। यदि आप एक नई कुंजी जोड़ते हैं, तो संरचना में सभी कुंजियों के सापेक्ष एक अद्वितीय नाम जोड़ें।

किसी संग्रह तत्व को हटाने के लिए, आपको "हटाएं" विधि का उपयोग करना होगा, जहां आप कुंजी नाम पास करते हैं:

संरचना.हटाएँ('कुंजीनाम');

किसी संग्रह में सभी ऑब्जेक्ट को साफ़ करना भी संभव है:

संरचना.साफ();

संरचना को पार करना

किसी संरचना के संग्रह के माध्यम से पुनरावृत्त करने के लिए, आपको "स्ट्रक्चर लूप से प्रत्येक कुंजी-मूल्य के लिए" निर्माण का उपयोग करने की आवश्यकता है।

उदाहरण के लिए:

स्ट्रक्चर लूप से प्रत्येक कुंजी-अर्थ के लिए
…… //प्रक्रिया, उदाहरण के लिए, मान बदलें
अंतचक्र;

प्रत्येक चक्र में आप देखेंगे कि निम्नलिखित फ़ील्ड हमारे लिए उपलब्ध हैं:



मित्रों को बताओ