Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows 8
  • Kako čitati binarne podatke 1c. Proširivanje funkcionalnosti rada sa binarnim podacima

Kako čitati binarne podatke 1c. Proširivanje funkcionalnosti rada sa binarnim podacima

Binarni podaci u 1C namijenjeni su za pohranjivanje datoteka bilo kojeg formata. Uz njihovu pomoć možete:

  • Organizirati interakciju korištenjem binarnog protokola s različitim uređajima;
  • Čuvajte datoteke bilo kojeg formata kao atribut metapodataka objekta;
  • Pretvorite tekstualne podatke u binarne (najčešće se koriste za slanje izvještaja);
  • Rad sa binarnim podacima u memoriji.

Šta sistem može da uradi

Prilikom rada sa binarnim podacima, platforma 8.3 može učiniti sljedeće:

  1. Čitanje i pisanje binarnih podataka;
  2. Premjestiti podatke s klijenta na server i nazad koristeći privremenu memoriju;
  3. Inicijalizirati objekt tipa "Slika" koristeći binarne datoteke;
  4. Pročitajte ih sa World Wide Weba koristeći objekte "Post Attachment", "NTTRC Connection" itd.
  5. Koristite kriptografske alate za šifriranje i potpisivanje važnih priloga;
  6. Izračunajte hash funkciju koristeći Data Hash objekt.

Pohranjivanje podataka u rekvizite

Na primjer, napravimo referencu u test konfiguraciji.

U stvari, malo je pogrešno koristiti isti direktorij za pohranjivanje informacija o nomenklaturi i binarnim podacima slika. Uz dovoljno velike količine podataka i teške datoteke velike veličine, može doći do neželjenih zastoja i "kočnica" u radu sistema. Sa stanovišta sistema bilo bi mnogo ispravnije organizovati poseban priručnik „Slike“, link na koji bismo mogli postaviti kao vrstu atributa.


Važno je napomenuti da budući da atributi tipa "ValueStorage" koji sadrže binarne podatke nisu dostupni u režimu upravljane aplikacije, pristup im je moguć samo pomoću metode FormAttributeValue.


Polje poruke predstavlja binarni zapis podataka skladišta vrijednosti.

Čitanje podataka iz rekvizita

Kreirajmo obradu koja će datoteku pohranjenu u binarnom obliku u našoj konfiguraciji izvesti u tabelarni dokument (ovo je neophodno, na primjer, za štampanje logotipa kompanije).


U osnovi, ovo je sav kod koji nam treba. Koristeći Get () operator, čitamo binarne podatke pohranjene u odgovarajućem referentnom atributu i prenosimo ih u objekt "Slika", koji će biti prikazan u gornjoj lijevoj ćeliji tabelarnog dokumenta obrasca (slika 9).

Slika 9

Transformacija podataka

Nije često, ali se dešava da je pri radu sa nestandardnim razmjenama sa eksternim sistemima potrebno konvertirati podatke iz binarnog formata u Base64 format ili obrnuto.

U većini slučajeva, platforma sama transformira podatke, ako se to ne dogodi, morate koristiti globalne funkcije prevođenja:

  1. Base64String - pretvara navedenu vrijednost u niz odgovarajućeg kodiranja;
  2. Base64 vrijednost - vrši obrnutu konverziju.

Optimizacija gornjeg koda

Kod prikazan na slici 4 svakako radi, ali uz jedno važno upozorenje: ako je polje za potvrdu "Modality use mode" označeno u svojstvima konfiguracije (slika 10). U suprotnom, njegovo korištenje će dovesti do greške.
Slika 10

Da se to ne dogodi, dok ste u modulu forme referentnog elementa, idite na meni Text-> Refactoring-> Deprecated synchronous calls-> Convert module calls.

Nakon nekog vremena, sinhroni pozivi će se automatski pretvoriti u asinhrone, a kod će poprimiti oblik (slika 11)

Slika 11

Gotovo sve informacije mogu se pohraniti u skladište vrijednosti, na primjer,

... slike (fotografije):

TekImage.Object = SprFabric.Ref; TekImage.DataType = Enumerations.AdditionalInformationTypesObjects.Image; Skladište = Nova vrijednost pohrane (Nova slika, Nova kompresija podataka ()); TekImage.Storage = Storage.Get ();

// na ovom mjestu prikazuje sve ... Form Elements.PictureField1.Picture = Storage.Get (); TekImage.Write ();

... tabelarni dokument:

TabDoc = Novi TabularDocument; TabDoc.Display (Elementi obrasca.TableDocumentField1); Skladištenje = Novo skladište vrijednosti (TabDoc); Pisati ();

Kraj procedure

Postupak Vraćanje iz skladišta Pritisnite (stavka)

TabDoc = Storage.Get (); Ako TabDoc<>Undefined Then Form Elements.TableDocumentField1.Offer (TabDoc); EndIf;

Kraj procedure

... proizvoljni fajlovi (binarni podaci):

HZ = NewValueStore (novi binarni podaci (datoteka));

Osam podržava kompresiju podataka koji se nalaze u memoriji:

HZ = NewValueStore (novi binarni podaci (datoteka), nova kompresija podataka (9));

... eksterna obrada i izvještavanje:

Procedura LoadProcessingIn Storage (Props StorageType)

Stepen kompresije = Nova kompresija podataka (9); // 9 maksimalnih PropsStorageType = NewValueStore (Novi binarni podaci ("c: \ reports \ report.epf", Stepen kompresije));

Kraj procedure

Procedura StartProcessingFrom Storage (Props StorageType)

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

Kraj procedure

Rad sa skladištem

Ako je to bio BinaryData, onda se može vratiti iz skladišta vrijednosti pomoću Get metode i zapisati u datoteku pomoću Write () metode.

Ako TypeZnch (Skladištenje)<>Upišite ("BinaryData") Zatim

Binarni podaci = Storage.Get ();

Binarni podaci = Skladištenje;

EndIf; BinaryData.Write (FileName);

Ako je to bio, na primjer, Word dokument (doc datoteka ili druga datoteka registrovanog tipa), onda se može otvoriti na sljedeći način:

RunApplication (FileName);

Da obrišete polje tipa Pohrana vrijednosti, morate mu dodijeliti Nedefinirano:

PropsStorage = Nedefinisano;

Rad sa datotekama i slikama na ugrađenom jeziku 1C: Enterprise 8

Imenovanje

Upravljana aplikacija ima novi mehanizam za rad sa datotekama. Omogućava razmjenu datoteka između baze podataka i klijentske aplikacije. Posebnost ovog mehanizma je u tome što je fokusiran na upotrebu u tankom klijentu i Web klijentu i dizajniran je uzimajući u obzir ograničenja rada sa datotekama koja nameću web pretraživači.

Mehanizam je skup metoda koji se mogu koristiti za stavljanje podataka pohranjenih lokalno kod korisnika u privremeno skladište infobaze, prijenos ovih informacija iz privremene memorije u bazu podataka i vraćanje na korisnički računar. Najčešći aplikativni zadaci koje rješava ovaj mehanizam su pohranjivanje popratnih informacija, na primjer, slike robe, dokumenata vezanih za ugovore itd.

Obim metode

Privremeno skladište

Privremena pohrana je specijalizirana oblast baze podataka u kojoj se mogu pohraniti binarni podaci. Glavna svrha je privremeno skladištenje informacija tokom interakcije klijent-server dok se ne prenesu u bazu podataka.

Potreba za privremenim skladištenjem nastaje zbog činjenice da je u modelu web pretraživača potrebno datoteku koju odabere korisnik prenijeti direktno na server bez mogućnosti pohranjivanja na klijenta. Prilikom prijenosa fajla on se stavlja u privremenu memoriju i tek tada se može koristiti prilikom upisivanja objekta u bazu podataka.

Najtipičniji problem aplikacije koji se rješava privremenim skladištenjem je omogućavanje pristupa datotekama ili slikama prije nego što se objekt upiše u infobazu, na primjer, u obliku elementa.

Datoteka ili binarni podaci smješteni u memoriju identificiraju se jedinstvenom adresom, koja se kasnije može koristiti u operacijama pisanja, čitanja ili brisanja. Ova adresa je data metodama za pisanje datoteke u privremenu memoriju. Zasebna metoda u ugrađenom jeziku omogućava vam da odredite da li je proslijeđena adresa adresa koja ukazuje na podatke u privremenoj memoriji.

Baza informacija

Mehanizam vam omogućava pristup binarnim podacima pohranjenim u atributima tipa ValueStore.

Kao iu slučaju privremenog skladištenja, informacijama se može pristupiti putem posebne adrese. Možete ga dobiti pomoću posebne metode prosljeđivanjem reference na objekt ili ključ zapisa registra informacija i ime atributa. U slučaju tabelarnog dijela potrebno je dodatno prenijeti indeks reda tabelarnog dijela.

Metode rada sa datotekama su ograničene kada se radi sa detaljima baze podataka. Za njih, za razliku od privremenog skladištenja, dostupno je samo čitanje informacija, ali ne i njihovo pisanje ili brisanje.

Opis metoda za rad sa datotekama

Pohranjivanje podataka u privremenu memoriju

Najtipičniji scenario za korištenje ovog mehanizma uključuje početno postavljanje korisničkih podataka u privremenu memoriju. Za to postoje dvije metode: PlaceFile () i PlaceFileToTemporaryStorage ().

Prva metoda, PlaceFile (), postavlja datoteku iz lokalnog sistema datoteka u privremenu memoriju. Metoda može uzeti ciljnu adresu u prodavnici. Ako nije definiran ili je prazan niz, tada će se kreirati nova datoteka i metoda će vratiti svoju adresu kroz odgovarajući parametar.

Ako je parametar koji određuje interaktivni način rada True, metoda će prikazati standardni dijaloški okvir za odabir datoteke, u kojem možete odabrati datoteku koja će biti smještena u spremište. U ovom slučaju, metoda će također vratiti adresu odabrane datoteke.

Kao rezultat, metoda vraća False ako je korisnik interaktivno odbio da izvrši operaciju u dijalogu za odabir datoteke. Metoda je dostupna samo na klijentu.

Druga metoda, PlaceFileToTemporaryStorage (), je slična prethodnoj, osim što je dostupna na serveru, a podaci koji se upisuju u privremenu memoriju nisu predstavljeni kao putanja u sistemu datoteka, već kao varijabla BinaryData . Slično, ako nije navedena ciljna adresa, kreira se nova datoteka u spremištu. Njegova adresa se vraća kao rezultat funkcije.

Preuzimanje datoteke iz privremene memorije

Kada pišete objekat u infobazu, možda ćete morati da izdvojite podatke iz privremene memorije i postavite ih, na primer, u props. Za to postoji odgovarajući serverski metod - GetFileFrom TemporaryStorage (). Ova metoda preuzima podatke iz privremene memorije i vraća ih kao rezultat. Da biste to učinili, morate navesti adresu u privremenoj memoriji. Ovu adresu vraćaju gornje metode PlaceFile () i PlaceFileTemporaryStorage () ako uspiju.

Uklanjanje fajla iz privremene memorije

Nakon što se podaci pohrane u rekvizite, datoteka u privremenoj memoriji se može izbrisati. Da biste to učinili, postoji metoda DeleteFileFromTemporaryStorage () koja uklanja datoteku iz privremene memorije. Metoda uzima u parametar adresu datoteke u privremenoj memoriji. Dostupno na serveru.

Provjera adrese da li pripada privremenom skladištu

Adresa datoteke može ukazivati ​​i na privremenu memoriju i na varijablu baze podataka. Da biste provjerili njegov tip, postoji metoda ThisTemporaryStorageAddress ().

Provjerava da li je proslijeđena adresa adresa koja upućuje na trgovinu. Vraća True ako adresa ukazuje na privremenu memoriju. Metoda je dostupna na serveru.

Dobivanje adrese rekvizita

Nakon što su podaci stavljeni u rekvizite u bazi podataka, možda ćete morati da im pristupite koristeći metode datoteka.

Ali prije nego što dobijete podatke, na primjer iz rekvizita, morate dobiti adresu ovog rekvizita. Da biste to učinili, postoji metoda GetFileAddressVinformationBase ().

Njegova svrha je da vrati adresu fajla u infobazu prema originalnim parametrima. Da biste to učinili, trebate proslijediti ključ objekta (može biti ili referenca na objekt ili ključ za zapis registra informacija) i naziv atributa. Ako trebate dobiti adresu datoteke pohranjene u atributu tabelarnog odjeljka, prije naziva atributa u parametru koji specificira naziv atributa, morate dodati naziv tabelarnog dijela i tačku ".". Metoda je dostupna i na klijentu i na serveru.

Preuzimanje fajla iz baze podataka

GetFile () metoda preuzima datoteku iz baze podataka i sprema je u korisnički lokalni sistem datoteka. Prvi parametar definira adresu datoteke u props-u ili u privremenoj memoriji datoteka. Drugi parametar specificira ciljnu lokaciju rezultirajuće datoteke. U neinteraktivnom načinu rada morate navesti putanju. U interaktivnom načinu rada, parametar je opcionalan.

Standardno, metoda se izvršava interaktivno, odnosno posljednji parametar je True. To znači da se prikazuje dijaloški okvir u kojem možete odrediti radnju s rezultirajućom datotekom: pokrenite je ili spremite na lokaciju koju odredi korisnik. Ako je interaktivni način aktivan i parametar Ciljna staza do datoteke na disku nije naveden, tada operacija otvaranja datoteke nije dostupna. Vraća logičku vrijednost. Netačno znači da je korisnik izabrao da otkaže operaciju u dijaloškom okviru za spremanje datoteke na mreži.

Primjer korištenja metoda datoteka

// Interaktivno preuzimanje datoteke s diska // i postavljanje u privremenu pohranu & Na klijentskoj proceduri SelectSDiskFileUsewrite ()

Varijabla SelectedName; Varijabilna adresa privremenog skladišta; Ako PutFile (Adresa TemporaryStorage, SelectedName, True) onda Object.FileName = SelectedName; PlaceObjectFile (TemporaryStorageAddress); EndIf;

Kraj procedure

// Kopiranje datoteke iz privremene memorije u // rekvizit direktorija, snimanje objekta, brisanje datoteke iz privremene // memorije & OnServer procedura PlaceObjectFile (Adresa TemporaryStorage)

DirectoryElement = FormInValue ("Objekat"); BinaryData = GetFileFrom TemporaryStorage (Adresa TemporaryStorage); DirectoryElement.FileData = NewValueStore (BinaryData); FileDiskPath = Nova datoteka (DirectoryElement.FileName); DirectoryElement.FileName = FilePathNaDisk.Name; DirectoryElement.Write (); Modifikacija = False; DeleteFileFrom Temporary Storage (Adresa privremene memorije); ValueVFormAttribute (DirectoryElement, "Object");

Kraj procedure

// Čitanje datoteke iz rekvizita i spremanje // na lokalni disk u interaktivnom načinu & Na klijentskoj proceduri ReadFile I Save OnDisk ()

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

Kraj procedure

Podrška za adrese u polju slike

Kontrola polja slike podržava prikazivanje slike određene adresom datoteke u privremenoj memoriji ili bazi podataka.

Da biste to učinili, u svojstvu podataka elementa obrasca morate navesti atribut tipa niza. Vrijednost ove varijable će se tumačiti kao adresa slike.

Primjer // Vezivanje polja slike za adresu slike u privremenoj // memoriji. AddressPictures form atribut string tipa

Datoteka mjesta (Adresa slike, istina)

Image.Data = Adresa slike

Ograničenja u radu sa Web klijentom

Rad opisanog mehanizma pri korištenju Web klijenta ima neka ograničenja. Ova ograničenja su povezana sa specifičnostima sigurnosnog modela pretraživača. Na primjer, klijent ne može sam spremiti datoteku u lokalni sistem datoteka, odnosno dostupna je samo interaktivna verzija klijentskih metoda PlaceFile () i GetFile (). Izuzetak se stvara kada se pokušava koristiti neinteraktivni način rada. Dijaloški okviri prikazani u interaktivnom načinu su specifični za određeni tip pretraživača.

Karakteristike pri radu sa Values ​​Store na klijentu

problem:

Kada dokument ima atribut tipa ValueStore u tabelarnom dijelu, to usporava otvaranje obrasca dokumenta ako ovaj atribut sadrži velike podatke.

Pretpostavljeni razlog:

Možda, kada se obrazac otvori, klijent ne prima link na podatke pohranjene u Values ​​Store-u, već na same podatke.

Rješenje

  • U svojstvima atributa tabele obrasca nalazi se zastavica „Uvek koristi“. Ako je postavljeno, tada se sadržaj polja uvijek prosljeđuje između servera i klijenta - na primjer, prilikom otvaranja obrasca. Ova zastavica mora biti onemogućena, ali to morate uzeti u obzir u kodu, jer po defaultu vrijednost ovog polja neće biti na klijentu. Primjer se može vidjeti u 1C: Arhiva.

Još bolje, koristite privremeno skladište za prijenos datoteka između klijenta i servera.

Ispis (Ctrl + P)

16.3. Rad sa binarnim podacima

16.3.1. opće informacije

Prilikom implementacije primijenjenih rješenja moguće su situacije kada je potrebno analizirati različite binarne podatke. Na primjer, potrebno je odrediti tip datoteke prema potpisu ili izvršiti neke manipulacije sa slikom. Za rad sa binarnim podacima, 1C: Enterprise nudi posebna softverska sučelja. Zatim ćemo razmotriti mogućnosti rada sa binarnim podacima.
Sav rad sa binarnim podacima zasniva se na konceptu toka. Flow Je logička generalizacija proizvoljnog (u opštem slučaju) izvora podataka (objekta toka). Sistem ne pruža mogućnost kreiranja nezavisnog Stream objekta koji nije povezan ni sa jednim izvorom. Ali postoje izvedeni objekti koje možete kreirati - tok povezan sa datotekom na disku (FileStream objekat) ili tok kreiran u memoriji (MemoryStream objekat). Strim vam omogućava i čitanje podataka i pisanje. Da bi se utvrdila mogućnost izvođenja određenih operacija, tok (i izvedeni objekti) imaju posebne metode koje vam omogućavaju da odredite koji
operacije su dostupne na ovom toku (metod AvailableRecord (), Dostupan Pročitaj (), AvailableChangePosition ()).
Ako trebate raditi sa streamom na višem nivou, posebno čitati / pisati podatke kao što je broj (različite širine bita) ili string, tada su objekti ReadData / WriteData namijenjeni za to. Uz pomoć ovih objekata moguće je pristupiti binarnim podacima koji se nalaze u toku na strukturiraniji način. Tako, na primjer, znajući format datoteke, možete prilično udobno čitati takvu datoteku, uzimajući potrebne podatke iz zaglavlja (koja su, po pravilu, predstavljena brojem i vrstama nizova), preskačući nepotrebne blokove podataka i učitavanje potrebnih podataka za obradu.
Opća šema za rad sa binarnim podacima može se predstaviti na sljedeći način:

  1. Prijem streama
  2. Kreiran je objekt DataReader ili DataWrite.
  3. Uz pomoć objekta kreiranog u koraku 2, izvode se potrebne radnje.
  4. Objekt kreiran u koraku 2 je zatvoren.
  5. Ako više nisu potrebne operacije, tok dobiven u koraku 1 se zatvara.
  6. Ako trebate nastaviti raditi sa streamom, možete postaviti novu poziciju u streamu (ako je ova operacija podržana) i nastaviti s radom od koraka 2.

Treba napomenuti da je moguće kombinovati klauzule 1 i 2. Drugim riječima, sistem pruža mogućnost kreiranja objekata ReadData / WriteData direktno iz, na primjer, objekta BinaryData.
Za obavljanje različitih operacija sa binarnim podacima, sistem pruža mogućnost dobijanja nekog dela toka kao zasebnog fragmenta sa slučajnim (bajt) pristupom (objekt BufferBinaryData). Veličina bafera je postavljena prilikom kreiranja i ne može se kasnije mijenjati. Kada radite sa baferom binarnih podataka, moguće je raditi sa brojevima različitih širina bitova kao sa
kao jedna celina. U ovom slučaju, moguće je odrediti redoslijed bajtova riječima: "little endian" ili "big endian". Također je moguće podijeliti jedan bafer na nekoliko i kombinirati više bafera binarnih podataka u jedan rezultirajući bafer.
Važno je napomenuti da rad sa baferom binarnih podataka može značajno pojednostaviti implementaciju ako se rad sa binarnim podacima implementira na strani klijentske aplikacije u asinkronom režimu. U ovom slučaju, čitanje podataka u bafer će se izvoditi asinkrono, a rad sa podacima u baferu je sinhroni.
Rad sa binarnim podacima dostupan je na strani klijenta (uključujući web klijenta) aplikacije i na strani servera, kao i u sinhronim i asinhronim šemama. U daljnjim primjerima koristit će se sinhrona shema rada.

16.3.2. Čitanje binarnih podataka

Kao primjer čitanja binarnih podataka razmotrićemo problem određivanja ispravnog formata datoteke koji je odabran u sistemu za dalju upotrebu. .wav datoteka sa audio podacima će se koristiti kao datoteka koju treba provjeriti. Za pohranjivanje .wav datoteka koristi se format datoteke za razmjenu resursa (RIFF), čiji je opis dat na linku:

https://msdn.microsoft.com/enus/library/windows/desktop/ee415713.aspx (na engleskom). Za primjer čitanja, koristit će se sljedeći format podataka:
1. prva 4 bajta datoteke sadrže identifikator formata: RIFF.
2. sljedeća 4 bajta sadrže veličinu stvarnih audio podataka u malom-endian redoslijedu bajtova.
3. sljedeća 4 bajta sadrže tekstualni tip korištenih podataka: WAVE.
Da biste dovršili ove korake, potreban vam je sljedeći inline kod:

Čitanje = Novo ReadData (FileName, Byte Order.LittleEndian);
Format datoteke = Read.ReadSymbols(4);
Veličina podataka = Read.ReadInteger32();
Tip datoteke = Read.ReadSymbols(4);
Ako je Format datoteke<>“RIFF” Onda
Izvještaj (“Ovo nije RIFF datoteka”);
Povratak ;
EndIf;
Ako je FileType = “WAVE” Onda
Izvještaj („Ovo je WAV datoteka sa podacima, veličinom“ + Veličina podataka + „bajtovi“);
Inače
Izvještaj („Ovo nije WAV datoteka“);
Povratak;
EndIf;

Razmotrimo primjer detaljnije.
Prvo se otvara datoteka, čije je ime sadržano u varijabli FileName, datoteka se otvara za čitanje ( File Open Mode.), oni će samo čitati iz datoteke ( File Access.Read) i 16-bajtni bafer će se koristiti za čitanje.
Zatim se formira tok za čitanje podataka, koji će biti najmanje značajnog reda bajtova za podatke tipa Broj. Zatim se iz rezultirajućeg toka čitaju 4 znaka, 32-bitni cijeli broj i još 4 znaka. Dobijeni podaci se analiziraju i na osnovu rezultata analize se donosi odluka da li je odabrana datoteka .wav datoteka ili ne.

16.3.3. Pisanje binarnih podataka

Upisivanje binarnih podataka u datoteku, u najjednostavnijem slučaju, radi se na sljedeći način:

Unos = Novo Snimanje podataka (FileName);
Za indeks = 0 do 255 ciklusa
Write.WriteByte (Indeks);
Kraj ciklusa;
Record.Close ();

Ovaj primjer upisuje u datoteku niz bajtova od 0 do 255 (0xFF u heksadecimalnom). Ovo je najjednostavnija opcija snimanja.
Također možete koristiti metodu sličnu metodi čitanja opisanom u prethodnom primjeru, kada se primi tok datoteke i podaci se upisuju u ovaj tok datoteke.

16.3.4. Rad sa baferom binarnih podataka

Kao što je gore spomenuto, bafer binarnih podataka pruža zgodan način za manipulaciju komadima binarnih podataka.
Podržano je ne samo čitanje podataka, već i pisanje.
Kao primjer, razmotrit ćemo raščlanjivanje zaglavlja RIFF datoteke iz primjera čitanja podataka (vidi ovdje). Za pravljenje primjera koristit će se potpuno iste informacije o formatu datoteke. Stoga je potrebno pročitati bafer veličine zaglavlja datoteke iz izvorne datoteke. Zaglavlje se sastoji od tri 4-bajtna polja. Dakle, potrebno je pročitati 12 bajtova.

Buffer = Novo BufferBinaryData(12);
Fajl = FileStreams.Open (TempFile Directory() + “Windows Logon.wav”, File Open Mode., File Access.Read);
File.Read (Buffer, 0, 12);
Veličina = Buffer.ReadInteger32(4);
LineStream = NewMemoryStream (Buffer);
StreamStrings.Go(0, PositionInStream.Start);

Format datoteke = ReadStrings.ReadSymbols(4, “windows-1251”);
ReadLines.Close();
StreamStrings.Go(8, PositionInStream.Start);
LineReader = NoviDataReader (LineStream);
Vrsta datoteke = ReadStrings.ReadCharacters ( 4, “windows-1251”);
ReadLines.Close();

Proces preuzimanja podataka u bafer binarnih podataka nije ništa posebno. Dalje operacije zahtijevaju neke komentare. Čitanje brojeva bilo koje podržane dubine bita je moguće sa bilo koje pozicije u međuspremniku. U ovom primjeru Buffer.ReadInteger32 (4); znači čitanje 32-bitnog cijelog broja počevši od 4 bajta bafera. Dakle, ako je potrebno pročitati nekoliko brojeva koji se nalaze na različitim mjestima u međuspremniku, to se može učiniti bez direktnog pozicioniranja u ovom baferu.
Čitanje stringa, međutim, nije podržano od strane bafera binarnih podataka. Stoga biste trebali koristiti objekat koji vam to omogućava: ReadingData. DataReader objekat se ne može kreirati na osnovu bafera binarnih podataka. Ali na osnovu bafera binarnih podataka, možete kreirati tok koji je univerzalni posrednik između lokacije fizičke memorije informacija (datoteka, bafer binarnih podataka) i objekta visoke razine koji vam omogućava rad s ovim podacima.
Kada se DataReader objekat kreira na osnovu toka, on počinje čitati podatke sa pozicije koja je trenutno postavljena u toku. Stoga se u primjeru prvo postavlja pozicija u toku, a zatim se kreira objekt DataReader i čita potreban broj znakova. Za detaljan opis razlike između broja bajtova i znakova pri čitanju nizova, pogledajte sljedeći odjeljak 16.3.5

16.3.5. Karakteristike upotrebe

Prilikom korištenja binarnih podataka treba uzeti u obzir posebnosti rada sa podacima tipa String. Posebnost je u tome što se dužina stringa koji vraća funkcija globalnog konteksta StrLength () mjeri u znakovima. Simboli bi trebali označavati veličine čitanja/pisanja podataka u metodama pisanja/čitanja linija u objektima za rad sa binarnim podacima ( ReadSymbols (),
ReadString (), WriteSymbols (), WriteString ()). Istovremeno, ne postoji jednoznačna opcija za pretvaranje dužine stringa u znakovima u sličan parametar u bajtovima. Ovisno o sadržaju niza i kodiranju, ovaj omjer će biti različit. Stoga, kada radite sa bilo kojom strukturom podataka koja uključuje nizove promjenjive dužine, trebali biste jasno razumjeti u kojim jedinicama se izražavaju dužine stringova.
Ako je u dostupnim podacima dužina niza naznačena u bajtovima, a niz je naveden u višebajtnom kodiranju promjenjive dužine (na primjer, UTF-8), tada je korištenjem objekata za rad s binarnim podacima općenito nemoguće pročitati takvu strukturu iz datoteke u podatke tipa String.
Ali u ovom slučaju možete lako promijeniti poziciju čitanja/pisanja u toku datoteke. Ako je dužina niza navedena u znakovima, tada postaje moguće pročitati takav niz u podatke tipa String, ali postaje nemoguće promijeniti poziciju čitanja/pisanja u takvom toku.
Da biste dobili dužinu niza u bajtovima, možete koristiti sljedeću funkciju za pretvaranje stringa u objekt BinaryData:

Funkcija GetBinaryDataFromStrings(StrParameter vrijednosti, kodiranje vrijednosti = "UTF-8")
Memorijski tok = Novi tok memorije;
Writer = Novo Pisanje podataka (memory Stream);
Writer.WriteString(StrParameter, Encoding);
Writer.Close();
Vratite StreamMemory.Close I GetBinaryData();
EndFunction

Stvarna veličina u bajtovima može se dobiti pozivanjem funkcije Size () objekta BinaryData, koja se dobiva kao rezultat funkcije.
Ne preporučuje se istovremena upotreba objekata ReadData / WriteData i streaming objekata. Ako između dvije uzastopne operacije čitanja iz ReadData ili dvije uzastopne operacije pisanja u WriteData dođe do promjene pozicije u toku s kojim se objekti H Streaming podataka / Pisanje podataka- baca se izuzetak. Dakle, sljedeći primjer demonstrira ispravnu promjenu pozicije u toku prilikom pisanja podataka u stream:

Stream = New StreamInMemory ();

WriteData.WriteString("Zdravo svijete!");
Snimanje podataka. Zatvori();
Stream.Go (0, PositionInStream.Start);
Zapis podataka = Novi zapis podataka (Stream);
WriteData.WriteString("Do!");
Snimanje podataka. Zatvori();
Sljedeći primjer hi izbacio je izuzetak:

Stream = New StreamInMemory ();

WriteData.WriteStrok ("Zdravo, svijet!");
Stream.Go (0, PositionInStream.Start);
// Sljedeći red će izbaciti izuzetak
WriteData.WriteString ("Zbogom!");
Istovremeno, moguće su situacije kada će ponašanje sistema biti pogrešno, ali neće biti generirane greške:

Stream = GetStream ();
ReadData = Novi ReadData (Stream);
TestString = ReadData.Read ();
SourcePosition = Stream.CurrentPosition ();
Zapis podataka = Novi zapis podataka (Stream);
WriteData.WriteString ("Neočekivani niz");
Data Recording.Close ();
Stream.Go (OriginPosition, PositionInStream.Start);
// Općenito, nemoguće je odrediti koja će vrijednost biti smještena u varijablu TestString2
TestString2 = ReadData.ReadString ();

Ponašanje opisano u ovom odjeljku je zbog činjenice da o Objekti ReadData / WriteData koriste svoje vlastite bafere kada rade sa streamom. Kao rezultat toga, stvarna pozicija toka se razlikuje od logičke pozicije koja se formira kao rezultat izvršenih operacija.
Također, nije podržana istovremena upotreba objekata Data Read i Data Writer, koji koriste istu nit za svoj rad.

Tehnološka platforma 1C: Enterprise 8 vam omogućava da spremate proizvoljne datoteke u infobazu, primate ih odatle i koristite na različite načine. Razmotrimo ove operacije na primjerima.

Prije preuzimanja datoteke u 1C infobazu, morate dobiti punu adresu datoteke na disku. Rad sa dijalozima za odabir datoteka opisan je u.

Za pohranjivanje datoteka, props (ili registarski resurs) s tipom StorageValues.

Učitavanje proizvoljnog fajla u 1C infobazu

Bilo koja datoteka može biti predstavljena kao binarni podatak i učitana u StoreValues.

Prilikom pretvaranja binarnih podataka u objekt StorageValues konstrukcija se koristi newValueStore (podaci, kompresija) sa dva parametra:

  1. Podaci- binarni podaci koji se stavljaju u skladište
  2. Kompresija- omjer kompresije algoritma deflacije. Cijeli broj u rasponu -1 ... 9. -1 je zadani omjer kompresije. 0 - nema kompresije, 9 - maksimalni omjer kompresije. Zadana vrijednost: -1. Parametar je opcionalan; ako nije naveden, kompresija se ne koristi.

// Pretvorite datoteku u binarne podatke
Fajl = Novi binarni podaci (putanja);

// Kreirajte novi StoreValues ​​objekat

Skladište podataka = New Value Store (Datoteka, Nova kompresija podataka (9));

Spremanje proizvoljne datoteke iz 1C infobaze na disk

Da biste spremili datoteku iz 1C baze podataka na disk, morate odrediti stazu i naziv datoteke. Za to postoji dijalog za čuvanje datoteke, rad s kojim je opisan u.

// Dobivanje binarnih podataka iz skladišta
// DataStore - atribut objekta s tipomValuesStorage

// Zapisuje primljene podatke na disk
// Varijabla Putanja sadrži punu adresu datoteke na disku
Podaci. Pisanje (putanja);

Pregledanje datoteke koja se nalazi u 1C infobazi

Za pregled datoteke sačuvane u bazi podataka, na računaru mora biti instalirana aplikacija koja otvara ovu datoteku.

// Dobivamo naziv privremene datoteke sa potrebnom ekstenzijom
// U varijablu Extension morate staviti ekstenziju datoteke, na primjer "pdf"
Putanja = GetTemporaryFileName (Extension);

// Dobivanje podataka iz skladišta
// DataStore - atribut objekta s tipomValuesStorage
Podaci = Skladište podataka. Receive() ;

// Upisuje podatke u privremenu datoteku
Podaci. Pisanje (putanja);

// Pokušavam otvoriti datoteku u predviđenoj aplikaciji
// Ako aplikacija nije pronađena, pojavit će se sistemski dijalog "Otvori sa...".
LaunchApplication (putanja);

Top srodni članci