Työskentely binääritietojen kanssa. Työskentely binääritietojen kanssa Binääritietojen tallentaminen tiedostoon 1s

Toteutettu versiossa 8.3.10.2168.

Lisäämme asteittain binaaridatan kanssa työskentelyn toimivuutta. Tähän on useita syitä. Ensinnäkin emme toteuttaneet kaikkea, mitä olimme suunnitelleet. Ja toiseksi, uusista mahdollisuuksista keskustellessamme saimme teiltä useita toiveita, jotka myös päätimme toteuttaa.

Uusia toimintoja binääritietojen muuntamiseen eri muotoihin

Olemme lisänneet suuren määrän uusia toimintoja binääritietojen muuntamisen globaaliin kontekstiin. Joten voit esimerkiksi muuntaa binaaridataa normaaliksi merkkijonoksi ja muotomerkkijonosta Perus64 ja muotomerkkijono BinHex. Lisäksi voit muuntaa itse binääritiedot muotoihin Perus64, BinHex ja takaisin.

Samanlaisia ​​muunnoksia tuetaan tälle tyypille BufferBinaryData. Lisäksi voit muuntaa binääritietopuskurin binääritiedoksi ja päinvastoin.

Lisäksi kaksi uutta toimintoa mahdollistavat binääritietojen jakamisen useisiin osiin ja päinvastoin useiden tyyppisten objektien yhdistämisen BinaryData yhdeksi. Tässä tapauksessa uusi objekti sisältää kaikkien osien tiedot määrittämässäsi järjestyksessä.

Nämä toiminnot ovat merkitykseltään samanlaisia ​​kuin tiedostojen jakaminen ja yhdistäminen, mutta monissa tapauksissa ne ovat tehokkaampia. Koska binääridataa ei tarvitse tallentaa etukäteen tiedostoon, ja koska tietoja ei tarvitse kopioida turhaan jakamisen aikana.

Lisäämällä mahdollisuus työskennellä virtojen kanssa tiedostojen kanssa toimiviin objekteihin

Koska binääritiedon käyttö liittyy suurelta osin tiedostotoimintoihin, pidimme täysin loogista ja luontevaa lisätä työskentelyä virtojen kanssa niihin objekteihin, jotka nyt lukevat ja kirjoittavat tiedostoja tavalla tai toisella.

Tämän seurauksena voit nyt avata virtoja lukemista ja kirjoittamista varten, kun käytät objekteja, kuten:

  • Tekstin lukeminen Ja Kirjoita teksti;
  • ReadingFastInfoSet Ja WriteFastInfoSet;
  • Html:n lukeminen Ja Kirjoita HTML;
  • JSON lukeminen Ja JSON-merkintä;
  • XML:n lukeminen Ja WriteXML;
  • Zip-tiedoston lukeminen Ja WriteZipFile.

Voit vastaanottaa rungon streamina, kun työskentelet HTTP:n kanssa:

  • HTTP-pyyntö Ja HTTP-vastaus;
  • HTTPServiceRequest Ja HTTPServiceResponse.
  • Tekstiasiakirja;
  • SpreadsheetDocument;
  • Muotoiltu asiakirja;
  • Maantieteellinen kartta;
  • GraphicScheme;
  • FTP-yhteys.

Striimiin kirjoittaminen on nyt käytettävissä tyyppien kanssa työskenneltäessä Kuva Ja ConvertToCanonicalXML. Ja tämän lisäksi työskentely streamien kanssa on nyt tuettu erilaisilla menetelmillä, joita tyypeillä on XSL-muunnos, Kryptografiapäällikkö, Salaussertifikaatti Ja HashingData.

Tehokas kopiointi lukemalla ja kirjoittamalla tietoja

Toteuttamamme binääritietotyökalut sallivat virtojen kopioimisen. Mutta suurilla tietomäärillä tämä toimenpide ei ollut kovin tehokas.

Siksi tyyppi ReadingData olemme ottaneet käyttöön uuden menetelmän CopyIn(). Se ei ainoastaan ​​poista tätä ongelmaa, vaan myös yksinkertaistaa tekstiä ja tekee siitä ymmärrettävämmän.

Aiemmin oli esimerkiksi mahdollista saada binaaridataa yhdestä virrasta ja kirjoittaa se toiseen virtaan.

Nyt ei tarvitse vastaanottaa binaaridataa, kopiointi suoritetaan tietojen lukuvaiheessa.

Hienoa on, että voit kopioida paitsi streamiin myös objektiin WriteData. Tämä vaihtoehto on kätevä, kun lähdevirran tietojen lisäksi sinun on kirjoitettava omaa dataasi lähtövirtaan.

Bittikohtaiset Boolen operaatiot binääritietopuskurissa

Voit nyt käyttää bittikohtaisia ​​loogisia operaatioita työskennellessäsi binääritietopuskureiden kanssa. Näiden operaatioiden tuloksena alkuperäisten tavujen ja määritetyn puskurin tavujen bittikohtaisen yhdistämisen tulos valitun loogisen operaation sääntöjen mukaisesti kirjoitetaan lähdepuskuriin. Olemme toteuttaneet seuraavat toiminnot:

  • WriteBitwiseAnd();
  • WriteBitwiseOr();
  • WriteBitwiseExceptionOr();
  • WriteBitwiseINe();
  • Käänteinen().

Hyvä esimerkki bittikohtaisten loogisten operaatioiden käytöstä on vaihtoformaatin dekoodaus myyntiautomaateilla. Esimerkiksi vaihtoformaattia kaupankäyntilaitteilla kuvataan 1 tavun kentällä. Tämä kenttä sisältää joukon ominaisuuksia, jotka kuvaavat tuotevalikoimaa:

  • Bitit 0-2: veroprosentti;
  • Bitti 3: 0 - kappaletavara, 1 - painotavara;
  • Bitti 4: 0 - ota myynti käyttöön, 1 - poista myynti;
  • Bitti 5: 0 - ota laskenta käyttöön, 1 - poista laskenta käytöstä;
  • Bitti 6: 0 - kertamyynti pois käytöstä, 1 - kertamyynti sallittu;
  • Bitti 7: varattu.

Tällöin koodi, joka poimii nämä tiedot ja esittää ne sopivassa muodossa jatkokäsittelyä varten, voi näyttää tältä.

Luvun saaminen heksadesimaali- ja binääriliteraaleista

  • NumberFromHexString();
  • NumberFromBinaryString().

Binääriliteraalit ovat hyödyllisiä maskien määrittämisessä, kun niitä käytetään yhdessä bittikohtaisten toimintojen kanssa. Esimerkiksi edellisessä esimerkissä vaihtomuodon jäsentämisestä myyntilaitteilla maskit määritetään käyttämällä desimaalilukuja. Tämä ei ole kovin kätevää, koska kun kirjoitat ja luet koodia, sinun on jatkuvasti käännettävä henkisesti desimaaliluku binäärijärjestelmäksi.

Sen sijaan on paljon kätevämpää käyttää binääriliteraaleja. Samalla koodista tulee visuaalisempaa ja virheen todennäköisyys pienenee merkittävästi.

Heksadesimaaliliteraaleja on kätevä käyttää jäsennettäessä teknisiä muotoja: kuva-, ääni-, videomuotoja.

Muutokset NativeAPI-ulkoisten komponenttien teknologiassa

Aiemmin siirrettäessä binääritietoja 1C:Enterprisen ja ulkoisen komponentin välillä oli useita rajoituksia. Esimerkiksi binaaridatan välittäminen ulkoiselle komponentille oli mahdotonta, ja web-asiakasohjelmassa työskennellessä binääritietojen vaihto oli yleensä mahdotonta.

Nyt poistamme kaikki nämä rajoitukset. Voit vaihtaa binaaridataa molempiin suuntiin ja jopa verkkoasiakassovelluksessa.

Tämä ei vaikuta olemassa olevien ulkoisten komponenttien toimintaan. Ne toimivat kuten ennenkin. Mutta juuri luoduissa komponenteissa voit nyt välittää objekteja parametreina BinaryData.

Arvosäilöön voi tallentaa lähes mitä tahansa tietoa, esim.

... kuvat (kuvat):

CurrentImage.Object = TextFabric.Reference; CurrentImage.DataType = Enumerations.Types of AdditionalObjectsInformation.Image; Tallennus = UusiArvoTallennus(UusiPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// tässä paikassa se näyttää kaiken...FormElements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...laskentataulukkodokumentti:

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

EndProcedure

Toimenpide RestoreFromStorageClick(kohde)

TabDoc=Storage.Get(); Jos TabDoc<>Määrittämätön ThenFormElements.SpreadsheetDocumentField1.Output(TabDoc); Loppu Jos;

EndProcedure

... mielivaltaiset tiedostot (binääritiedot):

XS = UusiArvoTallennus(Uusi BinaariData(tiedosto));

Kahdeksan tukee tallennustilaan sijoitettujen tietojen pakkausta:

XS = UusiArvoTallennus(Uusi BinaariData(tiedosto),UusiPakkaus(9));

... ulkoinen käsittely ja raportointi:

Menettely LoadProcessingToStorage (AttribuuttityyppiStorage)

CompressionDegree = Uusi DataCompression(9); //9 maksimi PropsStorageType = NewStorageValues(NewBinaryData("c:\reports\report.epf", pakkausaste));

EndProcedure

Toimenpide AloitusProcessingFromStorage(AttributeTypeStorage)

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

EndProcedure

Työskentely varastoinnin kanssa

Jos se oli BinaryData, ne voidaan palauttaa arvovarastosta Get-menetelmällä ja kirjoittaa tiedostoon Write()-menetelmällä.

IfTypeVnch (tallennustila)<>Type("BinaryData") Sitten

BinaryData = Storage.Get();

BinaryData = tallennustila;

Loppu Jos; BinaryData.Write(Tiedostonimi);

Jos kyseessä oli esimerkiksi Word-asiakirja (doc-tiedosto tai muu rekisteröidyn tyyppinen tiedosto), se voidaan avata seuraavasti:

Käynnistä Sovellus(Tiedostonimi);

Jos haluat tyhjentää arvotallennustyypin kentän, sinun on määritettävä se määrittämättömäksi:

PropsStorage = Undefined;

Työskentely tiedostojen ja kuvien kanssa sisäänrakennetulla kielellä 1C:Enterprise 8

Tarkoitus

Hallitussa sovelluksessa on uusi mekanismi tiedostojen käsittelyyn. Se tarjoaa tiedostonvaihdon tietokannan ja asiakassovelluksen välillä. Tämän mekanismin ominaisuus on, että se on keskittynyt käyttöön ohuessa asiakasohjelmassa ja Web-asiakasohjelmassa, ja se on suunniteltu ottamaan huomioon verkkoselaimien asettamat rajoitukset tiedostojen käsittelylle.

Mekanismi on joukko menetelmiä, joilla voidaan sijoittaa käyttäjän paikallisesti tallentamia tietoja väliaikaiseen tietokantavarastoon, siirtää nämä tiedot väliaikaisesta tallennustilasta tietokantaan ja hakea ne takaisin käyttäjän tietokoneelle. Yleisimmät tällä mekanismilla ratkaistut sovellustehtävät ovat mukana olevien tietojen, esimerkiksi tavarakuvien, sopimuksiin liittyvien asiakirjojen jne. tallentaminen.

Menetelmien laajuus

Väliaikainen varasto

Väliaikainen tallennus on tietokannan erikoisalue, johon voidaan sijoittaa binaaridataa. Päätarkoituksena on tietojen väliaikainen tallennus asiakas-palvelin-vuorovaikutuksen aikana ennen kuin se siirretään tietokantaan.

Tilapäistallennustarve syntyy siitä, että selainmallissa käyttäjän valitsema tiedosto on siirrettävä suoraan palvelimelle ilman mahdollisuutta tallentaa sitä asiakkaalle. Kun tiedosto siirretään, se sijoitetaan väliaikaiseen tallennustilaan ja vasta sitten sitä voidaan käyttää kirjoitettaessa objektia tietokantaan.

Tyypillisin sovellettu tilapäistallennuksella ratkaistava tehtävä on pääsy tiedostoihin tai kuviin ennen kuin objekti kirjoitetaan tietokantaan esimerkiksi elementin muodossa.

Tallennukseen sijoitettu tiedosto tai binääridata tunnistetaan yksilöllisellä osoitteella, jota voidaan myöhemmin käyttää kirjoitus-, luku- tai poistotoimintoihin. Tämä osoite annetaan menetelmillä tiedoston kirjoittamiseksi väliaikaiseen tallennustilaan. 1C:Enterprise-kielessä on erillinen menetelmä, jonka avulla voit määrittää, onko välitetty osoite osoite, joka osoittaa väliaikaisessa tallennustilassa oleviin tietoihin.

Tietokanta

Mekanismi mahdollistaa pääsyn ValueStorage-tyypin attribuutteihin tallennettuihin binääritietoihin.

Kuten väliaikaisen varastoinnin tapauksessa, tietoihin pääsee käsiksi erityisen osoitteen kautta. Saat sen erikoismenetelmällä välittämällä linkin objektiin tai tietorekisterin tietueavaimeen sekä attribuutin nimen. Taulukkoosion tapauksessa vaaditaan lisäksi taulukkoosuuden riviindeksin välitys.

Menetelmät tiedostojen käsittelyyn ovat rajoitettuja tietokannan tietojen kanssa työskenneltäessä. Heille, toisin kuin tilapäismuistissa, käytettävissä on vain lukutiedot, mutta ei niiden kirjoittamista tai poistamista.

Kuvaus menetelmistä työskennellä tiedostojen kanssa

Tietojen tallennus väliaikaiseen tallennustilaan

Tyypillisin skenaario tämän mekanismin käyttämiselle sisältää käyttäjätietojen alkuperäisen sijoittamisen väliaikaiseen tallennustilaan. Tätä varten on kaksi tapaa: PlaceFile() ja PlaceFileToTempStorage().

Ensimmäinen menetelmä, PlaceFile(), sijoittaa tiedoston paikallisesta tiedostojärjestelmästä väliaikaiseen tallennustilaan. Menetelmä voi hyväksyä kohdeosoitteen kaupassa. Jos sitä ei ole määritelty tai se on tyhjä merkkijono, luodaan uusi tiedosto ja menetelmä palauttaa osoitteensa vastaavan parametrin kautta.

Jos vuorovaikutteisen toimintatilan määrittävä parametri on True, menetelmä näyttää tavallisen tiedostonvalintaikkunan, jossa voit valita tallennustilaan tallennettavan tiedoston. Tässä tapauksessa menetelmä palauttaa myös valitun tiedoston osoitteen.

Tämän seurauksena menetelmä palauttaa arvon False, jos käyttäjä interaktiivisesti kieltäytyi suorittamasta toimintoa tiedostonvalintaikkunassa. Menetelmä on vain asiakkaan käytettävissä.

Toinen menetelmä, PutFileToTempStorage(), on samanlainen kuin edellinen, paitsi että se on saatavilla palvelimella ja tilapäiseen tallennustilaan kirjoitettavat tiedot ei esitetä tiedostojärjestelmän polkuna, vaan tyyppisenä muuttujana. BinaryData. Vastaavasti, jos kohdeosoitetta ei ole määritetty, uusi tiedosto luodaan arkistoon. Sen osoite palautetaan funktion tuloksena.

Haetaan tiedostoa väliaikaisesta tallennustilasta

Kun kirjoitat objektia tietokantaan, saatat joutua poimimaan tiedot väliaikaisesta tallennustilasta ja sijoittamaan ne esimerkiksi attribuuttiin. Tätä varten on olemassa vastaava palvelinmenetelmä - GetFileFromTemporaryStorage(). Tämä menetelmä hakee tiedot väliaikaisesta tallennustilasta ja palauttaa sen tuloksena. Tätä varten sinun on määritettävä osoite väliaikaisessa tallennustilassa. Tämä osoite palautetaan yllä olevilla menetelmillä PutFile() ja PutFileToTempStorage(), jos se onnistuu.

Tiedoston poistaminen väliaikaisesta tallennustilasta

Kun tiedot on tallennettu attribuutissa, väliaikaisessa tallennustilassa oleva tiedosto voidaan poistaa. Tätä varten on olemassa DeleteFileFromTemporaryStorage()-menetelmä, joka poistaa tiedoston väliaikaisesta tallennustilasta. Menetelmä ottaa parametriksi väliaikaisessa muistissa olevan tiedoston osoitteen. saatavilla palvelimella.

Tarkistetaan, kuuluuko osoite väliaikaiseen tallennustilaan

Tiedoston osoite voi viitata sekä tilapäiseen tallennustilaan että tietokannan tietoihin. Sen tyypin tarkistamiseksi on ThisTemporalStorageAddress()-metodi.

Se tarkistaa, että välitetty osoite on kauppaan osoittava osoite. Palauttaa True, jos osoite osoittaa väliaikaiseen tallennustilaan. Menetelmä on saatavilla palvelimella.

Rekvisiitta osoitteen saaminen

Kun tiedot on sijoitettu tietokannan rekvisiittauksiin, niitä voi olla tarpeen käyttää tiedostomenetelmillä.

Mutta ennen kuin saat tietoja esimerkiksi määritteestä, sinun on hankittava tämän määritteen osoite. Tätä varten on GetFileAddressInInfobase()-metodi.

Sen tarkoitus on palauttaa tietokannassa olevan tiedoston osoite alkuperäisten parametrien mukaisesti. Tätä varten sinun on välitettävä objektiavain (se voi olla joko linkki objektiin tai tietorekisterin tietueavain) ja attribuutin nimi. Jos haluat saada taulukkoosion attribuutissa tallennetun tiedoston osoitteen, sinun on lisättävä attribuutin nimen määrittelevän parametrin attribuutin nimen eteen taulukkoosion nimi ja piste "." Menetelmä on käytettävissä sekä asiakkaalla että palvelimella.

Tiedoston hakeminen tietokannasta

GetFile()-menetelmä vastaanottaa tiedoston tietokannasta ja tallentaa sen käyttäjän paikalliseen tiedostojärjestelmään. Ensimmäinen parametri määrittää attribuutissa tai väliaikaisessa tiedostomuistissa olevan tiedoston osoitteen. Toinen parametri määrittää tuloksena olevan tiedoston kohteen. Ei-interaktiivisessa tilassa sinun on määritettävä polku. Interaktiivisessa tilassa parametri on valinnainen.

Oletusarvoisesti menetelmä suoritetaan interaktiivisessa tilassa, eli viimeinen parametri on True. Tämä tarkoittaa, että näyttöön tulee valintaikkuna, jossa voit määrittää vastaanotetun tiedoston toiminnon: suorittaa sen tai tallentaa sen käyttäjän määrittämään sijaintiin. Jos interaktiivinen tila on aktiivinen eikä levyllä olevan tiedoston kohdepolkua ole määritetty, tiedoston avaamistoiminto ei ole käytettävissä. Palauttaa loogisen arvon. False tarkoittaa, että käyttäjä on valinnut toiminnon peruutuksen online-tallennustiedoston valintaikkunassa.

Esimerkki tiedostomenetelmien käytöstä

// Vastaanota tiedosto levyltä interaktiivisesti // ja aseta se tilapäiseen tallennustilaan &AtClient Procedure SelectFileCDDiskAndWrite()

Muuttuja SelectedName; Vaihtuva tilapäisen varastoinnin osoite; Jos PutFile(TempStorageAddress, SelectedName, True) Sitten Object.FileName = ValitunNimi; PlaceObjectFile(AddressTemporaryStorage); Loppu Jos;

EndProcedure

// Tiedoston kopioiminen väliaikaisesta tallennustilasta viitteeseen // attribuutti, objektin kirjoittaminen, tiedoston poistaminen väliaikaisesta tallennustilasta // &AtServer Procedure PlaceObjectFile(TemporaryStorageAddress)

Hakemistoelementti = FormAttributeToValue("Objekti"); BinaryData = GetFileFromTempStorage(TempStorageAddress); DirectoryItem.FileData = UusiArvoSäilytys(binääritiedot); FilePathOnDisk = Uusi tiedosto(Hakemistokohde.Tiedostonnimi); Katalogi Element.FileName = FilePathOnDisk.Name; ElementDirectory.Write(); muokattu = false; DeleteFileFromTemporaryStorage(AddressTemporaryStorage); ValueVFormAttribute(DirectoryItem, "Objekti");

EndProcedure

// Tiedoston lukeminen attribuutista ja sen tallentaminen // paikalliselle levylle interaktiivisessa &AtClient-tilassa Proseduuri ReadFileAndSaveToDisk()

Osoite = GetFileAddressInInfobase(Object.Link, "FileData"); GetFile(Osoite, Objekti.Tiedostonnimi, True);

EndProcedure

Tuki kuvakentässä oleville osoitteille

Image Field -säädin tukee väliaikaisessa tallennustilassa tai tietokannassa olevan tiedoston osoitteen määrittämän kuvan näyttämistä.

Tätä varten sinun on määritettävä lomakeelementin Data-ominaisuudessa merkkijonotyyppiattribuutti. Tämän määritteen arvo tulkitaan kuvan osoitteeksi.

Esimerkki // Kuvakentän sitominen väliaikaisessa tallennustilassa olevan kuvan osoitteeseen //. AddressImage form rekvisiitta merkkijonotyyppi

Paikkatiedosto (ImageAddr, True)

Image.Data = ImageAddress

Rajoitukset työskennellessäsi Web-asiakkaan kanssa

Kuvatun mekanismin toiminnalla Web-asiakasohjelmaa käytettäessä on joitain rajoituksia. Nämä rajoitukset liittyvät selaimen suojausmallin erityispiirteisiin. Joten esimerkiksi asiakas ei voi tallentaa tiedostoa paikalliseen tiedostojärjestelmään yksinään, eli käytettävissä on vain interaktiivinen versio asiakasmenetelmistä PlaceFile() ja GetFile(). Ei-interaktiivisen tilan yrittäminen aiheuttaa poikkeuksen. Interaktiivisesti näytettävät valintaikkunat ovat tietylle selaintyypille.

Ominaisuudet työskennellessäsi asiakkaan Value Storen kanssa

Ongelma:

Kun taulukkoosassa olevalla asiakirjalla on ValueStorage-tyyppinen attribuutti, se hidastaa asiakirjalomakkeen avaamista, jos tämä määrite sisältää suuria tietoja.

Ehdotettu syy:

Kenties lomaketta avattaessa asiakkaalle ei lähetetä linkkiä Value Storen tietoihin, vaan itse tietoon.

Ratkaisu

  • Lomakkeen taulukkomääritteen ominaisuuksissa on lippu "Käytä aina". Jos se on asetettu, kentän sisältö siirtyy aina palvelimen ja asiakkaan välillä - esimerkiksi lomaketta avattaessa. Tämä lippu on poistettava käytöstä, mutta sinun on otettava tämä huomioon koodissa, koska oletusarvoisesti tälle kentällä ei ole arvoa asiakkaassa. Esimerkki voidaan katsoa kohdassa 1C: Arkisto.

Sitä on vielä parempi käyttää väliaikainen varasto tiedostojen siirtämiseen asiakkaan ja palvelimen välillä.

Teknologisen alustan 1C:Enterprise 8 avulla voit tallentaa mielivaltaisia ​​tiedostoja tietokantaan, hakea ne sieltä ja käyttää niitä eri tavoilla. Katsotaanpa näitä toimintoja esimerkein.

Ennen kuin lataat tiedoston 1C-tietokantaan, sinun on saatava tiedoston täydellinen osoite levylle. Työskentely tiedostojen valintaikkunoiden kanssa on kuvattu kohdassa .

Tiedostojen tallentamiseksi määrite (tai rekisteriresurssi) tyypin kanssa Tallennusarvot.

Satunnaisen tiedoston lataaminen 1C-tietokantaan

Mikä tahansa tiedosto voidaan esittää binääritietona ja ladata siihen Arvon tallennus.

Kun binääridataa muunnetaan objektiksi Tallennusarvot rakentamista käytetään newStorageValue(Data,Compression) kahdella vaihtoehdolla:

  1. Data- binääritietoa tallennettavaksi
  2. Puristus— Deflaatio-algoritmin pakkausaste. Kokonaisluku välillä -1…9. -1 on oletuspakkaustaso. 0 - ei pakkausta, 9 - suurin pakkaussuhde. Oletusarvo: -1. Parametri on valinnainen, jos sitä ei ole määritetty, pakkausta ei käytetä.

//Muunna tiedosto binääritiedoksi
Tiedosto = Uusi binääritieto(polku) ;

//Luo uusi ValueStorage-objekti

DataStorage = UusiArvoTallennus(Tiedosto, NewDataCompression(9) ) ;

Satunnaisen tiedoston tallentaminen 1C-tietokannasta levylle

Jos haluat tallentaa tiedoston 1C-tietokannasta levylle, sinun on määritettävä polku ja tiedoston nimi. Tätä varten on tiedostojen tallennusikkuna, jonka kanssa työskentely kuvataan kohdassa .

//Hae binääritiedot tallennustilasta
//DataStorage - ValueStorage-tyypin objektin attribuutti

//Kirjoita vastaanotetut tiedot levylle
//Path-muuttuja sisältää levyllä olevan tiedoston täyden osoitteen
Data. Kirjoita(Path) ;

1C-tietokannassa olevan tiedoston katselu

Jotta voit tarkastella tietokantaan tallennettua tiedostoa, tietokoneellesi on oltava asennettuna sovellus, joka avaa tämän tiedoston.

//Hanki väliaikaisen tiedoston nimi vaaditulla tunnisteella
//Muuttujaan Extension täytyy laittaa tiedostopääte, esimerkiksi "pdf"
Polku= GetTemporaryFileName(Extension) ;

// Hae tiedot tallennustilasta
//DataStorage - ValueStorage-tyypin objektin attribuutti
Data = Datastore. Saada() ;

//Kirjoita tiedot väliaikaiseen tiedostoon
Data. Kirjoita(Path) ;

//Yritä avata tiedosto sille tarkoitetussa sovelluksessa
//Jos sovellusta ei löydy, "Open with..." -järjestelmän valintaikkuna tulee näkyviin
StartApplication(Path) ;

Tulosta (Ctrl+P)

16.3. Työskentely binääritietojen kanssa

16.3.1. yleistä tietoa

Sovellettuja ratkaisuja toteutettaessa ovat mahdollisia tilanteet, joissa on tarpeen analysoida erilaista binaaridataa. On esimerkiksi määritettävä tiedostotyyppi allekirjoituksen perusteella tai suoritettava joitain manipulaatioita kuvan kanssa. 1C:Enterprise tarjoaa erityisiä ohjelmointirajapintoja binääritietojen käsittelyä varten. Seuraavaksi tarkastellaan mahdollisuuksia työskennellä binääridatan kanssa.
Kaikki työ binääridatan kanssa perustuu virran käsitteeseen. Virtaus on mielivaltaisen (yleensä) tietolähteen (Stream-objektin) looginen yleistys. Järjestelmä ei tarjoa mahdollisuutta luoda itsenäistä Stream-objektia, jota ei ole liitetty mihinkään lähteeseen. Mutta on olemassa johdettuja objekteja, joita voidaan luoda - levyllä olevaan tiedostoon liittyvä virta (FileStream-objekti) tai muistiin luotu virta (MemoryStream-objekti). Virran avulla voit sekä lukea tietoja että kirjoittaa niitä. Tiettyjen toimintojen suorittamisen mahdollisuuden määrittämiseksi virralla (ja johdetuilla objekteilla) on erityisiä menetelmiä, joiden avulla voit määrittää, mitkä
toiminnot ovat käytettävissä annetulla virralla (menetelmät AvailableRecord(), SaatavillaLue(), AvailableChangePosition()).
Jos on tarpeen työskennellä virran kanssa korkeammalla tasolla, erityisesti lukemaan/kirjoittamaan dataa, kuten numeroa (eri bittisyyttä) tai merkkijonoa, ReadData /WriteData-objektit on tarkoitettu tähän. Näiden objektien avulla on mahdollista lähestyä virrassa olevaa binääritietoa jäsennellymmin. Joten esimerkiksi tietäen tiedoston muodon, voit melko mukavasti lukea tällaisen tiedoston saamalla tarvittavat tiedot otsikoista (jotka yleensä edustavat numero- ja merkkijonotyypit), ohittamalla tarpeettomat tietolohkot ja lataamalla tarvittavat käsittelyyn.
Binääritietojen kanssa työskentelyn yleinen kaavio voidaan esittää seuraavasti:

  1. Suoratoisto käynnissä
  2. DataReader- tai DataWrite-objekti luodaan.
  3. Vaiheessa 2 luodun objektin avulla suoritetaan tarvittavat toimenpiteet.
  4. Vaiheessa 2 luotu objekti suljetaan.
  5. Jos muita toimintoja ei tarvitse suorittaa, vaiheessa 1 saatu virta suljetaan.
  6. Jos haluat jatkaa työskentelyä streamin kanssa, voit asettaa uuden sijainnin streamiin (jos tämä toiminto on tuettu) ja jatkaa työskentelyä vaiheesta 2.

On huomattava, että on mahdollista yhdistää kohteita 1 ja 2. Toisin sanoen järjestelmä tarjoaa mahdollisuuden luoda objekteja Lue tiedot/kirjoita tiedot välittömästi esimerkiksi BinaryData-objektista.
Erilaisten toimintojen suorittamiseksi binääritiedoilla järjestelmä tarjoaa mahdollisuuden saada osa virrasta erillisenä fragmenttina mielivaltaisella (tavulta) pääsyllä (objekti) BufferBinaryData). Puskurin koko asetetaan luonnin yhteydessä, eikä sitä voi muuttaa myöhemmin. Binaaridatapuskurin kanssa työskennellessä on mahdollista työskennellä eri kapasiteetin lukujen kanssa, kuten kanssa
kokonaisena. Samalla on mahdollista määrittää tavujärjestys sanoilla: "juniori-senior" (little endian) tai "senior-junior" (big endian). On myös mahdollista jakaa yksi puskuri useaksi puskuriksi ja yhdistää useita binaaridatan puskureita yhdeksi tulokseksi puskuriksi.
On tärkeää huomata, että työskentely binääritietopuskurin kanssa voi yksinkertaistaa toteutusta merkittävästi, jos työ binaaridatan kanssa toteutetaan asiakassovelluksen puolella asynkronisessa tilassa. Tässä tapauksessa tietojen lukeminen puskuriin on asynkroninen toiminto ja puskuritiedon käsittely on synkronista.
Binaaridatan kanssa työskentely on mahdollista asiakassovelluksen (mukaan lukien web-asiakas) puolella ja palvelinpuolella sekä synkronisissa ja asynkronisissa työskentelymalleissa. Muissa esimerkeissä käytetään synkronista toimintamallia.

16.3.2. Binääritietojen lukeminen

Esimerkkinä binääritietojen lukemisesta tarkastelemme ongelmaa oikean tiedostomuodon määrittämisessä, joka järjestelmässä on valittu myöhempää käyttöä varten. Äänitietoja sisältävää .wav-tiedostoa käytetään tarkistettavana tiedostona. .wav-tiedostojen tallentamiseen käytetään RIFF (Resource Interchange File Format) -tiedostomuotoa, jonka kuvaus löytyy linkistä:

https://msdn.microsoft.com/enus/library/windows/desktop/ee415713.aspx (englanniksi). Lukuesimerkissä käytetään seuraavia muototietoja:
1. Tiedoston ensimmäiset 4 tavua sisältävät muototunnisteen: RIFF.
2. Seuraavat 4 tavua sisältävät todellisen äänidatan koon pienen loppujen tavujärjestyksessä.
3. Seuraavat 4 tavua sisältävät käytetyn datan tekstityypin: WAVE.
Näiden vaiheiden suorittamiseen tarvitset seuraavan 1C:Enterprise-koodin:

Lue = Uusi ReadData (Tiedostonimi, ByteOrder.LittleEndian);
FileFormat = Read.ReadCharacters(4);
DataSize = Read.ReadInteger32();
FileType = Read.ReadCharacters(4);
Jos tiedostomuoto<>"RIFF" siis
alert("Tämä ei ole RIFF-tiedosto");
Paluu ;
Loppu Jos ;
Jos FileType = "WAVE" Sitten
Raportti ("Tämä on WAV-tiedosto datalla, koko " + DataSize + " tavua");
Muuten
Ilmoita ("Tämä ei ole WAV-tiedosto");
Palata;
Loppu Jos;

Tarkastellaanpa esimerkkiä yksityiskohtaisemmin.
Ensin avataan tiedosto, jonka nimi on FileName-muuttujassa, tiedosto avataan luettavaksi ( FileOpenMode.Open), lukee vain tiedostosta ( FileAccess.Read) ja lukemiseen käytetään 16-tavuista puskuria.
Sitten muodostetaan tietovirta lukemaan dataa, jonka tavujärjestys on "pieni-korkea" numerotyyppisille tiedoille. Sitten tuloksena olevasta virrasta luetaan 4 merkkiä, 32-bittinen kokonaisluku ja 4 muuta merkkiä. Tuloksena oleva data analysoidaan ja analyysin tulosten perusteella päätetään, onko valittu tiedosto .wav-tiedosto vai ei.

16.3.3. Kirjoita binääridataa

Binääritietojen kirjoittaminen tiedostoon tapahtuu yksinkertaisimmassa tapauksessa seuraavasti:

Merkintä = Uusi WriteData (Tiedostonimi);
Indeksille = 0 - 255 sykli
Write.WriteByte(indeksi);
EndCycle;
Record.Close() ;

Tämä esimerkki kirjoittaa tiedostoon tavujen sarjan 0-255 (0xFF heksadesimaalilukuna). Tämä on yksinkertaisin merkintä.
Voit myös käyttää edellisessä esimerkissä käsiteltyä lukumenetelmää vastaavaa menetelmää, kun vastaanotetaan tiedostovirta ja kirjoitetaan dataa tähän tiedostovirtaan.

16.3.4. Työskentely binaaridatapuskurin kanssa

Kuten edellä mainittiin, binääridatapuskuri tarjoaa kätevän tavan käsitellä binääridatan bittejä.
Tietojen lukemisen lisäksi myös kirjoittamista tuetaan.
Esimerkkinä harkitaan RIFF-tiedoston otsikon jäsentämistä datanlukuesimerkistä (katso tästä). Täsmälleen samoja tiedostomuototietoja käytetään esimerkin rakentamiseen. Siksi lähdetiedostosta on luettava tiedoston otsikon kokoinen puskuri. Otsikko koostuu kolmesta 4-tavuisesta kentästä. Siksi on tarpeen lukea 12 tavua.

Puskuri = Uusi BufferBinaryData(12);
Tiedosto = FileStreams.Open(TempFiles-hakemisto() + "Windows Logon.wav", FileOpenMode.Open, FileAccess.Read);
Tiedosto.Lue(puskuri, 0, 12);
Koko = Puskuri.ReadInteger32(4);
StringStream = Uusi StreamInMemory(Buffer);
StreamString.Jump(0, PositionInStream.Start);

Tiedostomuoto = ReadString.ReadCharacters(4, "windows-1251");
ReadingLine.Close();
StreamString.Jump(8, PositionInStream.Start);
StringReader = NewDataReader(StringStream );
Tiedostotyyppi = ReadString.ReadCharacters( 4, "windows-1251");
ReadingLine.Close();

Tietojen saaminen binääritietopuskuriin ei ole mitään erikoista. Jatkotoimenpiteet vaativat kommentteja. Minkä tahansa tuetun bittisyvyyden numeroiden lukeminen on mahdollista mistä tahansa puskuripaikasta. Tässä esimerkissä Puskuri.ReadInteger32(4); tarkoittaa 32-bittisen kokonaisluvun lukemista puskurin tavusta 4 alkaen. Jos sinun on siis luettava useita puskurin eri paikoissa olevia lukuja, tämä voidaan tehdä ilman suoraa paikantamista tähän puskuriin.
Binääritietopuskuri ei kuitenkaan tue merkkijonon lukemista. Siksi sinun tulee käyttää objektia, jonka avulla voit tehdä tämän: ReadData . DataReader-objektia ei voi luoda binääritietopuskurista. Mutta binääritietojen puskurin perusteella voit luoda virran, joka on universaali välittäjä fyysisen tiedontallennuspaikan (tiedosto, binääritietojen puskuri) ja korkean tason objektin välillä, jonka avulla voit työskennellä näiden tietojen kanssa.
Kun DataReader-objekti luodaan virran perusteella, se aloittaa tietojen lukemisen virrassa sillä hetkellä määritetystä paikasta. Siksi esimerkissä asetetaan ensin paikka virrassa ja sitten luodaan DataReader-objekti ja luetaan tarvittava määrä merkkejä. Yksityiskohtainen kuvaus tavujen ja merkkien lukumäärän eroista merkkijonoja luettaessa, katso seuraava osa 16.3.5

16.3.5. Käyttöominaisuudet

Kun käytät binaaridataa, sinun tulee ottaa huomioon String-tyyppisten tietojen kanssa työskentelyn erityispiirteet. Erikoisuus on, että globaalin kontekstifunktion StrLength() palauttaman merkkijonon pituus mitataan merkeissä. Symboleissa tulee ilmoittaa luku-/kirjoitusdatan koot objekteissa olevien merkkijonojen kirjoitus-/lukumenetelmissä binaaridatan kanssa työskentelyä varten ( Luesymbolit (),
ReadString(), WriteSymbols(), WriteString()). Samanaikaisesti ei ole olemassa yksiselitteistä vaihtoehtoa merkkijonon pituuden muuntamiseksi vastaavaksi parametriksi tavuissa. Tämä suhde vaihtelee merkkijonon sisällöstä ja koodauksesta riippuen. Siksi, kun työskentelet tietorakenteiden kanssa, jotka sisältävät muuttuvan pituisia merkkijonoja, sinun tulee ymmärtää selvästi, missä yksiköissä merkkijonojen pituudet ilmaistaan.
Jos käytettävissä olevissa tiedoissa merkkijonon pituus on määritelty tavuissa ja merkkijono monitavuisessa vaihtuvamittaisessa koodauksessa (esim. UTF-8), niin binääritietoobjekteja käyttämällä on yleensä mahdotonta lukea tällaista rakennetta. tiedostosta String-tyyppisiksi tiedoiksi.
Mutta tässä tapauksessa voit helposti muuttaa luku-/kirjoituskohtaa tiedostovirrassa. Jos merkkijonon pituus määritetään merkeissä, tällainen merkkijono on mahdollista lukea String-tyyppisiksi tiedoiksi, mutta luku- / kirjoitusaseman muuttaminen tällaisessa virrassa on mahdotonta.
Jos haluat saada merkkijonon pituuden tavuina, voit muuntaa merkkijonon BinaryData-objektiksi seuraavalla funktiolla:

Toiminto Hanki BinaryDataFrom String(Val StrParameter , Val-koodaus = "UTF-8")
StreamMem = Uusi StreamInMemory ;
Kirjoittaja = Uusi WriteData (StreamMemory);
Writer.WriteString(StrParameter , Koodaus );
Kirjoittaja. Sulje();
Palauta StreamMemory.CloseAndGetBinaryData();
EndFunctions

Todellinen koko tavuina saadaan kutsumalla Size()-funktio BinaryData-objektissa, joka saadaan funktion tuloksena.
Esineiden samanaikainen käyttö ei ole suositeltavaa Lue tiedot/kirjoita tiedot ja stream-objekteja. Jos kahden peräkkäisen DataReader-lukemisen tai kahden peräkkäisen DataWrite-kirjoituksen välillä tapahtuu muutos sijainnissa virrassa, jonka kanssa objektit työskentelevät Varjostustiedot/tietojen kirjoittaminen- Poikkeus heitetään. Joten seuraava esimerkki osoittaa oikean sijainnin muutoksen virrassa, kun kirjoitetaan dataa streamiin:

Stream = Uusi StreamInMemory();

WriteData.WriteString("Hei maailma!");
WriteData.Close();
Stream.Jump(0, PositionInStream.Start);
DataRecord = Uusi DataRecord(Stream);
WriteData.WriteString("Hei hei!");
WriteData.Close();
Seuraava esimerkki tervehdys poikkeuksen tekemiselle:

Stream = Uusi StreamInMemory();

WriteData.WriteString("Hei maailma!");
Stream.Jump(0, PositionInStream.Start);
// Seuraava rivi tekee poikkeuksen
WriteData.WriteString("Hei!");
Samalla ovat mahdollisia tilanteita, joissa järjestelmän toiminta on virheellinen, mutta virheitä ei synny:

Stream = GetStream();
DataReader = Uusi DataReader(Stream);
Testimerkkijono = ReadData.Read();
InitialPosition = Stream.CurrentPosition();
DataRecord = Uusi DataRecord(Stream);
WriteData.WriteString("Odottamaton merkkijono");
DataWrite.Close();
Flow.Go(InitialPosition, PositionInStream.Start);
// Yleensä on mahdotonta määrittää, mikä arvo muuttujaan TestString2 sijoitetaan
Testimerkkijono2 = ReadData.ReadString();

Tässä osiossa kuvattu käyttäytyminen johtuu o DataReader/DataWrite-objektit käyttävät omia puskureitaan työskennellessään streamin kanssa. Tämän seurauksena virran todellinen sijainti poikkeaa loogisesta sijainnista, joka muodostuu suoritettujen toimintojen tuloksena.
Myöskään samaa säiettä työssään käyttävien ReadData- ja WriteData-objektien samanaikaista käyttöä ei tueta.