1s dvejetainiai duomenys xml. Darbas su dvejetainiais duomenimis. Duomenų išsaugojimas detalėse

Spausdinti (Ctrl+P)

16.3. Darbas su dvejetainiais duomenimis

16.3.1. Bendra informacija

Diegiant taikomųjų programų sprendimus gali pasitaikyti situacijų, kai reikia analizuoti įvairius dvejetainius duomenis. Pavyzdžiui, turite nustatyti failo tipą naudodami parašą arba atlikti kai kurias manipuliacijas su paveikslėliu. Norėdami dirbti su dvejetainiais duomenimis, 1C:Enterprise pateikia specialias programinės įrangos sąsajas. Toliau apžvelgsime galimybes dirbti su dvejetainiais duomenimis.
Visas darbas su dvejetainiais duomenimis grindžiamas srauto koncepcija. Srautas yra loginis savavališko (bendruoju atveju) duomenų šaltinio (Stream objekto) apibendrinimas. Sistema nesuteikia galimybės sukurti nepriklausomo srauto objekto, nesusieto su jokiu šaltiniu. Tačiau yra išvestinių objektų, kuriuos galima sukurti – srautą, susietą su diske esančiu failu (objektas „FileStream“) arba atmintyje sukurtą srautą (objektas „MemoryStream“). Srautas leidžia ir skaityti duomenis, ir juos rašyti. Norint nustatyti galimybę atlikti tam tikras operacijas, srautas (ir išvestiniai objektai) turi specialius metodus, leidžiančius nustatyti, kurie
su šia gija galimos operacijos (metodai AvailableRecord(), Galima skaityti (), AvailableChangePosition()).
Jei jums reikia dirbti su srautu aukštesniu lygiu, ypač skaityti / rašyti duomenis, pvz., skaičių (skirtingo bitų gylio) arba eilutę, tam yra skirti DataRead / DataWrite objektai. Šių objektų pagalba galima sistemingiau pažvelgti į sraute esančius dvejetainius duomenis. Taigi, pavyzdžiui, žinodami failo formatą, galite gana patogiai perskaityti tokį failą, gaudami reikiamus duomenis iš antraščių (kurios, kaip taisyklė, vaizduojamos tipų numeriu ir eilute), praleisdami nereikalingus duomenų blokus ir kraunant reikalingus perdirbimui.
Bendrą darbo su dvejetainiais duomenimis schemą galima pavaizduoti taip:

  1. Priimamas srautas
  2. Sukuriamas Data Reader arba Data Writer objektas.
  3. Naudojant 2 veiksme sukurtą objektą, atliekami reikiami veiksmai.
  4. 2 veiksme sukurtas objektas uždaromas.
  5. Jei daugiau operacijų nereikia, srautas, gautas atliekant 1 veiksmą, uždaromas.
  6. Jei jums reikia toliau dirbti su srautu, galite nustatyti naują poziciją sraute (jei ši operacija palaikoma) ir tęsti darbą nuo 2 veiksmo.

Verta paminėti, kad galima derinti 1 ir 2 dalis. Kitaip tariant, sistema suteikia galimybę kurti objektus Skaityti duomenis / rašyti duomenis tiesiogiai iš, pavyzdžiui, BinaryData objekto.
Norint atlikti įvairias operacijas su dvejetainiais duomenimis, sistema suteikia galimybę gauti dalį srauto kaip atskirą fragmentą su atsitiktine (baitas po baito) prieiga (objekto). BufferBinaryData). Buferio dydis nustatomas sukūrimo metu ir vėliau jo keisti negalima. Dirbant su dvejetainiu duomenų buferiu, galima dirbti su įvairaus bitų gylio skaičiais kaip
kaip viena visuma. Šiuo atveju galima nurodyti baitų tvarką žodžiais: „little endian“ arba „big endian“ (didysis endianas). Taip pat galima padalyti vieną buferį į kelis ir sujungti kelis dvejetainius duomenų buferius į vieną gautą buferį.
Svarbu pažymėti, kad darbas su dvejetainiu duomenų buferiu gali žymiai supaprastinti diegimą, jei darbas su dvejetainiais duomenimis yra įdiegtas kliento programos pusėje asinchroniniu režimu. Tokiu atveju duomenų nuskaitymas į buferį bus atliekamas kaip asinchroninė operacija, o darbas su buferio duomenimis bus sinchroniškas.
Darbas su dvejetainiais duomenimis galimas programos kliento pusėje (įskaitant žiniatinklio klientą) ir serverio pusėje, taip pat sinchroninėse ir asinchroninėse darbo schemose. Kituose pavyzdžiuose bus naudojama sinchroninio darbo schema.

16.3.2. Dvejetainių duomenų skaitymas

Kaip dvejetainių duomenų skaitymo pavyzdį apsvarstysime užduotį nustatyti teisingą failo formatą, kuris buvo pasirinktas sistemoje tolesniam naudojimui. Kaip tikrinamas failas bus naudojamas .wav failas su garso duomenimis. .wav failams saugoti naudojamas Resource Interchange File Format (RIFF), kurio aprašymas pateikiamas nuorodoje:

https://msdn.microsoft.com/enus/library/windows/desktop/ee415713.aspx (anglų kalba). Skaitymo pavyzdyje bus naudojama tokia formato informacija:
1. Pirmuosiuose 4 failo baituose yra formato identifikatorius: RIFF.
2. kituose 4 baituose yra faktinių garso duomenų dydis mažo galo baitų tvarka.
3. Kituose 4 baituose yra naudojamas tekstinis duomenų tipas: WAVE.
Norėdami atlikti šiuos veiksmus, jums reikės šio kodo integruota kalba:

Skaityti = Nauja Skaityti duomenys (failo pavadinimas, „ByteEndian. LittleEndian“);
FileFormat = Read.ReadCharacters(4);
DataSize = Read.ReadInteger32();
FileType = Read.ReadCharacters(4);
Jei failo formatas<>Tada „RIFF“.
Report("Tai ne RIFF failas");
Grįžti ;
EndIf ;
Jei failo tipas = „WAVE“, tada
Ataskaita ("Tai WAV failas su duomenimis, dydis " + DataSize + " baitai");
Priešingu atveju
Ataskaita („Tai nėra WAV failas“);
Grąžinti;
endIf;

Pažvelkime į pavyzdį išsamiau.
Pirmiausia atidaromas failas, kurio pavadinimas yra kintamajame FileName, failas atidaromas skaitymui ( FileOpenMode.Open), skaitys tik iš failo ( FileAccess.Read) ir skaitymui bus naudojamas 16 baitų buferis.
Tada duomenims nuskaityti sugeneruojamas srautas, kurio numerio tipo duomenų baitų tvarka bus mažiausiai reikšminga. Tada iš gauto srauto nuskaitomi 4 simboliai, 32 bitų sveikasis skaičius ir dar 4 simboliai. Gauti duomenys yra analizuojami ir remiantis analizės rezultatais priimamas sprendimas, ar pasirinktas failas yra .wav failas, ar ne.

16.3.3. Dvejetainių duomenų rašymas

Dvejetainių duomenų įrašymas į failą, paprasčiausiu atveju, atliekamas taip:

Įrašas = Naujas WriteData (failo pavadinimas);
Jei indeksas = 0 iki 255 ciklas
Rašyti. Rašyti baitas (indeksas);
EndCycle;
Įrašyti.Uždaryti() ;

Šis pavyzdys į failą įrašo baitų seką nuo 0 iki 255 (0xFF šešioliktainiu). Tai paprasčiausias įrašymo variantas.
Taip pat galite naudoti metodą, panašų į skaitymo metodą, aptartą ankstesniame pavyzdyje, kai gaunamas failo srautas ir į šį failų srautą įrašomi duomenys.

16.3.4. Darbas su dvejetainiu duomenų buferiu

Kaip minėta pirmiau, dvejetainių duomenų buferis yra patogus būdas manipuliuoti dvejetainių duomenų fragmentais.
Palaikomas ne tik duomenų skaitymas, bet ir rašymas.
Kaip pavyzdį apsvarstysime RIFF failo antraštės analizę iš duomenų skaitymo pavyzdžio (žr. čia). Norėdami sukurti pavyzdį, bus naudojama lygiai ta pati informacija apie failo formatą. Taigi, iš šaltinio failo reikia nuskaityti failo antraštės dydžio buferį. Antraštę sudaro trys 4 baitų laukai. Taigi, reikia nuskaityti 12 baitų.

Buferis = naujas BufferBinaryData(12);
Failas = FileStreams.Open (laikinas failų katalogas() + „Windows Logon.wav“, FileOpenMode.Open, FileAccess.Read);
Failas.Skaityti(buferis, 0, 12);
Dydis = Buferis.ReadInteger32(4);
StreamString = newStreamInMemory(buferis);
StreamRows.Go(0, PositionInStream.Start);

Failo formatas = Read Lines.ReadCharacters(4, „Windows-1251“);
Read Lines.Close();
StreamRows.Go(8, PositionInStream.Start);
RowReader = naujas duomenų skaitytuvas(RowStream);
Failo tipas = ReadLines.ReadCharacters( 4, „Windows-1251“);
Read Lines.Close();

Duomenų patekimo į dvejetainių duomenų buferį procesas nėra niekuo ypatingas. Tolesnės operacijos reikalauja tam tikrų pastabų. Nuskaityti bet kokio palaikomo bitų gylio skaičius galima iš bet kurios buferio vietos. Šiame pavyzdyje Buffer.ReadInteger32(4); reiškia 32 bitų sveikojo skaičiaus skaitymą, pradedant nuo 4 buferio baito. Taigi, jei reikia nuskaityti kelis skaičius, esančius skirtingose ​​buferio vietose, tai galima padaryti be tiesioginio pozicionavimo tame buferyje.
Tačiau dvejetainių duomenų buferis nepalaiko eilutės skaitymo. Todėl turėtumėte naudoti objektą, kuris leidžia tai padaryti: Skaityti duomenis. DataReader objekto negalima sukurti iš dvejetainių duomenų buferio. Tačiau remiantis dvejetainiu duomenų buferiu, galite sukurti srautą, kuris yra universalus tarpininkas tarp fizinės informacijos saugojimo vietos (failo, dvejetainių duomenų buferio) ir aukšto lygio objekto, leidžiančio dirbti su šiais duomenimis.
Kai DataReader objektas sukuriamas remiantis srautu, jis pradeda skaityti duomenis nuo tos vietos, kuri šiuo metu yra įdiegta sraute. Todėl pavyzdyje pirmiausia nustatoma padėtis sraute, o tada sukuriamas DataReader objektas ir nuskaitomas reikiamas simbolių skaičius. Išsamų baitų ir simbolių skaičiaus skirtumo nuskaitant eilutes aprašymą rasite kitame skyriuje 16.3.5

16.3.5. Naudojimo ypatybės

Naudodami dvejetainius duomenis, turėtumėte atsižvelgti į darbo su eilutės tipo duomenimis ypatybes. Ypatumas yra tas, kad eilutės, kurią grąžina globalaus konteksto funkcija StrLength(), ilgis matuojamas simboliais. Simboliuose turėtumėte nurodyti skaitomų / rašomų duomenų dydį objektų eilučių rašymo / skaitymo metoduose, skirtuose darbui su dvejetainiais duomenimis ( Skaityti simbolius (),
ReadString (), WriteCharacters (), WriteString()). Tačiau nėra vienareikšmės parinkties konvertuoti eilutės ilgį simboliais į panašų parametrą baitais. Priklausomai nuo eilutės turinio ir kodavimo, šis santykis skirsis. Todėl dirbdami su bet kokiomis duomenų struktūromis, kurios apima kintamo ilgio eilutes, turėtumėte aiškiai suprasti, kokiais vienetais išreiškiami eilučių ilgiai.
Jei turimuose duomenyse eilutės ilgis nurodomas baitais, o eilutė nurodyta kelių baitų kintamo ilgio koduotėje (pavyzdžiui, UTF-8), tai naudojant dvejetainius duomenų objektus, tokia struktūra nuskaitoma iš failo į String tipo duomenys paprastai neįmanomi.
Tačiau šiuo atveju galite lengvai pakeisti skaitymo / rašymo padėtį failo sraute. Jei eilutės ilgis nurodomas simboliais, tada tokią eilutę tampa įmanoma perskaityti į String tipo duomenis, tačiau pakeisti skaitymo/rašymo padėties tokiame sraute tampa neįmanoma.
Norėdami gauti eilutės ilgį baitais, galite naudoti šią funkciją konvertuoti eilutę į BinaryData objektą:

Funkcija Gaukite dvejetainius duomenis iš eilutės(Vertė StrParameter, reikšmės kodavimas = "UTF-8")
MemoryThread = NewMemoryThread;
Rašytojas = Naujas WriteData (StreamMemory);
Rašytojas. Rašyk eilutę(StrParameter, Kodavimas);
Rašytojas.Uždaryti();
Grąžinkite StreamMemory.CloseAndGetBinaryData();
EndFunction

Tikrąjį dydį baitais galima gauti iškviečiant funkciją Dydis() objekte BinaryData, kuri gaunama naudojant funkciją.
Nerekomenduojama vienu metu naudoti daiktų Skaityti duomenis / rašyti duomenis ir srauto objektus. Jei tarp dviejų nuoseklių skaitymo operacijų iš ReadData arba dviejų nuoseklių rašymo operacijų į WriteData pasikeičia padėtis sraute, su kuriuo veikia Ch objektai ShadowData / WriteData– sukuriama išimtis. Taigi, toliau pateiktame pavyzdyje parodytas teisingas padėties pasikeitimas sraute rašant duomenis į srautą:

Srautas = newStreamInMemory();

WriteData.WriteString("Labas pasauli!");
WriteData.Close();
Stream.Go (0, PositionInStream.Start);
DataWrite = newDataWrite(Stream);
WriteData.WriteString("Ate!");
WriteData.Close();
Šis pavyzdys, sveiki, padaroma išimtis:

Srautas = Nauja StreamInMemory();

WriteData.WriteString("Sveikas, pasauli!");
Stream.Go(0, PositionInStream.Start);
// Kita eilutė išmes išimtį
WriteData.WriteString("Iki!");
Tuo pačiu metu galimos situacijos, kai sistemos elgsena bus neteisinga, tačiau klaidų nebus:

Srautas = GetStream();
ReadData = nauji ReadData(Stream);
TestString = ReadData.Read();
Pradinė padėtis = Stream.CurrentPosition();
DataWrite = newDataWrite(Stream);
WriteData.WriteString("Netikėta eilutė");
WriteData.Close();
Stream.Go(Pradinė padėtis, PositionInStream.Start);
// Apskritai neįmanoma nustatyti, kokia reikšmė bus įtraukta į TestString2 kintamąjį
TestLine2 = ReadData.ReadLine();

Šiame skyriuje aprašytą elgesį sukelia o Data Reader/Data Writer objektai, dirbdami su srautu, naudoja savo buferius. Dėl to tikroji sriegio padėtis skiriasi nuo loginės padėties, kuri susidaro atlikus operacijas.
Taip pat nepalaikomas vienu metu naudojamas Data Reader ir Data Writer objektų, kurie savo darbui naudoja vieną giją.

Beveik bet kokia informacija gali būti saugoma vertybių saugykloje, pvz.

... nuotraukos (nuotraukos):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Sąrašai. Papildomos objektų informacijos tipai. Vaizdas; Saugykla = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// šioje vietoje ji rodo viską... Form Elements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...skaičiuoklės dokumentas:

TabDoc=Naujas lentelės dokumentas; TabDoc.Output(FormElements.TabularDocumentField1); Storage=NewValueStorage(TabDoc); Rašyti ();

Procedūros pabaiga

Atkūrimo iš saugyklos spaudos procedūra (elementas)

TabDoc=Storage.Get(); Jei TabDoc<>Neapibrėžta TadaFormElements.TabularDocumentField1.Output(TabDoc); endIf;

Procedūros pabaiga

...savavališki failai (dvejetainiai duomenys):

XZ = NewValueStorage(Nauji dvejetainiai duomenys(failas));

Aštuoni palaiko duomenų, esančių saugykloje, glaudinimą:

XZ = NewValueStorage(Nauji dvejetainiai duomenys(failas),Naujų duomenų suspaudimas(9));

... išorinis apdorojimas ir ataskaitų teikimas:

Procedūra LoadProcessingIntoStorage (PropsStorageType)

CompressionRate = NewDataCompression(9); //9 maksimalus PropsStorageType = New StorageValues(New BinaryData("c:\reports\report.epf", Compression Rate));

Procedūros pabaiga

Procedūros pradžios apdorojimas iš saugyklos (PropsStorageType)

TemporaryFileName = TemporaryFileDirectory()+"report.epf"; BinaryData = PropsStorageType.Get(); BinaryData.Write(LaikinasisFailoPavadinimas); ExternalProcessing = IšorinisApdorojimas.Sukurti(LaikinasisFailoPavadinimas); ExternalProcessing.GetForm().Open();

Procedūros pabaiga

Darbas su saugykla

Jei tai buvo dvejetainiai duomenys, tada juos galima atkurti iš reikšmių saugyklos naudojant metodą Gauti ir įrašyti į failą naudojant Write() metodą.

Jei tipo vertė (saugykla)<>Įveskite („BinaryData“) Tada

BinaryData = Storage.Get();

BinaryData = saugykla;

endIf; BinaryData.Write(FailoPavadinimas);

Jei tai buvo, pavyzdžiui, Word dokumentas (doc failas ar kitas registruotas failo tipas), tada jį galima atidaryti taip:

LaunchApplication (failo pavadinimas);

Norėdami išvalyti lauką, kurio tipas yra Value Storage, turite jį priskirti Neapibrėžta:

PropsStorage = Neapibrėžta;

Darbas su failais ir paveikslėliais integruota kalba 1C:Enterprise 8

Tikslas

Tvarkomoje programoje įdiegtas naujas darbo su failais mechanizmas. Tai suteikia failų mainus tarp informacijos bazės ir kliento programos. Šio mechanizmo ypatumas yra tas, kad jis skirtas naudoti plonajame kliente ir žiniatinklio kliente ir yra sukurtas atsižvelgiant į interneto naršyklių nustatytus darbo su failais apribojimus.

Mechanizmas – tai metodų rinkinys, kuriuo galima patalpinti vartotojo kompiuteryje lokaliai saugomus duomenis į laikinąją informacinės bazės saugyklą, perkelti šią informaciją iš laikinosios saugyklos į duomenų bazę ir gauti atgal į vartotojo kompiuterį. Dažniausiai šiuo mechanizmu sprendžiamos taikymo problemos yra pridedamos informacijos, pavyzdžiui, prekių vaizdų, su sutartimis susijusių dokumentų ir kt., saugojimas.

Metodo taikymo sritis

Laikinas saugojimas

Laikinas saugojimas yra specializuota informacijos bazės sritis, į kurią galima įdėti dvejetainius duomenis. Pagrindinis tikslas yra laikinas informacijos saugojimas kliento ir serverio sąveikos metu prieš perduodant ją į duomenų bazę.

Laikinosios saugyklos poreikis atsiranda dėl to, kad interneto naršyklės veikimo modelis reikalauja, kad vartotojo pasirinktas failas būtų perkeltas tiesiai į serverį be galimybės jį išsaugoti kliente. Kai failas perkeliamas, jis patalpinamas į laikiną saugyklą ir gali būti naudojamas įrašant objektą į duomenų bazę.

Tipiškiausia programos užduotis, išsprendžiama laikinuoju saugojimu, yra prieigos prie failų ar paveikslėlių suteikimas prieš objektą įrašant į informacinę bazę, pavyzdžiui, elemento pavidalu.

Failas arba dvejetainiai duomenys, patalpinti saugykloje, identifikuojami pagal unikalų adresą, kurį vėliau galima naudoti atliekant rašymo, skaitymo ar trynimo operacijas. Šis adresas suteikiamas failo įrašymo į laikinąją saugyklą metodais. Atskiras metodas integruotoje kalboje leidžia nustatyti, ar perduotas adresas yra adresas, nukreipiantis į laikinoje saugykloje esančius duomenis.

Informacinė bazė

Mechanizmas leidžia pasiekti dvejetainius duomenis, saugomus Value Storage tipo atributuose.

Kaip ir laikinojo saugojimo atveju, prieiga prie informacijos galima naudojant specialų adresą. Jį galite gauti specialiu būdu, perduodami nuorodą į objektą arba informacijos registro įvesties raktą ir atributo pavadinimą. Lentelės dalies atveju papildomai reikia perkelti lentelės dalies eilutės indeksą.

Darbo su failais metodai turi apribojimų dirbant su informacijos bazės informacija. Jiems, skirtingai nei laikinam saugojimui, galima tik skaityti informaciją, bet ne rašyti ar ištrinti.

Darbo su failais metodų aprašymas

Duomenų išsaugojimas laikinoje saugykloje

Įprasčiausias šio mechanizmo naudojimo scenarijus apima naudotojo duomenų įdėjimą į laikinąją saugyklą. Tam yra du būdai: PlaceFile() ir PlaceFileInTemporaryStorage().

Pirmasis metodas, PlaceFile(), įkelia failą iš vietinės failų sistemos į laikinąją saugyklą. Metodas gali priimti tikslinį adresą saugykloje. Jei jis neapibrėžtas arba yra tuščia eilutė, bus sukurtas naujas failas ir metodas grąžins savo adresą per atitinkamą parametrą.

Jei parametras, nustatantis interaktyvųjį veikimo režimą, yra True, tada metodas parodys standartinį failų pasirinkimo dialogo langą, kuriame galėsite pasirinkti failą, kurį norite įdėti į saugyklą. Tokiu atveju metodas taip pat grąžins pasirinkto failo adresą.

Dėl to metodas grąžina False, jei vartotojas interaktyviai atsisakė atlikti operaciją failo pasirinkimo dialogo lange. Metodas prieinamas tik klientui.

Antrasis metodas PlaceFileInTemporaryStorage() yra panašus į ankstesnį, išskyrus tai, kad jis pasiekiamas serveryje, o į laikinąją saugyklą įrašyti duomenys pateikiami ne kaip kelias failų sistemoje, o kaip tipo kintamasis. Dvejetainiai duomenys. Taip pat, jei nenurodytas tikslinis adresas, saugykloje sukuriamas naujas failas. Jos adresas grąžinamas kaip funkcijos rezultatas.

Failo nuskaitymas iš laikinosios saugyklos

Rašant objektą į informacinę bazę, gali tekti ištraukti duomenis iš laikinosios saugyklos ir įdėti juos, pavyzdžiui, į atributą. Tam yra atitinkamas serverio metodas – GetFileFromTemporaryStorage(). Šis metodas nuskaito duomenis iš laikinosios saugyklos ir grąžina juos kaip rezultatą. Norėdami tai padaryti, turite nurodyti laikinoje saugykloje esantį adresą. Šis adresas grąžinamas aukščiau aprašytais metodais PlaceFile() ir PlaceFileInTemporaryStorage(), jei jie sėkmingai vykdomi.

Failo ištrynimas iš laikinosios saugyklos

Išsaugojus duomenis detalėse, laikinoje saugykloje esantį failą galima ištrinti. Šiuo tikslu yra metodas DeleteFileFromTemporaryStorage(), kuris ištrina failą iš laikinosios saugyklos. Metodas kaip parametrą paima laikinoje saugykloje esančio failo adresą. Galimas serveryje.

Tikrinamas laikino saugojimo adresas

Failo adresas gali nurodyti laikiną saugyklą ir išsamią informaciją informacijos bazėje. Norėdami patikrinti jo tipą, yra metodas This isTemporaryStorageAddress().

Jis patikrina, ar perduotas adresas yra adresas, nukreipiantis į parduotuvę. Grąžina True, jei adresas nurodo laikiną saugyklą. Metodas pasiekiamas serveryje.

Rekvizito adreso gavimas

Įdėjus duomenis į informacijos bazės išsamią informaciją, gali tekti juos pasiekti naudojant failų metodus.

Tačiau prieš gaudami duomenis, pavyzdžiui, iš nuosavybės, turite gauti šios nuosavybės adresą. Šiuo tikslu yra metodas GetFileAddressInInformationBase().

Jo tikslas – grąžinti failo adresą informacijos bazėje pagal pradinius parametrus. Norėdami tai padaryti, turite perduoti objekto raktą (tai gali būti nuoroda į objektą arba informacijos registro įvesties raktas) ir atributo pavadinimą. Jei reikia gauti lentelės dalies atribute saugomo failo adresą, prieš atributo pavadinimą parametre, nurodančiame atributo pavadinimą, reikia pridėti lentelės dalies pavadinimą ir tašką „.“. Metodas galimas ir kliente, ir serveryje.

Failo nuskaitymas iš informacijos bazės

Metodas GetFile() gauna failą iš informacijos bazės ir išsaugo jį vartotojo vietinėje failų sistemoje. Pirmasis parametras nurodo rekvizitų arba laikinoje failų saugykloje esančio failo adresą. Antrasis parametras nurodo gauto failo paskirties vietą. Neinteraktyviuoju režimu turite nurodyti kelią. Interaktyviame režime parametras yra neprivalomas.

Pagal numatytuosius nustatymus metodas vykdomas interaktyviu režimu, tai yra, paskutinis parametras yra True. Tai reiškia, kad rodomas dialogo langas, kuriame galite nurodyti veiksmą su gautu failu: paleisti jį arba išsaugoti vartotojo nurodytoje vietoje. Jei aktyvus interaktyvusis režimas ir nenurodytas tikslinio disko failo kelio parametras, failo atidarymo operacija negalima. Grąžina loginę reikšmę. Netiesa reiškia, kad vartotojas pasirinko atšaukti operaciją interaktyviame failo išsaugojimo dialogo lange.

Failų metodų naudojimo pavyzdys

// Failo gavimas iš disko interaktyviuoju režimu // ir įdėjimas į laikinąją saugyklą &Kliento procedūroje SelectDiskFileAndWrite()

Kintamasis SelectedName; VariableTemporaryStorageAddress; Jei PutFile(LaikinasisSaugyklosAdresas, PasirinktasPavadinimas, Tiesa) Tada Object.FileName = SelectedName; PlaceObjectFile (laikinas saugojimo adresas); endIf;

Procedūros pabaiga

// Failo kopijavimas iš laikinosios saugyklos į katalogą // atributas, objekto įrašymas, failo ištrynimas iš laikinosios // saugyklos &Serverio procedūrų vieta Objekto failas (laikinas saugyklos adresas)

Katalogo elementas = Form AttributesValue("Objektas"); Dvejetainiai duomenys = GetFileFromTemporaryStorage(Laikinosios saugyklos adresas); Katalogo elementas.Failo duomenys = NewValueStorage(BinaryData); FilePathOnDisk = Naujas failas(Katalogo elementas.Failo pavadinimas); Katalogas Item.FileName = FilePathOnDisk.Name; Katalogo elementas.Write(); Modifikuota = klaidinga; DeleteFileFromTemporaryStorage(TemporaryStorageAddress); ValueВFormAttributes (katalogo elementas, "Objektas");

Procedūros pabaiga

// Failo skaitymas iš rekvizitų ir įrašymas // vietiniame diske interaktyviuoju režimu &Kliento procedūroje ReadFileAndSaveToDisk()

Adresas = GetFileAddressInInformationBase(Object.Link, "FileData"); GetFile(Adresas, Objektas.Failo pavadinimas, Tiesa);

Procedūros pabaiga

Adresų palaikymas paveikslėlio lauke

Vaizdo lauko valdiklis palaiko paveikslėlio, nurodyto laikinoje saugykloje arba duomenų bazėje esančio failo adresu, rodymą.

Norėdami tai padaryti, formos elemento ypatybėje Data turite nustatyti eilutės tipo atributą. Šio atributo reikšmė bus interpretuojama kaip paveikslėlio adresas.

Pavyzdys // Vaizdo lauko susiejimas su vaizdo adresu laikinojoje saugykloje //. AddressPictures formos detalės eilutės tipo

Vietos failas (vaizdo adresas, tiesa)

Picture.Data = AddressPictures

Apribojimai dirbant su žiniatinklio klientu

Aprašyto mechanizmo veikimas naudojant žiniatinklio klientą turi tam tikrų apribojimų. Šie apribojimai yra susiję su naršyklės saugos modeliu. Taigi, pavyzdžiui, klientas negali savarankiškai išsaugoti failo vietinėje failų sistemoje, tai yra, galima tik interaktyvi kliento metodų PlaceFile() ir GetFile() versija. Bandant naudoti neinteraktyvųjį režimą daroma išimtis. Interaktyviai rodomi dialogo langai priklauso nuo jūsų naršyklės tipo.

Funkcijos dirbant su „Value Storage“ Kliente

Problema:

Kai dokumento lentelės sekcijoje yra vertės saugyklos tipo atributas, sulėtėja dokumento formos atidarymas, jei šiame atribute yra daug duomenų.

Tariama priežastis:

Galbūt atidarant formą klientui siunčiama ne nuoroda į Value Store esančius duomenis, o patys duomenys.

Sprendimas

  • Formos lentelės atributo ypatybėse yra vėliavėlė „Visada naudoti“. Jei jis nustatytas, lauko turinys visada perduodamas tarp serverio ir kliento – pavyzdžiui, atidarant formą. Ši vėliavėlė turi būti išjungta, tačiau į tai turi būti atsižvelgta kode, nes pagal numatytuosius nustatymus kliente šio lauko reikšmės nebus. Pavyzdį galima rasti 1C:Archyvas.

Tai dar geriau naudoti laikinas saugojimas failams perkelti tarp kliento ir serverio.

Įdiegta 8.3.10.2168 versijoje.

Palaipsniui didiname darbo su dvejetainiais duomenimis funkcionalumą. Tam yra keletas priežasčių. Pirma, įgyvendinome ne viską, ką planavome. Ir antra, diskutuodami apie naujas galimybes sulaukėme nemažai jūsų pageidavimų, kuriuos taip pat nusprendėme įgyvendinti.

Naujos dvejetainių duomenų konvertavimo į skirtingus formatus funkcijos

Pasauliniame kontekste mes pridėjome daugybę naujų dvejetainių duomenų konvertavimo funkcijų. Taigi, pavyzdžiui, galite atlikti dvejetainių duomenų pirmyn ir atgal konvertavimą į įprastą eilutę, formato eilutę Bazė64 ir formato eilutę BinHex. Be to, galite konvertuoti pačius dvejetainius duomenis į formatus Bazė64, BinHex ir atgal.

Panašios konversijos palaikomos šiam tipui BufferBinaryData. Be to, dvejetainių duomenų buferį galite konvertuoti į dvejetainius duomenis ir atvirkščiai.

Be to, dvi naujos funkcijos leidžia padalyti dvejetainius duomenis į kelias dalis ir atvirkščiai, sujungti kelis tokio tipo objektus. Dvejetainiai duomenysį vieną. Tokiu atveju naujame objekte bus visų dalių duomenys jūsų nurodyta tvarka.

Šios funkcijos yra panašios į failų padalijimą ir sujungimą, tačiau daugeliu atvejų yra efektyvesnės. Nes nereikia iš pradžių įrašyti dvejetainių duomenų į failą, o dalijant nereikia nereikalingo duomenų kopijavimo.

Galimybės dirbti su srautais pridėjimas prie objektų, kurie dirba su failais

Kadangi dvejetainių duomenų naudojimas daugiausia susijęs su failų operacijomis, manėme, kad visiškai logiška ir natūralu pridėti darbą su srautais prie tų objektų, kurie šiuo metu vienaip ar kitaip skaito ir rašo failus.

Todėl dabar galite atidaryti srautus skaitymui ir rašymui naudodami tokius objektus kaip:

  • Skaitymas Tekstas Ir Rašyti Tekstą;
  • ReadingFastInfoSet Ir EntryFastInfoSet;
  • HTML skaitymas Ir PostHtml;
  • Skaito JSON Ir RecordJSON;
  • XML skaitymas Ir XML įrašas;
  • Zip failo skaitymas Ir Įrašykite ZIP failą.

Dirbdami su HTTP galite gauti tekstą kaip srautą:

  • HTTP užklausa Ir HTTP atsakymas;
  • HTTPServiceRequest Ir HTTPServiceResponse.
  • Tekstinis dokumentas;
  • Lentelinis dokumentas;
  • SuformatuotasDokumentas;
  • Geografinė schema;
  • Grafinė schema;
  • FTP ryšys.

Dabar galima rašyti į srautą dirbant su tipais Paveikslėlis Ir ConvertToCanonicalXML. Be to, darbas su srautais dabar palaikomas įvairiais būdais, kuriuos turi tipai XSL konvertavimas, Kriptografijos vadovas, Sertifikatas Kriptografija Ir HashingData.

Efektyvus kopijavimas nuskaitant ir rašant duomenis

Dvejetainiai įrankiai, kuriuos įdiegėme, leido kopijuoti srautus. Tačiau su dideliais duomenų kiekiais ši operacija nebuvo atlikta labai efektyviai.

Todėl tipas Skaityti duomenisįdiegėme naują metodą CopyB(). Tai ne tik pašalina šią problemą, bet ir supaprastina tekstą, todėl jis tampa suprantamesnis.

Pavyzdžiui, anksčiau buvo galima gauti dvejetainius duomenis iš vieno srauto ir įrašyti juos į kitą srautą.

Dabar nereikia gauti dvejetainių duomenų, kopijavimas atliekamas duomenų skaitymo etape.

Puiku tai, kad galite kopijuoti ne tik į srautą, bet ir į objektą WriteData. Ši parinktis yra patogi, kai, be duomenų iš šaltinio srauto, į išvesties srautą reikia įrašyti kai kuriuos savo duomenis.

Bitinės loginės operacijos dvejetainiame duomenų buferyje

Dabar galite naudoti bitines logines operacijas dirbdami su dvejetainiais duomenų buferiais. Dėl šių operacijų šaltinio baitų ir nurodytame buferyje esančių baitų bitų derinimo rezultatas bus įrašytas į šaltinio buferį pagal pasirinktos loginės operacijos taisykles. Įgyvendinome šias operacijas:

  • WriteBitBit();
  • WriteBitOr();
  • WriteBitExclusiveOr();
  • WriteBitIne();
  • Invert ().

Geras bitų loginių operacijų naudojimo pavyzdys yra keitimosi formato iššifravimas su mažmenine įranga. Pavyzdžiui, mainų formatas su mažmenine įranga aprašomas 1 baito lauku. Šiame lauke yra charakteristikų rinkinys, apibūdinantis produktų asortimentą:

  • 0–2 bitai: mokesčio tarifas;
  • 3 bitas: 0 - vienetinės prekės, 1 - svorio prekės;
  • 4 bitas: 0 – leisti parduoti, 1 – uždrausti parduoti;
  • 5 bitas: 0 - įjungti kiekių skaičiavimą, 1 - išjungti kiekio skaičiavimą;
  • 6 bitas: 0 – vienkartinis pardavimas draudžiamas, 1 – leidžiamas vienkartinis pardavimas;
  • 7 bitas: rezervuotas.

Tada kodas, kuris išgauna šią informaciją ir pateikia ją tolimesniam apdorojimui patogia forma, gali atrodyti taip.

Skaičių gavimas iš šešioliktainių ir dvejetainių raidžių

  • NumberFromHexString();
  • NumberFromBinaryString().

Dvejetainiai literalai yra naudingi apibrėžiant kaukes, kai jie naudojami kartu su bitinėmis operacijomis. Pavyzdžiui, ankstesniame pavyzdyje, kuriame analizuojamas mainų formatas su komercine įranga, kaukės nurodomos naudojant dešimtainius skaičius. Tai nėra labai patogu, nes rašant ir skaitant kodą reikia nuolat mintyse versti dešimtainį skaičių į dvejetainę sistemą.

Vietoje to daug patogiau naudoti dvejetainius literatus. Tuo pačiu metu kodas tampa aiškesnis ir klaidų tikimybė žymiai sumažėja.

Šešioliktaines raides patogu naudoti analizuojant techninius formatus: vaizdo, garso, vaizdo formatus.

Išorinių NativeAPI komponentų technologijos pokyčiai

Anksčiau buvo keli apribojimai perduodant dvejetainius duomenis tarp 1C:Enterprise ir išorinio komponento. Pavyzdžiui, buvo neįmanoma perkelti dvejetainių duomenų į išorinį komponentą, o dirbant žiniatinklio kliente, keistis dvejetainiais duomenimis apskritai buvo neįmanoma.

Dabar panaikiname visus šiuos apribojimus. Galite keistis dvejetainiais duomenimis abiem kryptimis ir net žiniatinklio kliente.

Tai jokiu būdu neturės įtakos esamų išorinių komponentų veikimui. Jie veiks kaip anksčiau. Tačiau naujai sukurtuose komponentuose dabar galite perduoti objektus kaip parametrus Dvejetainiai duomenys.

Dvejetainiai duomenys 1C yra skirti savavališko formato failams saugoti. Su jų pagalba galite:

  • Organizuoti sąveiką naudojant dvejetainį protokolą su įvairiais įrenginiais;
  • Saugoti bet kokio formato failus kaip metaduomenų objektų atributus;
  • Konvertuoti tekstinius duomenis į dvejetainius (dažniausiai naudojamas ataskaitoms siųsti);
  • Darbas su dvejetainiais duomenimis atmintyje.

Ką gali padaryti sistema

Dirbdama su dvejetainiais duomenimis, platforma 8.3 gali atlikti šiuos veiksmus:

  1. Skaityti ir rašyti dvejetainius duomenis;
  2. Perkelkite duomenis iš kliento į serverį ir atgal naudodami laikiną saugyklą;
  3. Inicijuoti „Paveikslėlio“ tipo objektą naudojant dvejetainius failus;
  4. Skaitykite juos iš žiniatinklio naudodami objektus „Pašto priedas“, „HTTP ryšys“ ir kt.
  5. Naudoti kriptografines priemones svarbiems priedams užšifruoti ir pasirašyti;
  6. Naudodami objektą „Duomenų maišos“ apskaičiuokite maišos funkciją.

Duomenų išsaugojimas detalėse

Pavyzdžiui, sukurkime katalogą bandomojoje konfigūracijoje.

Tiesą sakant, naudoti tą patį katalogą informacijai apie nomenklatūrą ir dvejetainius vaizdo duomenis saugoti yra šiek tiek neteisinga. Esant pakankamai dideliems duomenų kiekiams ir dideliems failams, gali atsirasti nepageidaujamų prastovų ir sistemos veikimo „stabdžių“. Sistemos požiūriu daug teisingiau būtų sutvarkyti atskirą katalogą „Paveikslėliai“, kurio nuorodą galėtume nustatyti kaip butaforijos tipą.


Svarbu pažymėti, kad dėl to, kad „ValueStorage“ tipo atributai, kuriuose yra dvejetainių duomenų, nėra pasiekiami valdomos programos režimu, juos galima pasiekti tik naudojant FormAttributesValue metodą.


Pranešimo laukas reiškia dvejetainių duomenų saugojimo reikšmių įrašą.

Duomenų skaitymas iš rekvizitų

Sukurkime apdorojimą, kuris mūsų konfigūracijoje dvejetaine forma saugomą failą išves į skaičiuoklės dokumentą (to reikia, pavyzdžiui, norint spausdinti įmonės logotipą).


Iš esmės tai yra visas kodas, kurio mums reikia. Naudodami operatorių Get() nuskaitome atitinkamame katalogo atribute saugomus dvejetainius duomenis ir perkeliame į objektą „Paveikslėlis“, kuris bus rodomas formos skaičiuoklės dokumento viršutiniame kairiajame langelyje (9 pav.).

9 pav

Duomenų konvertavimas

Tai nėra įprasta, tačiau pasitaiko, kad dirbant su nestandartiniais mainais su išorinėmis sistemomis, reikia konvertuoti duomenis iš dvejetainio formato į Base64 formatą arba atvirkščiai.

Daugeliu atvejų platforma automatiškai konvertuoja duomenis, jei tai neįvyksta, reikia naudoti visuotines vertimo funkcijas:

  1. Base64String – paverčia nurodytą reikšmę į atitinkamos koduotės eilutę;
  2. Base64Value – atlieka atvirkštinį konvertavimą.

Aukščiau pateikto kodo optimizavimas

4 pav. pateiktas kodas tikrai veikia, bet su vienu reikšmingu įspėjimu: jei konfigūracijos ypatybėse pažymėtas langelis „Modality use mode“ (10 pav.). Priešingu atveju jo naudojimas sukels klaidą.
10 pav

Kad taip neatsitiktų, būdami katalogo elemento formos modulyje, eikite į meniu Tekstas->Pertvarkymas->Nebenaudojami sinchroniniai skambučiai->Konvertuoti modulio skambučius.

Po kurio laiko sinchroniniai skambučiai bus automatiškai konvertuojami į asinchroninius, o kodas įgaus formą (11 pav.)

11 pav