घंटी

आपसे पहले इस खबर को पढ़ने वाले भी हैं।
नवीनतम लेख प्राप्त करने के लिए सदस्यता लें।
ईमेल
नाम
उपनाम
आप द बेल को कैसे पढ़ना चाहेंगे
कोई स्पैम नहीं

प्रश्न: 1सी 8.3 पर लिनक्स (उबंटू x64) के लिए सी++ में बाहरी नेटिव एपीआई घटक


मैं वीके लिख रहा हूं, मैं उबंटू पर 1 एस से कनेक्ट नहीं कर सकता। यहां तक ​​कि 1s का एक्सप्ल भी जुड़ा नहीं है। तो इसके बारे में एक सवाल:

1) मैं लेख में दिए गए VNCOMPS उदाहरण से वीके को जोड़ने की कोशिश कर रहा हूं

(लिंक बहुत अंत में पाया जा सकता है: "कॉपी किया जा रहा है")।
आंतरिक रूप से, NativeApi प्रोजेक्ट में एक मेकफाइल है। इसके साथ, मैं Ununtu पर .so लाइब्रेरी बनाता हूं।
लेकिन "बाहरी घटक कनेक्ट करें" पर 1 बंद हो जाता है।
इसी तरह, अगर मैं "build.sh" (परियोजना की जड़ में) का उपयोग कर निर्माण करता हूं।

मेकफ़ाइल में ही, मैं ध्वज को m32 से m64 में बदलता हूं, क्योंकि 1c और x64 सिस्टम ही। (M32 पैरामीटर के साथ यह वैसे भी नहीं उठाता है)
यहाँ 1C 8.3 से VK को कॉल करने का एक उदाहरण दिया गया है:
कनेक्शन हो गया = एक बाहरी घटक कनेक्ट करें("/home/alexeyubuntux64-20 gb/Documents/VNCOMP83/example/NativeAPI/AddInNative.so", "AddInNative", ExternalComponentType.Native); इस विषय पर सिर्फ एक लेख है।
लेकिन, जहाँ तक मैं देख सकता हूँ, इन सभी बिंदुओं को पहले ही ध्यान में रखा गया है और VNCOMPS उदाहरण में ठीक किया गया है।

लेकिन वास्तव में संकलन के मापदंडों में व्यापार। MB 32bit बाहरी घटक सामान्य रूप से 32bit 1c तक हुक करता है, लेकिन मैंने Ubuntu x64 1c Enterprise83 8.3.5-1486 amd64 पर तैनात किया। और मैं वीके को उसके पास ले जाना चाहता हूं।

क्या किसी के पास इस मुद्दे को हल करने का कोई विचार है?
VNCOMPS उदाहरण काम करना चाहिए, लेकिन निर्माण मापदंडों को ठीक करने की आवश्यकता है, या जिस प्लेटफॉर्म पर मैं परीक्षण कर रहा हूं वह गलत है।

उत्तर:दिलचस्प बात यह है कि क्या जावा में बाहरी घटक लिखना संभव है?

प्रश्न: बाहरी घटक (मूलनिवासी) जुड़ा नहीं है


64 और 32 बिट सिस्टम के लिए ITS के साथ एक उदाहरण संकलित किया।

मैं इस तरह से जुड़ता हूं:
कनेक्शन परिणाम = ConnectExternalComponent (CDLLPath, "कॉम्प", ExternalComponentType.Native); एक पीसी कनेक्ट होता है, दूसरा नहीं। ओएस में अंतर है। जहाँ कनेक्शन जाता है, वहाँ Win7 है, जहाँ कोई Win10 नहीं है। उसी समय, मानक घटक पीसी पर काम करते हैं जहां मेरा घटक काम नहीं करता है।

विभिन्न प्लेटफार्मों (8.3.4.482, 8.3.6.2100, 8.3.11.2700, 8.3.12.1412) पर परीक्षण किया गया।

कैसे समझें कि यह कनेक्ट क्यों नहीं होता है?

उत्तर: vc_redist नहीं भूले?

प्रश्न: 1C8 और मूल प्रकार के साथ एक बाह्य घटक


नमस्कार।
BP 3.0.50.12 का कॉन्फ़िगरेशन है और UniServerAuto का उपयोग करके स्केल-सॉफ्ट कंपनी से वजन को लागू करने की इच्छा है।
डेवलपर्स ने विंडोज 32 और 64 के लिए मूल घटक को संकलित किया, और इसे मैफेस्ट फ़ाइल के साथ एक संग्रह में डाल दिया। 1C के लिए एक उदाहरण भी है कि वजन की गणना कैसे की जा सकती है। इसमें, बाइनरी डेटा के साथ लेआउट की मदद से, यह संग्रह इंगित किया गया है, जैसा कि मैं इसे समझता हूं। उदाहरण में, सब कुछ ठीक है: घटक स्थापित है, जुड़ा हुआ है, फिर कनेक्शन स्थापित है और वजन पढ़ा जाता है।
लेकिन जैसे ही आप अपने आप को 1C पर स्थानांतरित करना शुरू करते हैं, वज़न पढ़ा नहीं जाता है। ऐसा लगता है कि सब कुछ बस लिखा गया है, लेकिन मुझे समझ नहीं आ रहा है कि रेक कहाँ है।
किसके पास थोड़ा समय होगा - मदद करो, एक आँख से देखो, शायद समाधान सतह पर है, लेकिन मैं कहीं गलत जगह चल रहा हूँ और कुछ गलत कर रहा हूँ। मैंने पहले कभी नेटिव तकनीक के साथ काम नहीं किया...

और अटैचमेंट में मेरा प्रोसेसिंग टेक्स्ट है

उत्तर:

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

मैं प्रसंस्करण के लिए एक लेआउट जोड़ने की कोशिश कर रहा हूं। इसका आकार तुरंत 10kb से 3mb तक बढ़ जाता है और एक महत्वपूर्ण मंदी देखी जाती है - यह फिट नहीं होती है। मैं डीएलएल के माध्यम से एक घटक के कनेक्शन की ओर खोदना शुरू करता हूं। वे। मूल रूप से वही जहां आपने शुरू किया था। लेकिन एक "लेकिन" है: उपयोगकर्ता के फ़ोल्डर में डीएलएल के नाम से खोज कर, मैंने देखा कि यह डीएल कहां है (जैसा कि मैं इसे समझता हूं) 1 सी में पंजीकृत डीएलएस जोड़े गए हैं:
C:\Users\USER\AppData\Roaming\1C\1cv8\ExtCompT
तदनुसार, डीएलएल के लिए पूर्ण पथ का उपयोग करने की कोई आवश्यकता नहीं है, आप बस इसका नाम लिख सकते हैं:
ConnectExternalComponent ("Add1CUniServerAuto32.dll", "UniServerAuto", ExternalComponentType.Native);

मैं कोशिश करता हूं ... पंजीकरण की कसम खाता हूं, लेकिन वजन का परिणाम देता हूं। यह पता चला है कि dll पहले से ही पंजीकृत है, जिसका अर्थ है कि आपको इसे कनेक्ट करने की आवश्यकता है। मैं इसे हटा देता हूं और सबकुछ काम करता है।
मैं सारांशित करता हूं:
1. खोलते समय प्रक्रिया में वजन के प्रसंस्करण में, मैंने बाहरी घटक का कनेक्शन और ऑब्जेक्ट से कनेक्शन जोड़ा।
2. मैंने dll का पथ नहीं लिखा, मैंने केवल उसके नाम का संकेत दिया।

अब मैं बैठकर सोचता हूं, 1C में dll कब स्थापित हुआ? सॉफ़्टवेयर स्थापना के समय? शायद ही... इस डीएलएल के डेवलपर कॉन्फ़िगरेशन को चलाने के समय, फॉर्म खोले जाने पर इसे कहां सेट किया जाता है? मुझे नहीं पता, लेकिन यह मेरे करीब लगता है... आपको क्या लगता है?
और दूसरी बात, एक नई जगह पर, जब उसी टर्मिनल को स्थापित करने की आवश्यकता हो, तो सब कुछ काम करने के लिए क्या किया जाना चाहिए? सॉफ्टवेयर को पूरी तरह से स्थापित करें, काम की जांच के लिए आपूर्तिकर्ता की कॉन्फ़िगरेशन चलाएं और फिर (सिद्धांत रूप में) मेरी प्रसंस्करण काम करनी चाहिए? कुछ जटिल है... या मेरे प्रसंस्करण में सॉफ़्टवेयर स्थापित करने के बाद, एक बार InstallExternalComponent करें?

मुझे इस पर आपके विचार सुनना अच्छा लगेगा ...

प्रश्न: बाहरी घटक.dll


सभी का दिन शुभ हो।
एक प्रश्न।
dll घटक है जो 1C 7.7 में ठीक काम करता है
1s 8.1 में बिल्कुल बूट नहीं करना चाहता ...
कोशिश की और इसे C:\Program Files\1cv81\bin\cache1c.dll में पेस्ट करें
मैंने regsvr32 "C:\Program Files\1cv81\bin\cache1c.dll" का उपयोग करके पंजीकरण करने का प्रयास किया
समस्याओं के बिना पंजीकृत।
जब मैं इसे एक्सेस करने का प्रयास करता हूं, तो मुझे एक त्रुटि संदेश मिलता है:

बाहरी घटक लोड करने में त्रुटि! कैश1c.dll
प्रक्रिया बटन पर क्लिक करें (बटन) बाहरी घटक लोड करने का प्रयास करें ( "C:\Program Files\1cv81\bin\cache1c.dll"); अपवाद रिपोर्ट( "बाहरी घटक लोड करने में त्रुटि!"+ "cache1c.dll"); प्रयास का अंत; प्रयास // घटक वस्तु प्राप्त करें। // एम = नया ("cache1c.GTMcmd"); m = नया COMObject ("cache1c.GTMcmd"); अपवाद रिपोर्ट(); प्रयास का अंत; अंतिम प्रक्रिया

उत्तर:नामुमकिन की हद तक साधारण...
कॉल (मिलीसेकंड) के बीच विराम बनाए रखना आवश्यक है...
प्रक्रिया ButtonExecuteClick (बटन) प्रयास // घटक वस्तु प्राप्त करें। m = नया COMObject ("cache1c.GTMcmd"); अपवाद रिपोर्ट( "बाहरी घटक वस्तु नहीं बना सका"); प्रयास का अंत; m.RemoteHost = "192.168.1.101"; एम। रिमोटपोर्ट = 6330; एम कनेक्ट (); एम.विराम (100); ...... आदि
1s 7.7 के लिए - यह आवश्यक नहीं है, यह पता चला है कि संचलन तेज है।

प्रश्न: 1 सी सर्वर के साथ एक बाहरी घटक का कार्य ...


नमस्कार,

C ++ में एक बाहरी घटक लिखा गया है, जिसका कार्य बाहरी डेटाबेस से जानकारी प्राप्त करना है और क्वेरी के परिणाम को 1C में मानों की तालिका के रूप में वापस करना है।
वर्तमान समय में मानों की एक तालिका बनाने के लिए, IDispatch* pBackConnection इंटरफ़ेस का उपयोग किया जाता है, जो कि Init () फ़ंक्शन में एक पैरामीटर के रूप में प्राप्त होता है। इसके अलावा, मैं केवल 1C फ़ंक्शंस का उपयोग करके, मानों की एक तालिका बनाता हूं, इसे भरता हूं और इसे CallAsFunc (...) में दूसरे पैरामीटर पर लौटाता हूं।
1C पतले ग्राहकों के लिए संक्रमण के साथ समस्याएं शुरू हुईं। सर्वर साइड पर, बाहरी घटक वास्तव में प्रारंभ नहीं होता है। आप इसे क्लाइंट साइड पर चला सकते हैं, लेकिन यह सब बैसाखी की तरह दिखता है और 1C में सामान्य "क्लाइंट-सर्वर" लॉजिक से बाहर हो जाता है। उदाहरण के लिए, ग्राहक यह नहीं समझता है कि मूल्यों की तालिका क्या है, "वैश्विक" चर, सत्र आदि के साथ समस्याएं।
इस संबंध में नेटिवएपीआई और भी छोटा है।
टैम्बोरिन के साथ नृत्य करने से तथ्य यह हुआ कि मैं 1C सर्वर के तहत एक बाहरी घटक लॉन्च करने में सक्षम था, लेकिन काम तब तक होता है जब तक कि pBackConnection पर Invoke को कॉल करने का प्रयास नहीं किया जाता। सर्वर 8.2 का 64-बिट संस्करण तब तक कुछ करने की कोशिश करता है जब तक कि यह एक टाइमआउट पर बंद न हो जाए, 32-बिट संस्करण (वीके स्वाभाविक रूप से 32-बिट भी है) बस तुरंत गिर जाता है।
मुझे लगता है कि 1C सर्वर ऑपरेशन के इस तरीके की सेवा नहीं करता है।
तदनुसार, प्रश्न उठते हैं, क्या यह अस्थायी है या 1C का तर्क कार्य की इस योजना को समाप्त करने के लिए कम हो गया है? यदि इस तरह से 1 सी (मानों की तालिका) की आंतरिक संरचनाएं बनाना असंभव है, तो सिद्धांत रूप में, सी + में इसे बनाने की कोशिश करने के लिए सिस्टम स्तर पर मूल्यों की तालिका क्या है, इसका विवरण है +, इसे भरें, और फिर 1C को रिटर्न पैरामीटर के रूप में स्लिप करें? मैं कम से कम एक दिशा प्राप्त करना चाहूंगा कि किस दिशा में खुदाई की जाए।

शुक्रिया।

उत्तर:

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

एक सत्र के भीतर यह संभव था, और अब यह संभव है, सत्र मॉड्यूल में चर घोषित करने के लिए, जो अलग-अलग स्थानों से सत्र के भीतर रहेंगे और दिखाई देंगे ... वास्तव में, उनमें से 4 हैं।
- सत्र मॉड्यूल;
- नियमित आवेदन मॉड्यूल;
- प्रबंधित अनुप्रयोग मॉड्यूल;
- बाहरी कनेक्शन मॉड्यूल।

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

सामान्य तौर पर, 1C आर्किटेक्चर प्रदान करता है कि डेटा एक्सचेंज चलेगा:
- प्रक्रियाओं/कार्यों के मापदंडों/रिटर्न के माध्यम से;
- तथाकथित सत्र मापदंडों के माध्यम से (वे ऑब्जेक्ट नहीं हो सकते हैं, आप वास्तव में इसे पैलेट में देख सकते हैं)।

प्रपत्र पर तालिका... और यह वस्तु की किसी भी तालिका (प्रसंस्करण, उदाहरण के लिए) के साथ जुड़ा हुआ है? या नहीं। यदि हाँ, तो यह सर्वर (&AtServer) पर भी उपलब्ध है और वहाँ संपादित करें...

और हां, क्लाइंट साइड पर यूवी में ValueTable उपलब्ध नहीं है। खैर, 1 सी ने ऐसा फैसला किया।

चलो भी! यहां यह एक्सेल के साथ काम करता है, यह एफएसओ और बाकी सब चीजों के साथ काम करता है, लेकिन यहां यह काम नहीं करता है। त्रुटि को पकड़ें और विश्लेषण करें ....

कोशिश करना
...
आपके कार्य
...
अपवाद
str = विवरण त्रुटि ();
प्रयास का अंत;

आधुनिक हार्डवेयर क्षमताओं के साथ, यह कोई तर्क नहीं है।

विशुद्ध रूप से आपकी निजी राय। वास्तविकता से कोई लेना देना नहीं है। किसी तरह नहीं। मैं एक बार फिर दोहराता हूं, 1C COM के साथ बढ़िया काम करता है। इन-प्रोक और आउट-प्रो दोनों के साथ।

वह कोड दें जिसे आप अपलोड करते हैं और VK पर लागू करते हैं।

वैसे, वीके ... आपके मामले में, यह COM या मूल एपीआई है?
यदि COM, तो आप इसे ... regsvr32 के माध्यम से ... के रूप में पंजीकृत करते हैं, तो आप बिट गहराई के मुद्दे को "हल" कैसे करते हैं?

प्रश्न: बाहरी घटक स्थापित करना


कृपया मुझे बताएं कि बाहरी घटक कैसे स्थापित करें। निम्नलिखित कोड निष्पादित करते समय, एक त्रुटि फेंक दी जाती है। लेआउट में NameDecl.dll खोजें

सेट करने का प्रयासExternalComponent("GeneralLayout.Layout"); अपवाद समाप्ति प्रयास;
त्रुटि: प्लगइन स्थापना विफल!

उत्तर: ()
ConnectExternalComponent("GeneralLayout.Layout", "NameDecl", ExternalComponentType.Native) रिटर्न FALSE ,
नया ("AddIn.NameDecl.CNameDecl", अपरिभाषित) = (()): प्रकार परिभाषित नहीं है (AddIn.NameDecl.NameDecl)

प्रश्न: नेटिव dll 1s 8.1 से जुड़ा नहीं है (fptrwin32_fz54_9_11_0_5549.dll)


नमस्ते।
1C ने fdd 1.05 के लिए ऑनलाइन कैश रजिस्टर एटोल के लिए dll अपडेट किया (fptrwin32_fz54_9_11_0_5549.dll रखरखाव प्रक्रिया में शामिल)।
मेरे पास एक पुराना 1C 8.1 है। 8.2 के विपरीत, यह 8.2 की तरह बाहरी उपकरणों के साथ काम करने का समर्थन नहीं करता है, इसलिए आपको पहले dll को विंडोज़ में पंजीकृत करने की आवश्यकता है, और उसके बाद ही इसे 1C से कनेक्ट करें?

प्रोगिड = "AddIn.IntegrationComponent.ATOL_KKT_1C83_V9"; LoadExternalComponent("C:\fptrwin32_fz54_9_11_0_5549.dll"); ConnectExternalComponent (ProgID); चालक = नया (प्रोगिड);

हालांकि, पुरानी प्रसंस्करण "प्रौद्योगिकी" कॉम, और नई देशी में लिखी गई थी। तदनुसार, पंजीकरण करते समय, regsvr32 एक त्रुटि देता है:
मॉड्यूल लोड किया गया था, लेकिन DllRegisterServer प्रविष्टि बिंदु नहीं मिला। और यह जाँचने का सुझाव देता है कि यह फ़ाइल सही dll या OCX फ़ाइल है।
किसने इसी तरह की स्थिति का सामना किया, आप कैसे बाहर निकले? मैं समझता हूं कि इसी तरह की समस्या 7.7 में होगी।
कोड 8.2:

लेआउट = GetLayout ("इंटीग्रेशनकंपोनेंट"); पता = प्लेसइनटेम्पस्टोरेज (लेआउट); कनेक्टएक्सटर्नलकंपोनेंट (पता, "इंटीग्रेशनकंपोनेंट", एक्सटर्नलकंपोनेंटटाइप.नेटिव); ड्राइवर = नया ("AddIn.IntegrationComponent.ATOL_KKT_1C83_V9");

1सी 8.2:
बाहरी घटक कनेक्ट करें(<Местоположение>, <Имя>, <Тип>)
1सी 8.1:
बाहरी घटक कनेक्ट करें(<Идентификатор объекта>)
विकल्प:
<Идентификатор объекта>(आवश्यक)
टाइप करें: स्ट्रिंग। बाहरी घटक वस्तु का प्रोगिड (प्रोग्रामेटिक आइडेंटिफायर)। सिस्टम पंजीकरण डेटाबेस (रजिस्ट्री) में जानकारी से मेल खाना चाहिए।
विवरण:
बाहरी घटक वस्तुओं को 1C:Enterprise से जोड़ता है।
1C: एंटरप्राइज़ सर्वर पर उपलब्ध नहीं है। बाहरी कनेक्शन मॉड्यूल में उपयोग नहीं किया गया।
टिप्पणी:
बाहरी घटक 1C:Enterprise 7.7 घटकों के साथ संगत हैं।
उदाहरण:
कोशिश करना
ConnectExternalComponent ("AddinObject.Scanner");
चेतावनी ("बारकोड स्कैनर घटक लोड किया गया");
अपवाद
चेतावनी ("बारकोड स्कैनर घटक लोड नहीं हुआ");
अंत प्रयास

क्या इस डीएल को 8.1 से जोड़ने का कोई तरीका है या नहीं?

आपको धन्यवाद!

उत्तर:

मुझे भी हाल ही में यह समस्या हुई थी। 1s के बाद के संस्करण में परिवर्तित करना संभव नहीं था। dll जिसके साथ यह कॉन्फ़िगरेशन काम करता है, बस काम करना बंद कर दिया और 1c त्रुटि के साथ बाहर हो गया।
समस्या को निम्न तरीके से हल किया गया:
मैंने एक खाली डेटाबेस 8.3 बनाया जिसमें मैंने घटक के आरंभीकरण को संसाधित किया और फिर 8.1 से COM कनेक्शन के माध्यम से मैंने पहले बनाए गए डेटाबेस तक पहुंच बनाई और वहां घटक को प्रारंभ किया। फिर, पहले से ही 8.1 में, मैंने इस घटक के तरीकों को बुलाया।
बेशक, यह एक बैसाखी है, लेकिन मुझे अभी तक कोई दूसरा रास्ता नहीं मिला है (

कोड उदाहरण 8.3:
रेम चालक निर्यात;
फ़ंक्शन कनेक्शनकंपोनेंटसीसीपी() निर्यात
कोशिश करना

लेआउट = GetLayout ("इंटीग्रेशनकंपोनेंट");
पता = प्लेसइनटेम्पस्टोरेज (लेआउट);
कनेक्टएक्सटर्नलकंपोनेंट (पता, "इंटीग्रेशनकंपोनेंट", एक्सटर्नलकंपोनेंटटाइप.नेटिव);
चालक = नया ("AddIn.IntegrationComponent.SMDrvFR1C20");
परिणाम = सच;

अपवाद

परिणाम = झूठा;

प्रयास का अंत;
वापसी परिणाम
अंत कार्य

कोड उदाहरण 8.1

फंक्शन क्रिएटड्राइवरऑब्जेक्ट (ड्राइवर) एक्सपोर्ट

परिणाम = सत्य;

कोशिश करना

कनेक्शनस्ट्रिंग = "फ़ाइल = "" "डेटाबेस का पथ" "";
ComObject = नया COMObject ("V83.ComConnector");
कनेक्ट = ComObject.Connect (कनेक्शनस्ट्रिंग);

प्रसंस्करण = Connect.Processing.ConnectingExternalComponent.Create ();
कनेक्शन परिणाम = प्रसंस्करण। कनेक्टिंग केकेटी घटक ();
अगर रिजल्ट कनेक्ट होता है तो
चालक = प्रसंस्करण। चालक;
एंडइफ ;

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

// मूल्यों की तालिका भरने का एक उदाहरण TK.Clear (); अनुरोध = नया अनुरोध; क्वेरी.टेक्स्ट = "चयन करें | नामकरण। लिंक कैसे नामकरण | से | Directory.Nomenclature AS Nomenclature"; QueryResult = Query.Execute(); Sampling = QueryResult.Select(); जबकि Sampling.Next() Loop Str = TK.Add(); FillPropertyValues(Pr, Sampling); EndCycle;
क्या आप इस उदाहरण के साथ व्याख्या कर सकते हैं कि आमतौर पर कोड का कौन सा भाग निकाला जाता है। अनुरोध के साथ भाग को बाहर करना तर्कसंगत होगा, लेकिन फिर हम प्लेटफॉर्म को बायपास करते हुए बाहरी घटक से बाहरी घटक से डेटाबेस तक कैसे पहुंच सकते हैं? पाठ व्यर्थ है। या सारणीबद्ध भाग के गठन को ही निकाल दें। कृपया इसके साथ अपना अनुभव साझा करें।

उत्तर:और यह कि "असंगत" शब्द का अर्थ हमेशा "खराब" शब्द होता है? हां, मुझे ऐसा लगता है कि अगर मैं अपनी शैली को "1C: इस स्क्रिप्टिंग इंजन पर सबसे खराब प्रोग्रामिंग कहता हूं जो प्रकृति में मौजूद है (साहित्यिक भाषा में अनुवादित)!" और फिर निश्चित रूप से ऐसे लोग होंगे जो इस जानवर की जांच करना चाहते हैं। और यह एक क्लासिक की तरह दिखता है: "मैंने पास्टर्नक को नहीं पढ़ा है, लेकिन मैं उससे पूरी तरह असहमत हूं!" :)

प्रश्न: 1s 8.3.6 और Win8 में बाहरी घटक को जोड़ना


vk_rs232.dll बाहरी कॉम्पोनेंट को स्व-लिखित कॉन्फ़िगरेशन से कनेक्ट करना आवश्यक है। जैसे regsvr32.exe के माध्यम से पंजीकृत। "ऐसा लगता है" क्योंकि मुझे एक संदेश मिला है कि "घटक पंजीकृत है, लेकिन फ़ायरवॉल में कुछ गड़बड़ है।" संदेश के पहले भाग के आधार पर, मैं 1s में कोड लिखता हूँ
आफ्टरकनेक्शन = न्यू नोटिफिकेशन डिस्क्रिप्शन ("आफ्टरकनेक्शन वीके", यह फॉर्म); StartExternalComponentInstallation ("सी: \ नियंत्रक \ vk_rs232.dll"); StartConnectingExternalComponent (आफ्टरकनेक्टिंग, "C: \ नियंत्रक \ vk_rs232.dll", "DLL_Scale");
और मुझे वह त्रुटि मिलती है
"बाहरी घटक स्थापना विफल! आप जिस क्लाइंट एप्लिकेशन का उपयोग कर रहे हैं उसका घटक गायब हो सकता है!"।

और अब मुझे समझ नहीं आ रहा है
1. हो सकता है कि घटक रजिस्ट्री में पंजीकृत नहीं है - मैं इसे वहां कैसे देख सकता हूं?
2. शायद इसका "संस्करण" Win8 के तहत काम नहीं करता है, हालांकि मेरे पास यह 32-बिट है।
3. हो सकता है कि 1s अपने आप में बहुत नया हो, अर्थात तदनुसार इस डीएलएल के साथ काम नहीं कर सकता?
4. अच्छा, यह सामान्य है - मैं कुछ गलत लिख रहा हूँ।

उत्तर:और यह सब मुझे अगली समस्या की ओर ले गया। VneshComp इंस्टॉल हो गया, अब आपको इसे कनेक्ट करने की आवश्यकता है। और यहाँ दोनों विकल्प हैं।
ConnectExternalComponent("C:\Controller\vk_rs232.dll", "तराजू")
ConnectExternalComponent("GeneralLayout.Layout","तराजू")

सिंटेक्स विकल्प: नाम और स्थान से

वाक्य - विन्यास:

बाहरी घटक कनेक्ट करें(<Местоположение>, <Имя>, <Тип>)
विकल्प:

<Местоположение>(आवश्यक)

टाइप करें: स्ट्रिंग।
बाहरी घटक का स्थान।
स्थान का उपयोग किया जा सकता है:
फ़ाइल सिस्टम में बाहरी घटक की फ़ाइल का पथ (वेब ​​क्लाइंट पर उपलब्ध नहीं), ज़िप संग्रह नहीं;
पूरा नामएक लेआउट जो बाइनरी डेटा या ज़िप संग्रह को संग्रहीत करता है;
बाहरी घटक का URL, बाइनरी डेटा या ज़िप संग्रह के रूप में, GetNaviLink के समान।
<Имя>(आवश्यक)

टाइप करें: स्ट्रिंग।
प्लग करने योग्य बाहरी घटक का प्रतीकात्मक नाम।
नाम को अंतर्निर्मित भाषा के नामकरण परंपराओं का पालन करना चाहिए।
<Тип>(वैकल्पिक)

प्रकार: बाहरी घटक प्रकार।
कनेक्ट करने के लिए बाहरी घटक का प्रकार।
यदि घटक ज़िप संग्रह में पैक किया गया है तो इसका उपयोग नहीं किया जाता है।
विधि संस्करण का विवरण:

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

वाक्य - विन्यास:

बाहरी घटक कनेक्ट करें(<ИдентификаторОбъекта>)
विकल्प:

<ИдентификаторОбъекта>(आवश्यक)

टाइप करें: स्ट्रिंग।
MS Windows रजिस्ट्री के ProgID (प्रोग्रामेटिक आइडेंटिफ़ायर) के रूप में बाहरी घटक वस्तु पहचानकर्ता (उदाहरण के लिए: "AddIn.Scanner")।
सिस्टम पंजीकरण डेटाबेस (रजिस्ट्री) में जानकारी से मेल खाना चाहिए।
विधि संस्करण का विवरण:

घटक को COM तकनीक का उपयोग करके कार्यान्वित किया जाना चाहिए और MS Windows रजिस्ट्री में पंजीकृत होना चाहिए।
ये घटक 1C:Enterprise 7.7 घटकों के साथ संगत हैं।
ध्यान! विधि का संस्करण सर्वर और बाहरी कनेक्शन में काम नहीं करता है।
प्रतिलाभ की मात्रा:

प्रकार: बूलियन।
सच - कनेक्शन सफल रहा।
विवरण:

एक बाहरी घटक को 1सी: एंटरप्राइज़ से जोड़ता है।
बाहरी घटकों को इन्फोबेस या कॉन्फ़िगरेशन लेआउट में ज़िप संग्रह या बाइनरी डेटा के रूप में या फ़ाइल सिस्टम फ़ाइल में संग्रहीत किया जा सकता है।
पतले क्लाइंट और वेब क्लाइंट पर काम करते समय, घटक पूर्व-स्थापित होना चाहिए।

उपलब्धता:

पतला क्लाइंट, वेब क्लाइंट, सर्वर, बाहरी कनेक्शन।
टिप्पणी:

नेटिव एपीआई या कॉम तकनीक का उपयोग करके बाहरी घटकों को लागू किया जा सकता है। COM तकनीक का उपयोग करके बनाए गए घटक 1C:Enterprise 7.7 घटकों के साथ संगत हैं।
वेब क्लाइंट केवल एक इन्फोबेस में घटकों के साथ काम कर सकता है जो एक संग्रह में पैक किए गए हैं।
थिन क्लाइंट इन्फोबेस में घटकों के साथ काम कर सकता है, संग्रह में पैक किया जा सकता है, और फाइल सिस्टम में स्थित घटकों के साथ काम कर सकता है।
मोटा ग्राहक घटकों के लिए सभी भंडारण विकल्पों के साथ काम कर सकता है। इस स्थिति में, यदि घटक InstallExternalComponent विधि का उपयोग करके स्थापित किया गया है, तो स्थापित घटक का उपयोग किया जाता है, और यदि यह स्थापित नहीं है, तो कनेक्शन के समय घटक प्राप्त होगा।
सर्वर सभी घटकों के साथ काम कर सकता है। सर्वर सत्र के लिए घटक को कैश किया जाता है।
उदाहरण:

अगर ConnectExternalComponent("AddinObject.Scanner") तब
चेतावनी ("बारकोड स्कैनर घटक लोड किया गया");
अन्यथा
चेतावनी ("बारकोड स्कैनर घटक लोड नहीं हुआ");
अगर अंत;

  • ट्यूटोरियल

परिचय

यह लेख इस बात का अंदाजा देता है कि 1C: एंटरप्राइज सिस्टम में बाहरी घटक कैसे काम करते हैं।
1C के लिए एक बाहरी घटक विकसित करने की प्रक्रिया: विंडोज ऑपरेटिंग सिस्टम के तहत काम के फ़ाइल संस्करण के साथ चल रहे एंटरप्राइज़ संस्करण 8.2 सिस्टम को दिखाया जाएगा। छोटे व्यवसायों के लिए डिज़ाइन किए गए अधिकांश समाधानों में इस विकल्प का उपयोग किया जाता है। वीसी को सी++ प्रोग्रामिंग लैंग्वेज में लागू किया जाएगा।

बाहरी घटक "1 सी: एंटरप्राइज़"

"1C: एंटरप्राइज" एक एक्स्टेंसिबल सिस्टम है। विस्तार के लिए कार्यक्षमतासिस्टम बाहरी घटकों (वीसी) का उपयोग करता है। एक डेवलपर के दृष्टिकोण से, वीसी एक बाहरी वस्तु है जिसमें गुण और विधियाँ हैं, और 1C: एंटरप्राइज सिस्टम द्वारा प्रसंस्करण के लिए ईवेंट भी उत्पन्न कर सकता है।
बाहरी घटकों का उपयोग उन कार्यों के वर्ग को हल करने के लिए किया जा सकता है जो 1C: एंटरप्राइज़ में निर्मित प्रोग्रामिंग भाषा का उपयोग करके कठिन या असंभव हैं। विशेष रूप से, इस वर्ग में ऐसे कार्य शामिल हैं जिनमें ऑपरेटिंग सिस्टम के साथ निम्न-स्तरीय सहभागिता की आवश्यकता होती है, उदाहरण के लिए, विशिष्ट हार्डवेयर के साथ काम करना।
1C: एंटरप्राइज़ सिस्टम बाहरी घटकों को बनाने के लिए दो तकनीकों का उपयोग करता है:
  • नेटिव एपीआई का उपयोग करना
  • कॉम तकनीक का उपयोग करना
उपरोक्त दो तकनीकों के बीच प्रतिबंधों को देखते हुए, अंतर नगण्य है, इसलिए हम नेटिव एपीआई का उपयोग करके वीके के विकास पर विचार करेंगे। यदि आवश्यक हो, कार्यान्वित विकास COM प्रौद्योगिकी का उपयोग कर वीसी के विकास के लिए लागू किया जा सकता है, और मामूली संशोधनों के साथ, 1 सी में उपयोग के लिए लागू किया जा सकता है: ऑपरेशन के फ़ाइल मोड के अलावा अन्य ऑपरेटिंग विकल्पों के साथ एंटरप्राइज़ सिस्टम।
वीके संरचना
1C का बाहरी घटक: एंटरप्राइज़ सिस्टम को DLL लाइब्रेरी के रूप में प्रस्तुत किया गया है। लाइब्रेरी कोड IComponentBase व्युत्पन्न वर्ग का वर्णन करता है। बनाई जा रही कक्षा में, बाहरी घटक के कार्यों को लागू करने के लिए जिम्मेदार विधियों को परिभाषित किया जाना चाहिए। सामग्री की प्रस्तुति के दौरान ओवरराइड किए गए तरीकों को बाद में और अधिक विस्तार से वर्णित किया जाएगा।

डेमो वीके लॉन्च करना

एक कार्य:
  1. ITS सदस्यता के साथ आपूर्ति किए गए बाहरी घटक को इकट्ठा करें और 1C में बाहरी घटक तंत्र की मुख्य क्षमताओं को प्रदर्शित करने के लिए डिज़ाइन किया गया
  2. डेमो घटक को 1C कॉन्फ़िगरेशन से कनेक्ट करें
  3. सुनिश्चित करें कि घोषित कार्य ठीक से काम करते हैं
संकलन
डेमो वीसी ITS सदस्यता डिस्क पर "/VNCOMP82/example/NativeAPI" निर्देशिका में स्थित है।
हम डेमो VK को असेंबल करने के लिए Microsoft Visual Studio 2008 का उपयोग करेंगे। इस उत्पाद के अन्य संस्करण उपयोग किए गए Visual Studio प्रोजेक्ट प्रारूप का समर्थन नहीं करते हैं।


AddInNative प्रोजेक्ट खोलें। प्रोजेक्ट सेटिंग्स में, हम डायरेक्टरी को प्रोजेक्ट बनाने के लिए आवश्यक हेडर फाइलों से जोड़ते हैं। डिफ़ॉल्ट रूप से, वे निर्देशिका में ITS डिस्क पर स्थित होते हैं /वीएनसीओएमपी82/शामिल हैं.
बिल्ड परिणाम एक फ़ाइल है /बाइंड/AddInNative.dll. यह 1C कॉन्फ़िगरेशन से कनेक्ट करने के लिए संकलित लाइब्रेरी है।
VK को 1C कॉन्फ़िगरेशन से कनेक्ट करना
चलिए एक खाली कॉन्फ़िगरेशन 1C बनाते हैं।
निम्नलिखित प्रबंधित अनुप्रयोग मॉड्यूल के लिए कोड है।
var डेमोकॉम्प; SystemStartup प्रक्रिया() ConnectExternalComponent("...\bind\AddInNative.dll", "DemoVK", ExternalComponentType.Native); डेमोकॉम्प = नया ("AddIn.DemoVK.AddInNativeExtension"); अंतिम प्रक्रिया
यदि 1C कॉन्फ़िगरेशन प्रारंभ करते समय कोई त्रुटि रिपोर्ट नहीं की गई थी, तो VK सफलतापूर्वक कनेक्ट हो गया था।
उपरोक्त कोड के निष्पादन के परिणामस्वरूप, कॉन्फ़िगरेशन की वैश्विक दृश्यता में एक वस्तु दिखाई देती है डेमोकॉम्पएक जिसमें ऐसे गुण और विधियाँ हैं जो बाहरी बीन कोड में परिभाषित हैं।
एम्बेडेड कार्यक्षमता का प्रदर्शन
आइए डेमो वीके के प्रदर्शन की जांच करें। ऐसा करने के लिए, आइए कुछ गुणों को सेट करने और पढ़ने का प्रयास करें, कुछ वीके विधियों को कॉल करें, और वीके संदेश भी प्राप्त करें और संसाधित करें।
आईटीएस डिस्क पर प्रदान किए गए दस्तावेज़ डेमो वीसी की निम्नलिखित कार्यक्षमता बताते हैं:
  1. घटक वस्तु राज्य प्रबंधन
    तरीके: चालू करो, बंद करना
    गुण: शामिल
  2. टाइमर नियंत्रण
    हर सेकंड, घटक 1C: एंटरप्राइज सिस्टम को मापदंडों के साथ एक संदेश भेजता है अवयव, घड़ीऔर एक सिस्टम क्लॉक काउंटर स्ट्रिंग।
    तरीके: स्टार्टटाइमर, स्टॉपटाइमर
    गुण: एक टाइमर है
  3. तरीका शोइनस्टैटसलाइन, जो स्टेटस बार में पैरामीटर के रूप में मेथड को पास किए गए टेक्स्ट को प्रदर्शित करता है
  4. तरीका तस्विर अपलोड करना. निर्दिष्ट फ़ाइल से एक छवि लोड करता है और इसे 1C: एंटरप्राइज़ सिस्टम में बाइनरी डेटा के रूप में स्थानांतरित करता है।
आइए सुनिश्चित करें कि ये कार्य काम करते हैं। ऐसा करने के लिए, हम निम्नलिखित कोड निष्पादित करेंगे:
var डेमोकॉम्प; SystemStart () प्रक्रिया ConnectExternalComponent (...); डेमोकॉम्प = नया ("AddIn.DemoVK.AddInNativeExtension"); DemoComp.Disable (); सूचित करें (डेमोकॉम्प। सक्षम); DemoComp.Enable(); सूचित करें (डेमोकॉम्प। सक्षम); DemoComp.StartTimer (); अंतिम प्रक्रिया प्रक्रियाExternalEventHandler (स्रोत, घटना, डेटा) रिपोर्ट (स्रोत + "" + घटना + "" + डेटा); अंतिम प्रक्रिया
कॉन्फ़िगरेशन को चलाने का परिणाम छवि में दिखाया गया है


विधि कॉल के परिणाम "संदेश" पैनल में प्रदर्शित होते हैं DemoComp.Disable ()तथा Demo.Comp.Enable(). उसी पैनल पर बाद की पंक्तियों में वीके से प्राप्त संदेशों के प्रसंस्करण के परिणाम होते हैं - स्रोत, आयोजनतथा जानकारीक्रमश।

मनमाना बाहरी घटक नाम

कार्य: बाहरी घटक का नाम मनमाने ढंग से बदलें।
पिछले अनुभाग में पहचानकर्ता का उपयोग किया गया था AddInNativeExtensionजिसका अर्थ नहीं बताया गया। इस मामले में AddInNativeExtensionविस्तार का नाम है।
वीसी कोड एक विधि को परिभाषित करता है रजिस्टर एक्सटेंशन ए.एस, जो नाम को 1C: एंटरप्राइज़ सिस्टम में लौटाता है, जो सिस्टम में VC के बाद के पंजीकरण के लिए आवश्यक है। एक पहचानकर्ता को निर्दिष्ट करने की सिफारिश की जाती है, जो एक निश्चित सीमा तक बाहरी घटक के सार को प्रकट करता है।
यहाँ विधि का पूरा कोड है रजिस्टर एक्सटेंशन ए.एसबदले गए एक्सटेंशन नाम के साथ:
बूल CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T* dest = 0; if (m_iMemory) ( if(m_iMemory->AllocMemory) ((void**)wsExtensionName, iActualSize * sizeof(WCHAR_T))) ::convToShortWchar(wsExtensionName, wsExtension, iActualSize); रिटर्न ट्रू; ) रिटर्न फाल्स; )
उपरोक्त उदाहरण में, वीके नाम को बदल दिया गया है कुछ नाम. फिर, VK को कनेक्ट करते समय, आपको एक नया नाम निर्दिष्ट करना होगा:
डेमोकॉम्प = नया ("AddIn.DemoVK.SomeName");

वीके संपत्तियों की सूची का विस्तार

एक कार्य:
  1. वीसी संपत्तियों के कार्यान्वयन का अध्ययन करें
  2. एक स्ट्रिंग प्रकार की पढ़ने-लिखने की संपत्ति जोड़ें
  3. एक पढ़ने/लिखने वाली स्ट्रिंग प्रकार की संपत्ति जोड़ें जो अंतिम सेट की संपत्ति के डेटा प्रकार को संग्रहीत करती है। संपत्ति मूल्य निर्धारित करते समय कोई कार्रवाई नहीं की जाती है

बनाए जा रहे घटक के गुणों को परिभाषित करने के लिए, डेवलपर को AddInNative.cpp लाइब्रेरी के कोड में निम्नलिखित विधियों को लागू करने की आवश्यकता है:
GetNProps
इस एक्सटेंशन के लिए प्रॉपर्टी की संख्या लौटाता है, अगर कोई प्रॉपर्टी नहीं है, तो 0 देता है
FindProp
उस संपत्ति की क्रमिक संख्या लौटाता है जिसका नाम मापदंडों में पारित किया गया है
GetPropName
संपत्ति का नाम उसके क्रमसूचक और पारित भाषा आईडी द्वारा लौटाता है
GetPropVal
निर्दिष्ट क्रमसूचक के साथ संपत्ति का मूल्य लौटाता है
सेटप्रॉपवैल
निर्दिष्ट क्रमसूचक के साथ संपत्ति का मूल्य निर्धारित करता है
IsPropReadable
निर्दिष्ट क्रमसूचक के साथ संपत्ति का पठनीयता ध्वज लौटाता है
IsPropWritable
निर्दिष्ट अनुक्रम संख्या के साथ गुण रिटेबिलिटी फ़्लैग लौटाता है


उपरोक्त वर्ग विधियों के कार्यान्वयन पर विचार करें CAddInNative.
डेमो वीसी 2 गुणों को परिभाषित करता है: शामिलतथा एक टाइमर है (सक्षम किया गया हैतथा IsTimerPresent).
लाइब्रेरी कोड के वैश्विक दायरे में दो सरणियों को परिभाषित किया गया है:
स्थिर wchar_t *g_PropNames = (एल"सक्षम है", एल"IsTimerPresent"); स्थिर wchar_t *g_PropNamesRu = (एल "सक्षम", एल "एक टाइमर है");
जो संपत्तियों के रूसी और अंग्रेजी नामों को संग्रहित करते हैं। हेडर फाइल में AddInNative.hएक एनम परिभाषित किया गया है:
एनम प्रॉप्स (ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // हमेशा अंतिम);
ईप्रॉपआई सक्षम हैतथा ePropIsTimerPresent, क्रमशः 0 और 1 मान वाले, सार्थक पहचानकर्ताओं के साथ गुणों की क्रम संख्या को बदलने के लिए उपयोग किए जाते हैं। ePropLast, जिसका मान 2 है, का उपयोग गुणों की संख्या प्राप्त करने के लिए किया जाता है (GetNProps विधि का उपयोग करके)। ये नाम केवल घटक के कोड के अंदर उपयोग किए जाते हैं और बाहर से पहुंच योग्य नहीं होते हैं।
FindProp और GetPropName विधियाँ सरणियों के माध्यम से खोजती हैं g_PropNamesतथा g_PropNames.
लाइब्रेरी मॉड्यूल में फ़ील्ड के मान को संग्रहीत करने के लिए, CAddInNative वर्ग में गुण होते हैं जो घटक के गुणों के मान को संग्रहीत करते हैं। तरीकों GetPropValतथा सेटप्रॉपवैलक्रमशः वापसी और इन गुणों का मान निर्धारित करें।
तरीकों IsPropReadableतथा IsPropWritableऔर वापस सचया असत्य, आवेदन तर्क के अनुसार संपत्ति के पारित आदेश के आधार पर।
एक कस्टम संपत्ति जोड़ने के लिए:

  1. सरणियों में जोड़े जाने वाले गुण का नाम जोड़ें g_PropNamesतथा g_PropNames(फ़ाइल AddInNative.cpp)
  2. गणना करना रंगमंच की सामग्री(फ़ाइल AddInNative.h) इससे पहले ईप्रॉपलास्टएक ऐसा नाम जोड़ें जो विशिष्ट रूप से जोड़ी जाने वाली संपत्ति की पहचान करता है
  3. संपत्ति मूल्यों को संग्रहीत करने के लिए मेमोरी को व्यवस्थित करें (घटक मॉड्यूल फ़ील्ड बनाएं जो संबंधित मूल्यों को संग्रहीत करते हैं)
  4. तरीकों में बदलाव करें GetPropValतथा सेटप्रॉपवैलपिछले चरण में आवंटित स्मृति के साथ सहभागिता करने के लिए
  5. एप्लिकेशन लॉजिक के अनुसार, तरीकों में बदलाव करें IsPropReadableतथा IsPropWritable
आइटम 1, 2, 5 को स्पष्टीकरण की आवश्यकता नहीं है। इन चरणों के कार्यान्वयन का विवरण लेख के परिशिष्ट में पाया जा सकता है।
आइए परीक्षण गुणों का नाम दें परीक्षणतथा चेक टाइप करेंक्रमश। फिर, पैराग्राफ 1 के परिणामस्वरूप, हमारे पास:
स्थिर wchar_t *g_PropNames = (एल"सक्षम है", एल"IsTimerPresent", एल"परीक्षण", एल"TestType"); स्थिर wchar_t * g_PropNamesRu = (एल "सक्षम", एल "HasTimer", एल "परीक्षण", एल "चेकटाइप");
गणना रंगमंच की सामग्रीऐसा दिखाई देगा:
एनम प्रॉप्स (ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // हमेशा अंतिम);
कोड को महत्वपूर्ण रूप से सरल बनाने के लिए, हम STL C++ का उपयोग करेंगे। विशेष रूप से, तार के साथ काम करने के लिए WCHAR, लाइब्रेरी कनेक्ट करें wstring.
एक विधि के मूल्य को स्टोर करने के लिए परीक्षण, कक्षा में परिभाषित करें CAddInNativeदायरे में निजी क्षेत्र:
स्ट्रिंग टेस्ट 1;
1C: एंटरप्राइज़ और एक बाहरी घटक के बीच स्ट्रिंग मापदंडों को स्थानांतरित करने के लिए, 1C: एंटरप्राइज मेमोरी मैनेजर का उपयोग किया जाता है। आइए उनके काम पर करीब से नज़र डालें। स्मृति आवंटित करने और मुक्त करने के लिए क्रमशः कार्यों का उपयोग करें AllocMemoryतथा फ्री मेमोरीफ़ाइल में परिभाषित किया गया है मेमोरीमैनेजर। एच. यदि 1C: एंटरप्राइज सिस्टम के लिए एक स्ट्रिंग पैरामीटर पास करना आवश्यक है, तो बाहरी घटक को फ़ंक्शन को कॉल करके इसके लिए मेमोरी आवंटित करनी चाहिए AllocMemory. इसका प्रोटोटाइप ऐसा दिखता है:
वर्चुअल बूल ADDIN_API AllocMemory (शून्य ** pMemory, अहस्ताक्षरित लंबा ulCountByte) = 0;
कहाँ पे pMemory- पॉइंटर का पता जिसमें आवंटित मेमोरी का पता रखा जाएगा,
ulCountByte- आवंटित स्मृति क्षेत्र का आकार।
एक स्ट्रिंग के लिए मेमोरी आवंटित करने का एक उदाहरण:
WCHAR_T *t1 = NULL, *test = L"TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((void**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
स्ट्रिंग डेटा प्रकारों के साथ काम करने की सुविधा के लिए, हम फ़ंक्शन का वर्णन करते हैं wstring_to_p. यह एक पैरामीटर के रूप में एक wstring स्ट्रिंग लेता है। फ़ंक्शन का परिणाम एक भरी हुई संरचना है टीवेरिएंट. फंक्शन कोड:
बूल CAddInNative::wstring_to_p(std::wstring str, tVariant* val) ( char* t1; TV_VT(val) = VTYPE_PWSTR; m_iMemory->AllocMemory((void**)&t1, (str.length()+1) * sizeof (WCHAR_T)); memcpy (t1, str.c_str (), (str.length () + 1) * sizeof (WCHAR_T)); वैल -> pstrVal = t1; वैल -> strLen = str.length (); रिटर्न ट्रू; )
फिर विधि के स्विच स्टेटमेंट का संबंधित केस सेक्शन GetPropValरूप ले लेंगे:
मामला ePropTest1: wstring_to_p (test1, pvarPropVal); टूटना;
तरीका सेटप्रॉपवैल:
केस ePropTest1: if (TV_VT(varPropVal) != VTYPE_PWSTR) रिटर्न फाल्स; test1 = एसटीडी :: wstring ((wchar_t *) (varPropVal -> pstrVal)); टूटना;
दूसरी संपत्ति को लागू करने के लिए, हम एक वर्ग क्षेत्र को परिभाषित करते हैं CaddInNative
uint8_t last_type;
जिसमें हम अंतिम पारित मूल्य के प्रकार को संग्रहित करेंगे। ऐसा करने के लिए, निम्नलिखित कमांड को CaddInNative::SetPropVal विधि में जोड़ें:
last_type = TV_VT (varPropVal);
अब, दूसरी संपत्ति के मूल्य को पढ़ने का अनुरोध करते समय, हम मूल्य वापस कर देंगे last_type, जो निर्दिष्ट कार्य के लिए आवश्यक है।
आइए किए गए परिवर्तनों के प्रदर्शन की जाँच करें।
इसके लिए हम प्रस्तुत करते हैं दिखावटदेखने के लिए विन्यास 1C:
var डेमोकॉम्प; SystemStartup प्रक्रिया () ConnectExternalComponent ("...", "DemoVK", ExternalComponentType.Native); डेमोकॉम्प = नया ("AddIn.DemoVK.SomeName"); DemoComp.CheckType = 1; रिपोर्ट (स्ट्रिंग (DemoComp.TypeCheck)); DemoComp.Test = "वास्या"; रिपोर्ट (स्ट्रिंग (DemoComp.Test)); DemoComp.Test = "पेट्या"; रिपोर्ट (स्ट्रिंग (DemoComp.Test)); रिपोर्ट (स्ट्रिंग (DemoComp.TypeCheck)); अंतिम प्रक्रिया
लॉन्च के परिणामस्वरूप, हमें संदेशों का एक क्रम मिलता है:
3
वस्या
पेट्या
22

दूसरा और तीसरा संदेश पिछले चरण में सेट की गई संपत्ति को पढ़ने का परिणाम है। पहले और दूसरे संदेशों में अंतिम गुण सेट का प्रकार कोड होता है। 3 एक पूर्णांक मान से मेल खाता है, 22 - एक स्ट्रिंग मान के लिए। फ़ाइल में प्रकार और उनके कोड का पत्राचार स्थापित किया गया है प्रकार.एच, जो ITS डिस्क पर स्थित है।

विधियों की सूची का विस्तार करना

एक कार्य:
  1. निम्नलिखित कार्यक्षमता के साथ बाहरी घटक की कार्यक्षमता बढ़ाएँ:
  2. बाहरी घटक विधियों को लागू करना सीखें
  3. विधि-फ़ंक्शन जोड़ें कार्य 1, जो एक पैरामीटर के रूप में दो तार ("पैरामीटर1" और "पैरामीटर2") लेता है। नतीजतन, फॉर्म की एक स्ट्रिंग वापस आ जाती है: "चेक करें। पैरामीटर1, पैरामीटर2"
  4. सत्यापित करें कि किए गए परिवर्तन काम कर रहे हैं।

बनाए जा रहे घटक के तरीकों को परिभाषित करने के लिए, डेवलपर को AddInNative लाइब्रेरी के कोड में निम्नलिखित विधियों को लागू करने की आवश्यकता है:
GetNMethods, FindMethod, GetMethodName
प्राप्त करने के लिए डिज़ाइन किया गया, क्रमशः, विधियों की संख्या, विधि की संख्या और नाम की खोज करें। गुणों के लिए संबंधित विधियों के समान
GetNParams
निर्दिष्ट क्रम संख्या के साथ विधि मापदंडों की संख्या लौटाता है; यदि इस संख्या के साथ कोई विधि नहीं है या कोई पैरामीटर नहीं है, तो 0 लौटाता है
GetParamDefValue
निर्दिष्ट विधि के निर्दिष्ट पैरामीटर का डिफ़ॉल्ट मान लौटाता है
HasRetVal
एक ध्वज लौटाता है जो निर्दिष्ट रिटर्न वैल्यू ऑर्डिनल के साथ विधि है: रिटर्न वैल्यू वाले तरीकों के लिए सच है और असत्यअन्यथा
CallAsProc
असत्य, रन-टाइम त्रुटि होती है और 1C का निष्पादन: एंटरप्राइज़ मॉड्यूल बंद हो जाता है। मापदंडों की सरणी के लिए मेमोरी 1C: एंटरप्राइज द्वारा आवंटित और जारी की जाती है।
CallAsFunc
निर्दिष्ट क्रमसूचक के साथ विधि को निष्पादित करता है। यदि विधि वापस आती है असत्य, रन-टाइम त्रुटि होती है और 1C का निष्पादन: एंटरप्राइज़ मॉड्यूल बंद हो जाता है। मापदंडों की सरणी के लिए मेमोरी 1C द्वारा आवंटित की जाती है: एंटरप्राइज़। यदि वापसी मान टाइप स्ट्रिंग या बाइनरी डेटा का है, तो घटक फ़ंक्शन के साथ मेमोरी आवंटित करता है AllocMemoryमेमोरी मैनेजर, वहां डेटा लिखता है और इस पते को संरचना के संबंधित क्षेत्र में संग्रहीत करता है। 1С: उद्यम इस मेमोरी को कॉल करके जारी करेगा फ्री मेमोरी.
मापदंडों की सूची सहित विधियों का एक पूरा विवरण ITS डिस्क पर दिए गए दस्तावेज़ में विस्तार से वर्णित है।
ऊपर वर्णित विधियों के कार्यान्वयन पर विचार करें।
घटक कोड में, दो सरणियों को परिभाषित किया गया है:
स्थिर wchar_t * g_MethodNames = (एल "सक्षम", एल "अक्षम", एल "शोइनस्टैटसलाइन", एल "स्टार्टटाइमर", एल "स्टॉपटाइमर", एल "लोडचित्र"); स्थिर wchar_t * g_MethodNamesRu = (एल "सक्षम", एल "अक्षम", एल "शोइनस्टैटसलाइन", एल "स्टार्टटाइमर", एल "स्टॉपटाइमर", एल "लोडइमेज");
और एनम:
एनम विधियाँ (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // हमेशा अंतिम);
इनका उपयोग कार्यों में किया जाता है GetNMethods, FindMethodतथा GetMethodName, गुणों के विवरण के अनुरूप।
तरीकों GetNParams, GetParamDefValue, HasRetValपास किए गए मापदंडों और एप्लिकेशन लॉजिक के आधार पर स्विच लागू करें, आवश्यक मान लौटाएं। तरीका HasRetValइसके कोड में केवल उन विधियों की सूची है जो परिणाम लौटा सकते हैं। उनके लिए यह लौटता है सच. सभी स्टील विधियों के लिए रिटर्न असत्य.
तरीकों CallAsProcतथा CallAsFuncसीधे निष्पादन योग्य विधि कोड शामिल करें।
एक विधि जोड़ने के लिए जिसे केवल एक फ़ंक्शन के रूप में कहा जा सकता है, आपको बाहरी घटक के स्रोत कोड में निम्नलिखित परिवर्तन करने होंगे:
  1. सरणी में विधि का नाम जोड़ें g_MethodNamesतथा g_MethodNames(फ़ाइल AddInNative.cpp)
  2. मेथड्स एनम में एक सार्थक विधि पहचानकर्ता जोड़ें (file AddInNative.h)
  3. फ़ंक्शन कोड में परिवर्तन करें GetNParamsकार्यक्रम तर्क के अनुसार
  4. यदि आवश्यक हो, विधि के कोड में परिवर्तन करें GetParamDefValueयदि आप विधि मापदंडों के डिफ़ॉल्ट मानों का उपयोग करना चाहते हैं।
  5. किसी फ़ंक्शन में परिवर्तन करें HasRetVal
  6. कार्यों के तर्क में परिवर्तन करें CallAsProcया CallAsFuncविधि के सीधे निष्पादन योग्य कोड को वहां रखकर
चलो सरणियाँ लाते हैं g_MethodNamesतथा g_MethodNames, साथ ही गणना तरीकोंदेखने के लिए:
स्थिर wchar_t * g_MethodNames = (एल "सक्षम करें", एल "अक्षम करें", एल "शोइनस्टैटसलाइन", एल "स्टार्टटाइमर", एल "स्टॉपटाइमर", एल "लोडचित्र", एल "टेस्ट"); स्टेटिक wchar_t *g_MethodNamesRu = (L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadImage", L"Test");

Enum तरीके (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // हमेशा अंतिम);
आइए फ़ंक्शन को संपादित करें GetNPropsताकि यह "टेस्ट" विधि के मापदंडों की संख्या लौटाए:
long CAddInNative::GetNParams(const long lMethodNum) (स्विच(lMethodNum) (केस eMethShowInStatusLine: रिटर्न 1; केस eMethLoadPicture: रिटर्न 1; केस eMethTest: रिटर्न 2; डिफॉल्ट: रिटर्न 0; ) रिटर्न 0;)
आइए फ़ंक्शन में परिवर्तन करें:
bool CAddInNative::GetParamDefValue(const long lMethodNum, const long lParamNum, tVariant *pvarParamDefValue) ( ​​TV_VT(pvarParamDefValue)= VTYPE_EMPTY; स्विच(lMethodNum) ( case eMethEnable: case eMethDisable: case eMethShowInStatusLine: case eMethStartMethStopeth case: : मामला / डिफ़ॉल्ट ब्रेक द्वारा कोई पैरामीटर मान नहीं हैं; डिफ़ॉल्ट: झूठी वापसी;) झूठी वापसी;)
जोड़ी गई लाइन के लिए धन्यवाद
मामला eMethTest:
एक या एक से अधिक तर्कों की अनुपस्थिति में, संबंधित मापदंडों का एक खाली मान होगा ( VTYPE_EMPTY). यदि आपको पैरामीटर के लिए डिफ़ॉल्ट मान की आवश्यकता है, तो आपको इसे अनुभाग में निर्दिष्ट करना होगा eMethTestफ़ंक्शन स्विच स्टेटमेंट CAddInNative::GetParamDefValue.
चूंकि "टेस्ट" विधि एक मान वापस कर सकती है, इसलिए आपको फ़ंक्शन कोड में परिवर्तन करने की आवश्यकता है HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) (स्विच(lMethodNum) (केस eMethLoadPicture: केस eMethTest: रिटर्न ट्रू; डिफॉल्ट: रिटर्न फाल्स; ) रिटर्न फाल्स;)
और विधि के निष्पादन योग्य कोड को फ़ंक्शन में जोड़ें CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(lMethodNum) ( case eMethLoadPicture: ... break; case eMethTest: अगर (lSizeArray || !paParams) गलत लौटें; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; wstring_to_p (std::wstring(s1+s2), pvarRetValue); ret = सच ; टूटना ; ) रिट रिटर्न ; )
आइए घटक को संकलित करें और कॉन्फ़िगरेशन कोड को फॉर्म में लाएं:
var डेमोकॉम्प; SystemStartup प्रक्रिया () ConnectExternalComponent ("...", "DemoVK", ExternalComponentType.Native); डेमोकॉम्प = नया ("AddIn.DemoVK.SomeName"); लेन = डेमोकॉम्प.टेस्ट ("हाय, ", "वर्ल्ड!"); सूचित करें (ट्रांस); अंतिम प्रक्रिया
कॉन्फ़िगरेशन शुरू करने के बाद, हमें एक संदेश प्राप्त होगा: "हैलो, वर्ल्ड!", जो इंगित करता है कि विधि ने सफलतापूर्वक काम किया है।

घड़ी

एक कार्य:
  1. डेमो वीके में टाइमर के कार्यान्वयन का अध्ययन करें
  2. टाइमर अंतराल (मिलीसेकंड में) पैरामीटर में पास करने की क्षमता जोड़कर "स्टार्टटाइमर" विधि को संशोधित करें
  3. सत्यापित करें कि किए गए परिवर्तन काम कर रहे हैं।

WinAPI में, आप समय के साथ काम करने के लिए संदेश का उपयोग कर सकते हैं WM_TIMER. टाइमर बनाते समय आपके द्वारा निर्दिष्ट समय अंतराल पर यह संदेश आपके प्रोग्राम को भेजा जाएगा।
टाइमर बनाने के लिए फ़ंक्शन का उपयोग करें टाइमर लगाएं:
UINT SetTimer (HWND hWnd, // विंडो हैंडल UINT nIDevent, // टाइमर पहचानकर्ता (संख्या) UINT nElapse, // विलंब TIMERPROC lpTimerFunc); // फंक्शन पॉइंटर
ऑपरेटिंग सिस्टम एक संदेश भेजेगा WM_TIMERकार्यक्रम के लिए तर्क में निर्दिष्ट अंतराल के साथ एन समाप्त(मिलीसेकंड में)। अंतिम पैरामीटर में, आप एक फ़ंक्शन निर्दिष्ट कर सकते हैं जो हर बार टाइमर के सक्रिय होने पर निष्पादित किया जाएगा। इस फ़ंक्शन का हेडर इस तरह दिखना चाहिए (नाम कुछ भी हो सकता है):
शून्य __stdcall TimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
डेमो वीके में टाइमर के कार्यान्वयन पर विचार करें।
चूंकि हम विंडोज ओएस परिवार के लिए एक बाहरी घटक विकसित करने की प्रक्रिया पर विचार कर रहे हैं, हम अन्य में टाइमर के कार्यान्वयन पर विचार नहीं करेंगे ऑपरेटिंग सिस्टम. जीएनयू/लिनक्स ओएस के लिए, विशेष रूप से, कार्यान्वयन फ़ंक्शन के सिंटैक्स में भिन्न होगा टाइमर लगाएंतथा टाइमरप्रोक.
विधि को निष्पादन योग्य कोड में कहा जाता है टाइमर लगाएं, जिसके लिए समारोह पारित किया गया है MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
निर्मित टाइमर की आईडी एक चर में रखी गई है m_uiTimerताकि आप इसे बाद में बंद कर सकें।
समारोह MyTimerProcनिम्नलिखित नुसार:
शून्य कॉलबैक MyTimerProc (HWND hwnd, // टाइमर संदेशों के लिए विंडो का हैंडल UINT uMsg, // WM_TIMER संदेश UINT idEvent, // टाइमर पहचानकर्ता DWORD dwTime // वर्तमान सिस्टम समय) ( if (!pAsyncEvent) वापसी; wchar_t *who = L "कंपोनेंटनेटिव", * व्हाट = एल "टाइमर"; wchar_t *wstime = new wchar_t; if (wstime) ( wmemset(wstime, 0, TIME_LEN); ::_ultow(dwTime, wstime, 10); pAsyncEvent->ExternalEvent(कौन , क्या, wstime); wstime हटाएं;))
फ़ंक्शन का सार यह है कि विधि को कहा जाता है बाहरीईवेंट, जो 1C: एंटरप्राइज़ सिस्टम को एक संदेश भेजता है।
विधि की कार्यक्षमता का विस्तार करने के लिए स्टार्टटाइमरआइए निम्न कार्य करें:
विधि कोड को संशोधित करना GetNParamsताकि यह विधि के लिए हो eMethStartTimerलौटाया गया मान 1:
मामला eMethStartTimer: वापसी 1;
यहाँ विधि कोड है CallAsProcदेखने के लिए:
केस eMethStartTimer: if (!lSizeArray || TV_VT(paParams) != VTYPE_I4 || TV_I4(paParams)<= 0) return false; pAsyncEvent = m_iConnect; #ifndef __linux__ m_uiTimer = ::SetTimer(NULL,0,TV_I4(paParams),(TIMERPROC)MyTimerProc); #else // код для GNU/Linux #endif break;
अब चलो कार्यक्षमता की जाँच करें। ऐसा करने के लिए, कॉन्फ़िगरेशन के प्रबंधित एप्लिकेशन के मॉड्यूल में, हम कोड लिखेंगे:
var डेमोकॉम्प; SystemStartup प्रक्रिया () ConnectExternalComponent ("...", "DemoVK", ExternalComponentType.Native); डेमोकॉम्प = नया ("AddIn.DemoVK.SomeName"); डेमोकॉम्प.स्टार्टटाइमर (2000); अंतिम प्रक्रिया
कॉन्फ़िगरेशन शुरू करने के बाद, प्रोग्राम को 2 सेकंड के अंतराल के साथ संदेश प्राप्त होंगे, जो टाइमर के सही संचालन को इंगित करता है।

1C के साथ इंटरेक्शन: एंटरप्राइज सिस्टम

बाहरी घटक और 1C के बीच बातचीत करने के लिए: एंटरप्राइज़ सिस्टम, फ़ाइल में वर्णित IAddInDefBase वर्ग के तरीके AddInDefBase.h. हम सबसे अधिक इस्तेमाल की जाने वाली सूची देते हैं:
त्रुटि संदेश पीढ़ी
वर्चुअल बूल ADDIN_API AddError (अहस्ताक्षरित लघु wcode, const WCHAR_T * स्रोत, const WCHAR_T * विवरण, लंबा स्कोड)
wcode, कोड- त्रुटि कोड (विवरण के साथ त्रुटि कोड की सूची ITS डिस्क पर पाई जा सकती है)
स्रोत- त्रुटि स्रोत
विवरण- त्रुटि विवरण
1C को संदेश भेजना: एंटरप्राइज सिस्टम
आभासी बूल ADDIN_API बाहरी घटना (WCHAR_T * wszSource, WCHAR_T * wszMessage, WCHAR_T * wszData) = 0;
wszSource- संदेश स्रोत
wszMessage- संदेश शब्द
wszData- प्रेषित डेटा
संदेश का अवरोधन कार्यविधि HandlingExternalEvent द्वारा किया जाता है
1सी: एंटरप्राइज सिस्टम में बाहरी घटक का पंजीकरण
वर्चुअल बूल ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfileName- घटक का नाम।
ये विधियाँ VK और 1C की पूर्ण सहभागिता के लिए पर्याप्त हैं। 1C से बाहरी घटक द्वारा डेटा प्राप्त करने के लिए: एंटरप्राइज़ सिस्टम और इसके विपरीत, बाहरी घटक एक विशेष संदेश भेजता है, जो बदले में, 1C सिस्टम द्वारा इंटरसेप्ट किया जाता है और यदि आवश्यक हो, तो भेजने के लिए बाहरी घटक के तरीकों को कॉल करता है। बैक डेटा।

टीवेरिएंट डेटा प्रकार

बाहरी घटक और 1C: एंटरप्राइज सिस्टम के बीच डेटा का आदान-प्रदान करते समय, tVariant डेटा प्रकार का उपयोग किया जाता है। यह उन प्रकारों में वर्णित है। h फ़ाइल, जो ITS डिस्क पर पाई जा सकती है:
संरचना _tvariant (_anonymous_union संघ (int8_t i8val; int16_t शॉर्टवल; int32_t lval; intval; intval; अहस्ताक्षरित int uintval; int64_t llval; uint8_t ui8val; uint16_t32_t; bVal; char chVal; wchar_t wchVal; दिनांक दिनांक; IID IDVal; संरचना _tVariant *pvarVal; संरचना tm tmVal; _ANONYMOUS_STRUCT संरचना (शून्य* pInterfaceVal; IID इंटरफ़ेसआईडी;) __VARIANT_NAME_2/*iface*/; _ANONYMOUS_STRUCT संरचना (char* pstr2_t Lint3 ; / / बाइट्स की गिनती) __VARIANT_NAME_3/*str*/; _ANONYMOUS_STRUCT स्ट्रक्चर (WCHAR_T* pwstrVal; uint32_t wstrLen; // प्रतीक की गिनती) __VARIANT_NAME_4/*wstr*/; ) __VARIANT_NAME_1; uint32_t cbElements; // एक-आयामी सरणी के लिए आयाम pvarVal TYPEVAR vt;);
के प्रकार टीवेरिएंटएक संरचना है जिसमें शामिल हैं:
  • मिश्रण (संघ) सीधे डेटा भंडारण के लिए अभिप्रेत है
  • डेटा प्रकार पहचानकर्ता
सामान्य तौर पर, प्रकार के चर के साथ काम करना टीवेरिएंटनिम्नलिखित एल्गोरिथम के अनुसार होता है:
  1. एक चर में वर्तमान में संग्रहीत डेटा के प्रकार का निर्धारण करना
  2. डेटा तक सीधी पहुंच के लिए मिश्रण के संबंधित क्षेत्र तक पहुंच
उपयोग टाइप करें टीवेरिएंट 1C: एंटरप्राइज सिस्टम और एक बाहरी घटक की बातचीत को बहुत सरल करता है

आवेदन पत्र

"उदाहरण" निर्देशिका में लेख के लिए उदाहरण हैं
उदाहरण/1 - डेमो घटक चलाएँ
उदाहरण/2 - संपत्ति सूची विस्तार डेमो
उदाहरण/3 - विधि सूची विस्तार का प्रदर्शन
प्रत्येक निर्देशिका में एक VS 2008 प्रोजेक्ट और एक पूर्वनिर्मित 1C कॉन्फ़िगरेशन होता है।

जब उपयोगकर्ता टर्मिनल के माध्यम से सर्वर से जुड़कर 1C के साथ काम करते हैं, तो प्रोग्रामर को अक्सर बाहरी घटकों (उदाहरण के लिए, वाणिज्यिक उपकरण ड्राइवर) को जोड़ने में समस्या होती है।

उसी समय, उपयोगकर्ता देखते हैं, उदाहरण के लिए, लेख की घोषणा में प्रस्तुत चित्र।

स्थानीय कंप्यूटर से काम करते समय, बाहरी घटकों को जोड़ने में कोई समस्या नहीं होती है।

यह किससे जुड़ा है? ऐसा इसलिए है क्योंकि जब उपयोगकर्ता टर्मिनल सर्वर के माध्यम से काम करते हैं, तो उनके पास स्थानीय कंप्यूटर पर काम करने की तुलना में कम अधिकार होते हैं।

यदि आप व्यवस्थापकीय अधिकारों वाले खाते के अंतर्गत टर्मिनल सर्वर में लॉग इन करते हैं तो यह सत्यापित करना आसान है।

इस अंतर का कारण यह है कि जब उपयोगकर्ता सामान्य अधिकारों के तहत टर्मिनल में काम करता है, तो 1C रजिस्ट्री में बाहरी घटक को पंजीकृत नहीं कर सकता है, क्योंकि एक सामान्य उपयोगकर्ता के पास सिस्टम रजिस्ट्री शाखा में लिखने की अनुमति नहीं होती है HKEY_CLASSES_ROOT.

टर्मिनल में बाहरी घटकों को जोड़ने के विषय पर प्रकाशन इस समस्या को हल करने के लिए विभिन्न तरीकों की पेशकश करते हैं।

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

1. प्रशासनिक अधिकारों के तहत पहली बार 1C चलाएँ।

यह विकल्प हमेशा काम नहीं करता। मैं समझाऊंगा कि नीचे क्यों।

2. टर्मिनल के सामान्य उपयोगकर्ताओं को सिस्टम रजिस्ट्री शाखा को लिखने का अधिकार दें HKEY_CLASSES_ROOT.

अपर्याप्त "उन्नत" उपयोगकर्ताओं को ऐसा नहीं करना चाहिए, अन्यथा समस्याएं हो सकती हैं।

3. पूर्ण अधिकार वाले उपयोगकर्ता की ओर से विभिन्न "गैजेट्स" रजिस्टर वीके का उपयोग करना।

खाना भी ठीक नहीं है।

तो इस स्थिति से बाहर निकलने का सबसे अच्छा तरीका क्या है?

मैं इस समस्या का अपना समाधान प्रस्तुत करता हूं। मेरी राय में - सरल और सुंदर, पहले इन्फोस्टार्ट पर पेश नहीं किया गया था।

इस समस्या की जांच करते हुए, मैंने सोचा - 1 सी वीके को एक नए रास्ते पर पंजीकृत करने का प्रयास क्यों करता है? आखिरकार, यह पहले से ही सिस्टम में पंजीकृत है।

बात यह निकली कि विशिष्ट 1C कॉन्फ़िगरेशन में (उदाहरण के लिए, "ट्रेड मैनेजमेंट") वैश्विक संदर्भ पद्धति के निम्नलिखित सिंटैक्स का उपयोग किया जाता है कनेक्ट बाहरी घटक () :

ConnectExternalComponent ("Reference.ConnectedEquipment.Layout.DriverATOLBarcodeScanner", "ATOLScanner");

जैसा कि आप देख सकते हैं, VK ड्राइवर "कनेक्टेड इक्विपमेंट" डायरेक्टरी के "DriverATOLScannerBarcode" लेआउट से कनेक्टेड है।

फिर क्या होता है?

1C घटक को उपयोगकर्ता के अस्थायी फ़ोल्डर में सहेजता है, उदाहरण के लिए "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"

और इसे इस पथ के साथ HKEY_CLASSES_ROOT रजिस्ट्री शाखा में पंजीकृत करने का प्रयास करता है।

टर्मिनल पर, सामान्य उपयोगकर्ताओं के पास इस रजिस्ट्री शाखा को बदलने का अधिकार नहीं है, इसलिए घटक उनके लिए जुड़ा नहीं है।

अब इस स्थिति से कैसे निकला जाए।

वैश्विक संदर्भ विधि ConnectExternalComponent() में कई सिंटैक्स विकल्प हैं। यही हम प्रयोग करेंगे।

तो, चरण दर चरण:

1. 32-बिट OS के लिए C:\WINDOWS\SYSTEM32 फ़ोल्डर में टर्मिनल सर्वर पर या फ़ोल्डर में regsvr32.exe उपयोगिता का उपयोग करके बाहरी घटक को पंजीकृत करें C:\WINDOWS\SYSWOW64 64-बिट OS के लिए।

2. ConnectExternalComponent() विधि के लिए दो अतिरिक्त सिंटैक्स विकल्पों में से एक का उपयोग करें:

विकल्प 1:

ConnectExternalComponent ("C:\WINDOWS\SysWOW64\Scaner1C.dll", "ATOLScanner", ExternalComponentType.COM);

DriverObject = नया ("AddIn.ATOLScanner.Scanner45");

विकल्प 2:

प्रोगिड = "AddIn.Scanner45";

बाहरी घटक (प्रोगिड) कनेक्ट करें;

ड्राइवर ऑब्जेक्ट = नया (प्रोगिड);

मेरी राय में, विकल्प #2 बेहतर है।

उसी समय, 1C वीसी को रजिस्ट्री में एक नए पथ के साथ फिर से पंजीकृत करने का प्रयास नहीं करता है, और इस प्रकार, सभी समस्याएं हल हो जाती हैं।

अच्छा यही सब है। नौकरी में गुड लक!

उदाहरण के लिए, यदि आप इसके लेखक नहीं हैं और कोई स्रोत कोड नहीं है, तो किसी घटक को फिर से लिखना संभव नहीं होगा। या यदि नेटिव एपीआई तकनीक (नंबर, स्ट्रिंग, बूलियन, डेट) द्वारा समर्थित सबसे सरल प्रकार इसके संचालन के लिए पर्याप्त नहीं हैं।

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

इस स्थिति में, आप घटक को क्लाइंट पर कॉल कर सकते हैं। ऐसा करने के लिए, क्लाइंट पर आवश्यक क्रियाएं करने के लिए सर्वर पर निर्धारित कार्य से एक और 1C सत्र लॉन्च करने के लिए पर्याप्त है। ठीक है, चल रहे सत्र को बाद में समाप्त करना न भूलें।

मान लीजिए कि हमारे निर्धारित कार्य में, हम एक रिपोर्ट बनाते और सहेजते हैं जो पूर्ण नाम को अस्वीकार करने के लिए बाहरी COM घटक NameDeclesion.dll का उपयोग करती है। फ़ाइल बेस पर, ऐसा शेड्यूल किया गया कार्य ठीक से काम करेगा, लेकिन यह सर्वर घटक पर काम नहीं करेगा।

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

#If क्लाइंट तो प्रक्रिया ExecuteFormationAndSavingReport() निर्यात करें यदि ConnectExternalComponent("CommonLayout.NAMEDECL","Cl",ExternalComponentType.COM) तो घटक = नया ("AddIn.Cl.NameDeclension"); // यहाँ रिपोर्ट बनाने और सहेजने के लिए कोड है। ElseJoinLogRecord ("RegTask", LogLogLevel.Error, "क्लाइंट पर बाहरी घटक को जोड़ने में विफल"); अगर अंत; प्रक्रिया का अंत #अन्यथा प्रक्रिया ExecuteFormationAndSavingReport() Export ExecuteOperationOnClient("RegularTasks.ExecuteFormationAndSavingReport()"); अंतिम प्रक्रिया प्रक्रिया PerformOperationOnClient (पैरामीटर टू एक्सक्यूट) ExportUserName = ""; यूजरपासवर्ड = ""; PathToExternalProcessing = "c:/temp/Autostart.epf"; भाव = """"; डायरेक्टरीबिन = डायरेक्टरीप्रोग्राम (); PathToConfiguration = InfoBase ConnectionString (); कॉन्फ़िगरेशनपथ = StrReplace (कॉन्फ़िगरेशनपथ, उद्धरण, उद्धरण + उद्धरण); StartString = उद्धरण + बिन निर्देशिका + "1cv8.exe" + उद्धरण + "उद्यम" + "/IBConnectionString" + उद्धरण + कॉन्फ़िगरेशनपथ + उद्धरण + "/N" + उद्धरण + उपयोगकर्ता नाम + उद्धरण + "/P" + उद्धरण + UserPassword + उद्धरण + "/निष्पादन" + उद्धरण + बाहरी प्रसंस्करण पथ + उद्धरण + "/सी" + उद्धरण + पैरामीटर निष्पादित करने के लिए + उद्धरण; स्टार्ट एप्लिकेशन (स्टार्टस्ट्रिंग); अंतिम प्रक्रिया #EndIf

बाहरी प्रसंस्करण कोड जो केवल क्लाइंट संदर्भ को अनुसूचित कार्य मॉड्यूल से आवश्यक रिपोर्ट प्रिंट करने का कारण बनता है और रिपोर्ट उत्पन्न होने के बाद सत्र समाप्त करता है।

निष्पादित करने का प्रयास (स्टार्टअप पैरामीटर); अपवाद एंडट्री; शटडाउन सिस्टम (झूठा);

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

एक विशिष्ट अनुप्रयोग के लिए कोड। सैद्धांतिक रूप से, यह एक प्रबंधित तरीके से पूरी तरह से समान तरीके से काम करेगा।

अनुलेखसाथ ही, इस दृष्टिकोण का उपयोग अनुसूचित नौकरियों में किसी भी क्लाइंट प्रक्रियाओं को निष्पादित करने के लिए किया जा सकता है।

घंटी

आपसे पहले इस खबर को पढ़ने वाले भी हैं।
नवीनतम लेख प्राप्त करने के लिए सदस्यता लें।
ईमेल
नाम
उपनाम
आप द बेल को कैसे पढ़ना चाहेंगे
कोई स्पैम नहीं