1s binární data z řetězce. Rozšíření funkčnosti práce s binárními daty. Omezení při práci s webovým klientem

Technologická platforma 1C:Enterprise 8 umožňuje ukládat libovolné soubory do informační základny, odtud je získávat a používat různé způsoby. Podívejme se na tyto operace na příkladech.

Před nahráním souboru do informační databáze 1C musíte získat úplnou adresu souboru na disku. Práce s dialogy pro výběr souboru je popsána v .

K ukládání souborů použijte atribut (nebo prostředek registru) s typem StorageValues.

Nahrání libovolného souboru do informační základny 1C

Jakýkoli soubor může být reprezentován jako binární data a načten do Ukládání hodnoty.

Při převodu binárních dat na objekt StorageValues použitý design nové hodnoty úložiště (data, komprese) se dvěma parametry:

  1. Data— binární data, která je třeba uložit do úložiště
  2. Komprese— kompresní poměr deflace algoritmu. Celé číslo v rozsahu -1...9. -1 je výchozí úroveň komprese. 0 - žádná komprese, 9 - maximální stupeň komprese. Výchozí hodnota: -1. Pokud není parametr zadán, komprese se nepoužije.

//Převod souboru na binární data
Soubor = New BinaryData(Cesta) ;

//Vytvořit nový objekt StorageValues

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

Uložení libovolného souboru z infobáze 1C na disk

Chcete-li uložit soubor z databáze 1C na disk, musíte určit cestu a název souboru. K tomu slouží dialog pro ukládání souborů, práce s nímž je popsána v.

//Získání binárních dat z úložiště
//Data Storage - atribut objektu s typem Value Storage

//Zapíše přijatá data na disk
//Proměnná Path obsahuje úplnou adresu souboru na disku
Data. Write(Cesta) ;

Zobrazení souboru umístěného v informační základně 1C

Chcete-li zobrazit soubor uložený v databázi, musíte mít v počítači nainstalovanou aplikaci, která soubor otevře.

//Získejte jméno dočasný soubor s potřebným prodloužením
//Do proměnné Přípona musíte zadat příponu souboru, například "pdf"
Cesta = GetTemporaryFileName(Extension) ;

//Příjem dat z úložiště
//Data Storage - atribut objektu s typem Value Storage
Data = úložiště dat. Dostat() ;

//Zápis dat do dočasného souboru
Data. Write(Cesta) ;

//Pokouším se otevřít soubor v zamýšlené aplikaci
//Pokud aplikace není nalezena, zobrazí se systémový dialog "Otevřít pomocí...".
LaunchApplication(Path) ;

V úložišti hodnot lze uložit téměř jakoukoli informaci, např.

... obrázky (fotky):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Enumerations.Types dalších informací o Objects.Image; Storage = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// na tomto místě zobrazí vše... Form Elements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...tabulkový dokument:

TabDoc=Nový tabulkový dokument; TabDoc.Output(FormElements.TabularDocumentField1); Storage=NewValueStorage(TabDoc); Napsat();

EndProcedure

Postup RestoreFromStoragePress (prvek)

TabDoc=Storage.Get(); Pokud TabDoc<>Nedefinováno ThenFormElements.TabularDocumentField1.Output(TabDoc); endIf;

EndProcedure

...libovolné soubory (binární data):

XZ = NewValueStorage(NewBinaryData(soubor));

Osm podporuje kompresi dat umístěných v úložišti:

XZ = NewValueStorage(NewBinaryData(soubor),NewDataCompression(9));

... externí zpracování a reportování:

Postup LoadProcessingIntoStorage(PropsStorageType)

CompressionRate = NewDataCompression(9); //9 maximum PropsStorageType = New StorageValues(New BinaryData("c:\reports\report.epf", kompresní poměr));

EndProcedure

Postup StartProcessingFromStorage(PropsStorageType)

TemporaryFileName = TemporaryFileDirectory()+"report.epf"; BinaryData = PropsStorageType.Get(); BinaryData.Write(TemporaryFileName); ExternalProcessing = ExternalProcessing.Create(TemporaryFileName); ExternalProcessing.GetForm().Open();

EndProcedure

Práce s úložištěm

Pokud se jednalo o binární data, lze je obnovit z úložiště hodnot pomocí metody Get a zapsat do souboru pomocí metody Write().

Pokud TypeValue(Storage)<>Zadejte("BinaryData") Potom

BinaryData = Storage.Get();

BinaryData = úložiště;

endIf; BinaryData.Write(NázevSouboru);

Pokud to byl například dokument aplikace Word (soubor doc nebo jiný registrovaný typ souboru), lze jej otevřít takto:

LaunchApplication(FileName);

Chcete-li vymazat pole typu Úložiště hodnoty, musíte mu přiřadit Nedefinováno:

PropsStorage = Nedefinováno;

Práce se soubory a obrázky ve vestavěném jazyce 1C:Enterprise 8

Účel

Spravovaná aplikace implementuje nový mechanismus pro práci se soubory. Poskytuje výměnu souborů mezi infobází a klientskou aplikací. Vlastnosti tento mechanismus je, že je určen k použití v tenký klient a Web Client a je navržen tak, aby zohlednil omezení zpracování souborů uložená webovými prohlížeči.

Mechanismus je sada metod, které lze použít k umístění dat uložených lokálně uživatelem do dočasného úložiště informační základna přeneste tyto informace z dočasného úložiště do databáze a získejte je zpět do počítače uživatele. Nejčastějšími aplikačními problémy řešenými tímto mechanismem je ukládání doprovodných informací, například obrázků zboží, dokumentů souvisejících se smlouvami atd.

Rozsah metody

Dočasné úložiště

Dočasné úložiště je specializovaná oblast informační základny, do které lze umístit binární data. Hlavním účelem je dočasné uložení informací během interakce klient-server před jejich přenesením do databáze.

Potřeba dočasného úložiště vyvstává z toho důvodu, že operační model webového prohlížeče vyžaduje, aby uživatelem vybraný soubor byl přenesen přímo na server bez možnosti jeho uložení na klientovi. Když je soubor přenesen, je umístěn do dočasného úložiště a lze jej pak použít při zápisu objektu do databáze.

Nejtypičtějším aplikačním úkolem řešeným dočasným úložištěm je poskytování přístupu k souborům nebo obrázkům předtím, než je objekt zaznamenán v informační základně, například ve formě prvku.

Soubor nebo binární data umístěná v úložišti jsou identifikována jedinečnou adresou, kterou lze později použít při operacích zápisu, čtení nebo mazání. Tato adresa je dána metodami pro zápis souboru do dočasného úložiště. Samostatná metoda ve vestavěném jazyce umožňuje určit, zda je předaná adresa adresou ukazující na data v dočasném úložišti.

Informační základna

Mechanismus umožňuje přístup k binárním datům uloženým v atributech typu Value Storage.

Stejně jako v případě dočasného úložiště je přístup k informacím možný prostřednictvím speciální adresy. Můžete jej získat speciální metodou předáním odkazu na objekt nebo vstupního klíče informačního registru a názvu atributu. V případě tabulkové části je navíc nutné přenést index řádku tabulkové části.

Metody pro práci se soubory mají omezení při práci s detaily infobáze. Pro ně je na rozdíl od dočasného úložiště dostupné pouze čtení informací, nikoli však jejich zápis nebo mazání.

Popis metod práce se soubory

Ukládání dat do dočasného úložiště

Nejtypičtější scénář pro použití tohoto mechanismu zahrnuje počáteční umístění uživatelských dat do dočasného úložiště. Existují dvě metody: PlaceFile() a PlaceFileInTemporaryStorage().

První metoda, PlaceFile(), umístí soubor z místního souborového systému do dočasného úložiště. Metoda může přijmout cílovou adresu v úložišti. Pokud není definován nebo je prázdným řetězcem, bude vytvořen nový soubor a metoda vrátí svou adresu prostřednictvím odpovídajícího parametru.

Pokud je parametr, který určuje interaktivní režim provozu, True, pak metoda zobrazí standardní dialogové okno pro výběr souboru, ve kterém můžete vybrat soubor, který chcete uložit do úložiště. V tomto případě metoda také vrátí adresu vybraného souboru.

Výsledkem je, že metoda vrátí hodnotu False, pokud uživatel interaktivně odmítl provést operaci v dialogovém okně pro výběr souboru. Metoda je dostupná pouze u klienta.

Druhá metoda, PlaceFileInTemporaryStorage(), je podobná předchozí, s tím rozdílem, že je dostupná na serveru a data, která mají být zapsána do dočasného úložiště, nejsou reprezentována jako cesta v systému souborů, ale jako proměnná typu Binární data. Podobně, pokud není zadána žádná cílová adresa, vytvoří se v úložišti nový soubor. Jeho adresa je vrácena jako výsledek funkce.

Načtení souboru z dočasného úložiště

Při zápisu objektu do infobáze možná budete muset extrahovat data z dočasného úložiště a umístit je například do atributu. K tomu existuje odpovídající serverová metoda - GetFileFromTemporaryStorage(). Tato metoda načítá data z dočasného úložiště a jako výsledek je vrací. Chcete-li to provést, musíte zadat adresu v dočasném úložišti. Tato adresa je vrácena výše popsanými metodami PlaceFile() a PlaceFileInTemporaryStorage(), pokud jsou úspěšně provedeny.

Odstranění souboru z dočasného úložiště

Po uložení dat do podrobností lze soubor v dočasném úložišti smazat. Pro tento účel existuje metoda DeleteFileFromTemporaryStorage(), která smaže soubor z dočasného úložiště. Metoda bere jako parametr adresu souboru v dočasném úložišti. Dostupné na serveru.

Kontrola adresy pro dočasné uložení

Adresa souboru může označovat dočasné úložiště i podrobnosti v informační databázi. Pro kontrolu jeho typu existuje metoda This isTemporaryStorageAddress().

Zkontroluje, že předaná adresa je adresa směřující do obchodu. Vrátí hodnotu True, pokud adresa ukazuje na dočasné úložiště. Metoda je dostupná na serveru.

Příjem adresy rekvizit

Poté, co jsou data umístěna do podrobností v infobázi, možná k nim budete potřebovat přístup pomocí souborové metody.

Než ale obdržíte data, například z nemovitosti, musíte získat adresu této nemovitosti. Pro tento účel existuje metoda GetFileAddressInInformationBase().

Jeho účelem je vrátit adresu souboru v infobázi podle původních parametrů. Chcete-li to provést, musíte předat klíč objektu (může to být buď odkaz na objekt nebo klíč položky registru informací) a název atributu. Pokud potřebujete získat adresu souboru uloženého v atributu tabulkové části, musíte před název atributu v parametru určujícím název atributu přidat název tabulkové části a tečku „.“. Metoda je dostupná jak na klientovi, tak na serveru.

Načtení souboru z infobáze

Metoda GetFile() přijme soubor z informační databáze a uloží jej do místního umístění souborový systém uživatel. První parametr určuje adresu souboru v atributu nebo dočasném úložišti souboru. Druhý parametr určuje cílové umístění výsledného souboru. V neinteraktivním režimu musíte zadat cestu. V interaktivním režimu je parametr nepovinný.

Ve výchozím nastavení se metoda provádí v interaktivním režimu, to znamená, že poslední parametr je True. To znamená, že se zobrazí dialogové okno, ve kterém můžete určit akci s přijatým souborem: spustit jej nebo uložit na uživatelem určené místo. Pokud je aktivní interaktivní režim a není zadán parametr Cesta k souboru cílového disku, operace otevření souboru není dostupná. Vrátí booleovskou hodnotu. False znamená, že uživatel zvolil zrušení operace v dialogovém okně interaktivního uložení souboru.

Příklad použití souborových metod

// Příjem souboru z disku v interaktivním režimu // a jeho umístění do dočasného úložiště &Na klientské procedurě SelectDiskFileAndWrite()

Proměnná SelectedName; VariableTemporaryStorageAddress; If PutFile(TemporaryStorageAddress, SelectedName, True) Then Object.FileName = SelectedName; PlaceObjectFile(TemporaryStorageAddress); endIf;

EndProcedure

// Kopírování souboru z dočasného úložiště do adresáře // atribut, záznam objektu, smazání souboru z dočasného // úložiště &Na serveru Postup Umístění souboru objektu (adresa dočasného úložiště)

Element adresáře = Form AttributesValue("Object"); BinaryData = GetFileFromTemporaryStorage(TemporaryStorageAddress); Data adresáře Element.File = NewValueStorage(BinaryData); FilePathOnDisk = Nový soubor(Adresář Item.FileName); Adresář Item.FileName = FilePathOnDisk.Name; Element adresáře.Write(); Upraveno = False; DeleteFileFromTemporaryStorage(TemporaryStorageAddress); ValueВFormAttributes(prvek adresáře, "Objekt");

EndProcedure

// Načtení souboru z rekvizit a jeho uložení // do lokální disk v interaktivním režimu &Na klientské proceduře ReadFileAndSaveToDisk()

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

EndProcedure

Podpora adres v poli obrázku

Ovládací prvek Picture Field podporuje zobrazení obrázku určeného adresou souboru v dočasném úložišti nebo v databázi.

Chcete-li to provést, musíte nastavit atribut typu řetězce ve vlastnosti Data prvku formuláře. Hodnota tohoto atributu bude interpretována jako adresa obrázku.

Příklad // Vazba pole obrázku s adresou obrázku v dočasném // úložišti. AddressPictures tvoří podrobnosti typu řetězce

PlaceFile(PictureAddress,True)

Picture.Data = AddressPictures

Omezení při práci s webovým klientem

Činnost popsaného mechanismu při použití webového klienta má určitá omezení. Tato omezení souvisejí s modelem zabezpečení prohlížeče. Klient tedy například nemůže samostatně uložit soubor do lokálního souborového systému, to znamená, že je k dispozici pouze interaktivní verze klientských metod PlaceFile() a GetFile(). Při pokusu o použití neinteraktivního režimu je vyvolána výjimka. Dialogová okna, zobrazené interaktivně, jsou specifické pro konkrétní typ prohlížeče.

Funkce při práci s Value Storage na klientovi

Problém:

Pokud má dokument v tabulkové části atribut typu Úložiště hodnoty, zpomalí to otevírání formuláře dokumentu, pokud tento atribut obsahuje velká data.

Předpokládaný důvod:

Možná, že při otevírání formuláře se klientovi neodesílá odkaz na data umístěná ve Value Store, ale samotná data.

Řešení

  • Ve vlastnostech detaily tabulky Formulář má příznak "Vždy použít". Pokud je nastaveno, obsah pole se vždy přenáší mezi serverem a klientem – např. při otevírání formuláře. Tento příznak musí být deaktivován, ale to musí být zohledněno v kódu, protože ve výchozím nastavení nebude mít toto pole na klientovi žádnou hodnotu. Příklad lze nalézt v 1C:Archive.

Ještě lepší je použít dočasné úložiště pro přenos souborů mezi klientem a serverem.

Binární data v 1C jsou určena pro ukládání souborů libovolného formátu. S jejich pomocí můžete:

  • Organizovat interakci pomocí binárního protokolu s různá zařízení;
  • Ukládejte soubory libovolných formátů jako atributy objektů metadat;
  • Převod textových dat na binární (nejčastěji používané pro odesílání reportů);
  • Práce s binárními daty v paměti.

Co systém umí

Při práci s binárními daty může fungovat Platforma 8.3 následující akce:

  1. Čtení a zápis binárních dat;
  2. Přesun dat z klienta na server a zpět pomocí dočasného úložiště;
  3. Inicializujte pomocí binární soubory objekt typu „Obrázek“;
  4. Přečtěte si je z celosvětová síť pomocí objektů „Mail Attachment“, „HTTP Connection“ atd.
  5. Použití kryptografickými prostředkyšifrovat a podepisovat důležité přílohy;
  6. Pomocí objektu „Hashování dat“ vypočítejte hashovací funkci.

Ukládání dat do detailů

Vytvořme si například adresář v testovací konfiguraci.

Ve skutečnosti je použití stejného adresáře k ukládání informací o nomenklatuře a binárních obrazových datech trochu nesprávné. Při dostatečně velkých objemech dat a těžkých, velkých souborech může docházet k nežádoucím prostojům a „brzdám“ provozu systému. Z hlediska systému by bylo mnohem správnější uspořádat samostatný adresář „Pictures“, odkaz, na který bychom mohli nastavit jako typ rekvizit.


Je důležité si uvědomit, že vzhledem k tomu, že atributy typu „Value Storage“ obsahující binární data nejsou v spravovaná aplikace, lze k nim přistupovat pouze pomocí metody FormAttributesValue.


Pole zprávy představuje binární datový záznam úložiště hodnot.

Čtení dat z rekvizit

Vytvořme zpracování, které vypíše soubor uložený v binární podobě v naší konfiguraci do tabulkového dokumentu (to je nutné např. pro tisk firemního loga).


V podstatě je to veškerý kód, který potřebujeme. Pomocí operátoru Get() načteme binární data uložená v odpovídajícím atributu adresáře a přeneseme je do objektu „Picture“, který se zobrazí v levé horní buňce. tabulkový dokument tvarů (obr. 9).

Obr.9

Konverze dat

Ne často, ale stává se, že při práci s nestandardními výměnami s externí systémy Vyžaduje převod dat z binárního formátu do formátu Base64 nebo naopak.

Ve většině případů platforma automaticky převede data, pokud se tak nestane, musíte použít globální funkce překlad:

  1. Base64String – převede zadanou hodnotu na řetězec odpovídajícího kódování;
  2. Base64Value – provede obrácený převod.

Optimalizace výše uvedeného kódu

Kód uvedený na obr. 4 jistě funguje, ale s jedním významným upozorněním: pokud je ve vlastnostech konfigurace zaškrtnuto políčko „Modality use mode“ (obr. 10). V opačném případě způsobí jeho použití chybu.
Obr.10

Chcete-li tomu zabránit, přejděte v modulu formuláře prvku adresáře do nabídky Text->Refaktoring->Zastaralá synchronní volání->Převést volání modulu.

Po nějaké době budou synchronní hovory automaticky převedeny na asynchronní a kód bude mít tvar (obr. 11)

Obr.11

Implementováno ve verzi 8.3.10.2168.

Postupně rozšiřujeme funkcionalitu pro práci s binárními daty. Důvodů je několik. Za prvé jsme nerealizovali vše, co jsme plánovali. A za druhé, v procesu projednávání nových příležitostí jsme od vás dostali řadu přání, která jsme se také rozhodli realizovat.

Nové funkce pro převod binárních dat do různých formátů

Přidali jsme se do globálního kontextu velký počet nové funkce pro převod binárních dat. Můžete tedy například provádět dopředný a zpětný převod binárních dat na běžný řetězec, formátovací řetězec Základ 64 a formátovací řetězec BinHex. Navíc můžete samotná binární data převést do formátů Základ 64, BinHex a zpět.

Pro typ jsou podporovány podobné převody BufferBinaryData. Kromě toho můžete převést vyrovnávací paměť binárních dat na binární data a naopak.

Dvě nové funkce navíc umožňují rozdělit binární data na několik částí a naopak kombinovat několik objektů typu Binární data do jednoho. V tomto případě bude nový objekt obsahovat data všech dílů v pořadí, které zadáte.

Tyto funkce jsou svou koncepcí podobné rozdělování a spojování souborů, ale v mnoha případech jsou efektivnější. Protože není potřeba binární data nejprve ukládat do souboru a protože nedochází ke zbytečnému kopírování dat při rozdělování.

Přidání možnosti pracovat s proudy k objektům, které pracují se soubory

Vzhledem k tomu, že použití binárních dat do značné míry souvisí se souborovými operacemi, považovali jsme za zcela logické a přirozené přidat práci s proudy i těm objektům, které v současnosti nějakým způsobem čtou a zapisují soubory.

Výsledkem je, že nyní můžete otevřít proudy pro čtení a zápis při použití objektů, jako jsou:

  • Čtení textu A NapišteText;
  • ReadingFastInfoSet A EntryFastInfoSet;
  • Čtení HTML A PostHtml;
  • Čtení JSON A Záznam JSON;
  • Čtení XML A XML zápis;
  • Čtení souboru ZIP A Záznam souboru ZIP.

Při práci s HTTP můžete tělo přijímat jako stream:

  • HTTPRequest A HTTPResponse;
  • HTTPServiceRequest A HTTPServiceResponse.
  • Textový dokument;
  • TabelarDocument;
  • Formátovaný dokument;
  • GeographicalScheme;
  • Grafické schéma;
  • FTP připojení.

Při práci s typy je nyní k dispozici zápis do streamu Obrázek A ConvertToCanonicalXML. Kromě toho je nyní podporována práce s vlákny různé metody, které typy mají Převod XSL, Správce kryptografie, CertifikátKryptografie A HashingData.

Efektivní kopírování čtením a zápisem dat

Binární nástroje, které jsme implementovali, umožnily kopírování streamů. Tato operace však nebyla na velkých objemech dat provedena příliš efektivně.

Proto typ ReadData zavedli jsme novou metodu CopyB(). Nejenže tento problém odstraňuje, ale také zjednodušuje text a činí jej srozumitelnějším.

Dříve bylo například možné přijímat binární data z jednoho streamu a zapisovat je do jiného streamu.

Nyní není potřeba přijímat binární data, kopírování probíhá ve fázi čtení dat.

Příjemné je, že kopírovat můžete nejen do streamu, ale i do objektu WriteData. Tato možnost je vhodná, když kromě dat ze zdrojového streamu potřebujete do výstupního proudu zapsat i některá svá data.

Bitové logické operace na vyrovnávací paměti binárních dat

Nyní můžete používat bitové logické operace při práci s vyrovnávacími pamětmi binárních dat. V důsledku těchto operací bude výsledek bitové kombinace zdrojových bajtů a bajtů v určeném bufferu zapsán do zdrojové vyrovnávací paměti podle pravidel zvolené logické operace. Provedli jsme následující operace:

  • WriteBitwiseAnd();
  • WriteBitOr();
  • WriteBitExclusiveNebo();
  • WriteBitIne();
  • Invert().

Dobrý příklad použití bitového kódu logické operace je úkolem dekódování výměnného formátu s obchodní vybavení. Například formát výměny s maloobchodním vybavením je popsán 1bajtovým polem. Toto pole obsahuje sadu charakteristik popisujících sortiment:

  • Bity 0-2: sazba daně;
  • Bit 3: 0 - kusové zboží, 1 - hmotnost zboží;
  • Bit 4: 0 - povolení prodeje, 1 - zákaz prodeje;
  • Bit 5: 0 - povolení počítání množství, 1 - zakázání počítání množství;
  • Bit 6: 0 - jednorázový prodej je zakázán, 1 - jednorázový prodej je povolen;
  • Bit 7: Vyhrazeno.

Pak může kód, který tyto informace extrahuje a prezentuje ve formě vhodné pro další zpracování, vypadat takto.

Získání čísla z hexadecimálních a binárních literálů

  • NumberFromHexString();
  • NumberFromBinaryString().

Binární literály jsou vhodné k definování masek kdy sdílení s bitovými operacemi. Například v předchozím příkladu s analýzou formátu výměny s komerčním vybavením jsou masky specifikovány pomocí desetinných čísel. To není příliš pohodlné, protože při psaní a čtení kódu musíte neustále provádět mentální překlad desetinné číslo do dvojkové soustavy.

Je mnohem pohodlnější místo toho použít binární literály. Kód se zároveň stává přehlednějším a výrazně se snižuje pravděpodobnost chyb.

Hexadecimální literály je vhodné použít při analýze technických formátů: obrazové, zvukové, video formáty.

Změny v technologii externích komponent NativeAPI

Dříve existovala řada omezení při přenosu binárních dat mezi 1C:Enterprise a externí komponentou. Například bylo nemožné přenést binární data na externí komponentu a při práci ve webovém klientovi byla výměna binárních dat zcela nemožná.

Nyní všechna tato omezení odstraňujeme. Binární data si můžete vyměňovat oběma směry a dokonce i ve webovém klientovi.

V práci existující externí komponenty nebude to mít žádný efekt. Budou fungovat jako doposud. Ale v nově vytvořených komponentách nyní můžete předávat objekty jako parametry Binární data.