Extinderea funcționalității de lucru cu date binare. Lucrul cu date binare 1c obține un fișier xls din datele binare

Datele binare din 1C sunt destinate stocării fișierelor de format arbitrar. Cu ajutorul lor poți:

  • Organizați interacțiunea folosind un protocol binar cu diverse dispozitive;
  • Stocați fișiere de orice format ca atribute ale obiectului metadatelor;
  • Convertiți datele text în binare (utilizate cel mai adesea pentru trimiterea de rapoarte);
  • Lucrați cu date binare în memorie.

Ce poate face sistemul

Când lucrați cu date binare, Platforma 8.3 poate efectua următoarele acțiuni:

  1. Citiți și scrieți date binare;
  2. Mutați datele de la client la server și înapoi folosind stocarea temporară;
  3. Inițializați un obiect de tip „Imagine” folosind fișiere binare;
  4. Citiți-le de pe World Wide Web folosind obiectele „Atașament la e-mail”, „Conexiune HTTP”, etc.
  5. Utilizați instrumente criptografice pentru a cripta și semna atașamente importante;
  6. Folosind obiectul „Data Hashing”, calculați funcția hash.

Salvarea datelor în atribute

De exemplu, să creăm un director într-o configurație de testare.

De fapt, folosirea aceluiași director pentru a stoca informații despre nomenclatură și datele de imagine binare este puțin incorectă. Cu volume suficient de mari de date și fișiere grele și mari, pot apărea timpi de nefuncționare nedoriți și „frâne” în funcționarea sistemului. Din punct de vedere al sistemului, ar fi mult mai corect să organizăm un director separat „Imagini”, un link către care am putea seta ca tip de recuzită.


Este important de reținut că, din cauza faptului că atributele de tip „ValueStorage” care conțin date binare nu sunt disponibile în modul de aplicație gestionată, ele pot fi accesate numai folosind metoda FormAttributesValue.


Câmpul de mesaj reprezintă o înregistrare de date binare de stocare a valorilor.

Citirea datelor din recuzită

Să creăm o procesare care va scoate fișierul stocat în formă binară în configurația noastră într-un document de foaie de calcul (acest lucru este necesar, de exemplu, pentru a tipări sigla unei companii).


Practic, acesta este tot codul de care avem nevoie. Folosind operatorul Get(), citim datele binare stocate în atributul de director corespunzător și le transferăm în obiectul „Picture”, care va fi afișat în celula din stânga sus a documentului tabelar al formularului (Fig. 9).

Fig.9

Conversia datelor

Nu este obișnuit, dar se întâmplă ca atunci când lucrați cu schimburi non-standard cu sisteme externe, este necesar să convertiți datele din format binar în format Base64 sau invers.

În majoritatea cazurilor, platforma convertește automat datele, dacă acest lucru nu se întâmplă, trebuie să utilizați funcții globale de traducere:

  1. Base64String – convertește valoarea specificată într-un șir de codificare corespunzătoare;
  2. Base64Value – face conversia inversă.

Optimizarea codului de mai sus

Codul prezentat în Fig. 4 funcționează cu siguranță, dar cu o avertizare semnificativă: dacă caseta de selectare „Modality use mode” este bifată în proprietățile de configurare (Fig. 10). În caz contrar, utilizarea acestuia va cauza o eroare.
Fig.10

Pentru a preveni acest lucru, în timp ce vă aflați în modulul de formular element de director, accesați meniul Text->Refactoring->Apeluri sincrone depreciate->Convertire apeluri de modul.

După ceva timp, apelurile sincrone vor fi convertite automat în asincron, iar codul va lua forma (Fig. 11)

Fig.11

Platforma tehnologică 1C:Enterprise 8 vă permite să salvați fișiere arbitrare în baza de informații, să le preluați de acolo și să le utilizați în diferite moduri. Să ne uităm la aceste operații folosind exemple.

Înainte de a încărca un fișier în baza de informații 1C, trebuie să obțineți adresa completă a fișierului de pe disc. Lucrul cu dialogurile de selectare a fișierelor este descris în .

Pentru a stoca fișiere, utilizați un atribut (sau înregistrați o resursă) cu tipul Valori de stocare.

Încărcarea unui fișier arbitrar în baza de informații 1C

Orice fișier poate fi reprezentat ca date binare și încărcat în Depozitarea valorii.

La conversia datelor binare într-un obiect Valori de stocare designul folosit noi valori de stocare (date, compresie) cu doi parametri:

  1. Date— date binare care trebuie stocate în stocare
  2. Comprimare— raportul de compresie al algoritmului Deflation. Număr întreg în intervalul -1...9. -1 este nivelul de compresie implicit. 0 - fără compresie, 9 - compresie maximă. Valoare implicită: -1. Parametrul este opțional dacă nu este specificat, atunci compresia nu este utilizată.

//Conversia fișierului în date binare
Fișier = New BinaryData(Path) ;

//Creează un nou obiect de stocare a valorilor

DataStorage = NewValueStorage(Fișier, NewDataCompression(9) ) ;

Salvarea unui fișier arbitrar din baza de informații 1C pe disc

Pentru a salva un fișier din baza de date 1C pe disc, trebuie să determinați calea și numele fișierului. Pentru a face acest lucru, există un dialog de salvare a fișierelor, care lucrează cu care este descris în.

//Obțineți date binare din stocare
//Data Storage - atribut al unui obiect cu tipul Value Storage

//Scrieți datele primite pe disc
//Variabila Path conține adresa completă a fișierului de pe disc
Date. Scrie(Cale);

Vizualizarea unui fișier situat în baza de informații 1C

Pentru a vizualiza un fișier salvat în baza de date, trebuie să aveți instalată pe computer o aplicație care deschide fișierul.

//Obțineți numele fișierului temporar cu extensia necesară
//În variabila Extensie trebuie să puneți extensia fișierului, de exemplu „pdf”
Cale = GetTemporaryFileName(Extensie) ;

// Primiți date din stocare
//Data Storage - atribut al unui obiect cu tipul Value Storage
Data = Datastore. Get() ;

//Scrieți datele într-un fișier temporar
Date. Scrie(Cale);

//Încercarea de a deschide fișierul în aplicația dorită
//Dacă aplicația nu este găsită, va apărea dialogul de sistem „Deschide cu...”.
LaunchApplication(Cale) ;

Implementat în versiunea 8.3.10.2168.

Creștem treptat funcționalitatea de lucru cu date binare. Există mai multe motive pentru aceasta. În primul rând, nu am implementat tot ceea ce ne-am planificat. Și în al doilea rând, în procesul de discutare a noilor oportunități, am primit o serie de urări din partea dumneavoastră, pe care am decis să le implementăm.

Noi funcții pentru conversia datelor binare în diferite formate

Într-un context global, am adăugat un număr mare de funcții noi pentru conversia datelor binare. Deci, de exemplu, puteți efectua conversia înainte și inversă a datelor binare într-un șir obișnuit, șir de format Baza 64și șir de format BinHex. În plus, puteți converti datele binare în sine în formate Baza 64, BinHexși înapoi.

Conversii similare sunt acceptate pentru tip BufferBinaryData. În plus, puteți converti un buffer de date binare în date binare și invers.

În plus, două funcții noi vă permit să împărțiți datele binare în mai multe părți și invers, să combinați mai multe obiecte de acest tip BinaryDataîntr-una. În acest caz, noul obiect va conține datele tuturor părților în ordinea pe care o specificați.

Aceste funcții sunt similare ca concept cu împărțirea și îmbinarea fișierelor, dar în multe cazuri sunt mai eficiente. Deoarece nu este nevoie să salvați mai întâi datele binare într-un fișier și pentru că nu există copiere inutilă a datelor la împărțire.

Adăugarea capacității de a lucra cu fluxuri la obiectele care funcționează cu fișiere

Deoarece utilizarea datelor binare este în mare măsură legată de operațiunile cu fișiere, am considerat că este complet logic și natural să adăugați lucru cu fluxuri la acele obiecte care în prezent citesc și scriu fișiere într-un fel sau altul.

Ca rezultat, acum puteți deschide fluxuri pentru citire și scriere atunci când utilizați obiecte precum:

  • Citirea textuluiŞi ScrieText;
  • ReadingFastInfoSetŞi EntryFastInfoSet;
  • ReadingHtmlŞi PostHtml;
  • Citirea JSONŞi intrare JSON;
  • Citirea XMLŞi intrare XML;
  • Citirea fișierului ZipŞi Înregistrați fișierul Zip.

Puteți primi corpul ca flux când lucrați cu HTTP:

  • HTTPRequestŞi HTTPResponse;
  • HTTPServiceRequestŞi HTTPServiceResponse.
  • TextDocument;
  • TabularDocument;
  • FormattedDocument;
  • Schema geografică;
  • GraphicScheme;
  • Conexiune FTP.

Scrierea într-un flux este acum disponibilă atunci când lucrați cu tipuri ImagineŞi ConvertToCanonicalXML. Și pe lângă asta, lucrul cu fluxuri este acum acceptat în diferite metode pe care le au tipurile Conversie XSL, Manager de criptografie, Certificat CriptografieŞi HashingData.

Copiere eficientă prin citirea și scrierea datelor

Instrumentele binare pe care le-am implementat au făcut posibilă copierea fluxurilor. Dar această operațiune nu a fost efectuată foarte eficient pe volume mari de date.

Prin urmare, tipul CitițiDate am implementat o nouă metodă CopyB(). Nu numai că elimină această problemă, dar simplifică și textul, făcându-l mai ușor de înțeles.

De exemplu, anterior era posibil să primiți date binare de la un flux și să le scrieți într-un alt flux.

Acum nu este nevoie să primiți date binare;

Lucrul frumos este că puteți copia nu numai într-un flux, ci și pe un obiect WriteData. Această opțiune este convenabilă atunci când, pe lângă datele din fluxul sursă, trebuie să scrieți unele dintre propriile date în fluxul de ieșire.

Operații logice pe biți pe un buffer de date binare

Acum puteți utiliza operații logice pe biți atunci când lucrați cu buffer-uri de date binare. Ca rezultat al acestor operații, rezultatul unei combinații pe biți a octeților sursă și octeții din buffer-ul specificat va fi scris în memoria tampon sursă conform regulilor operației logice selectate. Am implementat următoarele operațiuni:

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

Un bun exemplu de utilizare a operațiunilor logice pe biți este sarcina de a decoda formatul de schimb cu echipamente de vânzare cu amănuntul. De exemplu, formatul de schimb cu echipamentele de vânzare cu amănuntul este descris de un câmp de 1 octet. Acest câmp conține un set de caracteristici care descriu gama de produse:

  • Biții 0-2: cota de impozitare;
  • Bit 3: 0 - marfa bucata, 1 - marfa cu greutate;
  • Bit 4: 0 - permite vânzarea, 1 - interzice vânzarea;
  • Bit 5: 0 - activare contorizare cantități, 1 - dezactivare contorizare cantități;
  • Bit 6: 0 - vânzarea unică este interzisă, 1 - vânzarea unică este permisă;
  • Bit 7: Rezervat.

Apoi codul care extrage aceste informații și le prezintă într-o formă convenabilă pentru procesarea ulterioară poate arăta astfel.

Obținerea unui număr din literale hexazecimale și binare

  • NumberFromHexString();
  • NumberFromBinaryString().

Literale binare sunt utile pentru definirea măștilor atunci când sunt utilizate împreună cu operații pe biți. De exemplu, în exemplul anterior cu analiza formatului de schimb cu echipamente comerciale, măștile sunt specificate folosind numere zecimale. Acest lucru nu este foarte convenabil, deoarece atunci când scrieți și citiți codul trebuie să traduceți mental în mod constant numărul zecimal în sistemul binar.

Este mult mai convenabil să folosiți literale binar în schimb. În același timp, codul devine mai clar și probabilitatea de erori este redusă semnificativ.

Literele hexazecimale sunt convenabile de utilizat la analizarea formatelor tehnice: formate de imagine, sunet, video.

Schimbări în tehnologia componentelor externe NativeAPI

Anterior, existau o serie de restricții la transferul de date binare între 1C:Enterprise și o componentă externă. De exemplu, era imposibil să transferați date binare către o componentă externă, iar când lucrați într-un client web, schimbul de date binare era complet imposibil.

Acum eliminăm toate aceste restricții. Puteți face schimb de date binare în ambele direcții și chiar în clientul web.

Acest lucru nu va afecta în niciun fel funcționarea componentelor externe existente. Vor funcționa ca înainte. Dar în componentele nou create acum puteți trece obiecte ca parametri BinaryData.

Aproape orice informație poate fi stocată într-un depozit de valori, de ex.

... poze (fotografii):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Enumerări.Types ofAdditionalInformationObjects.Image; Stocare = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// în acest loc afișează totul... Form Elements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...document foaie de calcul:

TabDoc=New TabularDocument;

TabDoc.Output(FormElements.TabularDocumentField1);

Stocare=NewValueStorage(TabDoc);

Scrie();<>Sfârșitul procedurii

Procedura RestoreFromStoragePress(Element)

TabDoc=Storage.Get();

Dacă TabDoc

Nedefinit ThenFormElements.TabularDocumentField1.Output(TabDoc);

endIf;

Sfârșitul procedurii

...fișiere arbitrare (date binare):

XZ = NewValueStorage(NewBinaryData(fișier));

TabDoc.Output(FormElements.TabularDocumentField1);

Opt acceptă comprimarea datelor plasate în stocare:

XZ = NewValueStorage(NewBinaryData(fișier),NewDataCompression(9));

Procedura RestoreFromStoragePress(Element)

... prelucrare și raportare externă:

Procedura LoadProcessingIntoStorage(PropsStorageType)

CompressionRate = NewDataCompression(9); //9 PropsStorageType maxim = New StorageValues(New BinaryData("c:\reports\report.epf", Compression Rate));<>Procedure StartProcessingFromStorage(PropsStorageType)

TemporaryFileName = TemporaryFileDirectory()+"report.epf";

BinaryData = PropsStorageType.Get();

BinaryData.Write(TemporaryFileName);

ExternalProcessing = ExternalProcessing.Create(TemporaryFileName);

ExternalProcessing.GetForm().Open();

Lucrul cu stocarea

Dacă au fost date binare, atunci pot fi restaurate din depozitul de valori folosind metoda Get și scrise într-un fișier folosind metoda Write().

If TypeValue(Stocare)

Tastați ("BinaryData") Apoi

BinaryData = Storage.Get();

Mecanismul este un set de metode care pot fi folosite pentru a plasa datele stocate local pe computerul utilizatorului într-o stocare temporară a bazei de informații, a transfera aceste informații din stocarea temporară în baza de date și a le primi înapoi pe computerul utilizatorului. Cele mai frecvente probleme de aplicare rezolvate de acest mecanism sunt stocarea informațiilor însoțitoare, de exemplu, imagini ale mărfurilor, documente legate de contracte etc.

Domeniul de aplicare al metodei

Depozitare temporară

Stocarea temporară este o zonă specializată a bazei de informații în care pot fi plasate date binare. Scopul principal este stocarea temporară a informațiilor în timpul interacțiunii client-server înainte de a fi transferate în baza de date.

Necesitatea stocării temporare apare deoarece modelul de browser web necesită ca fișierul selectat de utilizator să fie transferat direct pe server fără posibilitatea stocării lui pe client. Când un fișier este transferat, acesta este plasat în stocare temporară și poate fi apoi utilizat atunci când scrieți un obiect în baza de date.

Cea mai tipică sarcină a aplicației rezolvată prin stocarea temporară este furnizarea de acces la fișiere sau imagini înainte ca obiectul să fie înregistrat în baza de informații, de exemplu, sub forma unui element.

Un fișier sau date binare plasate în stocare sunt identificate printr-o adresă unică, care poate fi folosită ulterior în operațiuni de scriere, citire sau ștergere. Această adresă este dată de metode de scriere a unui fișier în stocarea temporară. O metodă separată în limbajul încorporat vă permite să determinați dacă adresa transmisă este o adresă care indică date în stocare temporară.

Baza de informatii

Mecanismul vă permite să accesați date binare stocate în atribute de tipul Value Storage.

Ca și în cazul stocării temporare, accesul la informații este posibil printr-o adresă specială. Îl puteți obține printr-o metodă specială prin transmiterea unui link către un obiect sau o cheie de intrare în registrul de informații și numele atributului. În cazul unei piese tabulare, este necesar să se transfere în plus indexul de rând al părții tabulare.

Metodele de lucru cu fișiere au limitări atunci când se lucrează cu detaliile bazei de informații. Pentru ei, spre deosebire de stocarea temporară, sunt disponibile doar informațiile de citire, dar nu scrierea sau ștergerea acestora.

Descrierea metodelor de lucru cu fișiere

Salvarea datelor în stocarea temporară

Scenariul cel mai tipic pentru utilizarea acestui mecanism implică plasarea inițială a datelor utilizatorului în stocare temporară. Există două metode pentru aceasta: PlaceFile() și PlaceFileInTemporaryStorage().

Prima metodă, PlaceFile(), plasează un fișier din sistemul de fișiere local în stocarea temporară. Metoda poate accepta o adresă țintă în stocare. Dacă nu este definit sau este un șir gol, atunci va fi creat un fișier nou și metoda își va returna adresa prin parametrul corespunzător.

Dacă parametrul care determină modul interactiv de operare este True, atunci metoda va afișa o casetă de dialog standard de selecție a fișierelor în care puteți selecta un fișier pe care să îl plasați în stocare. În acest caz, metoda va returna și adresa fișierului selectat.

Ca rezultat, metoda returnează False dacă utilizatorul a refuzat în mod interactiv să efectueze o operație în dialogul de selecție a fișierului. Metoda este disponibilă numai pentru client.

A doua metodă, PlaceFileInTemporaryStorage(), este similară cu cea anterioară, cu excepția faptului că este disponibilă pe server, iar datele care urmează să fie scrise în stocarea temporară sunt reprezentate nu ca o cale în sistemul de fișiere, ci ca o variabilă de tip BinaryData. De asemenea, dacă nu este specificată nicio adresă țintă, este creat un fișier nou în stocare. Adresa sa este returnată ca rezultat al funcției.

Preluarea unui fișier din stocarea temporară

Când scrieți un obiect în baza de informații, poate fi necesar să extrageți date din stocarea temporară și să le plasați, de exemplu, într-un atribut. Există o metodă de server corespunzătoare pentru aceasta - GetFileFromTemporaryStorage(). Această metodă preia datele din stocarea temporară și, ca rezultat, le returnează. Pentru a face acest lucru, trebuie să specificați adresa în stocarea temporară. Această adresă este returnată de metodele descrise mai sus PlaceFile() și PlaceFileInTemporaryStorage() dacă sunt executate cu succes.

Ștergerea unui fișier din stocarea temporară

După ce datele sunt salvate în detalii, fișierul din stocare temporară poate fi șters. În acest scop, există o metodă DeleteFileFromTemporaryStorage(), care șterge un fișier din stocarea temporară. Metoda ia ca parametru adresa unui fișier aflat în stocare temporară. Disponibil pe server.

Verificarea adresei pentru stocare temporară

Adresa fișierului poate indica atât stocarea temporară, cât și detalii în baza de informații. Pentru a-i verifica tipul, există o metodă This isTemporaryStorageAddress().

Verifică dacă adresa transmisă este o adresă care indică către magazin. Returnează True dacă adresa indică o stocare temporară. Metoda este disponibilă pe server.

Primirea adresei de recuzită

După ce datele sunt plasate în atribute în baza de informații, poate fi necesar să le accesați folosind metode de fișier.

Dar înainte de a primi date, de exemplu de la o proprietate, trebuie să obțineți adresa acestei proprietăți. În acest scop, există o metodă GetFileAddressInInformationBase().

Scopul său este de a returna adresa fișierului în baza de informații conform parametrilor originali. Pentru a face acest lucru, trebuie să transmiteți cheia obiectului (aceasta poate fi fie un link către obiect, fie o cheie de intrare în registrul de informații) și numele atributului. Dacă trebuie să obțineți adresa unui fișier stocat într-un atribut al părții tabelare, înainte de numele atributului în parametrul care specifică numele atributului, trebuie să adăugați numele părții tabelare și un punct „.”. Metoda este disponibilă atât pe client, cât și pe server.

Preluarea unui fișier din baza de informații

Metoda GetFile() primește un fișier din baza de informații și îl salvează în sistemul de fișiere local al utilizatorului. Primul parametru specifică adresa fișierului din elementele de recuzită sau stocarea temporară a fișierului. Al doilea parametru specifică locația de destinație a fișierului rezultat. În modul non-interactiv, trebuie să specificați calea. În modul interactiv, parametrul este opțional.

Implicit, metoda este executată în modul interactiv, adică ultimul parametru este True. Aceasta înseamnă că este afișată o casetă de dialog în care puteți specifica acțiunea cu fișierul primit: rulați-l sau salvați-l într-o locație specificată de utilizator. Dacă modul interactiv este activ și parametrul Cale fișier disc țintă nu este specificat, operația de deschidere a fișierului nu este disponibilă. Returnează o valoare booleană. Fals înseamnă că utilizatorul a ales să anuleze operația în caseta de dialog interactivă de salvare a fișierului.

Exemplu de utilizare a metodelor de fișiere

// Primirea unui fișier de pe disc în modul interactiv // și plasarea acestuia în stocare temporară &Pe Procedura Client SelectDiskFileAndWrite()

Variabila SelectedName;

TabDoc.Output(FormElements.TabularDocumentField1);

VariableTemporaryStorageAddress;

Director Element = Form AttributesValue("Obiect");

TabDoc.Output(FormElements.TabularDocumentField1);

BinaryData = GetFileFromTemporaryStorage(TemporaryStorageAddress);

Director Element.File Data = NewValueStorage(BinaryData);

Procedura RestoreFromStoragePress(Element)

FilePathOnDisk = Fișier nou (DirectoryItem.FileName);

Director Item.FileName = FilePathOnDisk.Name;

Director element.Write();

Modificat = Fals; DeleteFileFromTemporaryStorage(TemporaryStorageAddress);

ValueВFormAttributes(Element director, „Obiect”);

// Citirea unui fișier din elemente de recuzită și salvarea lui // pe discul local în modul interactiv &Pe Procedura Client ReadFileAndSaveToDisk()

Adresă = GetFileAddressInInformationBase(Object.Link, "FileData");

GetFile(Adresă, Object.FileName, True);

Suport pentru adrese din câmpul de imagine

Controlul Picture Field acceptă afișarea unei imagini specificate de adresa unui fișier în stocarea temporară sau într-o bază de date.

Pentru a face acest lucru, trebuie să setați un atribut de tip șir în proprietatea Data a elementului formular. Valoarea acestui atribut va fi interpretată ca adresa imaginii.

Exemplu

// Legarea câmpului de imagine la adresa imaginii în // stocare temporară. AddressPictures formează detalii de tip șir

PlaceFile (Adresă imagine, adevărat)

  • În proprietățile atributului tabel al formularului există un steag „Folosește întotdeauna”. Dacă este setat, conținutul câmpului este întotdeauna transferat între server și client - de exemplu, la deschiderea unui formular. Acest flag trebuie să fie dezactivat, dar acest lucru trebuie luat în considerare în cod, deoarece implicit nu va exista nicio valoare pentru acest câmp pe client. Un exemplu poate fi găsit în 1C:Arhive.

Este chiar mai bine de folosit depozitare temporară pentru a transfera fișiere între client și server.