सिंटैक्स 1s चुनें. सशर्त कथन के अधिक जटिल परिणाम

तमाम कमियों के बावजूद, टेक्स्ट फ़ील्ड खोज अभी भी सबसे लोकप्रिय में से एक है। हम हर जगह स्ट्रिंग डेटा प्रकार पा सकते हैं - नाम, खाता संख्या, पते, साथ ही अन्य जानकारी इस प्रारूप में संग्रहीत की जा सकती है। अंतर्निहित 1C भाषा में प्रश्नों में, डेवलपर्स की सुविधा के लिए, एक विशेष ऑपरेटर "LIKE" का उपयोग किया जाता है। यह सबसे अधिक उपयोग किए जाने वाले कमांडों में से एक है, इसलिए इसके सिंटैक्स और क्षमताओं की पूरी जानकारी के बिना, प्रोग्रामर के लिए काम करना मुश्किल होगा।

LIKE ऑपरेटर का उपयोग करना

व्यवहार में किसी भी ऑपरेटर का उपयोग करने से पहले, आपको उसके उद्देश्य, अनुप्रयोग के स्थान और वाक्यविन्यास को स्पष्ट रूप से समझने की आवश्यकता है। 1C अनुरोध में "LIKE" का उपयोग करने का उद्देश्य टेम्पलेट के रूप में प्रस्तुत स्थिति की संतुष्टि की जांच करना है। रिटर्न मान एक बूलियन प्रकार है - सही या गलत, यह दर्शाता है कि क्या दी गई शर्त. LIKE ऑपरेटर का उपयोग किसी क्वेरी में कई स्थानों पर किया जा सकता है:

  • शर्तों के ब्लॉक में, कीवर्ड "कहां" द्वारा निर्दिष्ट;
  • चॉइस व्हेन देन अन्यथा एंड के डिज़ाइन में;
  • फ़ील्ड तुलना के परिणामस्वरूप, सीधे चयन फ़ील्ड में।

सत्यापन सिंटैक्स हमेशा समान होता है और इसमें 3 लिंक होते हैं। बाएं पाठ मान, जिसकी जांच की जा रही है, फिर "LIKE" ऑपरेटर, और दाईं ओर वह टेम्पलेट है जिसके द्वारा जांच की जाती है। जल्दी और आसानी से टेम्पलेट बनाने के लिए, विशेष प्रतीक हैं जो विकास को आसान बनाते हैं:

  1. "%" मनमानी लंबाई के किसी भी वर्ण का एक क्रम है। खोज के लिए उपयोग किया जाता है व्यक्तिगत शब्दया एक पंक्ति में संख्याएँ;
  2. "_" - कोई एकल वर्ण। एकल वर्ण की उपस्थिति को इंगित करने का इरादा;
  3. "[...]" एक स्ट्रिंग में किसी वर्ण के साथ तुलना करने के लिए वर्णों का एक क्रम है। इस तरह के पैटर्न की सहायता से, कोष्ठक में सूचीबद्ध किसी भी अक्षर से मिलान की जाँच की जाती है। आप संख्याओं या अक्षरों की एक श्रृंखला भी निर्दिष्ट कर सकते हैं ([a-g], );
  4. "[^...]" पिछले वाले के विपरीत पैटर्न है। पंक्ति में निर्दिष्ट वर्ण और कोष्ठक में सूचीबद्ध वर्णों के बीच अंतर की जाँच की जाती है।

सही टेम्प्लेट बनाने के सिद्धांतों को बेहतर ढंग से समझने और समझने के लिए, आइए कुछ उदाहरण देखें जो अक्सर डेवलपर्स के जीवन में सामने आते हैं। पहला तब होता है जब हमें नामकरण निर्देशिका से उन सभी वस्तुओं का चयन करने की आवश्यकता होती है जिनके नाम में "CUTTER" शब्द दिखाई देता है। इस मामले में, हमें क्वेरी शर्तों में LIKE का उपयोग करने की आवश्यकता है:

निर्देशिका से नाम के रूप में नामकरण का चयन करें। निर्देशिका से नाम के रूप में नामकरण का चयन करें। नामकरण जहां नामकरण है। नाम "% CUTTER%" के समान है।

यदि हम दोनों "%" प्रतीकों को हटा देते हैं, तो क्वेरी एक उत्पाद दिखाएगी जिसका नाम उद्धरण चिह्नों में निर्दिष्ट नाम से पूरी तरह मेल खाता है। यदि हम टेम्पलेट "कटर%" या "% कटर" को छोड़ देते हैं, तो परिणाम वर्णों के दिए गए संयोजन के साथ क्रमशः समाप्त या शुरू होने वाली वस्तुओं की एक सूची होगी।


आइए एक समस्या पर नजर डालें जो नौसिखिया प्रोग्रामर को भ्रमित कर सकती है जो क्वेरी सिंटैक्स नहीं जानते हैं। मान लीजिए कि आपको उन सभी वस्तुओं को ढूंढना है जिनके नाम में "%" चिन्ह है। विशेष रूप से ऐसे मामलों के लिए जब आपको आरक्षित वर्णों की खोज करने की आवश्यकता होती है, तो एक "विशेष वर्ण" ऑपरेटर होता है। #,\,/,~ और अन्य वर्णों का उपयोग एक विशेष वर्ण के रूप में किया जा सकता है, जिसके बाद कोई भी आरक्षित वर्ण केवल एक संकेत को दर्शाएगा।

निर्देशिका से नाम के रूप में नामकरण का चयन करें। निर्देशिका से नाम के रूप में नामकरण का चयन करें। जहां नामकरण। नाम "%#%" विशेष वर्ण "#" के समान है।

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

निर्देशिका से नाम के रूप में नामकरण का चयन करें। निर्देशिका से नाम के रूप में नामकरण का चयन करें। जहां नामकरण। नाम "%" + &name + "%" के समान है।

SIMILAR फ़ंक्शन 8 से शुरू होकर प्लेटफ़ॉर्म के सभी संस्करणों में लागू है, और इसकी प्रयोज्यता के कारण, 1C डेवलपर्स इसे बदलना नहीं चाहेंगे। बेशक, पाठ खोज हमेशा दर्ज किए गए नाम की सटीकता पर निर्भर करती है, लेकिन यह अभी भी सबसे आम में से एक है। इस संबंध में, पेशेवर 1C डेवलपर्स को SIMILAR के उपयोग की सभी बारीकियों के साथ अध्ययन करने की आवश्यकता है।

मैंने अपना योगदान देने और भाषा की उन विशेषताओं का वर्णन करने का निर्णय लिया जिनकी चर्चा उपरोक्त लेखों में नहीं की गई थी। यह लेख शुरुआती डेवलपर्स के लिए लक्षित है।

1. "IZ" डिज़ाइन।

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

निर्देशिका चुनें.बैंक.*

बैंक निर्देशिका से सभी फ़ील्ड का चयन करता है। और अनुरोध के समान है:

बैंकों का चयन करें। * निर्देशिका से। बैंकों के रूप में बैंक

2. संदर्भ फ़ील्ड द्वारा डेटा ऑर्डर करना

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

इस मामले में, दस्तावेज़ों के लिए ऑर्डर "दिनांक->संख्या" क्रम में होगा, संदर्भ पुस्तकों के लिए "मुख्य दृश्य" में होगा। यदि ऑर्डरिंग संदर्भ फ़ील्ड द्वारा नहीं होती है, तो "ऑटो ऑर्डर" निर्माण का उपयोग करने की अनुशंसा नहीं की जाती है।

कुछ मामलों में, "ऑटो ऑर्डर" निर्माण चयन प्रक्रिया को धीमा कर सकता है। इसी तरह, आप दस्तावेज़ों के लिए ऑटो-ऑर्डर किए बिना फिर से लिख सकते हैं:

3. एक संदर्भ प्रकार का पाठ प्रतिनिधित्व प्राप्त करना। "प्रस्तुति" डिज़ाइन.

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

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

4. टेम्पलेट के अनुसार डेटा का नमूना लेने की शर्त।

उदाहरण के लिए, आपको प्राप्त करने की आवश्यकता है मोबाइल फ़ोनप्रकार के कर्मचारी (8 -123-456-78-912)। ऐसा करने के लिए, आपको अनुरोध में निम्नलिखित शर्त निर्धारित करनी होगी:

निर्देशिका से कर्मचारी.नाम, कर्मचारी.फोन को फोन के रूप में चुनें। कर्मचारियों को कर्मचारियों के रूप में चुनें जहां फोन "____-___-__-__" जैसा हो।

"_" वर्ण एक सेवा वर्ण है और किसी भी वर्ण को प्रतिस्थापित करता है।

5. योग और समूह का एक साथ उपयोग।


योग का उपयोग अक्सर समूहों के संयोजन में किया जाता है, इस मामले में, कुल कार्यों को योग में निर्दिष्ट नहीं किया जा सकता है।

सेवाओं का प्रावधान चुनें। संगठन के रूप में संगठन, सेवाओं का प्रावधान। नामकरण के रूप में नामकरण, एसयूएम (सेवाओं का प्रावधान। दस्तावेज़ की मात्रा) दस्तावेज़ से दस्तावेज़ का योग। सेवाओं का प्रावधान सेवाओं के प्रावधान के रूप में सेवाओं का समूह। सेवाओं का प्रावधान। संगठन, प्रावधान सेवाओं का नामकरण सामान्य, संगठन, नामकरण द्वारा परिणाम

इस स्थिति में, क्वेरी लगभग निम्न क्वेरी के समान ही वापस आएगी:

सेवाओं के प्रावधान का चयन करें। संगठन के रूप में संगठन, सेवाओं का प्रावधान। नामकरण के रूप में नामकरण, सेवाओं का प्रावधान। दस्तावेज़ की मात्रा दस्तावेज़ से दस्तावेज़ की मात्रा। सेवाओं के प्रावधान के रूप में सेवाओं का प्रावधान परिणाम राशि (दस्तावेज़ की मात्रा) सामान्य, संगठन द्वारा, नामपद्धति

केवल पहली क्वेरी ही समान नामकरण वाले रिकॉर्ड को संक्षिप्त कर देगी।

6. असंदर्भित क्षेत्र।

किसी बिंदु के माध्यम से फ़ील्ड्स को संदर्भित करना रेफरेंस फ़ील्ड डीरेफ़रेंसिंग ऑपरेशन कहलाता है। उदाहरण के लिए भुगतान.संगठन.प्रशासनिक इकाई. इस मामले में, "भुगतान" दस्तावेज़ के संदर्भ क्षेत्र "संगठन" में, यह एक अन्य तालिका "संगठन" को संदर्भित करता है, जिसमें "प्रशासनिक इकाई" विशेषता का मूल्य प्राप्त किया जाएगा। यह समझना महत्वपूर्ण है कि एक बिंदु के माध्यम से फ़ील्ड तक पहुंचने पर, प्लेटफ़ॉर्म अंतर्निहित रूप से एक सबक्वेरी बनाता है और इन तालिकाओं में शामिल हो जाता है।

अनुरोध:

इस प्रकार दर्शाया जा सकता है:

भुगतान.लिंक, भुगतान.संगठन, भुगतान.संगठन, संगठन चुनें। दस्तावेज़ से प्रशासनिक इकाई। भुगतान के रूप में भुगतान बाएँ निर्देशिका में शामिल हों। संगठन के रूप में संगठन सॉफ़्टवेयर भुगतान। संगठन = संगठन। लिंक

किसी समग्र प्रकार के संदर्भ फ़ील्ड को डीरेफ़रेंस करते समय, फ़्रेमवर्क उन सभी तालिकाओं में अंतर्निहित जोड़ बनाने का प्रयास करता है जो उस फ़ील्ड के प्रकार का हिस्सा हैं। इस मामले में, क्वेरी इष्टतम नहीं होगी यदि यह स्पष्ट रूप से ज्ञात है कि यह किस प्रकार का फ़ील्ड है, तो ऐसे फ़ील्ड को एक निर्माण के साथ सीमित करना आवश्यक है अभिव्यक्त करना().

उदाहरण के लिए, एक संचय रजिस्टर "अवितरित भुगतान" है, जहां कई दस्तावेज़ रजिस्ट्रार के रूप में कार्य कर सकते हैं। इस मामले में, रजिस्ट्रार विवरण के मान इस प्रकार प्राप्त करना गलत है:

रजिस्टर संचयन से UnallocatedPayments.Registrar.Date, ..... को UnallocatedPayments के रूप में चुनें।

प्रकार प्रतिबंधित होना चाहिए समग्र क्षेत्ररजिस्ट्रार:

रजिस्टर एक्युमुलेशन से एक्सप्रेस(अनअलोकेटेडपेमेंट्स.रजिस्टर एज़ डॉक्यूमेंट.पेमेंट्स).दिनांक, ..... चुनें। अनअलोकेटेडपेमेंट्स एज़ अनअलोकेटेडपेमेंट्स

7. निर्माण "कहां"

दो तालिकाओं के बाएं जोड़ के साथ, जब आप दाहिनी तालिका पर "कहां" शर्त लगाते हैं, तो हमें तालिकाओं के आंतरिक जुड़ाव के परिणाम के समान परिणाम मिलेगा।

उदाहरण। ग्राहक निर्देशिका से सभी ग्राहकों का चयन करना आवश्यक है और उन ग्राहकों के लिए जिनके पास "संगठन" = &संगठन विशेषता के मूल्य के साथ भुगतान दस्तावेज़ है, दस्तावेज़ "भुगतान" प्रदर्शित करें, जिनके पास नहीं है, वे इसे प्रदर्शित न करें।

क्वेरी का परिणाम केवल उन ग्राहकों के लिए रिकॉर्ड लौटाएगा जिनके पास पैरामीटर में संगठन द्वारा भुगतान था, और अन्य ग्राहकों को फ़िल्टर कर देगा। इसलिए, आपको पहले "ऐसे और ऐसे" संगठन के लिए सभी भुगतान एक अस्थायी तालिका में प्राप्त करना होगा, और फिर इसे बाएं जोड़ का उपयोग करके "क्लाइंट" निर्देशिका से कनेक्ट करना होगा।

भुगतान का चयन करें। भुगतान के रूप में लिंक करें, भुगतान। ग्राहक के रूप में शेयरधारक दस्तावेज़ से भुगतान का स्थान। भुगतान के रूप में भुगतान जहां भुगतान। शाखा = &शाखा; ///////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// चयन करें। ग्राहक के रूप में लिंक करें, ISNULL(tPayment.Payment, "") निर्देशिका से भुगतान के रूप में। ग्राहक AS ग्राहकों ने भुगतान से कनेक्शन छोड़ दिया, भुगतान सॉफ़्टवेयर क्लाइंट के रूप में। लिंक = भुगतान से।ग्राहक

आप इस स्थिति से दूसरे तरीके से निपट सकते हैं। दो तालिकाओं के बीच संबंध पर सीधे "कहां" शर्त लागू करना आवश्यक है। उदाहरण:

ग्राहकों का चयन करें। लिंक, भुगतान। निर्देशिका से लिंक। यूएस_सब्सक्राइबर के रूप में यूएस_सब्सक्राइबर ने कनेक्शन दस्तावेज़ छोड़ दिया। भुगतान सॉफ्टवेयर के रूप में भुगतान (क्लाइंट। लिंक = भुगतान। क्लाइंट और भुगतान। क्लाइंट का नाम "चीनी पैकेट" जैसा) ग्राहकों द्वारा समूह। लिंक, भुगतान। जोड़ना

8. नेस्टेड और वर्चुअल टेबल्स के साथ जुड़ता है

नेस्टेड क्वेरीज़कुछ स्थितियों के आधार पर डेटा पुनः प्राप्त करना अक्सर आवश्यक होता है। यदि आप उन्हें अन्य तालिकाओं के साथ संयोजन में उपयोग करते हैं, तो यह क्वेरी के निष्पादन को गंभीर रूप से धीमा कर सकता है।

उदाहरण के लिए, हमें कुछ ग्राहकों के लिए वर्तमान तिथि तक शेष राशि प्राप्त करने की आवश्यकता है।

UnallocatedPaymentsBalances.Customer का चयन करें, UnallocatedPaymentsBalances.AmountBalance FROM (क्लाइंट का चयन करें। डायरेक्ट्री से लिंक के रूप में लिंक करें। क्लाइंट जहां क्लाइंट हैं वहां क्लाइंट के रूप में लिंक करें। (&Clients)) नेस्टेडक्वेरी के रूप में नेस्टेड द्वारा UnallocatedPayments के रूप में शामिल हों nyRequest.Link = UnallocatedPaymentsBalances. ग्राहक

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

ग्राहकों का चयन करें। लिंक के रूप में लिंक करें, निर्देशिका से ग्राहकों को रखें। ग्राहकों को ग्राहकों के रूप में कहां रखें
क्लाइंट्स.लिंक बी (&क्लाइंट्स); ///////////////////////////////////////////// // //////////////////////////// चयन करें tClients.Link, UnallocatedPaymentsRemains.AmountRemaining, tClients से जैसे ही tClients Join RegisterAccumulations.UnallocatedPayments.Balances (, client IN (tClients से tClients.Link चुनें)) UnallocatedPaymentsBalances के रूप में tClients.Link = UnallocatedPaymentsBalances.Clients

इस मामले में, ऑप्टिमाइज़र यह निर्धारित करने में सक्षम होगा कि अस्थायी तालिका tClients कितने रिकॉर्ड का उपयोग करती है और तालिकाओं में शामिल होने के लिए इष्टतम एल्गोरिदम का चयन करने में सक्षम होगी।

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

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

ग्राहकों का चयन करें। लिंक के रूप में लिंक करें, निर्देशिका से ग्राहकों को रखें। ग्राहकों को ग्राहकों के रूप में लिंक द्वारा अनुक्रमित करें जहां
क्लाइंट्स.लिंक बी (&क्लाइंट्स); ///////////////////////////////////////////// // //////////////////////////// चयन करें UnallocatedPayments.AmountBalance, UnallocatedPayments.Client AS क्लाइंट PLACE Balance FROM RegisterAccumulations.UnallocatedPayments.Balances(, क्लाइंट B ( tClients का चयन करें। tClients से लिंक)) UnallocatedPaymentsBalances के रूप में; ///////////////////////////////////////////// // ///////////////////////////////////////////////////// चुनें tClients.Link, toRemainders.AmountRemaining AS Amount शेष from tClients as tClients LEFT JOIN toRemaining as Remainder PO tClients.Link = tRemainings.ग्राहक

9.अनुरोध के परिणाम की जाँच करना।

क्वेरी का परिणाम खाली हो सकता है; खाली मानों की जांच करने के लिए, निम्नलिखित निर्माण का उपयोग करें:

ResRequest = Request.Execute(); यदि resQuery.Empty() तो वापस लौटें; अंतयदि;

तरीका खाली()तरीकों से पहले इस्तेमाल किया जाना चाहिए चुनना()या उतारना(), क्योंकि संग्रह को पुनः प्राप्त करने में समय लगता है।

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

अनुरोध = नया अनुरोध; Query.Text = "चुनें | क्लाइंट्स.लिंक, | क्लाइंट्स.जन्मतिथि |FROM | डायरेक्ट्री.क्लाइंट्स AS क्लाइंट्स | WHERE | क्लाइंट्स.लिंक = &क्लाइंट"; TableClients Loop Query.SetParameter("क्लाइंट", क्लाइंट) से प्रत्येक पंक्ति के लिए;

QueryResult = Query.Execute().Select(); अंतचक्र;

यह सिस्टम को लूप में अनुरोध की जाँच करने वाले सिंटैक्स से बचाएगा।

11. निर्माण "हो रहा है"।

भुगतान का चयन करें। ग्राहक, राशि (भुगतान राशि) दस्तावेज़ से राशि के रूप में। भुगतान भुगतान के रूप में जहां माह (भुगतान तिथि) = 9 भुगतान द्वारा समूह। ग्राहक के पास राशि (भुगतान राशि) > 13000

कंस्ट्रक्टर में, ऐसा करने के लिए, बस "शर्तें" टैब पर जाएं, एक नई शर्त जोड़ें और "कस्टम" चेकबॉक्स को चेक करें। तो बस लिखो राशि (भुगतान राशि) > 13000


12. शून्य मान

मैं यहां तीन-मूल्यवान तर्क के सिद्धांतों का वर्णन नहीं करूंगा, इस विषय पर डेटाबेस में कई लेख हैं। कैसे के बारे में संक्षेप में व्यर्थक्वेरी के परिणाम को प्रभावित कर सकता है. मान NULL वास्तव में एक मान नहीं है, और यह तथ्य कि मान अपरिभाषित है अज्ञात है। इसलिए, NULL के साथ कोई भी ऑपरेशन NULL लौटाता है, चाहे वह जोड़, घटाव, विभाजन या तुलना हो। शून्य मान की तुलना शून्य मान से नहीं की जा सकती क्योंकि हम नहीं जानते कि तुलना किससे करें। वे। ये दोनों तुलनाएँ हैं: NULL = NULL, NULL<>NULL सत्य या असत्य नहीं है, यह अज्ञात है।

आइए एक उदाहरण देखें.

उन ग्राहकों के लिए जिनके पास भुगतान नहीं है, हमें "कोई भुगतान नहीं" मान के साथ "साइन" फ़ील्ड प्रदर्शित करना होगा। इसके अलावा, हम निश्चित रूप से जानते हैं कि हमारे पास ऐसे ग्राहक हैं। और जो मैंने ऊपर लिखा है उसका सार प्रतिबिंबित करने के लिए, आइए इसे इस प्रकार करें।

विशेषता के रूप में "कोई भुगतान नहीं" चुनें, भुगतान के स्थान पर दस्तावेज़ स्थान के रूप में शून्य चुनें; ///////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////////// चयन करें। क्लाइंट के रूप में लिंक करें, भुगतान करें। लिंक करें कि भुगतान कैसे होता है, डायरेक्ट्री से tClientPayment डालें। क्लाइंट के रूप में क्लाइंट ने कनेक्शन दस्तावेज़ छोड़ा। भुगतान एएस भुगतान सॉफ्टवेयर क्लाइंट.लिंक = भुगतान.शेयरधारक; ///////////////////////////////////////////// // /////////////////////////// tClientPayment से tClientPayment.Client का चयन करें क्योंकि tClientPayment आंतरिक रूप से tPayment के रूप में tPayment में शामिल होता है tClientPayment.Payment = tPayment दस्तावेज़ द्वारा

दूसरी अस्थायी तालिका tClientPayment पर ध्यान दें। बाएं जुड़ाव से मैं सभी ग्राहकों और इन ग्राहकों के लिए सभी भुगतानों का चयन करता हूं। उन ग्राहकों के लिए जिनके पास भुगतान नहीं है, "भुगतान" फ़ील्ड शून्य होगी। तर्क का पालन करते हुए, पहली अस्थायी तालिका "tPayments" में मैंने 2 फ़ील्ड निर्दिष्ट किए, उनमें से एक NULL, दूसरी पंक्ति "भुगतान नहीं है"। तीसरी तालिका में मैं शामिल होता हूं आंतरिक रूप से जुड़ा"भुगतान" और "दस्तावेज़" फ़ील्ड के लिए तालिकाएँ "tClientPayment" और "tPayment"। हम जानते हैं कि पहली तालिका में "दस्तावेज़" फ़ील्ड शून्य है, और दूसरी तालिका में, जिनके पास "भुगतान" फ़ील्ड में भुगतान नहीं है वे भी शून्य हैं। ऐसा कनेक्शन हमें क्या लौटाएगा? लेकिन यह कुछ भी वापस नहीं करेगा. क्योंकि तुलना NULL = NULL सत्य का मूल्यांकन नहीं करती है।

अपेक्षित परिणाम लौटाने के अनुरोध के लिए, आइए इसे फिर से लिखें:

विशेषता के रूप में "कोई भुगतान नहीं" चुनें, भुगतान के दस्तावेज़ स्थान के रूप में मान (Document.Payment.EmptyLink) चुनें; ///////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////चयन करें। क्लाइंट का चयन करें। क्लाइंट के रूप में लिंक करें, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink )) कैसे भुगतान निर्देशिका से tClientPayment डालें। ग्राहकों द्वारा छोड़े गए कनेक्शन दस्तावेज़ के रूप में ग्राहक। ग्राहकों द्वारा भुगतान के रूप में भुगतान। लिंक = भुगतान। शेयरधारक; ///////////////////////////////////////////// // /////////////////////////// tClientPayment से tClientPayment का चयन करें

अब, दूसरी अस्थायी तालिका में, हमने संकेत दिया है कि यदि "भुगतान" फ़ील्ड शून्य है, तो यह फ़ील्ड = भुगतान दस्तावेज़ का एक खाली लिंक है। पहली तालिका में हमने NULL को एक खाली संदर्भ से भी बदल दिया। अब कनेक्शन में गैर-शून्य फ़ील्ड शामिल हैं और अनुरोध अपेक्षित परिणाम लौटाएगा।

लेख में शामिल सभी अनुरोध उन स्थितियों को दर्शाते हैं जिन पर मैं विचार करना चाहूंगा और इससे अधिक कुछ नहीं। के बारे में वे भ्रमपूर्ण या उप-इष्टतम नहीं हो सकते हैं, मुख्य बात यह है कि वे उदाहरण के सार को प्रतिबिंबित करते हैं।

13. "चॉइस व्हेन...थेन...एंड" डिज़ाइन की एक अनिर्दिष्ट विशेषता।

ऐसे मामले में जब अनुरोध में "शर्तों" के निर्माण का वर्णन करना आवश्यक हो, हम मानक वाक्यविन्यास का उपयोग करते हैं:

चयन का चयन करें जब Users.Name = "वास्या पुपकिन" तब "हमारा पसंदीदा कर्मचारी" अन्यथा "हम यह नहीं जानते" निर्देशिका से फ़ील्ड 1 के रूप में समाप्त होता है। Users AS Users

लेकिन क्या होगा यदि, उदाहरण के लिए, हमें अनुरोध में महीने का नाम प्राप्त करने की आवश्यकता हो? किसी अनुरोध में एक विशाल निर्माण लिखना बदसूरत और समय लेने वाला है, इसलिए उपरोक्त लेखन का यह रूप हमारी मदद कर सकता है:

महीना चुनें (यूएस_गणना खपत_टर्नओवर शेड्यूल.गणना अवधि) कब 1 तब "जनवरी" कब 2 तब "फरवरी" कब 3 तब "मार्च" कब 4 तब "अप्रैल" कब 5 फिर "मई" कब 6 तब "जून" कब 7 तब "जुलाई" कब 8 तब "अगस्त" जब 9 तब "सितंबर" जब 10 तब "अक्टूबर" जब 11 तब "नवंबर" जब 12 तब "दिसंबर" एक महीने के रूप में समाप्त होता है

अब डिज़ाइन कम बोझिल दिखता है और समझने में आसान है।

14. बैच क्वेरी निष्पादन।


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

उपयोगकर्ताओं का चयन करें। पूर्ण नाम के रूप में लिंक करें, उपयोगकर्ता। जन्मतिथि, उपयोगकर्ता। भूमिका निर्देशिका से vtUsers डालें। उपयोगकर्ताओं के रूप में उपयोगकर्ता; ///////////////////////////////////////////// // //////////////////////////// चुनें TueUsers.पूरा नाम, TueUsers.जन्मतिथि TueUsers से TueUsers के रूप में समूह TueUsers.पूरा नाम, TueUsers के अनुसार जन्म तिथि; ///////////////////////////////////////////// // //////////////////////////// चुनें wUsers.पूरा नाम, wUsers.भूमिका wUsers से wUsers के अनुसार समूहित करें wUsers.पूरा नाम, wUsers दिनांक जन्म से

tPackage = Request.ExecutePackage();

TP_BirthDate = tPackage.Upload();
TP_Roles = tPackage.Unload();

जैसा कि हम देख सकते हैं, क्वेरी को एक बैच में निष्पादित किया जा सकता है और परिणाम को एक सरणी के रूप में संसाधित किया जा सकता है। कुछ मामलों में यह बहुत सुविधाजनक है.

15. बैच अनुरोध में शर्तें

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

उपयोगकर्ता.व्यक्तिगत.नाम को नाम के रूप में चुनें, उपयोगकर्ता.व्यक्तिगत.जन्मतिथि को जन्मतिथि के रूप में चुनें, उपयोगकर्ता.व्यक्तिगत.कोड को कोड के रूप में चुनें निर्देशिका से उपयोगकर्ता को स्थान दें।उपयोगकर्ता को उपयोगकर्ता के रूप में चुनें; ///////////////////////////////////////////// // ///////////////////////////निर्देशिका से व्यक्तियों का चयन करें

आप इस तरह शर्तें लगा सकते हैं:

जहां व्यक्ति.कोड IN (मंगलवार उपयोगकर्ताओं से चयन करें TueUsers.Code) और व्यक्तियों.नाम IN (मंगलवार उपयोगकर्ताओं से चयन करें TueUsers.Code) और व्यक्तियों.जन्मतिथि IN (मंगलवार उपयोगकर्ताओं से TueUsers.DateBirth चुनें)

और आप इसे इस तरह कर सकते हैं:

कहां (व्यक्ति.कोड, व्यक्ति.नाम, व्यक्ति.जन्मतिथि) में (मंगलवार.कोड, मंगलउपयोगकर्ता.नाम, मंगलउपयोगकर्ता.जन्मतिथि का चयन मंगलवार से करें)

इसके अलावा व्यवस्था बनाए रखना भी जरूरी है।

16. बैच अनुरोध में "स्थिति" के लिए क्वेरी बिल्डर को कॉल करना

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

कंस्ट्रक्शन "बी" के बाद ब्रैकेट लगाना और ब्रैकेट के बीच खाली जगह (स्पेस) छोड़ना जरूरी है, इस स्पेस को सेलेक्ट करें और क्वेरी कंस्ट्रक्टर को कॉल करें। डिज़ाइनर के पास बैच क्वेरी की सभी तालिकाओं तक पहुंच होगी। तकनीक वर्चुअल रजिस्टर टेबल और "शर्तें" टैब दोनों पर काम करती है। बाद वाले मामले में, आपको "पी (मनमानी स्थिति)" बॉक्स को चेक करना होगा और संपादन मोड "एफ4" दर्ज करना होगा।

प्रश्न अक्सर अचानक ही तैयार कर लिए जाते थे और वे बस उन "तकनीकों" को स्पष्ट करने का काम करते हैं जिन पर मैं विचार कर रहा था।

मैं प्रश्नों में अनुक्रमणिका के उपयोग को देखना चाहता था, लेकिन यह एक बहुत व्यापक विषय है। मैं इसे एक अलग लेख में रखूंगा, या बाद में यहां जोड़ूंगा।

अद्यतन1. अंक 11,12
upd2. अंक 13,14,15,16

प्रयुक्त साहित्य:
क्वेरी भाषा "1सी:एंटरप्राइज़ 8" - ई.यू. ख्रुस्तलेवा
1सी:एंटरप्राइज़ 8 प्रणाली में व्यावसायिक विकास।"

NULL एक मूल्य की अनुपस्थिति से अधिक कुछ नहीं है। बहुत से लोग इसे टाइप नंबर के मान "0", किसी ऑब्जेक्ट का खाली संदर्भ या खाली स्ट्रिंग के साथ भ्रमित करते हैं। इसी ग़लतफ़हमी के कारण अनेक ग़लतियाँ उत्पन्न हो जाती हैं।

यदि अनुरोध किसी गैर-मौजूद फ़ील्ड, प्रॉपर्टी या टूटे हुए लिंक को संदर्भित करता है तो NULL मान दिखाई देगा।

SQL पर आधारित, जो NULL के लिए सामान्य समानता परीक्षण की अनुमति नहीं देता है। 1C 8.3 में NULL की जांच करने के दो तरीके नीचे दिए गए हैं।

1C 8.3 क्वेरी भाषा फ़ंक्शन ISNULL() में दो इनपुट पैरामीटर हैं:

  • अभिव्यक्ति का परीक्षण किया जाना है;
  • प्रतिस्थापन अभिव्यक्ति.

यदि परीक्षण किया जा रहा मान शून्य है, तो यह फ़ंक्शन प्रतिस्थापन अभिव्यक्ति का मान लौटाएगा। यदि मान NULL के अलावा अन्य है, तो परीक्षण किया जा रहा अभिव्यक्ति वापस कर दी जाएगी।

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

इस मामले में, ऐसी स्थिति उत्पन्न हो सकती है कि किसी स्थिति के लिए रजिस्टर में कोई कीमत ही न हो। इस स्थिति में, ISNULL फ़ंक्शन हमें सामान्य शून्य लौटाएगा। यदि आप इसका उपयोग नहीं करते हैं, तो जब आप शून्य मान के साथ "मूल्य" फ़ील्ड पर अंकगणितीय संचालन करने का प्रयास करेंगे, तो हमें एक त्रुटि प्राप्त होगी।

चुनना

ISNULL(कीमतें.कीमत, 0) वर्तमान कीमत के अनुसार
से



कहाँ

चयन कथन में शून्य है

ISNULL() का समतुल्य ISNULL है, जिसका उपयोग SELECT स्टेटमेंट में किया जाता है और जाँचता है कि मान NULL है या नहीं। इस मामले में "आईएस" का तात्पर्य समानता से है और पिछले उदाहरण में क्वेरी इस तरह दिखेगी:

चुनना
उत्पाद. नामकरण उत्पाद के रूप में,
पसंद
जब कीमतें शून्य हों
फिर 0
अन्यथा कीमतें.कीमत
वर्तमान मूल्य के रूप में समाप्त करें
से
दस्तावेज़। माल और सेवाओं की प्राप्ति
बायां कनेक्शन रजिस्टर जानकारी। मूल्य नामकरण। कीमतों के रूप में अंतिम स्लाइस
सॉफ़्टवेयर उत्पाद.नामपद्धति = कीमतें.नामपद्धति
कहाँ
उत्पाद.लिंक = &LinkToDocument

फ़ंक्शन ISNULL() और IS NULL के बीच अंतर

जैसा कि आप पिछले उदाहरणों से देख सकते हैं, दोनों मामलों में अनुरोध समान डेटा लौटाता है। ISNULL() फ़ंक्शन SELECTION WHEN... IS NULL... END का शॉर्टहैंड संस्करण है, लेकिन यह निम्नलिखित कारणों से अभी भी बेहतर है:

  1. ISNULL() फ़ंक्शन क्वेरी को अनुकूलित करता है। इसे एक बार पढ़ा जाता है, इसलिए किसी जटिल अभिव्यक्ति की जाँच करते समय अनुरोध तेजी से संसाधित होगा।
  2. ISNULL() फ़ंक्शन निर्माण को छोटा करता है, जिससे क्वेरी अधिक पठनीय हो जाती है।
  3. ISNULL() फ़ंक्शन को निष्पादित करते समय, प्रतिस्थापन अभिव्यक्ति स्ट्रिंग प्रकार (स्ट्रिंग लंबाई) और संख्यात्मक प्रकार (बिट गहराई) के लिए परीक्षण की जा रही अभिव्यक्ति के प्रकार तक कम हो जाती है।

इस लेख में हम आपसे हर बात पर चर्चा करना चाहते हैं 1C क्वेरी भाषा फ़ंक्शन, और भी क्वेरी भाषा निर्माण. फ़ंक्शन और डिज़ाइन में क्या अंतर है? फ़ंक्शन को कोष्ठक और उनमें संभावित पैरामीटर के साथ बुलाया जाता है, और निर्माण कोष्ठक के बिना लिखा जाता है। निश्चित रूप से 1C क्वेरी भाषा की सभी संरचनाएँ और कार्यडेटा अधिग्रहण प्रक्रिया को लचीला और बहुक्रियाशील बनाएं। ये फ़ंक्शन और संरचनाएं अनुरोध फ़ील्ड पर लागू होती हैं, और कुछ शर्तों पर भी लागू होती हैं।

1सी क्वेरी भाषा कार्य

क्योंकि स्पष्ट विवरण 1C क्वेरी भाषा फ़ंक्शनसंरचनाओं के विवरण की तुलना में बहुत कम आम है, हमने फ़ंक्शंस को देखना शुरू करने का निर्णय लिया। आइए अब प्रत्येक को अलग-अलग देखें, उसके उद्देश्य, वाक्य-विन्यास और उपयोग के उदाहरण का वर्णन करें, इस प्रकार:

1. समारोह दिनांक समय - यह फ़ंक्शन"दिनांक" प्रकार का एक स्थिर फ़ील्ड बनाता है।

सिंटेक्स: दिनांक समय(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

उपयोग उदाहरण:

2. दिनांक अंतर फ़ंक्शन- किसी एक आयाम (वर्ष, माह, दिन, घंटा, मिनट, सेकंड) में दो तिथियों के बीच का अंतर लौटाता है। माप को एक पैरामीटर के रूप में पारित किया जाता है।

सिंटेक्स: विभेदित दिनांक(<Дата1>, <Дата2>, <Тип>)

उपयोग उदाहरण:

Query.Text = "चयन करें | भिन्न दिनांक (दिनांक समय (2015, 4, 17), दिनांक समय (2015, 2, 1), दिन) | दिनों की संख्या के अनुसार";

3. फ़ंक्शन मान- डेटाबेस से पूर्वनिर्धारित रिकॉर्ड के साथ एक स्थिर फ़ील्ड सेट करता है, आप किसी भी प्रकार का एक खाली लिंक भी प्राप्त कर सकते हैं।

सिंटैक्स: मान(<Имя>)

उपयोग उदाहरण:

Request.Text = "SELECT //पूर्वनिर्धारित तत्व | VALUE(निर्देशिका.मुद्राएँ.Dollar) AS डॉलर, //खाली लिंक | VALUE(Document.Receipt of Goods and Services.EmptyLink) AS Receipt, //transfer value | VALUE(Transfer) . कानूनी व्यक्ति। व्यक्तिगत) एएस व्यक्तिगत, //पूर्वनिर्धारित खाता मूल्य (खातों का चार्ट। स्व-लेखा। सामग्री) एएस खाता_10" ;

4. फ़ंक्शन चुनें- हमारे सामने IF निर्माण का एक एनालॉग है, जिसका उपयोग कोड में किया जाता है, केवल इसका उपयोग 1C प्रश्नों में किया जाता है।

सिंटेक्स: कब चुनें<Выражение>तब<Выражение>अन्यथा<Выражение>अंत

उपयोग उदाहरण:

Request.Text = //यदि राशि 7500 से अधिक है, तो 300 रूबल की छूट होनी चाहिए, //इसलिए यदि स्थिति चालू हो जाती है तो फ़ंक्शन //राशि लौटाता है - 300 //अन्यथा अनुरोध केवल राशि लौटाएगा "चुनें | चुनें | जब TCReceipts.Amount > 7500 | तब TCReceipts.Amount - 300 | अन्यथा TCReceipts.Amount | AmountWithDiscount के रूप में समाप्त करें | FROM |

5. एक्सप्रेस समारोह- आपको एक विशिष्ट प्रकार के साथ एक स्थिर क्षेत्र को व्यक्त करने की अनुमति देता है।

सिंटेक्स: एक्सप्रेस (फ़ील्डनाम जैसा टाइपनाम)

उपयोग उदाहरण:

Query.Text = "विभिन्न चुनें | सेल्स.रजिस्ट्रार.नंबर, | चुनें | जब सेल्स.रजिस्ट्रार दस्तावेज़.व्यय को लिंक करें | तब व्यक्त करें (सेल्स.रजिस्ट्रार दस्तावेज़.व्यय के रूप में) | अन्यथा चुनें | जब सेल्स.रजिस्ट्रार दस्तावेज़.कार्यान्वयन को लिंक करें | फिर व्यक्त करें (बिक्री रजिस्ट्रार दस्तावेज़ कार्यान्वयन के रूप में) |। अंत |। संख्या के रूप में संचय रजिस्टर करें";

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

उपयोग उदाहरण:

Query.Text = "चयन करें | एक्सप्रेस (नामपद्धति। लाइन के रूप में टिप्पणी करें (300)) टिप्पणी के रूप में, | एक्सप्रेस (नामकरण। संख्या के रूप में योग (15,2)) योग के रूप में | FROM | निर्देशिका। नामकरण के रूप में नामकरण";

6. ISNULL फ़ंक्शन(वैकल्पिक वर्तनी ISNULL) - यदि फ़ील्ड NULL प्रकार का है, तो इसे फ़ंक्शन के दूसरे पैरामीटर से बदल दिया जाता है।

सिंटेक्स: शून्य(<Поле>, <ПодставляемоеЗначение>)

उपयोग उदाहरण:

यह भी ध्यान दें कि हमेशा NULL प्रकार को कुछ मान से बदलने की सलाह दी जाती है, क्योंकि NULL प्रकार के साथ तुलना हमेशा FALSE लौटाती है, भले ही आप NULL की तुलना NULL से करें। अक्सर, NULL मान तालिकाओं में शामिल होने (आंतरिक को छोड़कर सभी प्रकार के जोड़ों) के परिणामस्वरूप बनते हैं।

Query.Text = //संपूर्ण आइटम और उसके शेष का चयन करें //यदि किसी आइटम में कोई शेष नहीं है, तो एक फ़ील्ड होगा //NULL जिसे मान 0 "SELECT | No. Link, | ISNULL" से बदल दिया जाएगा (ProductsInStockRemains.InStockRemaining, 0) कैसे शेष |

7. प्रतिनिधित्व समारोह- आपको अनुरोध फ़ील्ड का प्रतिनिधित्व प्राप्त करने की अनुमति देता है।

सिंटेक्स: प्रदर्शन(<НаименованиеПоля>)

उपयोग उदाहरण:

Query.Text = "चयन | प्रतिनिधित्व(FreeRemainingRemains.Nomenclature) नामकरण के रूप में, | प्रतिनिधित्व(FreeRemainingRemaining.Warehouse) गोदाम के रूप में, | FreeRemainingRemaining.InStockRemaining |FROM |Accumulation Register.FreeRemaining.Remaining as FreeRemainingRemaining";

1C क्वेरी भाषा में निर्माण करता है

हमने आपसे ऊपर चर्चा की 1C क्वेरी भाषा फ़ंक्शन, अब विचार करने का समय आ गया है 1C क्वेरी भाषा में निर्माण करता है, वे कम महत्वपूर्ण और उपयोगी नहीं हैं, आइए शुरू करें।

1. निर्माण लिंक- संदर्भ प्रकार की जाँच के लिए एक तार्किक ऑपरेटर है। किसी विशिष्ट प्रकार के विरुद्ध किसी जटिल प्रकार के फ़ील्ड की जाँच करते समय अक्सर इसका सामना करना पड़ता है। सिंटेक्स: जोड़ना<Имя таблицы>

उपयोग उदाहरण:

Request.Text = //यदि मान प्रकार लकड़हारा है दस्तावेज़ प्रवेश कक्ष, //तब अनुरोध "माल की रसीद" लौटाएगा, अन्यथा "माल की बिक्री" "चयन करें | चयन करें | जब शेष। रजिस्ट्रार लिंक दस्तावेज़। माल और सेवाओं की रसीद | फिर ""रसीद"" | अन्यथा ""उपभोग" " | END AS मूवमेंट टाइप | FROM | संचय रजिस्टर। गोदामों में शेष माल यथा अवशेष" ;

2. के बीच डिज़ाइन करें- यह ऑपरेटर जाँचता है कि मान निर्दिष्ट सीमा के भीतर है या नहीं।

सिंटेक्स: बीच में<Выражение>और<Выражение>

उपयोग उदाहरण:

Request.Text = //संपूर्ण नामकरण प्राप्त करें जिसका कोड 1 से 100 तक की सीमा में है "SELECT | Nomenclature.Link |FROM | Directry.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code BETWEEN 1 AND 100" ;

3. निर्माण बी और बी पदानुक्रम- जांचें कि क्या मान हस्तांतरित सूची में है (सरणियाँ, मूल्यों की तालिकाएँ, आदि को एक सूची के रूप में स्थानांतरित किया जा सकता है)। IN HIERARCHY ऑपरेटर आपको पदानुक्रम देखने की अनुमति देता है (खातों के चार्ट का उपयोग करने का एक उदाहरण)।

सिंटेक्स: में(<СписокЗначений>), पदानुक्रम में(<СписокЗначений>)

उपयोग उदाहरण:

Request.Text = //खाते के सभी उप-खातों का चयन करें "चयन करें | स्वावलंबी। खाते के रूप में लिंक करें | FROM | खातों का चार्ट। स्वावलंबी के रूप में स्वावलंबी | कहां | स्वावलंबी। पदानुक्रम मान में लिंक करें (चार्ट का लेखा। स्वावलंबी सामान)";

4. डिज़ाइन समान- यह फ़ंक्शन हमें एक स्ट्रिंग की तुलना एक स्ट्रिंग पैटर्न से करने की अनुमति देता है।

सिंटेक्स: पसंद "<ТекстШаблона>"

पंक्ति पैटर्न विकल्प:

% - एक अनुक्रम जिसमें किसी भी संख्या में मनमाने वर्ण हों।

एक मनमाना चरित्र.

[...] - वर्गाकार कोष्ठकों के अंदर सूचीबद्ध कोई एकल वर्ण या वर्णों का क्रम। गणना श्रेणियाँ निर्दिष्ट कर सकती है, उदाहरण के लिए ए-जेड, जिसका अर्थ है सीमा में शामिल एक मनमाना वर्ण, जिसमें सीमा के सिरे भी शामिल हैं।

[^...] - निषेध चिह्न के बाद सूचीबद्ध वर्णों को छोड़कर वर्गाकार कोष्ठक के अंदर सूचीबद्ध कोई एकल वर्ण या वर्णों का क्रम।

उपयोग उदाहरण:

Query.Text = //संपूर्ण नामकरण ढूंढें जिसमें मूल TABUR शामिल है और //या तो एक छोटे अक्षर से या इसके साथ शुरू होता है बड़े अक्षरटी "चयन करें | नामकरण। लिंक | से | निर्देशिका। नामकरण के रूप में नामकरण | कहां | उत्पाद। नाम जैसे "" [टीटी]अबुर%""" ;

5. डिज़ाइन की अनुमति- यह ऑपरेटर आपको डेटाबेस से केवल उन्हीं रिकॉर्ड्स को चुनने की अनुमति देता है जिनके लिए कॉल करने वाले के पास पढ़ने की अनुमति है। ये अधिकार रिकॉर्ड स्तर (आरएलएस) पर कॉन्फ़िगर किए गए हैं।

सिंटेक्स: इसके बाद ALOWED लिखा है कीवर्डचुनना

उपयोग उदाहरण:

Request.Text = "चयन की अनुमति है | प्रतिपक्ष। लिंक | FROM | निर्देशिका। प्रतिपक्षों के रूप में प्रतिपक्ष";

6. विभिन्न डिज़ाइन करें- आपको उन रिकॉर्ड्स का चयन करने की अनुमति देता है जिनमें कोई डुप्लिकेट रिकॉर्ड नहीं हैं।

सिंटेक्स: कीवर्ड SELECT के बाद VARIOUS लिखा होता है

उपयोग उदाहरण:

Request.Text = // उन रिकॉर्ड्स का चयन करता है जिन पर पाठक के पास अधिकार हैं "विभिन्न का चयन करें | प्रतिपक्ष.नाम | FROM | निर्देशिका। प्रतिपक्षों के रूप में प्रतिपक्ष" ;

इसके अलावा, विभिन्न निर्माण का उपयोग स्वीकृत ऑपरेटर और अन्य ऑपरेटरों के साथ किया जा सकता है।

उपयोग उदाहरण:

Request.Text = // विभिन्न रिकॉर्ड्स का चयन करता है जिन पर पाठक के पास अधिकार हैं "अनुमत विभिन्न का चयन करें | प्रतिपक्ष.नाम | FROM | निर्देशिका। प्रतिपक्षों के रूप में प्रतिपक्ष";

7. पहले डिज़ाइन करें- क्वेरी परिणाम से पैरामीटर में निर्दिष्ट रिकॉर्ड की संख्या का चयन करता है।

सिंटैक्स: प्रथम<число>

उपयोग उदाहरण:

Request.Text = //निर्देशिका से पहले 4 सीसीडी नंबर चुनें "पहले 4 चुनें | सीसीडी नंबर। लिंक | FROM | निर्देशिका। सीसीडी नंबर सीसीडी नंबर के रूप में";

8. बदलाव के लिए डिज़ाइन- आपको एक टेबल लॉक करने की अनुमति देता है, केवल लेनदेन में काम करता है (केवल स्वचालित लॉक के लिए प्रासंगिक)।

सिंटेक्स: को बदलने<НаименованиеТаблицы>

उपयोग उदाहरण:

Query.Text = "चयन करें | निःशुल्क शेष अवशेष। नामकरण, | निःशुल्क शेष शेष। गोदाम, | निःशुल्क शेष शेष। स्टॉक में शेष | FROM | संचय का रजिस्टर। निःशुल्क शेष। निःशुल्क शेष के रूप में शेष | परिवर्तन के लिए | संचय का रजिस्टर . निःशुल्क शेष";

9. डिज़ाइन ऑर्डर द्वारा- एक विशिष्ट क्षेत्र द्वारा डेटा व्यवस्थित करता है। यदि फ़ील्ड एक लिंक है, तो ध्वज सेट करते समय ऑटो ऑर्डरसॉर्टिंग लिंक प्रतिनिधित्व के आधार पर होगी; यदि ध्वज बंद है, तो लिंक को मेमोरी में लिंक पते की वरिष्ठता के आधार पर सॉर्ट किया जाता है।

सिंटेक्स: द्वारा आदेश<НаименованиеПоля>ऑटो ऑर्डर

उपयोग उदाहरण:

Query.Text = "चयन करें | निःशुल्क शेष शेष। नामकरण के रूप में नामकरण, | निःशुल्क शेष शेष। गोदाम के रूप में गोदाम, | निःशुल्क शेष शेष। स्टॉक में शेष | FROM | रजिस्टर संचय। निःशुल्क शेष। शेष निःशुल्क शेष के रूप में | | ऑर्डर द्वारा |. नामकरण |. ऑटो ऑर्डर रीडिंग";

10. डिज़ाइन ग्रुप बाय- विशिष्ट फ़ील्ड द्वारा क्वेरी स्ट्रिंग्स को समूहीकृत करने के लिए उपयोग किया जाता है। किसी भी समग्र फ़ंक्शन के साथ संख्यात्मक फ़ील्ड का उपयोग किया जाना चाहिए।

सिंटेक्स: द्वारा समूह बनाएं<НаименованиеПоля1>, .... , <НаименованиеПоляN>

उपयोग उदाहरण:

Query.Text = "SELECT | ProductInWarehouses.Nomenclature as Nomenclature, | ProductInWarehouses.Nomenclature, | SUM(GoodsInWarehouses.InStock) as INSTOCK |FROM | RegisterAccumulations.ProductsInWarehouses AS ProductInWarehouses | | Group BY | ProductInWarehouses.Nomenclature, | Treasures.Warehouse";

11. डिजाइन होना- आपको WHERE निर्माण के समान, डेटा चयन स्थिति में एक समग्र फ़ंक्शन लागू करने की अनुमति देता है।

सिंटेक्स: होना<агрегатная функция с условием>

उपयोग उदाहरण:

Query.Text = // समूहीकृत रिकॉर्ड का चयन करता है जहां इनस्टॉक फ़ील्ड 3 से अधिक है "SELECT | ItemsInStocks.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) AS INSTOCK |FROM | RegisterAccumulations.ItemsInStocks AS ItemsInStocks | | समूह द्वारा |. उत्पाद गोदामों में. नामकरण, | उत्पाद गोदामों में | | उपलब्ध राशि |

12. निर्माण सूचकांक द्वारा- क्वेरी फ़ील्ड को अनुक्रमित करने के लिए उपयोग किया जाता है। अनुक्रमण के साथ एक क्वेरी को पूरा होने में अधिक समय लगता है, लेकिन अनुक्रमित फ़ील्ड के माध्यम से खोज की गति तेज हो जाती है। इसका उपयोग केवल वर्चुअल टेबल में किया जा सकता है।

सिंटेक्स: द्वारा सूचकांक<Поле1, ... , ПолеN>

उपयोग उदाहरण:

Request.Text = "SELECT | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | Place DataTs | FROM | &Ts AS Ts | | Index BY | Ts.NameOS, | Ts .कोडओएस";

13. डिज़ाइन कहां- आपको किसी भी चयन फ़ील्ड पर एक शर्त लगाने की अनुमति देता है। परिणाम में केवल वही रिकॉर्ड शामिल होंगे जो शर्त को पूरा करते हैं।

सिंटेक्स: कहाँ<Условие1 ОператорЛогСоединения УсловиеN>

उपयोग उदाहरण:

Query.Text = //CompensationRemaining वाले सभी रिकॉर्ड चयनित हैं<>0 और //AmountForcalcCompRemaining > 100 "चयन करें | CompensationRPOREmains.Counterparty, |CompensationRPOREmains.Child, | CompensationRPOREmains.CompensationRemaining, | CompensationRPORmains.AmountForcalcCompRemains |Place DataTz |FROM |Accumulation Register.CompensationRP.Remains AS CompensationRPRemains |WHERE |Compensation RPORemaining.CompensationRemaining<>0 | और CompensationRPOREmains.AmountForcalcCompRemaining> 100" ;

14. डिज़ाइन परिणाम... सामान्य- कुल की गणना करने के लिए उपयोग किया जाता है; डिज़ाइन उन फ़ील्ड को निर्दिष्ट करता है जिनके द्वारा कुल की गणना की जाएगी और कुल फ़ील्ड पर कुल फ़ंक्शन लागू होंगे। TOTAL निर्माण के बाद प्रत्येक फ़ील्ड के लिए कुल का उपयोग करते समय, डेटा को समूहीकृत किया जाता है। एक वैकल्पिक सामान्य निर्माण है; इसका उपयोग अतिरिक्त समूहन भी प्रदान करता है। आप नीचे अनुरोध परिणाम का एक उदाहरण देखेंगे।

सिंटेक्स: परिणाम<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>द्वारा<ОБЩИЕ> <Поле1, ... , ПолеN>

उपयोग उदाहरण:

Request.Text = "चयन करें | गणना। प्रतिपक्ष समझौता। अनुबंध के प्रकार के रूप में समझौते का प्रकार, | गणना। अनुबंध के रूप में प्रतिपक्ष समझौता, | गणना। प्रतिपक्ष, | गणना। पारस्परिक निपटान शेष की राशि शेष राशि के रूप में | FROM | संचय का रजिस्टर। पारस्परिक प्रतिपक्षों के साथ निपटान। गणना के रूप में शेष | कुल |। राशि (शेष राशि) | सामान्य, | समझौते का प्रकार";

यह आंकड़ा उन समूहों को रेखांकित करता है जो अनुरोध के निष्पादन के दौरान बनाए गए थे, शीर्ष वाला सामान्य अनुभाग को संदर्भित करता है, और दूसरा प्रतिपक्ष समझौतेएग्रीमेंट प्रकार फ़ील्ड को संदर्भित करता है।

आप क्वेरी फ़ील्ड में विभिन्न फ़ंक्शंस लागू कर सकते हैं। इस अनुभाग में मैं उनमें से सबसे अधिक उपयोग किए जाने वाले (मेरे द्वारा व्यक्तिगत रूप से) पर विचार करूंगा।

दिनांक समय- दिनांक प्रकार के साथ एक स्थिर फ़ील्ड निर्दिष्ट करता है। सिंटेक्स:

दिनांक समय(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)
अनुरोध.पाठ=
"चुनना
| दिनांकसमय(2013, 1, 1) एएस ओएमजी";//जनवरी 1, 2013

विभेदित दिनांक- निर्दिष्ट आयाम (वर्ष, माह, दिन, घंटा, मिनट, सेकंड) में 2 तिथियों के बीच का अंतर लौटाता है। सिंटेक्स:

विभेदित दिनांक(<Дата1>, <Дата2>, <Тип>)
अनुरोध.पाठ=
"चुनना
| दिनांकअंतर(दिनांकसमय(2013, 2,28), दिनांकसमय(2013, 1,1), दिन)
| शीत ऋतु के अंत तक के दिनों की तरह";

अर्थ- डेटाबेस तालिकाओं में से किसी एक के पूर्वनिर्धारित रिकॉर्ड के साथ एक स्थिर फ़ील्ड निर्दिष्ट करता है, आप एक खाली लिंक भी पास कर सकते हैं; सिंटेक्स:

अर्थ(<Имя>)
अनुरोध.पाठ=
"चुनना
// पूर्वनिर्धारित निर्देशिका तत्व
| मूल्य(निर्देशिका.मुद्राएं.रूबल) रूबल के रूप में,
//दस्तावेज़ का खाली लिंक
| मूल्य (दस्तावेज़। खरीदार को भुगतान के लिए चालान। खाली लिंक) खाली चालान के रूप में,
//गणना मूल्य
| मान(गणना.लिंगव्यक्ति.पुरुष) पुरुष के रूप में,
// खातों के चार्ट से पूर्वनिर्धारित खाता
| मूल्य (खातों का चार्ट। स्वावलंबी। सामान) एएस खाता_41";

पसंद- 1C क्वेरी भाषा के लिए IF निर्माण का एक एनालॉग। सिंटेक्स:

पसंद
कब<Выражение>तब<Выражение>
अन्यथा<Выражение>
अंत
अनुरोध.पाठ=
"चुनना
//यदि कीमत 100 से कम है, तो भी अनुरोध 100 लौटाएगा
//अन्यथा अनुरोध वास्तविक कीमत लौटा देगा
| पसंद
| जब उत्पाद.मूल्य > 100
| फिर उत्पाद.कीमत
| अन्य 100
| कीमत के रूप में समाप्त करें
|से

जोड़ना<Имя таблицы>
अनुरोध.पाठ=
"चुनना
//यदि रिकॉर्डर मान प्रकार दस्तावेज़ रसीद है,
//तो अनुरोध "माल की प्राप्ति" लौटाएगा, अन्यथा "माल की बिक्री"
| पसंद
| जब बैलेंस.रजिस्ट्रार लिंक दस्तावेज़.रसीद
| फिर ""माल की प्राप्ति""
| अन्यथा ""माल की बिक्री""
| आंदोलन दृश्य के रूप में समाप्त करें
|से
| संचय रजिस्टर. शेष के रूप में शेष";

बीच में- श्रेणी में शामिल करने के लिए मूल्य की जाँच करता है। सिंटेक्स:

बीच में<Выражение>और<Выражение>
अनुरोध.पाठ=
// 100 से 1000 तक मूल्य सीमा में सभी उत्पाद प्राप्त करें
"चुनना
| उत्पाद.उत्पाद
|से
|कहां
| उत्पाद। कीमत 100 और 1000 के बीच";

मेंऔर पदानुक्रम में- हस्तांतरित सूची में किसी मान की उपस्थिति की जाँच करें। पदानुक्रम पदानुक्रमित तत्वों को भी नीचे गिराएगा और अधीनस्थ तत्वों के बीच मूल्य की तलाश करेगा। सिंटेक्स:

में(<СписокЗначений>), पदानुक्रम में(<СписокЗначений>)
अनुरोध.पाठ=
//41वें और 10वें खाते के सभी उप-खाते प्राप्त करें
"चुनना
| स्वावलंबी। एएस खाता लिंक करें
|से
| स्वावलंबी एएस स्वावलंबी खातों का चार्ट
|कहां
| स्वावलंबी। पदानुक्रम में संदर्भ (मूल्य (खातों का चार्ट। स्व-वित्तपोषण। सामान),
| मूल्य (खातों का चार्ट। लागत लेखांकन। सामग्री))";

पसंद- आपको एक पैटर्न के साथ एक स्ट्रिंग की तुलना करने की अनुमति देता है, जिसका उपयोग तब किया जाता है जब खोज स्ट्रिंग को सख्ती से परिभाषित नहीं किया जाता है। टेम्पलेट का निर्माण:

  • % (प्रतिशत): एक अनुक्रम जिसमें किसी भी संख्या में मनमाने वर्ण हों
  • _ (अंडरस्कोर): एक मनमाना वर्ण
  • [...] (वर्गाकार कोष्ठक में एक या अधिक वर्ण): वर्गाकार कोष्ठक के अंदर सूचीबद्ध कोई एकल वर्ण। गणना रेंज निर्दिष्ट कर सकती है, उदाहरण के लिए a-z, जिसका अर्थ है रेंज में शामिल एक मनमाना वर्ण, जिसमें रेंज के सिरे भी शामिल हैं
  • [^...] (वर्ग कोष्ठक में एक निषेध चिह्न जिसके बाद एक या अधिक वर्ण होते हैं): निषेध चिह्न के बाद सूचीबद्ध वर्णों के अलावा कोई एकल वर्ण

सिंटेक्स:

पसंद "<ТекстШаблона>"
अनुरोध.पाठ=
//नामकरण निर्देशिका में सभी कुर्सियाँ खोजें
"चुनना
| उत्पाद.उत्पाद
|से
| निर्देशिका. उत्पाद के रूप में उत्पाद
|कहां
| उत्पाद.नाम ""टूल%""" के समान;
// यह अनुरोध कुर्सी, कुर्सी, ऊंची कुर्सी, कार्यालय कुर्सी, आदि लौटाएगा।
//लेकिन तालिका इस सूची में नहीं होगी

ISNULL- यदि फ़ील्ड परिभाषित नहीं है, तो उसे निर्दिष्ट अभिव्यक्ति में परिभाषित करता है। सिंटेक्स:

शून्य(<Выражение>, <Выражение>)
अनुरोध.पाठ=
//यदि फ़ील्ड परिभाषित नहीं है (शून्य)? फिर इसे एक खाली लिंक असाइन करें
"चुनना
| ISNULL(Products.Link, VALUE(Directory.Products.EmptyLink)) उत्पाद के रूप में
|से
| निर्देशिका.उत्पाद के रूप में उत्पाद";

मैं ध्यान देता हूं कि NULL को संसाधित किया जाना चाहिए, क्योंकि यह एक बहुत ही "मज़बूत" प्रकार है (1सी:एंटरप्राइज़ 8 प्रणाली में इसे परिभाषित किया गया है विशेष प्रकारएक तत्व के साथ शून्य)। यदि आप इस प्रकार के मान की तुलना करने या निर्दिष्ट करने का प्रयास करते हैं, तो आप निश्चित रूप से एक त्रुटि में भाग जाएंगे, इसलिए इस निर्माण के बारे में न भूलें। NULL कब पॉप अप हो सकता है:

  • तालिकाओं में शामिल होने के बाद, आंतरिक तालिकाओं को छोड़कर (जुड़ने के बारे में अगला लेख देखें);
  • केवल निर्देशिका समूहों के लिए परिभाषित विवरणों का चयन करने के बाद और इसके विपरीत;
  • दस्तावेज़ जर्नल कॉलम का चयन करने के बाद, जबकि वर्तमान दस्तावेज़ में इस कॉलम में विवरण शामिल नहीं है।

ये तो दूर की बात है पूरी सूची 1सी 8 क्वेरी भाषा के कार्य, यदि आप किसी अन्य कार्य में रुचि रखते हैं, तो टिप्पणियों में लिखें।