1c bináris adat a kérésben. Bináris adatokkal való munka. Fájl törlése az ideiglenes tárolóból

25.01.2021 Biztonság

Az 1C:Enterprise 8 technológiai platform lehetővé teszi tetszőleges fájlok elmentését az információs bázisba, onnan lekérését és használatát különböző utak. Nézzük meg ezeket a műveleteket példákkal.

Mielőtt feltöltene egy fájlt az 1C információs bázisba, meg kell szereznie a fájl teljes címét a lemezen. A fájlkiválasztó párbeszédpanelekkel való munkavégzés leírása: .

Fájlok tárolásához egy attribútumot (vagy regiszter erőforrást) a típussal StorageValues.

Tetszőleges fájl feltöltése az 1C információs bázisba

Bármely fájl bináris adatként ábrázolható és betölthető Értéktárolás.

Bináris adatok objektummá konvertálásakor StorageValues konstrukciót használnak newStorageValue(Adat,Tömörítés) két lehetőséggel:

  1. Adat- bináris adatok tárolására
  2. Tömörítés— a Deflációs algoritmus tömörítési foka. Egy egész szám a -1…9 tartományban. -1 az alapértelmezett tömörítési szint. 0 - nincs tömörítés, 9 - maximális tömörítési arány. Alapértelmezett érték: -1. A paraméter nem kötelező, ha nincs megadva, akkor a tömörítés nem használatos.

//A fájl konvertálása bináris adatokká
Fájl = New BinaryData(Path) ;

//Teremt új objektum StorageValues

DataStorage = NewValueStorage(Fájl, ÚjAdatTömörítés(9 ) ) ;

Tetszőleges fájl mentése az 1C információs bázisból a lemezre

A fájl 1C adatbázisból lemezre mentéséhez meg kell határoznia az elérési utat és a fájl nevét. Ehhez egy párbeszédablak található a fájlok mentésére, amelynek a műveletét a -ban ismertetjük.

//Bináris adatok beszerzése a tárhelyről
//DataStorage - az objektum ValueStorage típusú attribútuma

//A fogadott adatok lemezre írása
//A Path változó a lemezen lévő fájl teljes címét tartalmazza
Adat. Write(Path) ;

Az 1C információs bázisban található fájl megtekintése

Az adatbázisba mentett fájlok megtekintéséhez telepíteni kell egy olyan alkalmazást a számítógépére, amely megnyitja ezt a fájlt.

//Az ideiglenes fájl nevének lekérése a szükséges kiterjesztéssel
//Az Extension változóban meg kell adni a fájl kiterjesztését, például "pdf"
Elérési út= GetTemporaryFileName(Extension) ;

// Adatok lekérése a tárhelyről
//DataStorage - az objektum ValueStorage típusú attribútuma
Adatok = Adattár. Get() ;

//Adatok írása egy ideiglenes fájlba
Adat. Write(Path) ;

//Próbálja meg megnyitni a fájlt a kívánt alkalmazásban
//Ha az alkalmazás nem található, megjelenik a "Megnyitás ezzel..." rendszer párbeszédpanel
StartApplication(Path) ;

Az 1C bináris adatai tetszőleges formátumú fájlok tárolására szolgálnak. Segítségükkel a következőket teheti:

  • Az interakció megszervezése bináris protokoll használatával különféle eszközök;
  • Bármilyen formátumú fájl tárolása metaadat objektum attribútumaként;
  • Szöveges adatok konvertálása binárissá (leggyakrabban jelentések küldésére használják);
  • Dolgozzon bináris adatokkal a memóriában.

Mit tud a rendszer

Amikor bináris adatokkal dolgozik, a 8.3 platform a következőkre képes:

  1. Bináris adatok olvasása és írása;
  2. Adatok mozgatása kliensről szerverre és vissza ideiglenes tárhely használatával;
  3. Inicializáljon egy "Picture" típusú objektumot bináris fájlokkal;
  4. Olvassa el őket a World Wide Webről a MailAttachment, HTTPConnection stb. objektumok segítségével.
  5. Használjon kriptográfiai eszközöket az érzékeny mellékletek titkosításához és aláírásához;
  6. Számítsa ki a hash függvényt a DataHashing objektum segítségével.

Adatok mentése kellékekbe

Például alkossunk tesztkonfiguráció Könyvtár.

Valójában egy kicsit helytelen ugyanazt a könyvtárat használni a nómenklatúra és a bináris képadatok tárolására. Kellően nagy mennyiségű adattal és nehéz fájlokkal nagy méret Nem kívánt állásidő és "fékezés" a rendszerben előfordulhat. A rendszer szempontjából sokkal helyesebb lenne egy külön „Pictures” könyvtárat szervezni, amihez egy hivatkozást beállíthatunk attribútumtípusként.


Fontos megjegyezni, hogy mivel a "ValueStorage" típusú, bináris adatokat tartalmazó attribútumok nem érhetők el kezelt alkalmazás módban, csak a FormAttributesToValue metódussal érhetők el.


Az üzenetmező egy értéktároló bináris adatbevitelt jelent.

Adatok olvasása kellékekből

Hozzunk létre egy feldolgozást, amely a konfigurációnkban bináris formában tárolt fájlt egy táblázatkezelő dokumentumba írja ki (ez pl. céglogó nyomtatásához szükséges).


Alapvetően ez az összes kód, amire szükségünk van. A Get() operátor segítségével beolvassuk a megfelelő referencia attribútumban tárolt bináris adatokat, és átadjuk a "Picture" objektumnak, amely a bal felső cellában jelenik meg. táblázatos dokumentum formák (9. ábra).

9. ábra

Adatkonverzió

Ritkán, de előfordul, hogy a külső rendszerekkel végzett nem szabványos cserékkel végzett munka során az adatokat bináris formátumból Base64 formátumba kell konvertálni, vagy fordítva.

A legtöbb esetben a platform önállóan konvertálja az adatokat, ha ez nem történik meg, akkor a globális fordítási funkciókat kell használnia:

  1. Base64String - a megadott értéket a megfelelő kódolás karakterláncává alakítja;
  2. Base64Value – a fordított konverziót végzi.

A fenti kód optimalizálása

A 4. ábrán látható kód minden bizonnyal működik, de egy lényeges kitétellel: ha a "Modality use mode" jelölőnégyzet be van jelölve a konfigurációs tulajdonságokban (10. ábra). Ellenkező esetben a használata hibát okoz.
10. ábra

Ennek elkerülése érdekében a referenciaelem űrlap moduljában lépjen a Szöveg->Refaktoring->Elavult szinkronhívások->Modulhívások átalakítása menüpontba.

Egy idő után a szinkronhívások automatikusan aszinkron hívásokká alakulnak, és a kód így fog kinézni (11. ábra)

11. ábra

Szinte bármilyen információt tárolhat egy értéktárban, pl.

... képek (képek):

CurrentImage.Object = TextFabric.Reference; CurrentImage.DataType = Enumerations.Types of AdditionalObjectsInformation.Image; Tárhely = NewValueTárolás(ÚjKép, ÚjAdattömörítés()); CurrentImage.Storage = Storage.Get();

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

...táblázati dokumentum:

TabDoc=New SpreadsheetDocument; TabDoc.Output(FormElements.FieldofSpreadsheetDocument1); Storage=NewValueStorage(TabDoc); Ír();

Vége eljárás

Eljárás RestoreFromStorageClick (elem)

TabDoc=Tárolás.Get(); Ha a TabDoc<>Undefined ThenFormElements.SpreadsheetDocumentField1.Output(TabDoc); EndIf;

Vége eljárás

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

XS = NewValueStorage(Új Bináris Adat(fájl));

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

XS = NewValueStorage(Új Bináris Adat(fájl),ÚjTömörítés(9));

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

LoadProcessingToStorage (AttributeTypeStorage) eljárás

CompressionDegree = New DataCompression(9); //9 maximum PropsStorageType = NewStorageValues(NewBinaryData("c:\reports\report.epf", tömörítési fok));

Vége eljárás

Procedure StartProcessingFromStorage(AttributeTypeStorage)

TempFileName = TempFileDirectory()+"report.epf"; BinaryData = PropsTypeStorage.Get(); BinaryData.Write(TempFileName); ExternalProcessing = ExternalProcessing.Create(TempFileName); ExternalProcessing.GetForm().Open();

Vége eljárás

Munkatárolás

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

IfTypeVnch (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 volt szó (doc fájlról vagy más, bejegyzett típusú fájlról), akkor az így nyitható meg:

Alkalmazás indítása(Fájlnév);

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

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 mechanizmussal rendelkezik 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 a felhasználásra összpontosít vékony kliensés Web Client, és úgy lett kialakítva, hogy figyelembe vegye a webböngészők által szabott fájlkorlátozásokat.

A mechanizmus olyan módszerek összessége, amelyek segítségével a felhasználó által helyileg tárolt adatokat ideiglenes tárhelyre helyezheti információs bázis, vigye át ezeket az információkat az ideiglenes tárolóból az adatbázisba, és kérje vissza a felhasználó számítógépére. Az ezzel a mechanizmussal megoldott leggyakoribb alkalmazási feladatok a kísérő információk tárolása, például áruképek, szerződésekkel kapcsolatos dokumentumok stb.

A módszerek hatóköre

Átmeneti tároló

Az ideiglenes tárolás az információs bázis egy speciális területe, ahol 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ás szükségessége abból adódik, hogy a webböngésző modell megköveteli a felhasználó által kiválasztott fájl közvetlen átvitelét a szerverre anélkül, hogy azt a kliensen tárolná. A fájl átvitelekor ideiglenes tárolóba kerül, és csak ezután használható objektum adatbázisba írásakor.

Az ideiglenes tárolással megoldott legjellemzőbb alkalmazott 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árolóban elhelyezett fájlt vagy bináris adatot egy 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. Az 1C:Enterprise nyelv külön módszere lehetővé teszi annak meghatározását, hogy az átadott cím olyan cím-e, amely az ideiglenes tárolóban lévő adatokra mutat.

Információs bázis

A mechanizmus lehetővé teszi a ValueStorage 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 kaphatja meg, egy objektumra mutató hivatkozást vagy az információs regiszter rekordkulcsát és az attribútum nevét átadva. Táblázatos szakasz esetén ezenkívül szükséges a táblázatos szakasz sorindexének átadása.

A fájlokkal való munkavégzés módszerei korlátozottak, ha az információsbázis részleteivel dolgozik. 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 PlaceFileToTempStorage().

Az első módszer, a PlaceFile(), a helyi fájlrendszerből ideiglenes tárolóba helyez egy fájlt. A metódus elfogad egy célcímet az áruházban. Ha nincs megadva, vagy üres karakterlánc, akkor létrejön új fájlé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óban tárolandó 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 PutFileInTempStorage() 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 adni a címet az ideiglenes tárolóban. Ezt a címet a fenti PutFile() és PutFileToTempStorage() metódusok küldik vissza, ha sikeresek.

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

Az adatok attribútumban való mentése után az ideiglenes tárolóban lévő fájl törölhető. Ehhez létezik a DeleteFileFromTemporaryStorage() metódus, amely törli a fájlt az ideiglenes tárhelyről. A metódus paraméterként veszi az ideiglenes tárolóban lévő fájl címét. elérhető a szerveren.

Annak ellenőrzése, hogy egy cím ideiglenes tárolóhoz tartozik-e

A fájl címe utalhat mind az ideiglenes tárhelyre, mind az információs bázis részleteire. Típusának ellenőrzéséhez létezik a ThisTemporalStorageAddress() metódus.

Ellenőrzi, hogy az átadott cím egy üzletre mutat-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 megszerzése

Miután az adatok az infobázis kellékeibe kerültek, előfordulhat, hogy fájlmódszerekkel kell hozzáférni.

Mielőtt azonban adatokat kapna, például egy attribútumból, meg kell szereznie ennek az attribútumnak a címét. Ehhez létezik egy GetFileAddressInInfobase() 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 (lehet az objektumra mutató hivatkozás vagy az információs regiszter rekordkulcsa) és az attribútum nevét. Ha egy táblázatos szakasz attribútumban tárolt fájl címét szeretné lekérni, akkor az attribútum nevét meghatározó paraméterben az attribútum neve elé, hozzá kell adnia a táblázatos szakasz nevét és egy "." 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 helyi fájlba fájlrendszer felhasználó. Az első paraméter az attribútumban vagy az ideiglenes fájltárolóban lévő fájl címét adja meg. A második paraméter határozza meg az eredményül kapott fájl célját. 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 megadhatja a kapott fájllal kapcsolatos műveletet: futtassa vagy mentse a felhasználó által megadott helyre. Ha az interaktív mód aktív, és a lemezen lévő fájl cél elérési útja nincs megadva, akkor a fájlmegnyitási művelet nem érhető el. Logikai értéket ad vissza. Hamis azt jelenti, hogy a felhasználó a művelet megszakítását választotta az online mentési fájl párbeszédpanelen.

Példa a fájlmetódusok használatára

// Fájl fogadása a lemezről interaktívan // és ideiglenes tárhelyre helyezése &AtClient eljárás SelectFileCDDiskAndWrite()

Változó SelectedName; Az ideiglenes tárolás változó címe; Ha PutFile(TempStorageAddress, SelectedName, True) akkor Object.FileName = SelectedName; PlaceObjectFile(AddressTemporaryStorage); EndIf;

Vége eljárás

// Fájl másolása ideiglenes tárhelyről referencia attribútumba //, objektum írása, fájl törlése az ideiglenes tárhelyről // &AtServer eljárás PlaceObjectFile(TemporaryStorageAddress)

Könyvtárelem = FormAttributeToValue("Object"); BinaryData = GetFileFromTempStorage(TempStorageAddress); DirectoryItem.FileData = NewValueStorage(BinaryData); FilePathOnDisk = Új fájl(DirectoryItem.FileName); Katalógus Element.FileName = FilePathOnDisk.Name; ElementDirectory.Write(); módosított = false; DeleteFileFromTemporaryStorage(AddressTemporaryStorage); ValueVFormAttribute(DirectoryItem, "Object");

Vége eljárás

// Olvassa be a fájlt az attribútumból, és mentse el // ide helyi lemez interaktívan &Az ügyfél-eljárásban ReadFileAndSaveToDisk()

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

Vége eljárás

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

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

Ehhez a form elem Data tulajdonságában meg kell adni egy string típusú attribútumot. Ennek az attribútumnak az értéke a kép címeként lesz értelmezve.

Példa // A képmező kötése az ideiglenes tárhelyen lévő kép címéhez //. AddressImage form kellékek karakterlánc típusa

Helyfájl (ImageAddr, True)

Image.Data = Képcím

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

A leírt mechanizmus működése a webkliens használatakor bizonyos korlátokkal rendelkezik. Ezek a korlátozások a böngésző biztonsági modelljének sajátosságaihoz kapcsolódnak. Így például a kliens önmagában nem tudja elmenteni a fájlt a helyi fájlrendszerbe, vagyis csak a PlaceFile() és a GetFile() kliens metódusok interaktív változata érhető el. A nem interaktív mód használatának kísérlete kivételt jelent. Párbeszédpanelek, interaktívan megjelenítve egy adott böngészőtípusra jellemzőek.

Jellemzők, amikor a Value Store-val dolgozik az ügyfélen

Probléma:

Ha a táblázatos részben lévő dokumentumnak ValueStorage típusú attribútuma van, lelassítja a dokumentuműrlap megnyitását, ha ez az attribútum nagy adatot tartalmaz.

Javasolt ok:

Lehetséges, hogy az űrlap megnyitásakor a kliensnek nem az Értéktárban lévő adatokra mutató hivatkozást küldik, hanem magát az adatot.

Megoldás

  • Az ingatlanokban asztali kellékek Az űrlapon van egy "Mindig használat" jelző. Ha be van állítva, akkor 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. Egy példa megtekinthető az 1C: Archívumban.

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

Nyomtatás (Ctrl+P)

16.3. Munka bináris adatokkal

16.3.1. Általános információ

A megvalósítás során alkalmazott megoldások vannak helyzetek, amikor különböző bináris adatok elemzésére van szükség. Például meg kell határozni a fájl típusát az aláírás alapján, vagy bizonyos manipulációkat kell végrehajtani a képpel. Az 1C:Enterprise speciális programozási felületeket biztosít a bináris adatokkal való munkavégzéshez. Ezután megvizsgáljuk a bináris adatokkal való munkavégzés lehetőségeit.
Minden bináris adatokkal végzett munka az adatfolyam fogalmán alapul. Folyam egy tetszőleges (általában) adatforrás (a Stream objektum) logikai általánosítása. A rendszer nem ad lehetőséget olyan független Stream objektum létrehozására, amely nem kapcsolódik semmilyen forráshoz. De vannak származtatott objektumok, amelyek létrehozhatók - egy lemezen lévő fájlhoz társított adatfolyam (FileStream objektum) vagy egy memóriában létrehozott adatfolyam (MemoryStream objektum). A stream lehetővé teszi az adatok olvasását és írását is. Bizonyos műveletek végrehajtásának lehetőségének meghatározásához az adatfolyam (és a származtatott objektumok) speciális módszerekkel rendelkezik, amelyek lehetővé teszik annak meghatározását, hogy melyik
műveletek elérhetőek az adott adatfolyammal (metódusok ElérhetőRekord(), ElérhetőRead(), ElérhetőChangePosition()).
Ha többet kell dolgoznia a patammal, mint magas szint, különösen olyan adatok olvasására/írására, mint például egy szám (különböző bithosszúságú) vagy egy karakterlánc, akkor a ReadData / WriteData objektumok erre szolgálnak. Ezen objektumok segítségével lehetőség nyílik a streamben található bináris adatok strukturáltabb megközelítésére. Így például egy fájl formátumának ismeretében meglehetősen kényelmesen olvashat egy ilyen fájlt, megszerezve a szükséges adatokat a fejlécekből (amelyeket általában a szám és a karakterlánc típusok képviselnek), kihagyva a felesleges adatblokkokat és a feldolgozáshoz szükségesek betöltése.
A bináris adatokkal való munka általános sémája a következőképpen ábrázolható:

  1. Az adatfolyam folyamatban van
  2. Létrejön egy DataReader vagy DataWrite objektum.
  3. A 2. lépésben létrehozott objektum segítségével a szükséges műveletek végrehajtásra kerülnek.
  4. A 2. lépésben létrehozott objektum bezárul.
  5. Ha nem kell több műveletet végrehajtani, az 1. lépésben kapott adatfolyamot lezárjuk.
  6. Ha folytatni szeretné a munkát az adatfolyammal, telepítheti új pozíciót adatfolyamban (ha ez a művelet támogatott), és folytassa a munkát a 2. lépéstől.

Megjegyzendő, hogy az 1. és 2. elem kombinálható. Más szóval a rendszer lehetőséget biztosít objektumok létrehozására Adatok olvasása/Adatok írása közvetlenül például egy BinaryData objektumból.
A bináris adatokkal végzett különféle műveletek végrehajtásához a rendszer lehetőséget biztosít arra, hogy a folyam egy részét külön töredékként kapja meg tetszőleges (byte-byte) hozzáféréssel (objektum) BufferBinaryData). A puffer mérete a létrehozáskor van beállítva, és később nem módosítható. Ha bináris adatpufferrel dolgozik, lehetséges, hogy különböző kapacitású számokkal dolgozzon, mint a
mint egész. Ugyanakkor lehetőség van a bájtsorrend megadására a következő szavakkal: " junior-senior" (little endian) vagy "senior-junior" (big endian). Lehetőség van arra is, hogy egy puffert több pufferre osszanak fel, és több bináris adatok pufferét egyesítsék egy kapott pufferbe.
Fontos megjegyezni, hogy a bináris adatpufferrel való munka jelentősen leegyszerűsítheti a megvalósítást, ha a bináris adatokkal végzett munka a kliens alkalmazás oldalán aszinkron módban kerül megvalósításra. Ebben az esetben az adatok beolvasása a pufferbe aszinkron művelet, a pufferadatokkal való munka pedig szinkron.
A bináris adatokkal való munkavégzés elérhető a kliens (beleértve a webklienst is) alkalmazás oldalán és a szerver oldalon, valamint szinkron és aszinkron munkasémákban. További példák a szinkron működési sémát fogják használni.

16.3.2. Bináris adatok olvasása

A bináris adatok olvasásának példájaként megvizsgáljuk a rendszerben a további felhasználáshoz kiválasztott helyes fájlformátum meghatározásának problémáját. A rendszer egy hangadatokat tartalmazó .wav fájlt fog használni az ellenőrizendő fájlként. A .wav fájlok tárolására a Resource Interchange File Format (RIFF) szolgál, melynek leírása a linken található:

https://msdn.microsoft.com/enus/library/windows/desktop/ee415713.aspx (címen angol nyelv). Az olvasási példa esetében a következő formátumadatokat kell használni:
1. A fájl első 4 bájtja tartalmazza a formátum azonosítót: RIFF.
2. A következő 4 bájt az aktuális hangadatok méretét tartalmazza kis-végi bájt sorrendben.
3. A következő 4 bájt a felhasznált adatok szöveges típusát tartalmazza: WAVE.
A lépések végrehajtásához a következő 1C:Enterprise kódra lesz szüksége:

Olvasás = Új ReadData (Fájlnév, ByteOrder.LittleEndian);
FileFormat = Read.ReadCharacters(4);
DataSize = Read.ReadInteger32();
FileType = Read.ReadCharacters(4);
Ha a Fájlformátum<>"RIFF" akkor
alert("Ez nem RIFF fájl");
Visszatérés ;
EndIf ;
Ha FileType = "WAVE" Akkor
Jelentés ("Ez egy WAV fájl adatokkal, mérete " + DataSize + " bájt");
Másképp
Értesítés („Ez nem WAV-fájl”);
Visszatérés;
EndIf;

Tekintsünk egy példát részletesebben.
Először megnyílik az a fájl, amelynek a neve a FileName változóban van, és a fájl megnyitásra kerül olvasásra ( FileOpenMode.Open), csak a fájlból ( FileAccess.Read) és egy 16 bájtos puffert használunk az olvasáshoz.
Ezután egy folyam jön létre az adatok beolvasására, amely a Number típusú adatoknál "kis-magas" bájtsorrendű lesz. Ezután a rendszer 4 karaktert olvas ki a kapott adatfolyamból, egy 32 bites egész számot és további 4 karaktert. A kapott adatokat elemzik, és az elemzés eredményei alapján döntenek arról, hogy a kiválasztott fájl .wav fájl-e vagy sem.

16.3.3. Írjon bináris adatokat

A bináris adatok fájlba írása a legegyszerűbb esetben a következőképpen történik:

Bejegyzés = Új WriteData (fájlnév);
Index esetén = 0 - 255 Ciklus
Write.WriteByte(Index);
EndCycle;
Record.Close() ;

Ez a példa 0 és 255 közötti bájtsorozatot ír egy fájlba (0xFF hexadecimálisan). Ez a legegyszerűbb bejegyzés.
Használhat egy, az előző példában tárgyalt olvasási módszerhez hasonló módszert is, amikor egy fájl adatfolyamot fogadunk, és ebbe a fájlfolyamba írunk adatokat.

16.3.4. Munka a bináris adatpufferrel

Mint fentebb említettük, a bináris adatpuffer kényelmes módot biztosít a bináris adatok bitjeinek kezelésére.
Nem csak az adatok olvasása támogatott, hanem az írás is.
Példaként a RIFF fájl fejlécének elemzését az adatolvasási példából (lásd itt) megfontoljuk. Pontosan ugyanazokat a fájlformátum-információkat fogja használni a példa felépítéséhez. Ebből tehát ki kell olvasni forrás fájl egy fájlfejléc méretű puffer. A fejléc három 4 bájtos mezőből áll. Így 12 bájtot kell olvasni.

Puffer = Új BufferBinaryData(12);
Fájl = FileStreams.Open(TempFiles könyvtár() + „Windows Logon.wav”, FileOpenMode.Open, FileAccess.Read);
File.Read(puffer, 0, 12);
Méret = Buffer.ReadInteger32(4);
StringStream = Új StreamInMemory(Buffer);
StreamString.Jump(0, PositionInStream.Start);

Fájlformátum = ReadString.ReadCharacters(4, "windows-1251");
ReadingLine.Close();
StreamString.Jump(8, PositionInStream.Start);
StringReader = NewDataReader(StringStream );
Fájltípus = ReadString.ReadCharacters( 4, "windows-1251");
ReadingLine.Close();

Az adatok bináris adatpufferbe kerülésének folyamata semmi különös. A további műveletekhez néhány megjegyzés szükséges. Bármilyen támogatott bitmélységű szám beolvasása lehetséges bármely pufferpozícióból. NÁL NÉL ezt a példát Buffer.ReadInteger32(4); egy 32 bites egész szám beolvasását jelenti a puffer 4. bájtjától kezdve. Így, ha több, a puffer különböző helyein található számot kell kiolvasnia, ezt megteheti közvetlen pozicionálás nélkül ebben a pufferben.
A karakterlánc beolvasását azonban nem támogatja a bináris adatpuffer. Ezért olyan objektumot kell használnia, amely lehetővé teszi ezt: ReadData . DataReader objektum nem hozható létre bináris adatpufferből. De a bináris adatok puffere alapján létrehozhat egy olyan adatfolyamot, amely univerzális közvetítő az információtároló fizikai helye (fájl, bináris adatok puffere) és egy magas szintű objektum, amely lehetővé teszi az adatokkal való munkát.
Amikor egy DataReader objektumot egy adatfolyam alapján hoz létre, az a pozícióból kezdi el az adatok beolvasását Ebben a pillanatban telepítve a patakba. Ezért a példában először a streamben lévő pozíciót állítjuk be, majd a DataReader objektumot létrehozzuk, és a szükséges számú karaktert beolvassuk. Részletes leírás a bájtok és a karakterek száma közötti különbséget karakterláncok olvasásakor, lásd a következő 16.3.5. szakaszt

16.3.5. Használati jellemzők

Bináris adatok használatakor figyelembe kell venni a String típusú adatokkal való munkavégzés sajátosságait. A sajátosság az, hogy a StrLength() globális kontextusfüggvény által visszaadott karakterlánc hosszát karakterekben mérjük. A szimbólumokban meg kell adni az olvasási/írási adatok méretét az objektumokban lévő karakterláncok írási/olvasási metódusaiban a bináris adatokkal való munkavégzéshez ( Read Symbols (),
ReadString(), WriteSymbols(), WriteString()). Ugyanakkor nincs egyértelmű lehetőség egy karakterlánc hosszának konvertálására bájtokban megadott hasonló paraméterré. A karakterlánc tartalmától és a kódolástól függően ez az arány eltérő lesz. Ezért, ha olyan adatstruktúrákkal dolgozik, amelyek változó hosszúságú karakterláncokat tartalmaznak, világosan meg kell értenie, hogy a karakterláncok hosszát milyen egységekben fejezik ki.
Ha a rendelkezésre álló adatokban a karakterlánc hossza bájtban van megadva, a karakterlánc pedig többbájtos változó hosszúságú kódolásban van megadva (például UTF-8), akkor bináris adatobjektumok használatával általában lehetetlen egy ilyen szerkezetet beolvasni. fájlból String típusú adatokká.
De ebben az esetben könnyen megváltoztathatja az olvasási / írási pozíciót a fájlfolyamban. Ha a karakterlánc hosszát karakterben adjuk meg, akkor lehetségessé válik egy ilyen karakterlánc beolvasása String típusú adatokba, de lehetetlenné válik az olvasási / írási pozíció megváltoztatása egy ilyen adatfolyamban.
Ha egy karakterlánc hosszát bájtban szeretné megadni, a következő függvény segítségével konvertálhatja a karakterláncot BinaryData objektummá:

Funkció Get BinaryDataFrom String(Val StrParameter , Val kódolás = "UTF-8")
StreamMem = Új StreamInMemory ;
Író = Új WriteData (StreamMemory);
Writer.WriteString(StrParameter , Kódolás );
Író.Bezár();
Return StreamMemory.CloseAndGetBinaryData();
EndFunctions

A tényleges méretet bájtban a BinaryData objektum Size() függvényének meghívásával kaphatjuk meg, amelyet a függvény eredményeként kapunk meg.
Tárgyak egyidejű használata nem javasolt Adatok olvasása/Adatok írásaés stream objektumok. Ha a DataReader két egymást követő olvasása vagy a DataWrite rendszerbe történő két egymást követő írás között megváltozik az a stream pozíciója, amellyel az objektumok dolgoznak. Adatok árnyékolása/Adatok írása- Kivételt dobtak. Tehát a következő példa bemutatja a helyes pozícióváltást az adatfolyamban, amikor adatokat ír az adatfolyamba:

Stream = Új StreamInMemory();

WriteData.WriteString("Helló Világ!");
WriteData.Close();
Stream.Jump(0, PositionInStream.Start);
DataRecord = New DataRecord(Stream);
WriteData.WriteString("Viszlát!");
WriteData.Close();
A következő példa üdvözli a kivételt:

Stream = Új StreamInMemory();

WriteData.WriteString("Helló világ!");
Stream.Jump(0, PositionInStream.Start);
// A következő sor kivételt dob
WriteData.WriteString("Viszlát!");
Ugyanakkor előfordulhatnak olyan helyzetek, amikor a rendszer viselkedése hibás lesz, de nem keletkezik hiba:

Stream = GetStream();
DataReader = Új DataReader(folyam);
TestString = ReadData.Read();
InitialPosition = Stream.CurrentPosition();
DataRecord = New DataRecord(Stream);
WriteData.WriteString(“Váratlan karakterlánc”);
DataWrite.Close();
Flow.Go(Kezdőpozíció, PositionInStream.Start);
// Általában nem lehet meghatározni, hogy milyen érték kerüljön a TestString2 változóba
Tesztkarakterlánc2 = ReadData.ReadString();

Leírva a ez a szekció viselkedését okozza o A DataReader/DataWrite objektumok saját puffereiket használják, amikor egy adatfolyammal dolgoznak. Ennek eredményeként a folyam tényleges helyzete eltér a logikai pozíciótól, amely az elvégzett műveletek eredményeként alakul ki.
Ezenkívül nem támogatott a ReadData és a WriteData objektumok egyidejű használata, amelyek egy szálat használnak munkájukhoz.