Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Windows 8
  • Si të lexoni të dhënat binare 1s. Zgjerimi i funksionalitetit të punës me të dhëna binare

Si të lexoni të dhënat binare 1s. Zgjerimi i funksionalitetit të punës me të dhëna binare

Të dhënat binare në 1C janë krijuar për të ruajtur skedarë të formatit arbitrar. Me ndihmën e tyre, ju mund të:

  • Organizoni ndërveprimin duke përdorur një protokoll binar me pajisje të ndryshme;
  • Ruani skedarët e çdo formati si një atribut të një objekti të meta të dhënave;
  • Konvertoni të dhënat e tekstit në binare (më shpesh përdoren për të dërguar raporte);
  • Punoni me të dhëna binare në memorie.

Çfarë mund të sistemit

Kur punoni me të dhëna binare, platforma 8.3 mund të bëjë sa më poshtë:

  1. Kryen leximin dhe shkrimin e të dhënave binare;
  2. Zhvendosni të dhënat nga klienti në server dhe mbrapa duke përdorur ruajtje të përkohshme;
  3. Inicializoni një objekt të tipit "Picture" duke përdorur skedarë binare;
  4. Lexoni ato nga World Wide Web duke përdorur objektet MailAttachment, HTTPConnection, etj.
  5. Përdorni mjete kriptografike për të kriptuar dhe nënshkruar bashkëngjitjet e ndjeshme;
  6. Llogaritni funksionin hash duke përdorur objektin DataHashing.

Ruajtja e të dhënave në rekuizita

Për shembull, le të krijojmë një direktori në një konfigurim provë.

Në fakt, përdorimi i të njëjtit direktorium për të ruajtur informacionin në lidhje me nomenklaturën dhe të dhënat e imazheve binare është paksa i gabuar. Me sasi mjaft të mëdha të dhënash dhe skedarë të rëndë me përmasa të mëdha, mund të ndodhin ndërprerje të padëshiruara dhe "frena" në sistem. Nga pikëpamja e sistemit, do të ishte shumë më korrekte të organizonim një direktori të veçantë "Pictures", një lidhje në të cilën mund të vendosnim si një lloj atributi.


Është e rëndësishme të theksohet se meqenëse atributet e tipit "ValueStorage" që përmbajnë të dhëna binare nuk janë të disponueshme në modalitetin e aplikacionit të menaxhuar, ato mund të aksesohen vetëm duke përdorur metodën FormAttributesToValue.


Fusha e mesazhit përfaqëson një hyrje binar të të dhënave për ruajtjen e vlerave.

Leximi i të dhënave nga mbështetësit

Le të krijojmë një përpunim që do të nxjerrë skedarin e ruajtur në formë binare në konfigurimin tonë në një dokument spreadsheet (kjo është e nevojshme, për shembull, për të printuar një logo të kompanisë).


Në thelb, ky është i gjithë kodi që na nevojitet. Duke përdorur operatorin Get(), lexojmë të dhënat binare të ruajtura në atributin përkatës të referencës dhe i transferojmë ato në objektin "Picture", i cili do të shfaqet në qelizën e sipërme të majtë të dokumentit të fletëllogaritjes së formularit (Fig. 9).

Fig.9

Konvertimi i të dhënave

Rrallëherë, por ndodh që kur punoni me shkëmbime jo standarde me sisteme të jashtme, është e nevojshme të konvertohen të dhënat nga një format binar në formatin Base64 ose anasjelltas.

Në shumicën e rasteve, platforma konverton në mënyrë të pavarur të dhënat, nëse kjo nuk ndodh, duhet të përdorni funksionet globale të përkthimit:

  1. Base64String - e përkthen vlerën e dhënë në një varg të kodimit përkatës;
  2. Base64Value - bën konvertimin e kundërt.

Optimizimi i kodit të mësipërm

Kodi i paraqitur në Fig. 4 sigurisht që funksionon, por me një paralajmërim domethënës: nëse kutia e kontrollit "Modaliteti i përdorimit të modalitetit" kontrollohet në vetitë e konfigurimit (Fig. 10). Përndryshe, përdorimi i tij do të shkaktojë një gabim.
Fig.10

Për të parandaluar që kjo të ndodhë, ndërsa jeni në modulin e formës së elementit referues, shkoni te menyja Tekst->Rifaktorimi->Thirrjet sinkrone të vjetruara->Transformoni thirrjet e modulit.

Pas ca kohësh, thirrjet sinkrone do të konvertohen automatikisht në ato asinkrone dhe kodi do të duket si (Fig. 11)

Fig.11

Ju mund të ruani pothuajse çdo informacion në një dyqan vlerash, për shembull,

... foto (foto):

CurrentImage.Object = TextFabric.Reference; CurrentImage.DataType = Enumerations.Types of AdditionalObjectsInformation.Image; Storage = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// në këtë vend shfaq gjithçka...FormElements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...dokumenti i fletëllogaritjes:

TabDoc=Dokument i ri Spreadsheet; TabDoc.Output(FormElements.FieldofSpreadsheetDocument1); Storage=NewValueStorage(TabDoc); Shkruaj();

Procedura e Fundit

Procedura RestoreNgaStorageClick(Article)

TabDoc=Storage.Get(); Nëse TabDoc<>Të padefinuara ThenFormElements.SpreadsheetDocumentField1.Output(TabDoc); FundNëse;

Procedura e Fundit

... skedarë arbitrarë (të dhëna binare):

XS = NewValueStorage(New BinaryData(skedar));

Tetë mbështet kompresimin e të dhënave të vendosura në ruajtje:

XS = NewValueStorage(New BinaryData(skedar),NewCompression(9));

... përpunimi dhe raportimi i jashtëm:

Procedura LoadProcessingToStorage (AttributeTypeStorage)

Shkalla e Kompresimit = Kompresimi i të Dhënave të Re (9); //9 maksimumi PropsStorageType = NewStorageValues(NewBinaryData("c:\reports\report.epf", Shkalla e Kompresimit));

Procedura e Fundit

Procedura Fillimi i përpunimit nga ruajtja (AttributeTypeStorage)

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

Procedura e Fundit

Puna me ruajtje

Nëse ishte BinaryData, atëherë ato mund të rikthehen nga ruajtja e vlerave duke përdorur metodën Get dhe të shkruajnë në një skedar duke përdorur metodën Write().

IfTypeVnch (Storage)<>Shkruani ("BinaryData") Pastaj

BinaryData = Storage.Get();

BinaryData = Magazinimi;

FundNëse; BinaryData.Write(Emri i skedarit);

Nëse ishte, për shembull, një dokument Word (skedar doc, ose një skedar tjetër i një lloji të regjistruar), atëherë mund të hapet si kjo:

StartApplication (Emri i skedarit);

Për të pastruar një fushë të tipit Value Storage, duhet ta caktoni atë në Padefinuar:

PropsStorage = I papërcaktuar;

Puna me skedarë dhe fotografi në gjuhën e integruar 1C: Enterprise 8

Qëllimi

Aplikacioni i menaxhuar ka një mekanizëm të ri për të punuar me skedarë. Ai siguron shkëmbim skedarësh midis infobazës dhe aplikacionit të klientit. Një tipar i këtij mekanizmi është se ai është i përqendruar në përdorimin në një klient të hollë dhe klient Web dhe është projektuar duke marrë parasysh kufizimet në punën me skedarët e vendosur nga shfletuesit e uebit.

Mekanizmi është një grup metodash që mund të përdoren për të vendosur të dhënat e ruajtura në nivel lokal nga përdoruesi në ruajtjen e përkohshme të bazës së informacionit, për ta transferuar këtë informacion nga ruajtja e përkohshme në bazën e të dhënave dhe për t'i rikthyer në kompjuterin e përdoruesit. Detyrat më të zakonshme të aplikimit të zgjidhura nga ky mekanizëm janë ruajtja e informacionit shoqërues, për shembull, imazhet e mallrave, dokumentet që lidhen me kontratat, etj.

Fushëveprimi i Metodave

Ruajtja e përkohshme

Ruajtja e përkohshme është një zonë e specializuar e infobazës ku mund të vendosen të dhënat binare. Qëllimi kryesor është ruajtja e përkohshme e informacionit gjatë ndërveprimit klient-server përpara se ai të transferohet në bazën e të dhënave.

Nevoja për ruajtje të përkohshme lind nga fakti se modeli i shfletuesit të internetit kërkon transferimin e skedarit të zgjedhur nga përdoruesi drejtpërdrejt në server pa mundësinë e ruajtjes së tij në klient. Kur një skedar transferohet, ai vendoset në ruajtje të përkohshme dhe vetëm atëherë mund të përdoret kur shkruani një objekt në bazën e të dhënave.

Detyra më tipike e aplikuar e zgjidhur nga ruajtja e përkohshme është sigurimi i aksesit në skedarë ose fotografi përpara se objekti të shkruhet në bazën e informacionit, për shembull, në formën e një elementi.

Një skedar ose të dhëna binare të vendosura në ruajtje identifikohen nga një adresë unike që më vonë mund të përdoret në operacionet e shkrimit, leximit ose fshirjes. Kjo adresë jepet me metoda për të shkruar një skedar në ruajtje të përkohshme. Një metodë e veçantë në gjuhën 1C:Enterprise ju lejon të përcaktoni nëse adresa e kaluar është një adresë që tregon të dhënat në ruajtje të përkohshme.

Baza e informacionit

Mekanizmi lejon aksesin në të dhënat binare të ruajtura në atributet e tipit ValueStorage.

Ashtu si në rastin e ruajtjes së përkohshme, qasja në informacion është e mundur përmes një adrese të veçantë. Ju mund ta merrni atë përmes një metode të veçantë, duke kaluar një lidhje me një objekt ose një çelës regjistrimi të regjistrit të informacionit dhe emrin e atributit. Në rastin e një seksioni tabelor, kërkohet gjithashtu që të kalohet indeksi i rreshtit të seksionit tabelor.

Metodat për të punuar me skedarë janë të kufizuara kur punoni me detajet e bazës së informacionit. Për ta, ndryshe nga ruajtja e përkohshme, disponohet vetëm leximi i informacionit, por jo shkrimi ose fshirja e tij.

Përshkrimi i metodave për të punuar me skedarë

Ruajtja e të dhënave në ruajtje të përkohshme

Skenari më tipik për përdorimin e këtij mekanizmi përfshin vendosjen fillestare të të dhënave të përdoruesit në ruajtje të përkohshme. Ekzistojnë dy metoda për këtë: PlaceFile() dhe PlaceFileToTempStorage().

Metoda e parë, PlaceFile(), vendos një skedar nga sistemi lokal i skedarëve në ruajtje të përkohshme. Metoda mund të pranojë një adresë të synuar në dyqan. Nëse nuk është i përcaktuar ose është një varg bosh, atëherë do të krijohet një skedar i ri dhe metoda do të kthejë adresën e saj përmes parametrit përkatës.

Nëse parametri që përcakton mënyrën ndërvepruese të funksionimit është i vërtetë, atëherë metoda do të shfaqë një kuti dialogu të përzgjedhjes standarde të skedarit, në të cilën mund të zgjidhni një skedar për ta ruajtur në ruajtje. Në këtë rast, metoda do të kthejë gjithashtu adresën e skedarit të zgjedhur.

Si rezultat, metoda kthen False nëse përdoruesi në mënyrë interaktive refuzon të kryejë operacionin në dialogun e përzgjedhjes së skedarit. Metoda është e disponueshme vetëm për klientin.

Metoda e dytë, PutFileInTempStorage(), është e ngjashme me atë të mëparshmen, me përjashtim të faktit se është e disponueshme në server dhe të dhënat që do të shkruhen në ruajtje të përkohshme përfaqësohen jo si një shteg në sistemin e skedarëve, por si një variabël i llojit. Të dhënat binare. Në mënyrë të ngjashme, nëse nuk specifikohet adresa e synuar, krijohet një skedar i ri në depo. Adresa e tij kthehet si rezultat i funksionit.

Marrja e një skedari nga ruajtja e përkohshme

Kur shkruani një objekt në bazën e informacionit, mund t'ju duhet të nxirrni të dhëna nga ruajtja e përkohshme dhe t'i vendosni ato, për shembull, në një atribut. Ekziston një metodë përkatëse e serverit për këtë - GetFileFromTemporaryStorage(). Kjo metodë merr të dhëna nga ruajtja e përkohshme dhe si rezultat i kthen ato. Për ta bërë këtë, duhet të specifikoni adresën në ruajtjen e përkohshme. Kjo adresë kthehet me metodat e mësipërme PutFile() dhe PutFileToTempStorage() nëse është e suksesshme.

Fshirja e një skedari nga ruajtja e përkohshme

Pasi të dhënat të ruhen në atribut, skedari në ruajtje të përkohshme mund të fshihet. Për ta bërë këtë, ekziston metoda DeleteFileFromTemporaryStorage(), e cila fshin një skedar nga ruajtja e përkohshme. Metoda merr si parametër adresën e një skedari në ruajtje të përkohshme. në dispozicion në server.

Kontrollimi nëse një adresë i përket një ruajtjeje të përkohshme

Adresa e skedarit mund të tregojë si për ruajtjen e përkohshme ashtu edhe për detajet në bazën e informacionit. Për të kontrolluar llojin e tij, ekziston metoda ThisTemporalStorageAddress().

Kontrollon që adresa e kaluar është një adresë që tregon një dyqan. Kthen True nëse adresa tregon për ruajtjen e përkohshme. Metoda është e disponueshme në server.

Marrja e adresës së mbështetësve

Pasi të dhënat vendosen në mbështetëset në bazën e informacionit, mund të jetë e nevojshme t'i qaseni duke përdorur metodat e skedarëve.

Por, përpara se të merrni të dhëna, për shembull, nga një atribut, duhet të merrni adresën e këtij atributi. Ekziston një metodë GetFileAddressInInfobase() për këtë.

Qëllimi i tij është të kthejë adresën e skedarit në infobazë sipas parametrave origjinalë. Për ta bërë këtë, duhet të kaloni çelësin e objektit (mund të jetë ose një lidhje me objektin ose një çelës regjistrimi i regjistrit të informacionit) dhe emrin e atributit. Nëse ju duhet të merrni adresën e një skedari të ruajtur në një atribut të seksionit tabelor, përpara emrit të atributit në parametrin që specifikon emrin e atributit, duhet të shtoni emrin e seksionit tabelor dhe një pikë "." Metoda është e disponueshme si në klient ashtu edhe në server.

Marrja e një skedari nga baza e informacionit

Metoda GetFile() merr një skedar nga infobaza dhe e ruan atë në sistemin lokal të skedarëve të përdoruesit. Parametri i parë specifikon adresën e skedarit në atributin ose në ruajtjen e përkohshme të skedarit. Parametri i dytë specifikon destinacionin e skedarit që rezulton. Në modalitetin jo-interaktiv, duhet të specifikoni shtegun. Në modalitetin interaktiv, parametri është opsional.

Si parazgjedhje, metoda ekzekutohet në modalitetin interaktiv, domethënë parametri i fundit është i vërtetë. Kjo do të thotë që shfaqet një kuti dialogu në të cilën mund të specifikoni veprimin me skedarin e marrë: ekzekutoni ose ruani në një vendndodhje të caktuar nga përdoruesi. Nëse modaliteti ndërveprues është aktiv dhe shtegu i Destinacionit te skedari në parametrin e diskut nuk është specifikuar, atëherë operacioni i hapjes së skedarit nuk është i disponueshëm. Kthen një vlerë boolean. False do të thotë që përdoruesi ka zgjedhur të anulojë operacionin në dialogun e skedarit të ruajtjes në internet.

Një shembull i përdorimit të metodave të skedarëve

// Merrni skedarin nga disku në mënyrë interaktive // ​​dhe vendoseni në ruajtje të përkohshme &Procedura AtClient SelectFileCDDiskAndWrite()

Variabli SelectedName; Adresa e ndryshueshme e ruajtjes së përkohshme; Nëse PutFile(TempStorageAddress, SelectedName, True) Atëherë Object.FileName = SelectedName; PlaceObjectFile(AddressTemporaryStorage); FundNëse;

Procedura e Fundit

// Kopjimi i një skedari nga ruajtja e përkohshme në një atribut //, shkrimi i një objekti, fshirja e një skedari nga ruajtja e përkohshme // &Procedura në Server PlaceObjectFile(TemporaryStorageAddress)

Elementi i Drejtorisë = FormAttributeToValue("Objekt"); BinaryData = GetFileFromTempStorage(TempStorageAddress); DirectoryItem.FileData = NewValueStorage(BinaryData); FilePathOnDisk = Skedari i ri (DirectoryItem.FileName); Elementi i katalogut.Emri i skedarit = FilePathOnDisk.Name; ElementDirectory.Write(); i modifikuar = i rremë; DeleteFileFromTemporaryStorage(AddressTemporaryStorage); ValueVFormAttribute(DirectoryItem, "Object");

Procedura e Fundit

// Leximi i skedarit nga atributi dhe ruajtja e tij // në diskun lokal në modalitetin interaktiv &AtClient Procedura ReadFileAndSaveToDisk()

Adresa = GetFileAddressInInfobase(Object.Link, "FileData"); GetFile (Adresa, Object.FileEmri, True);

Procedura e Fundit

Mbështetje për adresat në fushën e figurës

Kontrolli i fushës së imazhit mbështet shfaqjen e një imazhi të specifikuar nga adresa e një skedari në ruajtje të përkohshme ose në bazën e të dhënave.

Për ta bërë këtë, në veçorinë Data e elementit të formës, duhet të specifikoni një atribut tip vargu. Vlera e këtij atributi do të interpretohet si adresa e imazhit.

Shembull // Lidhja e fushës së imazhit me adresën e imazhit në ruajtje të përkohshme //. Forma AddressImage mbështet llojin e vargut

PlaceFile (ImageAddr, True)

Image.Data = Image Address

Kufizimet kur punoni me klientin në ueb

Funksionimi i mekanizmit të përshkruar kur përdorni Web Client ka disa kufizime. Këto kufizime lidhen me veçoritë e modelit të sigurisë së shfletuesit. Kështu, për shembull, klienti nuk mund ta ruajë skedarin në sistemin lokal të skedarëve vetë, domethënë është i disponueshëm vetëm versioni interaktiv i metodave të klientit PlaceFile() dhe GetFile(). Përpjekja për të përdorur modalitetin jo-interaktiv hedh një përjashtim. Kutitë e dialogut të shfaqura në mënyrë interaktive janë specifike për një lloj të caktuar shfletuesi.

Veçoritë kur punoni me Value Store te klienti

Problemi:

Kur një Dokument në seksionin tabelor ka një atribut të tipit ValueStorage, ai ngadalëson hapjen e formularit të dokumentit nëse ky atribut përmban të dhëna të mëdha.

Arsyeja e sugjeruar:

Ndoshta, kur hapet formulari, klientit nuk i dërgohet një lidhje me të dhënat në Dyqanin e Vlerave, por vetë të dhënat.

Zgjidhje

  • Ekziston një flamur "Përdor gjithmonë" në vetitë e atributit të tabelës së formularit. Nëse është vendosur, atëherë përmbajtja e fushës transferohet gjithmonë midis serverit dhe klientit - për shembull, kur hapet një formular. Ky flamur duhet të çaktivizohet, por duhet ta merrni parasysh këtë në kod, pasi si parazgjedhje nuk do të ketë asnjë vlerë për këtë fushë në klient. Një shembull mund të shihet në 1C: Arkivi.

Është edhe më mirë të përdoret ruajtje e përkohshme për të transferuar skedarë midis klientit dhe serverit.

Print (Ctrl+P)

16.3. Puna me të dhëna binare

16.3.1. informacion i pergjithshem

Gjatë zbatimit të zgjidhjeve të aplikuara, situatat janë të mundshme kur është e nevojshme të analizohen të dhëna të ndryshme binare. Për shembull, kërkohet të përcaktohet lloji i skedarit me nënshkrim ose të kryhen disa manipulime me figurën. 1C: Enterprise ofron ndërfaqe të veçanta programimi për të punuar me të dhëna binare. Më pas do të shqyrtohen mundësitë për të punuar me të dhëna binare.
E gjithë puna me të dhëna binare bazohet në konceptin e një rryme. Rrjedhaështë një përgjithësim logjik i një burimi arbitrar (në përgjithësi) të të dhënave (objekti Stream). Sistemi nuk ofron një mundësi për të krijuar një objekt të pavarur Stream që nuk është i lidhur me asnjë burim. Por ka objekte të prejardhura që mund të krijohen - një rrjedhë e lidhur me një skedar në disk (objekt FileStream) ose një rrjedhë e krijuar në memorie (objekt Memory Stream). Një transmetim ju lejon të lexoni dhe shkruani të dhënat. Për të përcaktuar mundësinë e kryerjes së operacioneve të caktuara, rryma (dhe objektet e prejardhura) kanë metoda të veçanta që ju lejojnë të përcaktoni se cilat
operacionet janë të disponueshme me rrjedhën e dhënë (metodat AvailableRecord(), E disponueshmeLexo(), AvailableChangePosition()).
Nëse keni nevojë të punoni me një transmetim në një nivel më të lartë, në veçanti, të lexoni/shkruani të dhëna të tilla si një numër (me bit të ndryshëm) ose një varg, atëherë objektet ReadData /WriteData janë të destinuara për këtë. Me ndihmën e këtyre objekteve, është e mundur të kemi një qasje më të strukturuar ndaj të dhënave binare të vendosura në rrymë. Kështu, për shembull, duke ditur formatin e një skedari, mund ta lexoni me lehtësi një skedar të tillë, duke marrë të dhënat e nevojshme nga titujt (të cilët, si rregull, përfaqësohen nga numri dhe llojet e vargjeve), duke anashkaluar blloqet e panevojshme të të dhënave dhe duke ngarkuar ato të nevojshme për përpunim.
Skema e përgjithshme për të punuar me të dhëna binare mund të përfaqësohet si më poshtë:

  1. Transmetimi po vazhdon
  2. Krijohet një objekt DataReader ose DataWrite.
  3. Me ndihmën e objektit të krijuar në hapin 2 kryhen veprimet e kërkuara.
  4. Objekti i krijuar në hapin 2 është i mbyllur.
  5. Nëse nuk ka nevojë të kryhen më operacione, rryma e marrë në hapin 1 mbyllet.
  6. Nëse dëshironi të vazhdoni të punoni me transmetimin, atëherë mund të vendosni një pozicion të ri në transmetim (nëse ky operacion mbështetet) dhe të vazhdoni të punoni nga hapi 2.

Duhet të theksohet se është e mundur të kombinohen pikat 1 dhe 2. Me fjalë të tjera, sistemi ofron mundësinë për të krijuar objekte Lexoni të Dhënat/Shkruani të Dhënat menjëherë nga, për shembull, një objekt BinaryData.
Për të kryer operacione të ndryshme me të dhëna binare, sistemi ofron mundësinë për të marrë një pjesë të rrymës si një fragment të veçantë me akses arbitrar (bajt pas bajt) (objekt). BufferBinary Data). Madhësia e buferit është vendosur në krijimin dhe nuk mund të ndryshohet më vonë. Kur punoni me një bufer binar të të dhënave, është e mundur të punoni me numra me kapacitet të ndryshëm si me
në tërësi. Në të njëjtën kohë, është e mundur të specifikoni rendin e bajtit me fjalë: "junior-senior" (endian i vogël) ose "senior-junior" (endian i madh). Është gjithashtu e mundur të ndahet një bufer në disa bufera dhe të bashkohen disa bufera të të dhënave binare në një bufer që rezulton.
Është e rëndësishme të theksohet se puna me buferin e të dhënave binar mund të thjeshtojë ndjeshëm zbatimin nëse puna me të dhënat binare zbatohet në anën e aplikacionit të klientit në modalitetin asinkron. Në këtë rast, leximi i të dhënave në tampon do të jetë një operacion asinkron, dhe puna me të dhënat e buferit është sinkron.
Puna me të dhëna binare është e disponueshme në anën e aplikacionit të klientit (përfshirë klientin në ueb) dhe në anën e serverit, si dhe në skemat sinkrone dhe asinkrone të punës. Shembuj të mëtejshëm do të përdorin skemën e funksionimit sinkron.

16.3.2. Leximi i të dhënave binare

Si shembull i leximit të të dhënave binare, ne do të shqyrtojmë problemin e përcaktimit të formatit të saktë të skedarit që zgjidhet në sistem për përdorim të mëtejshëm. Një skedar .wav me të dhëna audio do të përdoret si skedari që do të kontrollohet. Për të ruajtur skedarët .wav, përdoret Formati i skedarit të shkëmbimit të burimeve (RIFF), përshkrimi i të cilit jepet në lidhjen:

https://msdn.microsoft.com/enus/library/windows/desktop/ee415713.aspx (në anglisht). Për shembullin e leximit, do të përdoren të dhënat e formatit të mëposhtëm:
1. 4 bajtët e parë të skedarit përmbajnë identifikuesin e formatit: RIFF.
2. 4 bajtët e ardhshëm përmbajnë madhësinë e të dhënave aktuale të audios në rendin e bajtit pak-endian.
3. 4 bajtët e ardhshëm përmbajnë llojin e tekstit të të dhënave të përdorura: WAVE.
Për të kryer këto hapa, do t'ju duhet kodi i mëposhtëm 1C: Enterprise:

Lexo = E re ReadData (Emri i skedarit, ByteOrder.LittleEndian);
FileFormat = Read.Read Characters(4);
DataSize = Read.ReadInteger32();
FileType = Read.Read Characters(4);
Nëse formati i skedarit<>"RIFF" Pastaj
alert ("Ky nuk është një skedar RIFF");
Kthimi ;
FundNëse;
Nëse FileType = "WAVE" Atëherë
Raporti ("Ky është një skedar WAV me të dhëna, madhësia " + DataSize + " bytes");
Përndryshe
Njoftoni ("Ky nuk është një skedar WAV");
Kthimi;
FundNëse;

Le të shqyrtojmë një shembull në më shumë detaje.
Së pari, skedari emri i të cilit gjendet në variablin FileName hapet, skedari hapet për lexim ( FileOpenMode.Open), do të lexohet vetëm nga skedari ( FileAccess.Lexo) dhe një bufer 16-bajtë do të përdoret për lexim.
Më pas formohet një rrymë për të lexuar të dhënat, e cila do të ketë rendin e bajtit "pak-lartë" për të dhënat e tipit Number. Më pas lexohen 4 karaktere nga rrjedha që rezulton, një numër i plotë 32-bit dhe 4 karaktere të tjera. Të dhënat që rezultojnë analizohen dhe, në bazë të rezultateve të analizës, vendoset nëse skedari i përzgjedhur është skedar .wav apo jo.

16.3.3. Shkruani të dhëna binare

Shkrimi i të dhënave binare në një skedar, në rastin më të thjeshtë, bëhet si më poshtë:

Hyrja = E re WriteData (Emri i skedarit);
Për Indeksin = Cikli 0 deri në 255
Write.WriteByte(Indeksi);
Cikli i Fundit;
Record.Close() ;

Ky shembull shkruan në një skedar një sekuencë bajtësh nga 0 në 255 (0xFF në heksadecimal). Kjo është hyrja më e thjeshtë.
Ju gjithashtu mund të përdorni një metodë të ngjashme me metodën e leximit të diskutuar në shembullin e mëparshëm, kur merret një transmetim skedari dhe të dhënat shkruhen në këtë transmetim skedari.

16.3.4. Puna me Bufferin e të Dhënave Binar

Siç u përmend më lart, buferi i të dhënave binare ofron një mënyrë të përshtatshme për të manipuluar pjesët e të dhënave binare.
Mbështetet jo vetëm leximi i të dhënave, por edhe shkrimi.
Si shembull, analizimi i kokës së skedarit RIFF nga shembulli i leximit të të dhënave (shih këtu) do të konsiderohet. Saktësisht i njëjti informacion i formatit të skedarit do të përdoret për të ndërtuar shembullin. Kështu, është e nevojshme të lexohet nga skedari burimor një bufer me madhësinë e kokës së skedarit. Kreu përbëhet nga tre fusha 4-bajtë. Kështu, është e nevojshme të lexoni 12 bajt.

Buffer = E re BufferBinary Data(12);
Skedari = FileStreams.Open(Direktoria TempFiles() + "Windows Logon.wav", FileOpenMode.Open, FileAccess.Lexo);
File.Read(Buffer, 0, 12);
Madhësia = Buffer.ReadInteger32(4);
StringStream = New StreamInMemory(Buffer);
StreamString.Kërcim(0, PositionInStream.Start);

Formati i skedarit = ReadString.ReadCharacters(4, "windows-1251");
Reading Line.Mbyll();
StreamString.Kërcim(8, PositionInStream.Start);
StringReader = NewDataReader(StringStream);
Lloji i skedarit = ReadString.Read Characters( 4, "windows-1251");
Reading Line.Mbyll();

Procesi i marrjes së të dhënave në buferin binar të të dhënave nuk është asgjë e veçantë. Operacionet e mëtejshme kërkojnë disa komente. Leximi i numrave të çdo thellësie të bitit të mbështetur është i mundur nga çdo pozicion buferi. Në këtë shembull Buffer.ReadInteger32(4); do të thotë të lexosh një numër të plotë 32-bit që fillon në bajtin 4 të buferit. Kështu, nëse keni nevojë të lexoni disa numra të vendosur në vende të ndryshme në tampon, kjo mund të bëhet pa pozicionim të drejtpërdrejtë në këtë bufer.
Leximi i një vargu, megjithatë, nuk mbështetet nga buferi binar i të dhënave. Prandaj, duhet të përdorni një objekt që ju lejon ta bëni këtë: ReadData . Një objekt DataReader nuk mund të krijohet nga një bufer binar i të dhënave. Por bazuar në buferin e të dhënave binare, mund të krijoni një rrjedhë që është një ndërmjetës universal midis vendndodhjes fizike të ruajtjes së informacionit (skedar, tampon i të dhënave binare) dhe një objekti të nivelit të lartë që ju lejon të punoni me këto të dhëna.
Kur një objekt DataReader krijohet bazuar në një transmetim, ai fillon të lexojë të dhëna nga pozicioni që është vendosur aktualisht në transmetim. Prandaj, në shembull, fillimisht vendoset pozicioni në transmetim dhe më pas krijohet objekti DataReader dhe lexohet numri i kërkuar i karaktereve. Për një përshkrim të hollësishëm të ndryshimit midis numrit të bajteve dhe karaktereve gjatë leximit të vargjeve, shihni seksionin e mëposhtëm 16.3.5

16.3.5. Veçoritë e përdorimit

Kur përdorni të dhëna binare, duhet të merrni parasysh veçoritë e punës me të dhënat e llojit String. E veçanta është se gjatësia e vargut të kthyer nga funksioni i kontekstit global StrLength() matet me karaktere. Në simbole, duhet të tregohen madhësitë e të dhënave të leximit / shkrimit në metodat e shkrimit / leximit të vargjeve në objekte për të punuar me të dhëna binare ( ReadSymbols (),
ReadString (), WriteSymbols (), WriteString()). Në të njëjtën kohë, nuk ka asnjë opsion të qartë për konvertimin e gjatësisë së një vargu në karaktere në një parametër të ngjashëm në bajt. Në varësi të përmbajtjes së vargut dhe kodimit, ky raport do të jetë i ndryshëm. Prandaj, kur punoni me çdo strukturë të dhënash që përfshin vargje me gjatësi të ndryshueshme, duhet të kuptoni qartë se në cilat njësi shprehen gjatësitë e vargjeve.
Nëse në të dhënat e disponueshme gjatësia e vargut specifikohet në bajt, dhe vargu specifikohet në një kodim me gjatësi të ndryshueshme shumëbajtëshe (për shembull, UTF-8), atëherë duke përdorur objektet e të dhënave binare, është përgjithësisht e pamundur të lexohet një strukturë e tillë. nga një skedar në të dhëna të tipit String.
Por në këtë rast, ju lehtë mund të ndryshoni pozicionin e leximit / shkrimit në rrjedhën e skedarit. Nëse gjatësia e vargut specifikohet me karaktere, atëherë bëhet e mundur të lexohet një varg i tillë në të dhëna të llojit String, por bëhet e pamundur të ndryshohet pozicioni i leximit / shkrimit në një rrjedhë të tillë.
Për të marrë gjatësinë e një vargu në bajt, mund të përdorni funksionin e mëposhtëm për të kthyer vargun në një objekt BinaryData:

Funksioni Merrni BinaryDataFrom String(Val StrParameter, Val Encoding = "UTF-8")
StreamMem = StreamInMemory i ri;
Shkrimtar = I ri WriteData (StreamMemory);
Writer.WriteString(StrParameter, Encoding);
Shkrimtar.Mbyll();
Ktheni StreamMemory.CloseAndGetBinaryData();
Funksionet e Fundit

Madhësia aktuale në bajt mund të merret duke thirrur funksionin Size() në objektin BinaryData, i cili merret si rezultat i funksionit.
Përdorimi i njëkohshëm i objekteve nuk rekomandohet Lexoni të Dhënat/Shkruani të Dhënat dhe përçojnë objekte. Nëse ndërmjet dy leximeve të njëpasnjëshme nga një DataReader ose dy shkrimeve të njëpasnjëshme në një DataWrite, ka një ndryshim në pozicionin në rrjedhën me të cilën po punojnë objektet. Hije e të dhënave / Shkrimi i të dhënave- Është hedhur një përjashtim. Pra, shembulli i mëposhtëm tregon ndryshimin e saktë të pozicionit në rrjedhë kur shkruani të dhëna në rrjedhë:

Stream = New StreamInMemory();

WriteData.WriteString("Përshendetje Botë!");
WriteData.Mbyll();
Transmetim.Kërcim(0, PositionInStream.Start);
DataRecord = New DataRecord(Stream);
WriteData.WriteString("Mirupafshim!");
WriteData.Mbyll();
Shembulli i mëposhtëm përshëndetje për të hedhur një përjashtim:

Stream = New StreamInMemory();

WriteData.WriteString("Përshëndetje botë!");
Stream.Jump(0, PositionInStream.Start);
// Rreshti tjetër do të bëjë një përjashtim
WriteData.WriteString("Bye!");
Në të njëjtën kohë, situatat janë të mundshme kur sjellja e sistemit do të jetë e pasaktë, por nuk do të krijohen gabime:

Stream = GetStream();
DataReader = New DataReader(Stream);
TestString = ReadData.Read();
Pozicioni fillestar = Stream.Pozicioni aktual();
DataRecord = New DataRecord(Stream);
WriteData.WriteString (“varg i papritur”);
DataWrite.Close();
Flow.Go (Pozicioni fillestar, PozicioniNëRrjedhës.Start);
// Në përgjithësi, është e pamundur të përcaktohet se çfarë vlere do të vendoset në variablin TestString2
TestString2 = ReadData.ReadString();

Sjellja e përshkruar në këtë pjesë është për shkak të o Objektet DataReader/DataWrite përdorin buferët e tyre kur punojnë me një transmetim. Si rezultat, pozicioni aktual i rrjedhës ndryshon nga pozicioni logjik, i cili formohet si rezultat i operacioneve të kryera.
Gjithashtu, nuk mbështetet përdorimi i njëkohshëm i objekteve ReadData dhe WriteData, të cilët përdorin të njëjtin thread për punën e tyre.

Platforma teknologjike 1C: Enterprise 8 ju lejon të ruani skedarë arbitrar në bazën e informacionit, t'i merrni ato nga atje dhe t'i përdorni ato në mënyra të ndryshme. Le t'i shohim këto operacione me shembuj.

Para se të ngarkoni një skedar në bazën e informacionit 1C, duhet të merrni adresën e plotë të skedarit në disk. Puna me dialogët e përzgjedhjes së skedarëve përshkruhet në .

Për të ruajtur skedarët, një atribut (ose regjistru burim) me llojin Vlerat e ruajtjes.

Ngarkimi i një skedari arbitrar në bazën e informacionit 1C

Çdo skedar mund të përfaqësohet si të dhëna binare dhe të ngarkohet në Ruajtja e vlerës.

Gjatë konvertimit të të dhënave binare në një objekt Vlerat e ruajtjes përdoret ndërtimi newStorageValue (Të dhënat, Kompresimi) me dy opsione:

  1. Të dhënat- të dhënat binare të vendosen në ruajtje
  2. Kompresimi— shkalla e ngjeshjes së algoritmit Deflation. Një numër i plotë në rangun -1…9. -1 është niveli i paracaktuar i kompresimit. 0 - pa kompresim, 9 - raporti maksimal i kompresimit. Vlera e paracaktuar: -1. Parametri është opsional, nëse nuk specifikohet, atëherë kompresimi nuk përdoret.

//Konvertoni skedarin në të dhëna binare
Skedari = Të dhënat e reja binare (Rruga) ;

//Krijoni një objekt të ri ValueStorage

DataStorage = NewValueStorage(File, NewDataCompression(9) );

Ruajtja e një skedari arbitrar nga baza e informacionit 1C në disk

Për të ruajtur një skedar nga baza e të dhënave 1C në disk, duhet të përcaktoni shtegun dhe emrin e skedarit. Për ta bërë këtë, ekziston një dialog për ruajtjen e skedarëve, puna me të cilën përshkruhet në .

//Merrni të dhëna binare nga ruajtja
//DataStorage - atribut i objektit me llojin ValueStorage

//Shkruani të dhënat e marra në disk
//Ndryshorja Path përmban adresën e plotë të skedarit në disk
Të dhënat. Shkruani (Rruga) ;

Shikimi i një skedari të vendosur në bazën e informacionit 1C

Për të parë një skedar të ruajtur në bazën e të dhënave, duhet të keni të instaluar një aplikacion në kompjuterin tuaj që hap këtë skedar.

//Merrni emrin e skedarit të përkohshëm me shtesën e kërkuar
//Në variablin Extension duhet të vendosni shtesën e skedarit, për shembull "pdf"
Rruga= GetTemporaryFileName(Extension) ;

// Merrni të dhëna nga ruajtja
//DataStorage - atribut i objektit me llojin ValueStorage
Data = Data Store. Receive() ;

//Shkruani të dhëna në një skedar të përkohshëm
Të dhënat. Shkruani (Rruga) ;

//Përpiquni të hapni skedarin në aplikacionin e synuar
//Nëse aplikacioni nuk gjendet, do të shfaqet dialogu i sistemit "Open with...".
StartApplication (Rruga);

Artikujt kryesorë të lidhur