वैल्यू स्टोरेज 1s 8.3 से डेटा प्राप्त करें। वेब क्लाइंट के साथ काम करते समय सीमाएँ

लगभग किसी भी जानकारी को वैल्यू स्टोर में संग्रहित किया जा सकता है, उदा.

... तस्वीरें (तस्वीरें):

currentImage.Object = SprFabric.Link; currentImage.DataType = गणना.वस्तुओं की अतिरिक्त जानकारी के प्रकार.छवि; स्टोरेज = न्यूवैल्यूस्टोरेज(न्यूपिक्चर, न्यूडाटाकंप्रेशन()); करंटइमेज.स्टोरेज = स्टोरेज.गेट();

// इस स्थान पर यह सब कुछ प्रदर्शित करता है... फॉर्म एलिमेंट्स.पिक्चरफील्ड1.पिक्चर = स्टोरेज.गेट(); करंटइमेज.लिखें();

...स्प्रेडशीट दस्तावेज़:

TabDoc=नया TabularDocument; TabDoc.Output(FormElements.TabularDocumentField1); स्टोरेज=न्यूवैल्यूस्टोरेज(टैबडॉक); लिखना();

प्रक्रिया का अंत

प्रक्रिया पुनर्स्थापनाफ्रॉमस्टोरेजप्रेस(तत्व)

TabDoc=Storage.Get(); यदि TabDoc<>अपरिभाषित ThanFormElements.TabularDocumentField1.Output(TabDoc); अगर अंत;

प्रक्रिया का अंत

...मनमाना फ़ाइलें (बाइनरी डेटा):

XZ = NewValueStorage(NewBinaryData(फ़ाइल));

आठ भंडारण में रखे गए डेटा के संपीड़न का समर्थन करते हैं:

XZ = NewValueStorage(NewBinaryData(file),NewDataCompression(9));

... बाहरी प्रसंस्करण और रिपोर्टिंग:

प्रक्रिया LoadProcessingIntoStorage(PropsStorageType)

कंप्रेशनरेट = न्यूडाटाकंप्रेशन(9); //9 अधिकतम प्रॉप्सस्टोरेजटाइप = नया स्टोरेजवैल्यू (नया बाइनरीडेटा ("सी:\रिपोर्ट\रिपोर्ट.ईपीएफ", संपीड़न दर));

प्रक्रिया का अंत

प्रक्रिया स्टार्टप्रोसेसिंगफ्रॉमस्टोरेज(प्रॉप्सस्टोरेजटाइप)

TemporaryFileName = TemporaryFileDirectory()+"report.epf"; बाइनरीडेटा = PropsStorageType.Get(); बाइनरीडेटा.लिखें(अस्थायीफ़ाइलनाम); एक्सटर्नलप्रोसेसिंग = एक्सटर्नलप्रोसेसिंग.क्रिएट(अस्थायीफ़ाइलनाम); एक्सटर्नलप्रोसेसिंग.गेटफॉर्म().ओपन();

प्रक्रिया का अंत

भंडारण के साथ कार्य करना

यदि यह बाइनरी डेटा था, तो इसे Get विधि का उपयोग करके वैल्यू स्टोर से पुनर्स्थापित किया जा सकता है और Write() विधि का उपयोग करके फ़ाइल में लिखा जा सकता है।

यदि टाइप वैल्यू (भंडारण)<>फिर ("बाइनरीडेटा") टाइप करें

बाइनरीडेटा = स्टोरेज.गेट();

बाइनरीडेटा = भंडारण;

अगर अंत; बाइनरीडेटा.लिखें(फ़ाइलनाम);

यदि यह, उदाहरण के लिए, एक Word दस्तावेज़ (doc फ़ाइल, या अन्य पंजीकृत फ़ाइल प्रकार) था, तो इसे इस तरह खोला जा सकता है:

लॉन्चएप्लिकेशन(फ़ाइलनाम);

वैल्यू स्टोरेज प्रकार के फ़ील्ड को साफ़ करने के लिए, आपको इसे अपरिभाषित निर्दिष्ट करने की आवश्यकता है:

प्रॉप्सस्टोरेज = अपरिभाषित;

अंतर्निहित भाषा 1सी:एंटरप्राइज़ 8 में फ़ाइलों और चित्रों के साथ कार्य करना

उद्देश्य

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

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

विधि का दायरा

अस्थायी भंडारण

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

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

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

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

सूचना आधार

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

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

इन्फोबेस विवरण के साथ काम करते समय फ़ाइलों के साथ काम करने के तरीकों की सीमाएँ होती हैं। उनके लिए, अस्थायी भंडारण के विपरीत, केवल पढ़ने की जानकारी उपलब्ध है, लेकिन उसे लिखने या हटाने की नहीं।

फ़ाइलों के साथ काम करने के तरीकों का विवरण

डेटा को अस्थायी भंडारण में सहेजना

इस तंत्र का उपयोग करने के लिए सबसे विशिष्ट परिदृश्य में प्रारंभ में उपयोगकर्ता डेटा को अस्थायी भंडारण में रखना शामिल है। इसके लिए दो विधियाँ हैं: PlaceFile() और PlaceFileInTemporaryStorage()।

पहली विधि, प्लेसफ़ाइल (), स्थानीय फ़ाइल सिस्टम से एक फ़ाइल को अस्थायी भंडारण में रखती है। विधि भंडारण में लक्ष्य पते को स्वीकार कर सकती है। यदि यह परिभाषित नहीं है या एक खाली स्ट्रिंग है, तो एक नई फ़ाइल बनाई जाएगी और विधि संबंधित पैरामीटर के माध्यम से अपना पता लौटा देगी।

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

परिणामस्वरूप, यदि उपयोगकर्ता ने फ़ाइल चयन संवाद में कोई ऑपरेशन करने से इंटरैक्टिव रूप से इनकार कर दिया है, तो विधि गलत रिटर्न देती है। यह विधि केवल क्लाइंट पर उपलब्ध है।

दूसरी विधि, PlaceFileInTemporaryStorage(), पिछली विधि के समान है, सिवाय इसके कि यह सर्वर पर उपलब्ध है, और अस्थायी भंडारण में लिखे जाने वाले डेटा को फ़ाइल सिस्टम में पथ के रूप में नहीं, बल्कि प्रकार के एक चर के रूप में दर्शाया जाता है बाइनरी डेटा। इसी तरह, यदि कोई लक्ष्य पता निर्दिष्ट नहीं है, तो स्टोरेज में एक नई फ़ाइल बनाई जाती है। इसका पता फ़ंक्शन के परिणाम के रूप में लौटाया जाता है।

अस्थायी भंडारण से फ़ाइल पुनर्प्राप्त करना

इन्फोबेस पर कोई ऑब्जेक्ट लिखते समय, आपको अस्थायी भंडारण से डेटा निकालने और उसे रखने की आवश्यकता हो सकती है, उदाहरण के लिए, एक विशेषता में। इसके लिए एक संबंधित सर्वर विधि है - GetFileFromTemporaryStorage()। यह विधि अस्थायी भंडारण से डेटा पुनर्प्राप्त करती है और परिणामस्वरूप उसे वापस कर देती है। ऐसा करने के लिए, आपको अस्थायी भंडारण में पता निर्दिष्ट करना होगा। यह पता ऊपर वर्णित विधियों PlaceFile() और PlaceFileInTemporaryStorage() द्वारा लौटाया जाता है यदि उन्हें सफलतापूर्वक निष्पादित किया जाता है।

किसी फ़ाइल को अस्थायी संग्रहण से हटाना

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

अस्थायी भंडारण के लिए पते की जाँच की जा रही है

फ़ाइल पता इन्फोबेस में अस्थायी भंडारण और विवरण दोनों को इंगित कर सकता है। इसके प्रकार की जांच करने के लिए, एक विधि है यह TemporaryStorageAddress() है।

यह जाँचता है कि पारित पता स्टोर की ओर इंगित करने वाला पता है। यदि पता अस्थायी भंडारण की ओर इंगित करता है तो सत्य लौटाता है। विधि सर्वर पर उपलब्ध है.

प्रॉप्स पता प्राप्त करना

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

लेकिन इससे पहले कि आप डेटा प्राप्त करें, उदाहरण के लिए किसी संपत्ति से, आपको इस संपत्ति का पता प्राप्त करना होगा। इस प्रयोजन के लिए, एक विधि GetFileAddressInInformationBase() है।

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

इन्फोबेस से एक फ़ाइल पुनर्प्राप्त करना

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

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

फ़ाइल विधियों का उपयोग करने का उदाहरण

// इंटरैक्टिव मोड में डिस्क से एक फ़ाइल प्राप्त करना // और इसे अस्थायी भंडारण में रखना और क्लाइंट प्रक्रिया पर चयन करनाDiskFileAndWrite()

परिवर्तनीय चयनित नाम; परिवर्तनीयअस्थायीभंडारणपता; यदि पुटफ़ाइल (अस्थायी स्टोरेज पता, चयनित नाम, सत्य) तो ऑब्जेक्ट.फ़ाइल नाम = चयनित नाम; प्लेसऑब्जेक्टफ़ाइल(अस्थायीस्टोरेजएड्रेस); अगर अंत;

प्रक्रिया का अंत

// किसी फ़ाइल को अस्थायी भंडारण से किसी निर्देशिका में कॉपी करना // विशेषता, किसी ऑब्जेक्ट को रिकॉर्ड करना, किसी फ़ाइल को अस्थायी // भंडारण से हटाना और सर्वर प्रक्रिया पर ऑब्जेक्ट फ़ाइल रखें (अस्थायी भंडारण पता)

निर्देशिका तत्व = फॉर्म विशेषताएँ वैल्यू ("ऑब्जेक्ट"); बाइनरीडेटा = GetFileFromTemporaryStorage(TemporaryStorageAddress); निर्देशिका तत्व.फ़ाइल डेटा = न्यूवैल्यूस्टोरेज(बाइनरीडेटा); FilePathOnDisk = नई फ़ाइल(DirectoryItem.FileName); निर्देशिका आइटम.फ़ाइलनाम = FilePathOnDisk.Name; निर्देशिका तत्व.लिखें(); संशोधित = गलत; DeleteFileFromTemporaryStorage(TemporaryStorageAddress); वैल्यूएफ़ॉर्मएट्रिब्यूट्स(निर्देशिका तत्व, "ऑब्जेक्ट");

प्रक्रिया का अंत

// प्रॉप्स से एक फ़ाइल को पढ़ना और इसे सहेजना // इंटरैक्टिव मोड में स्थानीय डिस्क पर और क्लाइंट प्रक्रिया पर ReadFileAndSaveToDisk()

पता = GetFileAddressInInformationBase(Object.Link, "FileData"); GetFile(पता, ऑब्जेक्ट.फ़ाइलनाम, सत्य);

प्रक्रिया का अंत

चित्र क्षेत्र में पतों के लिए समर्थन

चित्र फ़ील्ड नियंत्रण अस्थायी भंडारण या डेटाबेस में फ़ाइल के पते द्वारा निर्दिष्ट चित्र प्रदर्शित करने का समर्थन करता है।

ऐसा करने के लिए, आपको प्रपत्र तत्व की डेटा प्रॉपर्टी में एक स्ट्रिंग प्रकार विशेषता सेट करनी होगी। इस विशेषता का मान चित्र के पते के रूप में समझा जाएगा।

उदाहरण // अस्थायी // भंडारण में छवि फ़ील्ड को छवि पते से बांधना। पता चित्र स्ट्रिंग प्रकार का विवरण बनाते हैं

प्लेसफ़ाइल (चित्र पता, सत्य)

चित्र.डेटा = पताचित्र

वेब क्लाइंट के साथ काम करते समय सीमाएँ

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

क्लाइंट पर वैल्यू स्टोरेज के साथ काम करते समय सुविधाएँ

संकट:

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

अनुमानित कारण:

शायद, फॉर्म खोलते समय, क्लाइंट को वैल्यू स्टोर में स्थित डेटा का लिंक नहीं भेजा जाता है, बल्कि डेटा ही भेजा जाता है।

समाधान

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

इसका उपयोग करना और भी बेहतर है अस्थायी भंडारणक्लाइंट और सर्वर के बीच फ़ाइलें स्थानांतरित करने के लिए।

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

एक तत्व के रूप में डिस्क से एक मनमानी फ़ाइल संलग्न करने के लिए, "अटैचफाइल" कमांड लागू किया गया है। इसका प्रोग्राम कोड निम्नलिखित सूची में प्रस्तुत किया गया है:

क्लाइंट प्रक्रिया पर अटैचफ़ाइल(कमांड) // क्लाइंट पर कमांड हैंडलर। फ़ाइल चयन // डिस्क से फ़ाइल का चयन करने के लिए संवादमोड = FileSelectionDialogMode. खुलना; OpenFileDialog = NewFileSelectDialog(मोड); ओपनफ़ाइल संवाद. FullFileName = "" ; ओपनफ़ाइल संवाद. एकाधिक चयन = गलत; ओपनफ़ाइल संवाद. शीर्षक = "फ़ाइलें चुनें"; यदि FileOpenDialog. चुनें() फिर FilePath = FileOpenDialog. पूर्णफ़ाइलनाम; // बाइनरी फ़ाइल डेटा प्राप्त करेंबाइनरीडेटा = नया बाइनरीडेटा(PathToFile); // बाइनरी डेटा को सर्वर पर स्थानांतरित करेंअटैचफ़ाइलसर्वर(बाइनरीडेटा); अन्यथा पाठ = "आरयू = " " फ़ाइल (ओं) का चयन नहीं किया गया!" " ; एन =" " फ़ाइल (ओं) का चयन नहीं किया गया!" " " ; चेतावनी (एनएसटीआर (टेक्स्ट) ) ; एंडइफ ; एंडप्रोसीजर और ऑनसर्वर प्रक्रिया अटैच फाइलसर्वर (बाइनरीडेटा) // सूचना सुरक्षा में फ़ाइल रिकॉर्ड करने के लिए सर्वर पर हैंडलर // फॉर्म ऑब्जेक्ट को संदर्भ ऑब्जेक्ट में बदलेंऑब्जेक्ट करंट = फॉर्मएट्रिब्यूट्सवैल्यू ("ऑब्जेक्ट"); // "डेटा" विशेषता के लिए एक नया मान निर्दिष्ट करेंऑब्जेक्ट करंट। डेटा = न्यूवैल्यूस्टोरेज(बाइनरीडेटा); // परिवर्तनों को सुरक्षित करेंऑब्जेक्ट करंट। लिखना() ; प्रक्रिया का अंत

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

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

प्रदर्शन प्रभाव

आइए कुछ प्रदर्शन परीक्षण चलाएँ। परीक्षण संलग्न फ़ाइल के साथ और उसके बिना, "उत्पाद" निर्देशिका के दो तत्वों का उपयोग करेंगे। संलग्न फ़ाइल का आकार 5 मेगाबाइट है.

सभी परीक्षण परीक्षण कॉन्फ़िगरेशन में "गेटएलिमेंट" प्रोसेसिंग का उपयोग करके किए जाते हैं। आप इस कॉन्फ़िगरेशन को लेख के अंत में दिए गए लिंक से डाउनलोड कर सकते हैं।

आइए "उत्पाद" निर्देशिका में आइटम खोलने में लगने वाले समय को मापें। किसी तत्व को खोलने के लिए, वैश्विक संदर्भ विधि "OpenValue()" का उपयोग किया जाता है, जो पैरामीटर के रूप में तत्व के संदर्भ को पारित करता है। आइए एक मानक प्रदर्शन माप उपकरण का उपयोग करके शुरुआती समय को मापें। परिणाम निम्नलिखित स्क्रीनशॉट में प्रस्तुत किए गए हैं:

जैसा कि हम देख सकते हैं, संलग्न फ़ाइल के साथ किसी तत्व को खोलने में लगने वाला समय 10 गुना अधिक है! चलिए एक और परीक्षण करते हैं. आइए उत्पाद कैटलॉग तत्व को संदर्भित करने के लिए "GetObject()" विधि निष्पादित करें। आप परीक्षा परिणाम निम्नलिखित स्क्रीनशॉट में देख सकते हैं।

अंतर काफी महत्वपूर्ण है. संलग्न फ़ाइल के बिना तत्व प्राप्त करना 194 गुना तेज है!

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

ध्यान दें: "OpenValue()" विधि को निष्पादित करते समय, निर्देशिका तत्व ऑब्जेक्ट भी पहले प्राप्त किया जाता है, और फिर एक फॉर्म ऑब्जेक्ट में बदल दिया जाता है और क्लाइंट को पास कर दिया जाता है (प्रबंधित फॉर्म के लिए)। अर्थात् जब किसी तत्व को संदर्भ द्वारा खोला जाता है, तो वस्तु भी पुनः प्राप्त हो जाती है।

आइए किसी निर्देशिका आइटम को संलग्न फ़ाइल के साथ और उसके बिना खोलने और लिखने में लगने वाले समय पर एक अंतिम परीक्षण करें। परिणाम निम्नलिखित स्क्रीनशॉट में दिखाया गया है।

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

सूचना आधार वस्तुओं के लिए डेटा संग्रहीत करने की समस्या को हल करने का सबसे सही तरीका क्या है?

सही समाधान

यदि हम विशिष्ट कॉन्फ़िगरेशन में इस तंत्र के कार्यान्वयन को देखते हैं, तो हम देखेंगे कि वस्तुओं के लिए अतिरिक्त जानकारी एक अलग सूचना रजिस्टर तालिका में संग्रहीत की जाती है। उदाहरण के लिए, यह "ट्रेड मैनेजमेंट" संस्करण 11 के मानक कॉन्फ़िगरेशन में अटैचमेंट फ़ाइल तंत्र जैसा दिखता है।

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

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

आलेख से एक उदाहरण के साथ कॉन्फ़िगरेशन का परीक्षण करें: जोड़ना .

प्लेटफ़ॉर्म 1सी:एंटरप्राइज़विभिन्न प्रकार के डेटा को संग्रहीत करने के लिए बहुत सारी संभावनाएँ प्रदान करता है।

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

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

और अब हम इस निर्देशिका में और प्रॉप्स में तत्व बना सकते हैं एक वस्तुप्रत्येक तत्व एक फ़ाइल में लिखा जाता है।

वैल्यू स्टोर के साथ काम करना बहुत सरल है। यदि हम सिंटैक्स हेल्पर को देखें, तो हम देखेंगे कि इस ऑब्जेक्ट में केवल एक विधि और एक कंस्ट्रक्टर है।

अब, प्रदर्शन के लिए, आइए सबसे सरल कोड लिखें जो प्रॉप्स पर एक फ़ाइल लिखेगा एक वस्तुपहले से निर्मित निर्देशिका तत्व, और फिर इस फ़ाइल को प्रॉप्स से पढ़ें और इसे डिस्क पर लिखें, लेकिन एक अलग नाम के तहत।

&सर्वर प्रक्रिया पर लोडअनलोडफ़ाइल(निर्देशिका तत्व)निर्देशिका ऑब्जेक्ट =निर्देशिका तत्व। गेटऑब्जेक्ट() ; // छवि को वैल्यू स्टोर में रखेंलेबलडाउनलोड = नई छवि ("g:\musor\favicon.ico") NewValueStorage; // एक निर्देशिका तत्व लिखेंनिर्देशिका वस्तु. डायरेक्टरीऑब्जेक्ट ऑब्जेक्ट। लिखना() ; // वैल्यू स्टोर से छवि को फ़ाइल में अपलोड करेंफ़ाइलनाम = "g:\musor\favicon_1.ico" ; लेबलअपलोड = निर्देशिका ऑब्जेक्ट। एक वस्तु। पाना() ; लेबल अपलोड करें. लिखें(फ़ाइलनाम); प्रक्रिया का अंत

और कोड के लिए कुछ स्पष्टीकरण।

  • जब कंस्ट्रक्टर का उपयोग करके स्टोर बनाया जाता है तो ऑब्जेक्ट को सीधे स्टोर में रखा जाता है।

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