Príjem dát z úložiska hodnoty 1s 8.3. Obmedzenia pri práci s webovým klientom

V sklade hodnôt je možné uložiť takmer akúkoľvek informáciu, napr.

... obrázky (fotky):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Enumerations.Types of Additional Information of Objects.Image; Storage = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// na tomto mieste zobrazí všetko... Form Elements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...tabuľkový dokument:

TabDoc=Nový tabuľkový dokument; TabDoc.Output(FormElements.TabularDocumentField1); Storage=NewValueStorage(TabDoc); Napíšte ();

Koniec procedúry

Postup RestoreFromStoragePress (prvok)

TabDoc=Storage.Get(); Ak TabDoc<>Undefined ThenFormElements.TabularDocumentField1.Output(TabDoc); koniec Ak;

Koniec procedúry

...ľubovoľné súbory (binárne dáta):

XZ = NewValueStorage(NewBinaryData(súbor));

Osem podporuje kompresiu údajov umiestnených v úložisku:

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

... externé spracovanie a podávanie správ:

Postup LoadProcessingIntoStorage(PropsStorageType)

CompressionRate = NewDataCompression(9); //9 maximum PropsStorageType = New StorageValues(New BinaryData("c:\reports\report.epf", Miera kompresie));

Koniec procedúry

Postup StartProcessingFromStorage(PropsStorageType)

TemporaryFileName = TemporaryFileDirectory()+"report.epf"; BinaryData = PropsStorageType.Get(); BinaryData.Write(TemporaryFileName); ExternalProcessing = ExternalProcessing.Create(TemporaryFileName); ExternalProcessing.GetForm().Open();

Koniec procedúry

Práca s úložiskom

Ak to boli binárne údaje, potom ich možno obnoviť z úložiska hodnôt pomocou metódy Get a zapísať do súboru pomocou metódy Write().

Ak TypeValue(Storage)<>Zadajte ("BinaryData") Potom

BinaryData = Storage.Get();

BinaryData = Úložisko;

koniec Ak; BinaryData.Write(Názov súboru);

Ak to bol napríklad dokument programu Word (súbor doc alebo iný registrovaný typ súboru), možno ho otvoriť takto:

LaunchApplication(FileName);

Ak chcete vymazať pole typu Ukladanie hodnôt, musíte mu priradiť Nedefinované:

PropsStorage = Nedefinované;

Práca so súbormi a obrázkami vo vstavanom jazyku 1C:Enterprise 8

Účel

Spravovaná aplikácia implementuje nový mechanizmus pre prácu so súbormi. Poskytuje výmenu súborov medzi infobázou a klientskou aplikáciou. Zvláštnosťou tohto mechanizmu je, že je navrhnutý na použitie v tenkom klientovi a webovom klientovi a je navrhnutý s ohľadom na obmedzenia práce so súbormi uložené webovými prehliadačmi.

Mechanizmus je súbor metód, ktoré možno použiť na umiestnenie údajov uložených lokálne na počítači používateľa do dočasného úložiska informačnej základne, prenos týchto informácií z dočasného úložiska do databázy a ich príjem späť do počítača používateľa. Najčastejšími aplikačnými problémami riešenými týmto mechanizmom je ukladanie sprievodných informácií, napríklad obrázkov tovaru, dokumentov súvisiacich so zmluvami atď.

Rozsah metódy

Dočasné uloženie

Dočasné úložisko je špecializovaná oblasť informačnej základne, do ktorej možno umiestniť binárne údaje. Hlavným účelom je dočasné uloženie informácií počas interakcie klient-server pred ich prenosom do databázy.

Potreba dočasného úložiska vzniká, pretože prevádzkový model webového prehliadača vyžaduje, aby užívateľom vybraný súbor bol prenesený priamo na server bez možnosti jeho uloženia na klientovi. Keď sa súbor prenesie, uloží sa do dočasného úložiska a potom sa dá použiť pri zápise objektu do databázy.

Najtypickejšou aplikačnou úlohou riešenou dočasným úložiskom je poskytovanie prístupu k súborom alebo obrázkom predtým, ako je objekt zaznamenaný v informačnej databáze, napríklad vo forme prvku.

Súbor alebo binárne dáta umiestnené v úložisku sú identifikované jedinečnou adresou, ktorú možno neskôr použiť pri operáciách zápisu, čítania alebo vymazania. Táto adresa je daná metódami zápisu súboru do dočasného úložiska. Samostatná metóda v zabudovanom jazyku vám umožňuje určiť, či odovzdaná adresa je adresou smerujúcou na údaje v dočasnom úložisku.

Informačná základňa

Mechanizmus umožňuje prístup k binárnym údajom uloženým v atribútoch typu Value Storage.

Rovnako ako v prípade dočasného uloženia je prístup k informáciám možný prostredníctvom špeciálnej adresy. Môžete ho získať špeciálnou metódou odovzdaním odkazu na objekt alebo kľúča vstupu do registra informácií a názvu atribútu. V prípade tabuľkovej časti je navyše potrebné preniesť index riadku tabuľkovej časti.

Metódy práce so súbormi majú obmedzenia pri práci s podrobnosťami infobáze. Pre nich je na rozdiel od dočasného úložiska k dispozícii iba čítanie informácií, ale nie ich zapisovanie ani mazanie.

Popis metód práce so súbormi

Ukladanie údajov do dočasného úložiska

Najtypickejší scenár použitia tohto mechanizmu zahŕňa počiatočné umiestnenie používateľských údajov do dočasného úložiska. Existujú na to dve metódy: PlaceFile() a PlaceFileInTemporaryStorage().

Prvá metóda, PlaceFile(), umiestni súbor z lokálneho súborového systému do dočasného úložiska. Metóda môže prijať cieľovú adresu v úložisku. Ak nie je definovaný alebo je prázdny, vytvorí sa nový súbor a metóda vráti svoju adresu cez príslušný parameter.

Ak je parameter, ktorý určuje interaktívny režim prevádzky, True, potom metóda zobrazí štandardné dialógové okno výberu súboru, v ktorom môžete vybrať súbor, ktorý chcete uložiť. V tomto prípade metóda vráti aj adresu zvoleného súboru.

Výsledkom je, že metóda vráti hodnotu False, ak používateľ interaktívne odmietol vykonať operáciu v dialógovom okne výberu súboru. Metóda je dostupná len u klienta.

Druhá metóda, PlaceFileInTemporaryStorage(), je podobná predchádzajúcej, s tým rozdielom, že je dostupná na serveri a údaje, ktoré sa majú zapísať do dočasného úložiska, nie sú reprezentované ako cesta v súborovom systéme, ale ako premenná typu Binárne údaje. Podobne, ak nie je zadaná žiadna cieľová adresa, v úložisku sa vytvorí nový súbor. Jeho adresa sa vráti ako výsledok funkcie.

Načítanie súboru z dočasného úložiska

Pri zápise objektu do informačnej databázy možno budete musieť extrahovať údaje z dočasného úložiska a umiestniť ich napríklad do atribútu. Na to existuje zodpovedajúca serverová metóda - GetFileFromTemporaryStorage(). Táto metóda získava údaje z dočasného úložiska a v dôsledku toho ich vracia. Ak to chcete urobiť, musíte zadať adresu v dočasnom úložisku. Táto adresa je vrátená vyššie popísanými metódami PlaceFile() a PlaceFileInTemporaryStorage(), ak sú úspešne spustené.

Odstránenie súboru z dočasného úložiska

Po uložení údajov do podrobností je možné súbor v dočasnom úložisku vymazať. Na tento účel existuje metóda DeleteFileFromTemporaryStorage(), ktorá vymaže súbor z dočasného úložiska. Metóda berie ako parameter adresu súboru v dočasnom úložisku. Dostupné na serveri.

Kontrola adresy pre dočasné uloženie

Adresa súboru môže označovať dočasné úložisko aj podrobnosti v informačnej databáze. Na kontrolu jeho typu existuje metóda This isTemporaryStorageAddress().

Skontroluje, či odovzdaná adresa je adresou smerujúcou do obchodu. Ak adresa ukazuje na dočasné úložisko, vráti hodnotu True. Metóda je dostupná na serveri.

Prijímanie adresy rekvizít

Po umiestnení údajov do podrobností v informačnej databáze k nim možno budete musieť pristupovať pomocou súborových metód.

Ale predtým, ako dostanete údaje, napríklad z nehnuteľnosti, musíte získať adresu tejto nehnuteľnosti. Na tento účel existuje metóda GetFileAddressInInformationBase().

Jeho účelom je vrátiť adresu súboru v infobáze podľa pôvodných parametrov. Ak to chcete urobiť, musíte odovzdať kľúč objektu (môže to byť buď odkaz na objekt alebo kľúč vstupu do registra informácií) a názov atribútu. Ak potrebujete získať adresu súboru uloženého v atribúte tabuľkovej časti, pred názov atribútu v parametri určujúcom názov atribútu musíte pridať názov tabuľkovej časti a bodku „.“. Metóda je dostupná na klientovi aj na serveri.

Načítanie súboru z informačnej databázy

Metóda GetFile() prijme súbor z informačnej databázy a uloží ho do lokálneho systému súborov používateľa. Prvý parameter určuje adresu súboru v rekvizitách alebo dočasnom úložisku súborov. Druhý parameter určuje cieľové umiestnenie výsledného súboru. V neinteraktívnom režime musíte zadať cestu. V interaktívnom režime je parameter voliteľný.

Štandardne sa metóda vykonáva v interaktívnom režime, to znamená, že posledný parameter je True. To znamená, že sa zobrazí dialógové okno, v ktorom môžete určiť akciu s prijatým súborom: spustiť ho alebo uložiť na miesto určené používateľom. Ak je aktívny interaktívny režim a nie je zadaný parameter Cesta k súboru cieľového disku, operácia otvorenia súboru nie je dostupná. Vráti boolovskú hodnotu. False znamená, že používateľ sa rozhodol zrušiť operáciu v dialógovom okne interaktívneho uloženia súboru.

Príklad použitia súborových metód

// Príjem súboru z disku v interaktívnom režime // a jeho umiestnenie do dočasného úložiska &Na klientskej procedúre SelectDiskFileAndWrite()

Premenná SelectedName; VariableTemporaryStorageAddress; If PutFile(TemporaryStorageAddress, SelectedName, True) Then Object.FileName = SelectedName; PlaceObjectFile(TemporaryStorageAddress); koniec Ak;

Koniec procedúry

// Kopírovanie súboru z dočasného úložiska do adresára // atribút, zaznamenanie objektu, vymazanie súboru z dočasného // úložiska &Na server Postup Umiestniť súbor objektu (adresa dočasného úložiska)

Element adresára = Form AttributesValue("Object"); BinaryData = GetFileFromTemporaryStorage(TemporaryStorageAddress); Element Directory.File Data = NewValueStorage(BinaryData); FilePathOnDisk = Nový súbor(DirectoryItem.FileName); Adresár Item.FileName = FilePathOnDisk.Name; Element adresára.Write(); Upravené = False; DeleteFileFromTemporaryStorage(TemporaryStorageAddress); ValueВFormAttributes(prvok adresára, "Objekt");

Koniec procedúry

// Čítanie súboru z rekvizít a jeho uloženie // na lokálny disk v interaktívnom režime &Na klientskej procedúre ReadFileAndSaveToDisk()

Adresa = GetFileAddressInInformationBase(Object.Link, "FileData"); GetFile(Address, Object.FileName, True);

Koniec procedúry

Podpora adries v poli obrázka

Ovládací prvok Pole obrázkov podporuje zobrazenie obrázka určeného adresou súboru v dočasnom úložisku alebo v databáze.

Ak to chcete urobiť, musíte nastaviť atribút typu reťazca vo vlastnosti Data prvku formulára. Hodnota tohto atribútu bude interpretovaná ako adresa obrázka.

Príklad // Väzba poľa obrázka s adresou obrázka v dočasnom // úložisku. AddressPictures tvoria podrobnosti o type reťazca

PlaceFile(PictureAddress,True)

Picture.Data = AddressPictures

Obmedzenia pri práci s webovým klientom

Prevádzka opísaného mechanizmu pri používaní webového klienta má určité obmedzenia. Tieto obmedzenia súvisia s bezpečnostným modelom prehliadača. Klient teda napríklad nemôže samostatne uložiť súbor do lokálneho súborového systému, to znamená, že je k dispozícii iba interaktívna verzia klientskych metód PlaceFile() a GetFile(). Pri pokuse o použitie neinteraktívneho režimu sa vyvolá výnimka. Dialógové okná, ktoré sa zobrazujú interaktívne, sú špecifické pre váš typ prehliadača.

Funkcie pri práci s Value Storage na klientovi

problém:

Ak má dokument v tabuľkovej časti atribút typu Uloženie hodnoty, spomalí to otváranie formulára dokumentu, ak tento atribút obsahuje veľké množstvo údajov.

Predpokladaný dôvod:

Možno, že pri otváraní formulára sa klientovi neodošle odkaz na údaje nachádzajúce sa v obchode hodnôt, ale samotné údaje.

Riešenie

  • Vo vlastnostiach atribútu tabuľky formulára je príznak "Vždy použiť". Ak je nastavené, obsah poľa sa vždy prenáša medzi serverom a klientom – napríklad pri otváraní formulára. Tento príznak musí byť zakázaný, ale musí sa to zohľadniť v kóde, pretože v predvolenom nastavení nebude mať toto pole na klientovi žiadnu hodnotu. Príklad nájdete v 1C:Archive.

Ešte lepšie je použiť dočasné uskladnenie na prenos súborov medzi klientom a serverom.

Máme adresár „Produkty“, v atribúte „Údaje“, ktorého informácie sú uložené vo forme binárnych údajov. Samotný atribút má typ hodnoty „Uloženie hodnoty“. Nasledujúca snímka obrazovky zobrazuje štruktúru metadát adresára.

Na pripojenie ľubovoľného súboru z disku vo forme prvku bol implementovaný príkaz "AttachFile". Jeho programový kód je uvedený v nasledujúcom zozname:

& Na klientskej procedúre AttachFile(Command) // Ovládač príkazov na klientovi. Výber súboru // Dialógové okno pre výber súboru z disku Režim = FileSelectionDialogMode. Otváranie; OpenFileDialog = NewFileSelectDialog(Mode); Dialógové okno OpenFile. FullFileName = " " ; Dialógové okno OpenFile. MultipleSelect = False ; Dialógové okno OpenFile. Title = "Vybrať súbory"; Ak FileOpenDialog. Select() Potom FilePath = FileOpenDialog. FullFileName; // Príjem binárnych údajov súboru BinaryData = new BinaryData(PathToFile) ; // Prenos binárnych údajov na server AttachFileServer(BinaryData) ; V opačnom prípade Text = "ru = " " Súbor (s) nevybraté!" " ; sk =" " Súbor (s) nevybraté!" " " ; Upozornenie(NStr(Text) ); EndIf ; EndProcedure & OnServer Procedure AttachFileServer(BinaryData) // Handler na serveri pre záznam súboru v informačnej bezpečnosti // Transformácia objektu formulára na referenčný objekt ObjectCurrent = FormAttributesValue("Object" ) ; // Priraďte novú hodnotu atribútu "Data". ObjectCurrent. Dáta = NewValueStorage(BinaryData) ; // Uložiť zmeny ObjectCurrent. Napíšte() ; Koniec procedúry

Ak popíšeme algoritmus všeobecne, potom sa najprv vyberie súbor z disku na klientovi. Výsledné dáta binárneho súboru sú odoslané na server, kde sú zaznamenané v informačnej databáze, a to v atribúte „Data“ aktuálneho prvku adresára.

V princípe všetko funguje. Pri otváraní prvku môžeme tieto údaje čítať podľa potreby. Ak je napríklad obrázok uložený v rekvizitách, môžeme ho získať a zobraziť v poli formulára. Toto riešenie má svoje miesto, ale vo väčšine úloh nie je optimálne používať atribúty s typom hodnoty „Value Storage“ v adresároch a dokumentoch. A preto...

Vplyv na výkon

Urobme niekoľko výkonnostných testov. Testy budú používať dva prvky adresára "Produkty" s pripojeným súborom a bez neho. Veľkosť priloženého súboru je 5 megabajtov.

Všetky testy sa vykonávajú pomocou spracovania "GetElement" v konfigurácii testu. Túto konfiguráciu si môžete stiahnuť z odkazu na konci článku.

Poďme zmerať čas potrebný na otvorenie položiek v adresári „Produkty“. Na otvorenie prvku sa používa metóda globálneho kontextu „OpenValue()“, ktorej sa odovzdá odkaz na prvok ako parameter. Zmerajte čas otvorenia pomocou štandardného nástroja na meranie výkonu. Výsledky sú uvedené na nasledujúcej snímke obrazovky:

Ako vidíme, čas potrebný na otvorenie prvku s pripojeným súborom je 10-krát dlhší! Urobme ďalší test. Spustite metódu "GetObject()" na odkaz na prvok katalógu produktov. Výsledok testu môžete vidieť na nasledujúcej snímke obrazovky.

Rozdiel je dosť výrazný. Príjem prvku bez pripojeného súboru je 194-krát rýchlejší!

Stáva sa to preto, že metóda „GetObject()“ prijíma všetky údaje z podrobností prvku adresára pomocou odkazu. Metóda teda dostáva hodnoty nielen atribútov „Kód“ a „Názov“, ale aj hodnoty atribútu „Údaje“. Ak uchováva binárne dáta s veľkosťou 5 megabajtov (ako v našom príklade), potom sa pri prijatí objektu tieto dáta umiestnia do RAM (ako iné detaily) a následne sa prenesú na stranu klienta. Práve príjem dát z tohto atribútu zvyšuje čas na získanie objektu prvku. Ak sa použije tenký komunikačný kanál, čas otvorenia sa ešte výraznejšie zvýši v dôsledku prenosu veľkého množstva informácií cez sieť.

Poznámka: Pri vykonávaní metódy "OpenValue()" sa najprv získa aj objekt prvku adresára a potom sa transformuje na objekt formulára a odovzdá sa klientovi (pre spravované formuláre). To znamená, že keď sa prvok otvorí odkazom, načíta sa aj objekt.

Vykonajte záverečný test času potrebného na otvorenie a zápis položky adresára s priloženým súborom a bez neho. Výsledok je zobrazený na nasledujúcej snímke obrazovky.

Prirodzený výsledok. Čas prijatia a následného zápisu pre položku adresára s pripojeným súborom sa ukázal byť ~19-krát dlhší. Ako je uvedené vyššie, pri prijímaní objektu sa získajú hodnoty všetkých jeho podrobností vrátane atribútu „Data“, v ktorom je uložených 5 megabajtov informácií. Keď je prvok zapísaný, toto množstvo údajov sa znova zapíše do informačnej databázy. V dôsledku toho ukladanie údajov do atribútu adresára (alebo dokumentu) s typom „Uloženie hodnoty“ negatívne ovplyvňuje výkon pri získavaní objektu aj pri jeho umiestnení do informačnej databázy.

Aký je najsprávnejší spôsob riešenia problému ukladania údajov pre objekty informačnej bázy?

Správne riešenie

Ak sa pozrieme na implementáciu tohto mechanizmu v typických konfiguráciách, uvidíme, že pre objekty sú dodatočné informácie uložené v samostatnej tabuľke registra informácií. Takto napríklad vyzerá mechanizmus súboru s prílohou v štandardnej konfigurácii „Trade Management“ verzie 11.

Adresár "Nomenclature" je vlastníkom adresára "NomenclatureAttachedFiles". To je zase spojené s informačným registrom AttachedFiles, ktorého dimenzia AttachedFile odkazuje na jeho prvok. Dáta pripojené k objektom informačnej bázy sú teda v skutočnosti uložené v tabuľke informačného registra, ktorej činnosť prakticky nie je ovplyvnená množstvom dát uložených v zdroji. Sprostredkujúci adresár „Nomenklatúra pripojených súborov“ je potrebný na uloženie dodatočných informácií pre pripojený súbor, ako aj na podporu prístupu k priloženému súboru pomocou odkazu.

Všetky vyššie uvedené opäť potvrdzujú enormný vplyv na výkon správne navrhnutej štruktúry metadát konfigurácie.

Otestujte konfiguráciu s príkladom z článku: LINK .

Platforma 1C: Enterprise poskytuje množstvo možností na ukladanie dát rôzneho typu.

Tieto príležitosti však často nestačia. A potom nám príde na pomoc špeciálny predmet - StorageValues. Tento objekt vám umožňuje uložiť v špeciálnom formáte štandardné objekty 1C:Enterprise, napríklad tabuľku hodnôt, ako aj neštandardné objekty, pre ktoré platforma neposkytuje typ. Neštandardné typy môžu zahŕňať súbory. Napríklad pomocou úložiska hodnôt v databáze 1C môžete ukladať fotografie zamestnancov, skeny dokumentov, externé spracovanie atď. Výhodou je, že všetky tieto objekty sú uložené v samotnej databáze. Preto pri nasadzovaní novej databázy zo záložnej kópie budú všetky tieto objekty prítomné aj v novej databáze. Na druhej strane, ak do databázy ukladáte veľké súbory, môže to výrazne zvýšiť jej objem a negatívne ovplyvniť jej výkon. Preto tu treba zachovať rozumnú rovnováhu.

Pozrime sa na prácu s úložiskom hodnoty na príklade. V konfigurátore si vytvoríme špeciálny adresár – nazvime ho ExternéObjekty a následne vytvoríme náležitosti pre adresár Objekt s typom StorageValues

A teraz môžeme vytvárať prvky v tomto adresári a v rekvizitách Objekt Každý prvok je zapísaný do súboru.

Práca s cenným skladom je veľmi jednoduchá. Ak sa pozrieme na pomocníka syntaxe, uvidíme, že tento objekt má len jednu metódu a jeden konštruktor.

Teraz, pre demonštráciu, napíšme najjednoduchší kód, ktorý zapíše súbor do rekvizít Objekt predtým vytvorený prvok adresára a potom si prečítajte tento súbor z rekvizít a zapíšte ho na disk, ale pod iným názvom.

&Na serveri Procedúra LoadUnloadFile(prvok adresára)Objekt adresára =prvok adresára. GetObject() ; //Umiestnite obrázok do úložiska hodnôt LabelDownload = Nový obrázok("g:\musor\favicon.ico" ) NewValueStorage; //Napíšte prvok adresára Objekt adresára. Objekt DirectoryObject. Napíšte() ; //Odovzdajte obrázok z úložiska hodnôt do súboru Názov súboru = "g:\musor\favicon_1.ico" ; LabelUpload = Objekt adresára. Objekt. Get() ; LabelUpload. Write(FileName) ; Koniec procedúry

A pár vysvetlení ku kódu.

  • Objekt je umiestnený do obchodu priamo pri vytváraní obchodu pomocou konštruktora.

Na ukladanie iných typov súborov iných ako obrázky v úložisku môžete použiť objekt Binárne údaje. Čisto teoreticky môžete do úložiska hodnôt ukladať aj prvky adresára, dokumenty atď. Ale v praxi to nedáva zmysel. Niekedy je však možné použiť úložisko hodnôt na uloženie tabuľky hodnôt, stromu hodnôt a iných univerzálnych zbierok.