Adatok fogadása az értéktárból 1s 8.3. Korlátozások a webes klienssel végzett munka során

Értéktárban szinte bármilyen információ tárolható, pl.

... képek (fotók):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Felsorolások. Az objektumok további információinak típusai.Image; Tárhely = NewValueTárolás(ÚjKép, ÚjAdattömörítés()); CurrentImage.Storage = Storage.Get();

// ezen a helyen mindent megjelenít... Form Elements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...táblázati dokumentum:

TabDoc=Új táblázatos dokumentum; TabDoc.Output(FormElements.TabularDocumentField1); Storage=NewValueStorage(TabDoc); Ír();

Az eljárás vége

Eljárás Restore FromStoragePress (Elem)

TabDoc=Storage.Get(); Ha a TabDoc<>Undefined ThenFormElements.TabularDocumentField1.Output(TabDoc); endIf;

Az eljárás vége

...tetszőleges fájlok (bináris adatok):

XZ = ÚjÉrtéktár(ÚjBinárisAdat(fájl));

Nyolc támogatja a tárolóban elhelyezett adatok tömörítését:

XZ = ÚjÉrtéktár(ÚjBinárisAdat(fájl),ÚjAdattömörítés(9));

... külső feldolgozás és jelentéskészítés:

LoadProcessingIntoStorage (PropsStorageType) eljárás

CompressionRate = NewDataCompression(9); //9 maximum PropsStorageType = New StorageValues(New BinaryData("c:\reports\report.epf", tömörítési sebesség));

Az eljárás vége

Eljárás indítási folyamat a tárolóból (PropsStorageType)

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

Az eljárás vége

Munkatárolás

Ha bináris adat volt, akkor az értéktárból a Get metódussal visszaállítható, és a Write() metódussal fájlba írható.

Ha TypeValue (tárhely)<>Type("BinaryData") Ezután

BinaryData = Storage.Get();

BinaryData = Tárhely;

endIf; BinaryData.Write(Fájlnév);

Ha például Word dokumentumról van szó (doc fájl vagy más regisztrált fájltípus), akkor az így nyitható meg:

LaunchApplication(Fájlnév);

Az Értéktár típusú mező törléséhez hozzá kell rendelnie Undefined:

PropsStorage = Undefined;

Fájlokkal és képekkel való munkavégzés az 1C:Enterprise 8 beépített nyelven

Célja

A felügyelt alkalmazás új mechanizmust valósít meg a fájlokkal való munkavégzéshez. Fájlcserét biztosít az infobázis és az ügyfélalkalmazás között. Ennek a mechanizmusnak az a sajátossága, hogy vékony kliensben és webes kliensben való használatra készült, és figyelembe veszi a webböngészők által a fájlokkal való munkavégzésre vonatkozó korlátozásokat.

A mechanizmus olyan módszerek összessége, amelyek segítségével a felhasználó számítógépén helyben tárolt adatokat az információs bázis ideiglenes tárolójába lehet helyezni, ezeket az információkat az ideiglenes tárolóból az adatbázisba átvinni, majd visszakapni a felhasználó számítógépére. Az ezzel a mechanizmussal megoldott leggyakoribb alkalmazási problémák a kísérő információk tárolása, például áruképek, szerződésekkel kapcsolatos dokumentumok stb.

A módszer hatóköre

Átmeneti tároló

Az ideiglenes tárolás az információs bázis egy speciális területe, amelyben bináris adatok helyezhetők el. A fő cél az információk ideiglenes tárolása a kliens-szerver interakció során, mielőtt azok átkerülnének az adatbázisba.

Az ideiglenes tárolásra azért van szükség, mert a webböngésző működési modellje megköveteli, hogy a felhasználó által kiválasztott fájl közvetlenül a szerverre kerüljön, anélkül, hogy a kliensen tárolná. A fájl átvitelekor az ideiglenes tárolóba kerül, majd felhasználható objektumok adatbázisba írásakor.

Az ideiglenes tárolással megoldott legjellemzőbb alkalmazási feladat a fájlokhoz vagy képekhez való hozzáférés biztosítása, mielőtt az objektum az információs bázisba kerülne, például elem formájában.

A tárhelyen elhelyezett fájlt vagy bináris adatot egyedi cím azonosítja, amely később írási, olvasási vagy törlési műveletekhez használható. Ezt a címet a fájl ideiglenes tárolóba írásának módszerei adják meg. A beépített nyelvben egy külön módszer lehetővé teszi annak meghatározását, hogy az átadott cím ideiglenes tárolóban lévő adatokra mutató cím-e.

Információs bázis

A mechanizmus lehetővé teszi a Value Storage típusú attribútumokban tárolt bináris adatok elérését.

Az ideiglenes tároláshoz hasonlóan az információkhoz való hozzáférés egy speciális címen keresztül lehetséges. Ezt speciális módszerrel érheti el, ha átad egy hivatkozást egy objektumra vagy egy információs regiszter beviteli kulcsára, és az attribútum nevét. Táblázatos rész esetén a táblázatos rész sorindexének átvitele is szükséges.

A fájlokkal való munkavégzés módszerei korlátozottak az információs bázis részleteivel való munka során. Számukra az ideiglenes tárolással ellentétben csak az olvasási információ érhető el, de nem írható vagy törölhető.

A fájlokkal való munkavégzés módszereinek leírása

Adatok mentése ideiglenes tárhelyre

A mechanizmus használatának legjellemzőbb forgatókönyve a felhasználói adatok ideiglenes tárolása. Két módszer létezik erre: PlaceFile() és PlaceFileInTemporaryStorage().

Az első módszer, a PlaceFile(), a helyi fájlrendszerből ideiglenes tárolóba helyez egy fájlt. A metódus képes fogadni egy célcímet a tárhelyen. Ha nincs megadva, vagy üres karakterlánc, akkor egy új fájl jön létre, és a metódus a megfelelő paraméteren keresztül visszaadja a címét.

Ha az interaktív üzemmódot meghatározó paraméter True, akkor a metódus egy szabványos fájlkiválasztó párbeszédpanelt jelenít meg, amelyben kiválaszthatja a tárolóba helyezendő fájlt. Ebben az esetben a metódus a kiválasztott fájl címét is visszaadja.

Ennek eredményeként a metódus False értéket ad vissza, ha a felhasználó interaktív módon megtagadta a művelet végrehajtását a fájlkiválasztó párbeszédpanelen. A módszer csak az ügyfélnél érhető el.

A második metódus, a PlaceFileInTemporaryStorage() hasonló az előzőhöz, azzal a különbséggel, hogy elérhető a szerveren, és az ideiglenes tárolóba írandó adatok nem elérési útként jelennek meg a fájlrendszerben, hanem egy típusú változóként. Bináris adatok. Hasonlóképpen, ha nincs megadva célcím, egy új fájl jön létre a tárolóban. A címe a függvény eredményeként kerül visszaadásra.

Fájl lekérése az ideiglenes tárolóból

Amikor objektumot ír az információs bázisba, előfordulhat, hogy adatokat kell kivonnia az ideiglenes tárolóból, és el kell helyeznie azokat például egy attribútumba. Ehhez létezik egy megfelelő kiszolgáló metódus - GetFileFromTemporaryStorage(). Ez a módszer lekéri az adatokat az ideiglenes tárolóból, és ennek eredményeként visszaadja azokat. Ehhez meg kell adnia az ideiglenes tárhely címét. Ezt a címet a fent leírt PlaceFile() és PlaceFileInTemporaryStorage() metódusok adják vissza, ha sikeresen végrehajtásra kerültek.

Fájl törlése az ideiglenes tárolóból

Az adatok Részletekben történő mentése után az ideiglenes tárolóban lévő fájl törölhető. Erre a célra létezik egy DeleteFileFromTemporaryStorage() metódus, amely törli a fájlt az ideiglenes tárolóból. A metódus paraméterként veszi az ideiglenes tárolóban lévő fájl címét. Elérhető a szerveren.

Az ideiglenes tárolás címének ellenőrzése

A fájl címe jelezheti mind az ideiglenes tárolást, mind a részleteket az információs bázisban. A típusának ellenőrzéséhez létezik egy This isTemporaryStorageAddress() metódus.

Ellenőrzi, hogy az átadott cím az áruházra mutató cím-e. Igaz értéket ad vissza, ha a cím ideiglenes tárolóra mutat. A módszer elérhető a szerveren.

A kellékek címének átvétele

Miután az adatokat elhelyezte az információs bázis adatai között, előfordulhat, hogy fájlmódszerekkel kell hozzáférnie.

Mielőtt azonban adatokat kapna, például egy ingatlantól, meg kell szereznie ennek a tulajdonnak a címét. Erre a célra létezik egy GetFileAddressInInformationBase() metódus.

Célja, hogy az eredeti paraméterek szerint visszaadja a fájl címét az infobázisban. Ehhez át kell adni az objektumkulcsot (ez lehet az objektumra mutató hivatkozás vagy az információs regiszter beviteli kulcsa) és az attribútum nevét. Ha egy táblázatos részattribútumban tárolt fájl címét kell lekérni, akkor az attribútum nevét megadó paraméterben az attribútum neve elé, akkor hozzá kell adni a táblázatos rész nevét és egy „.” pontot. A módszer a kliensen és a szerveren is elérhető.

Fájl lekérése az információs bázisból

A GetFile() metódus fogad egy fájlt az információs bázisból, és elmenti a felhasználó helyi fájlrendszerébe. Az első paraméter megadja a fájl címét a kellékekben vagy az ideiglenes fájltárolóban. A második paraméter az eredményül kapott fájl célhelyét adja meg. Nem interaktív módban meg kell adni az elérési utat. Interaktív módban a paraméter nem kötelező.

Alapértelmezés szerint a metódus interaktív módban fut, vagyis az utolsó paraméter True. Ez azt jelenti, hogy megjelenik egy párbeszédpanel, amelyben megadhat egy műveletet a kapott fájllal: futtassa vagy mentse a felhasználó által megadott helyre. Ha az interaktív mód aktív, és a Target disk file path paraméter nincs megadva, akkor a fájlmegnyitási művelet nem érhető el. Logikai értéket ad vissza. A False azt jelenti, hogy a felhasználó úgy döntött, hogy megszakítja a műveletet az interaktív fájlmentési párbeszédpanelen.

Példa a fájlmódszerek használatára

// Fájl fogadása a lemezről interaktív módban // és ideiglenes tárolóba helyezése &Az ügyféleljárásban SelectDiskFileAndWrite()

Változó SelectedName; VariableTemporaryStorageAddress; Ha PutFile(Ideiglenes Tárhelycím, KiválasztottNév, Igaz) Akkor Object.FileName = KiválasztottNév; PlaceObjectFile(TemporaryStorageAddress); endIf;

Az eljárás vége

// Fájl másolása ideiglenes tárolóból könyvtárba // attribútum, objektum rögzítése, fájl törlése az ideiglenes // tárhelyről &A szervereljáráson Helyezze el az objektumfájlt (ideiglenes tárolási cím)

Könyvtárelem = Form AttributesValue("Object"); BinaryData = GetFileFromTemporaryStorage(TemporaryStorageAddress); Directory Element.File Data = NewValueStorage(BinaryData); FilePathOnDisk = Új fájl(DirectoryItem.FileName); Directory Item.FileName = FilePathOnDisk.Name; Könyvtár elem.Write(); Módosítva = False; DeleteFileFromTemporaryStorage(TemporaryStorageAddress); ValueВFormAttributes(Könyvtárelem, "Objektum");

Az eljárás vége

// Fájl beolvasása a kellékekből és mentése // a helyi lemezre interaktív módban &A kliens eljárásban ReadFileAndSaveToDisk()

Cím = GetFileAddressInInformationBase(Object.Link, "FileData"); GetFile(cím, objektum.fájlnév, igaz);

Az eljárás vége

A képmezőben lévő címek támogatása

A Képmező vezérlő támogatja az ideiglenes tárolóban vagy adatbázisban lévő fájl címe által meghatározott kép megjelenítését.

Ehhez be kell állítani egy string típusú attribútumot az űrlapelem Data tulajdonságában. Ennek az attribútumnak az értéke a kép címeként lesz értelmezve.

Példa // A képmező hozzárendelése a kép címéhez az ideiglenes // tárhelyen. Az AddressPictures űrlaprészletek a karakterlánc típusúak

Helyfájl (PictureAddress, True)

Picture.Data = CímKépek

Korlátozások a webes klienssel végzett munka során

A leírt mechanizmus működése a webes kliens használatakor bizonyos korlátokkal rendelkezik. Ezek a korlátozások a böngésző biztonsági modelljéhez kapcsolódnak. Így például a kliens nem tud önállóan elmenteni egy fájlt a helyi fájlrendszerbe, vagyis csak a PlaceFile() és a GetFile() kliens metódusok interaktív változata érhető el. Kivételt jelent, ha nem interaktív módot próbál használni. Az interaktívan megjelenő párbeszédpanelek a böngésző típusától függenek.

Funkciók, amikor a Value Storage szolgáltatással dolgozik az ügyfélen

Probléma:

Ha egy dokumentumnál a táblázatos részben Értéktár típusú attribútum szerepel, lelassítja a dokumentuműrlap megnyitását, ha ez az attribútum nagy adatot tartalmaz.

Feltételezett ok:

Lehetséges, hogy egy űrlap megnyitásakor nem a Value Store-ban található adatokra mutató hivatkozást küldik el a kliensnek, hanem magát az adatot.

Megoldás

  • Az űrlap table attribútumának tulajdonságai között van egy "Mindig használd" jelző. Ha be van állítva, a mező tartalma mindig átvitelre kerül a szerver és a kliens között - például egy űrlap megnyitásakor. Ezt a jelzőt le kell tiltani, de ezt figyelembe kell venni a kódban, mivel a kliensen alapértelmezés szerint ennek a mezőnek nem lesz értéke. Példa található az 1C:Archívumban.

Még jobb használni Átmeneti tároló fájlok átviteléhez a kliens és a szerver között.

Van egy „Termékek” könyvtárunk, amelynek „Adatok” attribútuma bináris adatok formájában tárolja az információkat. Maga az attribútum értéktípusa "Értéktárolás". A következő képernyőképen a könyvtár metaadat-struktúrája látható.

Egy tetszőleges fájl lemezről elem formájában történő csatolásához az "AttachFile" parancs végrehajtásra került. Programkódja az alábbi listában látható:

& Az ügyféleljáráson AttachFile(parancs) // Parancskezelő az ügyfélen. Fájl kiválasztása // Párbeszéd a fájl kiválasztásához a lemezről Mode = FileSelectionDialogMode. Nyítás; OpenFileDialog = NewFileSelectDialog(Mode); OpenFile párbeszédpanel. FullFileName = " " ; OpenFile párbeszédpanel. MultipleSelect = False ; OpenFile párbeszédpanel. Title = "Fájlok kiválasztása"; Ha a FileOpenDialog. Select() majd FilePath = FileOpenDialog. FullFileName; // Bináris fájladatok fogadása BinaryData = new BinaryData(PathToFile) ; // Bináris adatok átvitele a szerverre AttachFileServer(BinaryData) ; Ellenkező esetben Text = "ru = " " Fájl (s) nincs kiválasztva!" " ; hu =" " Fájl (s) nincs kiválasztva!" " " ; Figyelmeztetés(NStr(Szöveg) ) ; EndIf ; EndProcedure & OnServer eljárás AttachFileServer(BinaryData) // Kezelő a szerveren fájl rögzítéséhez az információbiztonságban // Az űrlap objektum átalakítása referencia objektummá ObjectCurrent = FormAttributesValue("Object" ) ; // Új érték hozzárendelése az "Adatok" attribútumhoz ObjectCurrent. Adatok = NewValueStorage(BinaryData) ; // Változtatások mentése ObjectCurrent. Ír() ; Az eljárás vége

Ha általánosságban írjuk le az algoritmust, akkor először kiválasztunk egy fájlt a kliens lemezéről. Az így létrejövő bináris fájl adatok elküldésre kerülnek a szerverre, ahol rögzítésre kerülnek az információs bázisban, mégpedig az aktuális könyvtárelem „Data” attribútuma alatt.

Elvileg minden működik. Egy elem megnyitásakor ezeket az adatokat szükség szerint ki tudjuk olvasni. Ha például egy képet elmentünk a kellékek közé, akkor azt megkaphatjuk és megjeleníthetjük az űrlapmezőben. Ennek a megoldásnak van helye, de a legtöbb feladatban nem optimális az „Értéktár” értéktípusú attribútumok használata könyvtárakban és dokumentumokban. És ezért...

Teljesítményhatás

Futtassunk néhány teljesítménytesztet. A tesztek a "Termékek" könyvtár két elemét fogják használni, csatolt fájllal és anélkül. A csatolt fájl mérete 5 megabájt.

Minden tesztet a "GetElement" feldolgozás segítségével hajtanak végre a tesztkonfigurációban. Ezt a konfigurációt a cikk végén található linkről töltheti le.

Mérjük meg, mennyi időbe telik a „Termékek” könyvtár elemeinek megnyitásához. Egy elem megnyitásához az "OpenValue()" globális kontextusmódszert használják, amely paraméterként az elemre mutató hivatkozást ad át. Mérjük meg a nyitási időt egy szabványos teljesítménymérő eszközzel. Az eredményeket az alábbi képernyőképen mutatjuk be:

Amint látjuk, egy csatolt fájllal rendelkező elem megnyitásának ideje 10-szer hosszabb! Csináljunk még egy tesztet. Végezzük el a "GetObject()" metódust a termékkatalógus elemre való hivatkozáshoz. A teszt eredményét a következő képernyőképen láthatja.

A különbség elég jelentős. Csatolt fájl nélküli elem fogadása 194-szer gyorsabb!

Ez azért történik, mert a „GetObject()” metódus az összes adatot hivatkozással kapja meg a címtárelem részleteitől. Ennek megfelelően a módszer nemcsak a „Kód” és a „Név” attribútumok értékeit kapja meg, hanem az „Adatok” attribútum értékét is. Ha 5 megabájt méretű bináris adatokat tárol (mint a példánkban), akkor az objektum vételekor ezek az adatok (más részletekhez hasonlóan) a RAM-ba kerülnek, majd továbbítják a kliens oldalra. Ez az attribútumból származó adatok fogadása növeli az elem objektum megszerzésének idejét. Ha vékony kommunikációs csatornát használnak, akkor a nyitási idő még jelentősen megnő a nagy mennyiségű információ hálózaton keresztüli átvitele miatt.

Megjegyzés: az "OpenValue()" metódus végrehajtásakor először a könyvtárelem objektumot is beszerezzük, majd formobjektummá alakítjuk, és átadjuk a kliensnek (felügyelt űrlapoknál). Vagyis amikor egy elemet hivatkozással nyitunk meg, akkor az objektumot is lekérjük.

Végezzünk el egy utolsó tesztet arra vonatkozóan, hogy mennyi időbe telik egy könyvtárelem megnyitásához és írásához csatolt fájllal és anélkül. Az eredmény a következő képernyőképen látható.

Természetes eredmény. A csatolt fájllal rendelkező könyvtárelem fogadásának, majd írásának ideje ~19-szer hosszabbnak bizonyult. Amint fentebb említettük, egy objektum fogadásakor az összes részlet értéke megtörténik, beleértve az „Adatok” attribútumot is, amelyben 5 megabájtnyi információ van tárolva. Amikor egy elemet írunk, ez az adatmennyiség ismét az információs bázisba kerül. Következésképpen az adatok „Value Storage” típusú könyvtárattribútumban (vagy dokumentumban) való tárolása negatívan befolyásolja a teljesítményt mind az objektum lekérésekor, mind az információs bázisba való elhelyezéskor.

Hogyan lehet a leghelyesebben megoldani az információs bázisobjektumok adattárolási problémáját?

Korrekt megoldás

Ha megnézzük ennek a mechanizmusnak a megvalósítását tipikus konfigurációkban, látni fogjuk, hogy az objektumok további információit külön információs regisztertáblázatban tárolják. Így néz ki például a csatolt fájl mechanizmusa a „Trade Management” 11-es verziójának szabványos konfigurációjában.

A "Nomenclature" könyvtár a "NomenclatureAttachedFiles" könyvtár tulajdonosa. Ez pedig az AttachedFiles információs regiszterhez van társítva, melynek AttachedFile dimenziója az elemére utal. Így az információs bázis objektumokhoz csatolt adatok ténylegesen az információs regiszter táblában tárolódnak, amelynek működését gyakorlatilag nem befolyásolja az erőforrásban tárolt adatok mennyisége. A "Csatolt fájlok nómenklatúrája" közbenső könyvtár szükséges a csatolt fájlhoz kapcsolódó további információk tárolására, valamint a csatolt fájl hivatkozással történő elérésének támogatására.

A fentiek mindegyike ismét megerősíti a megfelelően megtervezett konfigurációs metaadat-struktúra hatalmas teljesítményhatását.

Tesztelje a konfigurációt a cikkből származó példával: LINK .

1C platform: Enterprise számos lehetőséget biztosít különféle típusú adatok tárolására.

De gyakran ezek a lehetőségek nem elegendőek. És akkor egy különleges tárgy jön a segítségünkre - StorageValues. Ez az objektum lehetővé teszi, hogy speciális formátumban tárolja mind a szabványos 1C:Enterprise objektumokat, például egy értéktáblázatot, mind a nem szabványos objektumokat, amelyekhez a platform nem rendelkezik típussal. A nem szabványos típusok tartalmazhatnak fájlokat. Például egy 1C adatbázisban található értéktár használatával tárolhatja az alkalmazottak fényképeit, beolvasott dokumentumokat, külső feldolgozást stb. Ennek az az előnye, hogy ezeket az objektumokat magában az adatbázisban tárolják. Ennek megfelelően új adatbázis biztonsági másolatból történő üzembe helyezésekor ezek az objektumok az új adatbázisban is jelen lesznek. Másrészt, ha nagy fájlokat tárol az adatbázisban, ez jelentősen növelheti annak mennyiségét, és negatívan befolyásolhatja a teljesítményét. Ezért itt fenn kell tartani az ésszerű egyensúlyt.

Nézzük meg, hogyan dolgozunk egy értéktárral egy példa segítségével. Hozzon létre egy speciális könyvtárat a konfigurátorban - nevezzük Külső objektumok, majd elkészítjük a könyvtár kellékeit Egy tárgy típussal StorageValues

És most már létrehozhatunk elemeket ebben a könyvtárban és kellékekben Egy tárgy Minden elem egy fájlba van írva.

Az értéktárral való munka nagyon egyszerű. Ha megnézzük a szintaktikai segédprogramot, látni fogjuk, hogy ennek az objektumnak csak egy metódusa és egy konstruktora van.

Most a bemutató kedvéért írjuk meg a legegyszerűbb kódot, amely fájlt ír a kellékekhez Egy tárgy egy korábban létrehozott könyvtárelemet, majd olvassa be ezt a fájlt a kellékekből, és írja ki a lemezre, de más néven.

&A kiszolgáló eljáráson LoadUnloadFile(Könyvtárelem)Directory Object =Könyvtárelem. GetObject() ; //Helyezze el a képet az értéktárban LabelDownload = Új kép("g:\musor\favicon.ico" ) NewValueStorage; //Könyvtárelem írása Címtár objektum. DirectoryObject objektum. Ír() ; //A kép feltöltése az értéktárból egy fájlba Fájlnév = "g:\musor\favicon_1.ico" ; LabelUpload = Könyvtárobjektum. Egy tárgy. Get() ; LabelUpload. Write(Fájlnév) ; Az eljárás vége

És néhány magyarázat a kódhoz.

  • Az objektum közvetlenül az áruházba kerül, amikor az áruházat a konstruktor segítségével létrehozzák.

A képeken kívül más típusú fájlok tárolására is használhatja az objektumot Bináris adatok. Tisztán elméletileg az értéktárban akár könyvtárelemeket, dokumentumokat stb. De a gyakorlatban ennek semmi értelme. De néha lehetőség van értéktár használatával értéktáblázat, értékfa és más univerzális gyűjtemények tárolására.