Příjem dat z úložiště hodnoty 1s 8.3. Omezení při práci s webovým klientem

V úložišti hodnot lze uložit téměř jakoukoli informaci, např.

... obrázky (fotky):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Enumerations.Types dalších informací o Objects.Image; Storage = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// na tomto místě zobrazí vše... Form Elements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...tabulkový dokument:

TabDoc=Nový tabulkový dokument; TabDoc.Output(FormElements.TabularDocumentField1); Storage=NewValueStorage(TabDoc); Napsat();

Konec procedury

Postup RestoreFromStoragePress (prvek)

TabDoc=Storage.Get(); Pokud TabDoc<>Nedefinováno ThenFormElements.TabularDocumentField1.Output(TabDoc); endIf;

Konec procedury

...libovolné soubory (binární data):

XZ = NewValueStorage(NewBinaryData(soubor));

Osmička podporuje kompresi dat umístěných v úložišti:

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

... externí zpracování a reportování:

Postup LoadProcessingIntoStorage(PropsStorageType)

CompressionRate = NewDataCompression(9); //9 maximum PropsStorageType = New StorageValues(New BinaryData("c:\reports\report.epf", Kompresní poměr));

Konec procedury

Postup StartProcessingFromStorage(PropsStorageType)

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

Konec procedury

Práce s úložištěm

Pokud se jednalo o binární data, lze je obnovit z úložiště hodnot pomocí metody Get a zapsat do souboru pomocí metody Write().

Pokud TypeValue(Storage)<>Zadejte("BinaryData") Potom

BinaryData = Storage.Get();

BinaryData = úložiště;

endIf; BinaryData.Write(NázevSouboru);

Pokud to byl například dokument aplikace Word (soubor doc nebo jiný registrovaný typ souboru), lze jej otevřít takto:

LaunchApplication(FileName);

Chcete-li vymazat pole typu Úložiště hodnoty, musíte mu přiřadit Nedefinováno:

PropsStorage = Nedefinováno;

Práce se soubory a obrázky ve vestavěném jazyce 1C:Enterprise 8

Účel

Spravovaná aplikace implementuje nový mechanismus pro práci se soubory. Poskytuje výměnu souborů mezi infobází a klientskou aplikací. Zvláštností tohoto mechanismu je, že je navržen pro použití v tenkém klientovi a webovém klientovi a je navržen s ohledem na omezení práce se soubory uložená webovými prohlížeči.

Mechanismus je soubor metod, pomocí kterých lze umístit data uložená lokálně na počítači uživatele do dočasného úložiště informační báze, přenést tyto informace z dočasného úložiště do databáze a přijmout je zpět do počítače uživatele. Nejčastějšími aplikačními problémy řešenými tímto mechanismem je ukládání doprovodných informací, například obrázků zboží, dokumentů souvisejících se smlouvami atd.

Metoda Rozsah

Dočasné úložiště

Dočasné úložiště je specializovaná oblast informační základny, do které lze umístit binární data. Hlavním účelem je dočasné uložení informací během interakce klient-server před jejich přenesením do databáze.

Potřeba dočasného úložiště vyvstává, protože operační model webového prohlížeče vyžaduje, aby uživatelem vybraný soubor byl přenesen přímo na server bez možnosti jeho uložení na klientovi. Když je soubor přenesen, je umístěn do dočasného úložiště a lze jej pak použít při zápisu objektu do databáze.

Nejtypičtějším aplikačním úkolem řešeným dočasným úložištěm je poskytování přístupu k souborům nebo obrázkům předtím, než je objekt zaznamenán v informační databázi, například ve formě prvku.

Soubor nebo binární data umístěná v úložišti jsou identifikována jedinečnou adresou, kterou lze později použít při operacích zápisu, čtení nebo mazání. Tato adresa je dána metodami pro zápis souboru do dočasného úložiště. Samostatná metoda ve vestavěném jazyce umožňuje určit, zda je předaná adresa adresou ukazující na data v dočasném úložišti.

Informační základna

Mechanismus umožňuje přístup k binárním datům uloženým v atributech typu Value Storage.

Stejně jako v případě dočasného úložiště je přístup k informacím možný prostřednictvím speciální adresy. Můžete jej získat speciální metodou předáním odkazu na objekt nebo vstupního klíče informačního registru a názvu atributu. V případě tabulkové části je navíc nutné přenést index řádku tabulkové části.

Metody pro práci se soubory mají omezení při práci s detaily infobáze. Pro ně je na rozdíl od dočasného úložiště dostupné pouze čtení informací, nikoli však jejich zápis nebo mazání.

Popis metod práce se soubory

Ukládání dat do dočasného úložiště

Nejtypičtější scénář pro použití tohoto mechanismu zahrnuje počáteční umístění uživatelských dat do dočasného úložiště. Existují dvě metody: PlaceFile() a PlaceFileInTemporaryStorage().

První metoda, PlaceFile(), umístí soubor z místního souborového systému do dočasného úložiště. Metoda může přijmout cílovou adresu v úložišti. Pokud není definován nebo je prázdný, vytvoří se nový soubor a metoda vrátí svou adresu přes odpovídající parametr.

Pokud je parametr, který určuje interaktivní režim provozu, True, pak metoda zobrazí standardní dialogové okno pro výběr souboru, ve kterém můžete vybrat soubor, který chcete uložit do úložiště. V tomto případě metoda také vrátí adresu vybraného souboru.

Výsledkem je, že metoda vrátí hodnotu False, pokud uživatel interaktivně odmítl provést operaci v dialogovém okně pro výběr souboru. Metoda je dostupná pouze u klienta.

Druhá metoda, PlaceFileInTemporaryStorage(), je podobná předchozí, s tím rozdílem, že je dostupná na serveru a data, která mají být zapsána do dočasného úložiště, nejsou reprezentována jako cesta v systému souborů, ale jako proměnná typu Binární data. Podobně, pokud není zadána žádná cílová adresa, vytvoří se v úložišti nový soubor. Jeho adresa je vrácena jako výsledek funkce.

Načtení souboru z dočasného úložiště

Při zápisu objektu do infobáze možná budete muset extrahovat data z dočasného úložiště a umístit je například do atributu. K tomu existuje odpovídající serverová metoda - GetFileFromTemporaryStorage(). Tato metoda načítá data z dočasného úložiště a jako výsledek je vrací. Chcete-li to provést, musíte zadat adresu v dočasném úložišti. Tato adresa je vrácena výše popsanými metodami PlaceFile() a PlaceFileInTemporaryStorage(), pokud jsou úspěšně provedeny.

Odstranění souboru z dočasného úložiště

Po uložení dat do podrobností lze soubor v dočasném úložišti smazat. Pro tento účel existuje metoda DeleteFileFromTemporaryStorage(), která smaže soubor z dočasného úložiště. Metoda bere jako parametr adresu souboru v dočasném úložišti. Dostupné na serveru.

Kontrola adresy pro dočasné uložení

Adresa souboru může označovat dočasné úložiště i podrobnosti v informační databázi. Pro kontrolu jeho typu existuje metoda This isTemporaryStorageAddress().

Zkontroluje, že předaná adresa je adresa směřující do obchodu. Vrátí hodnotu True, pokud adresa ukazuje na dočasné úložiště. Metoda je dostupná na serveru.

Příjem adresy rekvizit

Poté, co jsou data umístěna do podrobností v infobázi, možná k nim budete muset přistupovat pomocí souborových metod.

Než ale obdržíte data, například z nemovitosti, musíte získat adresu této nemovitosti. Pro tento účel existuje metoda GetFileAddressInInformationBase().

Jeho účelem je vrátit adresu souboru v infobázi podle původních parametrů. Chcete-li to provést, musíte předat klíč objektu (může to být buď odkaz na objekt nebo klíč položky registru informací) a název atributu. Pokud potřebujete získat adresu souboru uloženého v atributu tabulkové části, musíte před název atributu v parametru určujícím název atributu přidat název tabulkové části a tečku „.“. Metoda je dostupná jak na klientovi, tak na serveru.

Načtení souboru z infobáze

Metoda GetFile() přijme soubor z infobáze a uloží jej do lokálního systému souborů uživatele. První parametr určuje adresu souboru v rekvizitách nebo dočasném úložišti souborů. Druhý parametr určuje cílové umístění výsledného souboru. V neinteraktivním režimu musíte zadat cestu. V interaktivním režimu je parametr nepovinný.

Ve výchozím nastavení se metoda provádí v interaktivním režimu, to znamená, že poslední parametr je True. To znamená, že se zobrazí dialogové okno, ve kterém můžete určit akci s přijatým souborem: spustit jej nebo uložit do uživatelem zadaného umístění. Pokud je aktivní interaktivní režim a není zadán parametr Cesta k souboru cílového disku, operace otevření souboru není dostupná. Vrátí booleovskou hodnotu. False znamená, že uživatel zvolil zrušení operace v dialogovém okně interaktivního uložení souboru.

Příklad použití souborových metod

// Příjem souboru z disku v interaktivním režimu // a jeho umístění do dočasného úložiště &Na klientské procedurě SelectDiskFileAndWrite()

Proměnná SelectedName; VariableTemporaryStorageAddress; If PutFile(TemporaryStorageAddress, SelectedName, True) Then Object.FileName = SelectedName; PlaceObjectFile(TemporaryStorageAddress); endIf;

Konec procedury

// Kopírování souboru z dočasného úložiště do adresáře // atribut, záznam objektu, smazání souboru z dočasného // úložiště &Na serveru Postup Umístění souboru objektu (adresa dočasného úložiště)

Element adresáře = Form AttributesValue("Object"); BinaryData = GetFileFromTemporaryStorage(TemporaryStorageAddress); Data adresáře Element.File = NewValueStorage(BinaryData); FilePathOnDisk = Nový soubor(DirectoryItem.FileName); Adresář Item.FileName = FilePathOnDisk.Name; Element adresáře.Write(); Upraveno = False; DeleteFileFromTemporaryStorage(TemporaryStorageAddress); ValueВFormAttributes(prvek adresáře, "Objekt");

Konec procedury

// Načtení souboru z rekvizit a jeho uložení // na místní disk v interaktivním režimu &Na klientské procedurě ReadFileAndSaveToDisk()

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

Konec procedury

Podpora adres v poli obrázku

Ovládací prvek Picture Field podporuje zobrazení obrázku určeného adresou souboru v dočasném úložišti nebo v databázi.

Chcete-li to provést, musíte nastavit atribut typu řetězce ve vlastnosti Data prvku formuláře. Hodnota tohoto atributu bude interpretována jako adresa obrázku.

Příklad // Vazba pole obrázku s adresou obrázku v dočasném // úložišti. AddressPictures tvoří podrobnosti typu řetězce

PlaceFile(PictureAddress,True)

Picture.Data = AddressPictures

Omezení při práci s webovým klientem

Činnost popsaného mechanismu při použití webového klienta má určitá omezení. Tato omezení souvisejí s modelem zabezpečení prohlížeče. Klient tedy například nemůže samostatně uložit soubor do lokálního souborového systému, to znamená, že je k dispozici pouze interaktivní verze klientských metod PlaceFile() a GetFile(). Při pokusu o použití neinteraktivního režimu je vyvolána výjimka. Dialogová okna, která se zobrazují interaktivně, jsou specifická pro váš typ prohlížeče.

Funkce při práci s Value Storage na klientovi

Problém:

Pokud má dokument v tabulkové části atribut typu Úložiště hodnoty, zpomaluje otevírání formuláře dokumentu, pokud tento atribut obsahuje velká data.

Předpokládaný důvod:

Možná, že při otevírání formuláře se klientovi neodešle odkaz na data umístěná ve Value Store, ale data samotná.

Řešení

  • Ve vlastnostech atributu tabulky formuláře je příznak "Vždy použít". Pokud je nastaveno, obsah pole se vždy přenáší mezi serverem a klientem – např. při otevírání formuláře. Tento příznak musí být deaktivován, ale musí to být zohledněno v kódu, protože ve výchozím nastavení nebude mít toto pole na klientovi žádnou hodnotu. Příklad lze nalézt v 1C:Archive.

Ještě lepší je použít dočasné úložiště pro přenos souborů mezi klientem a serverem.

Máme adresář „Produkty“, v atributu „Data“, jehož informace jsou uloženy ve formě binárních dat. Samotný atribut má typ hodnoty "Uložení hodnoty". Následující snímek obrazovky ukazuje strukturu metadat adresáře.

Pro připojení libovolného souboru z disku ve formě prvku byl implementován příkaz "AttachFile". Jeho programový kód je uveden v následujícím seznamu:

& Na proceduru klienta AttachFile(Command) // Ovladač příkazů na klientovi. Výběr souboru // Dialog pro výběr souboru z disku Mode = FileSelectionDialogMode. Otevírací; OpenFileDialog = NewFileSelectDialog(Mode); Dialogové okno OpenFile. FullFileName = " " ; Dialogové okno OpenFile. MultipleSelect = False ; Dialogové okno OpenFile. Title = "Vybrat soubory" ; Pokud FileOpenDialog. Select() Then FilePath = FileOpenDialog. FullFileName; // Příjem binárních dat souboru BinaryData = new BinaryData(PathToFile) ; // Přenos binárních dat na server AttachFileServer(BinaryData) ; Jinak Text = "ru = " " Soubor (s) není vybráno!" " ; en =" " Soubor (s) není vybráno!" " " ; Warning(NStr(Text) ); EndIf ; EndProcedure & OnServer Procedure AttachFileServer(BinaryData) // Handler na serveru pro záznam souboru v zabezpečení informací // Transformace objektu formuláře na referenční objekt ObjectCurrent = FormAttributesValue("Object" ) ; // Přiřaďte novou hodnotu atributu "Data". ObjectCurrent. Data = NewValueStorage(BinaryData) ; // Uložit změny ObjectCurrent. Napsat() ; Konec procedury

Pokud popíšeme algoritmus obecně, pak se nejprve vybere soubor z disku na klientovi. Výsledná data binárního souboru jsou odeslána na server, kde jsou zaznamenána v informační databázi, a to v atributu „Data“ prvku aktuálního adresáře.

V principu vše funguje. Při otevírání prvku můžeme tato data číst podle potřeby. Pokud je například v atributu uložen obrázek, můžeme jej získat a zobrazit v poli formuláře. Toto řešení má své místo, ale ve většině úloh není optimální používat v adresářích a dokumentech atributy s typem hodnoty „Value Storage“. A proto...

Dopad na výkon

Pojďme provést nějaké testy výkonu. Testy budou používat dva prvky adresáře "Products" s připojeným souborem a bez něj. Velikost přiloženého souboru je 5 MB.

Všechny testy se provádějí pomocí zpracování "GetElement" v konfiguraci testu. Tuto konfiguraci si můžete stáhnout z odkazu na konci článku.

Změřme čas, který trvá otevření položek v adresáři „Produkty“. K otevření prvku se používá metoda globálního kontextu "OpenValue()", které je předán odkaz na prvek jako parametr. Změřme otevírací dobu pomocí standardního nástroje pro měření výkonu. Výsledky jsou uvedeny na následujícím snímku obrazovky:

Jak vidíme, čas potřebný k otevření prvku s připojeným souborem je 10krát delší! Udělejme další test. Proveďme metodu "GetObject()" pro odkaz na prvek katalogu produktů. Výsledek testu můžete vidět na následujícím snímku obrazovky.

Rozdíl je poměrně výrazný. Příjem prvku bez připojeného souboru je 194krát rychlejší!

K tomu dochází, protože metoda „GetObject()“ přijímá všechna data z podrobností prvku adresáře odkazem. V souladu s tím metoda přijímá hodnoty nejen atributů „Kód“ a „Název“, ale také hodnotu atributu „Data“. Pokud ukládá binární data o velikosti 5 megabajtů (jako v našem příkladu), pak se při přijetí objektu tato data umístí do RAM (jako další detaily) a poté se přenesou na stranu klienta. Právě příjem dat z tohoto atributu prodlužuje dobu pro získání objektu prvku. Při použití tenkého komunikačního kanálu se otevírací doba ještě výrazněji prodlouží v důsledku přenosu velkého množství informací po síti.

Poznámka: Při provádění metody "OpenValue()" je také nejprve získán objekt prvku adresáře a poté transformován na objekt formuláře a předán klientovi (u spravovaných formulářů). To znamená, že když je prvek otevřen odkazem, objekt je také načten.

Proveďme závěrečný test času potřebného k otevření a zápisu položky adresáře s připojeným souborem a bez něj. Výsledek je zobrazen na následujícím snímku obrazovky.

Přirozený výsledek. Čas přijetí a následného zápisu pro položku adresáře s připojeným souborem se ukázal být ~19krát delší. Jak bylo uvedeno výše, při příjmu objektu se získají hodnoty všech jeho podrobností, včetně atributu „Data“, ve kterém je uloženo 5 megabajtů informací. Když je prvek zapsán, toto množství dat je znovu zapsáno do infobáze. V důsledku toho ukládání dat v atributu adresáře (nebo dokumentu) s typem „Value Storage“ negativně ovlivňuje výkon jak při načítání objektu, tak při jeho umístění do infobáze.

Jaký je nejsprávnější způsob řešení problému ukládání dat pro objekty informační báze?

Správné řešení

Pokud se podíváme na implementaci tohoto mechanismu v typických konfiguracích, uvidíme, že pro objekty jsou další informace uloženy v samostatné tabulce registrů informací. Takto například vypadá mechanismus souborů příloh ve standardní konfiguraci „Správa obchodu“ verze 11.

Adresář "Nomenclature" je vlastníkem adresáře "NomenclatureAttachedFiles". To je zase spojeno s registrem informací AttachedFiles, jehož dimenze AttachedFile odkazuje na jeho prvek. Data připojená k objektům informační báze jsou tedy ve skutečnosti uložena v tabulce informačního registru, jejíž provoz není prakticky ovlivněn množstvím dat uložených ve zdroji. Zprostředkující adresář "Nomenclature of Attached Files" je nezbytný pro uložení dalších informací pro připojený soubor a také pro podporu přístupu k připojenému souboru pomocí odkazu.

Vše výše uvedené opět potvrzuje enormní dopad na výkon správně navržené struktury metadat konfigurace.

Otestujte konfiguraci s příkladem z článku: ODKAZ .

Platforma 1C: Enterprise poskytuje mnoho možností pro ukládání dat různého typu.

Tyto příležitosti ale často nestačí. A pak nám přijde na pomoc speciální předmět - StorageValues. Tento objekt umožňuje ukládat ve speciálním formátu jak standardní objekty 1C:Enterprise, například tabulku hodnot, tak nestandardní objekty, pro které platforma neposkytuje typ. Nestandardní typy mohou zahrnovat soubory. Například pomocí úložiště hodnot v databázi 1C můžete ukládat fotografie zaměstnanců, skeny dokumentů, externí zpracování atd. Výhodou zde je, že všechny tyto objekty jsou uloženy v samotné databázi. Při nasazování nové databáze ze záložní kopie tedy budou všechny tyto objekty také přítomny v nové databázi. Na druhou stranu, pokud do databáze ukládáte velké soubory, může to výrazně zvýšit její objem a negativně ovlivnit její výkon. Proto zde musí být zachována rozumná rovnováha.

Podívejme se na práci s úložištěm hodnoty na příkladu. Vytvořme si v konfigurátoru speciální adresář – nazvěme ho ExterníObjekty, a my zase vytvoříme náležitosti pro adresář Objekt s typem StorageValues

A nyní můžeme vytvářet prvky v tomto adresáři a v rekvizitách Objekt Každý prvek je zapsán do souboru.

Práce s hodnotovým skladem je velmi jednoduchá. Pokud se podíváme na pomocníka syntaxe, uvidíme, že tento objekt má pouze jednu metodu a jeden konstruktor.

Nyní pro demonstraci napíšeme nejjednodušší kód, který zapíše soubor do rekvizit Objekt dříve vytvořený prvek adresáře a poté si tento soubor načtěte z podpěr a zapište jej na disk, ale pod jiným názvem.

&Na serveru Postup LoadUnloadFile(prvek adresáře)Objekt adresáře =prvek adresáře. GetObject() ; //Umístění obrázku do úložiště hodnot LabelDownload = Nový obrázek("g:\musor\favicon.ico" ) NewValueStorage; //Zapište prvek adresáře Objekt adresáře. Objekt DirectoryObject. Napsat() ; //Nahrání obrázku z úložiště hodnot do souboru Název souboru = "g:\musor\favicon_1.ico" ; LabelUpload = Objekt adresáře. Objekt. Dostat() ; LabelUpload. Write(NazevSouboru) ; Konec procedury

A pár vysvětlení ke kódu.

  • Objekt je umístěn do úložiště přímo při vytvoření úložiště pomocí konstruktoru.

Chcete-li do úložiště uložit jiné typy souborů než obrázky, můžete použít objekt Binární data. Čistě teoreticky můžete do úložiště hodnot ukládat i prvky adresáře, dokumenty atd. Ale v praxi to nedává smysl. Někdy je však možné použít úložiště hodnot k uložení tabulky hodnot, stromu hodnot a dalších univerzálních kolekcí.