Motta data fra verdilagring 1s 8.3. Begrensninger ved arbeid med webklienten

Nesten all informasjon kan lagres i et verdilager, f.eks.

... bilder (bilder):

CurrentImage.Object = SprFabric.Link; CurrentImage.DataType = Enumerations.Types of Other Information of Objects.Image; Storage = NewValueStorage(NewPicture, NewDataCompression()); CurrentImage.Storage = Storage.Get();

// på dette stedet viser det alt... Form Elements.PictureField1.Picture = Storage.Get(); CurrentImage.Write();

...regnearkdokument:

TabDoc=Nytt tabelldokument; TabDoc.Output(FormElements.TabularDocumentField1); Storage=NewValueStorage(TabDoc); Skrive();

Slutt på prosedyre

Prosedyre RestoreFromStoragePress(Element)

TabDoc=Storage.Get(); Hvis TabDoc<>Undefined ThenFormElements.TabularDocumentField1.Output(TabDoc); slutt om;

Slutt på prosedyre

...vilkårlige filer (binære data):

XZ = NewValueStorage(NewBinaryData(fil));

Åtte støtter komprimering av data plassert i lagring:

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

... ekstern behandling og rapportering:

Prosedyre LoadProcessingIntoStorage(PropsStorageType)

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

Slutt på prosedyre

Prosedyre StartProcessingFromStorage(PropsStorageType)

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

Slutt på prosedyre

Jobber med oppbevaring

Hvis det var binære data, kan de gjenopprettes fra verdilageret ved å bruke Get-metoden og skrives til en fil ved hjelp av Write()-metoden.

Hvis TypeValue(Storage)<>Type("BinaryData") Deretter

BinaryData = Storage.Get();

BinaryData = Lagring;

slutt om; BinaryData.Write(Filnavn);

Hvis det for eksempel var et Word-dokument (doc-fil eller annen registrert filtype), kan det åpnes slik:

LaunchApplication(Filnavn);

For å fjerne et felt av typen Verdilagring, må du tilordne det Udefinert:

PropsStorage = Udefinert;

Arbeide med filer og bilder i det innebygde språket 1C:Enterprise 8

Hensikt

Den administrerte applikasjonen implementerer en ny mekanisme for arbeid med filer. Det gir filutveksling mellom infobasen og klientapplikasjonen. Det særegne ved denne mekanismen er at den er designet for bruk i en tynnklient og en nettklient og er utformet under hensyntagen til begrensningene for arbeid med filer pålagt av nettlesere.

Mekanismen er et sett med metoder som kan brukes til å plassere data som er lagret lokalt på brukerens datamaskin i en midlertidig lagring av informasjonsbasen, overføre denne informasjonen fra den midlertidige lagringen til databasen, og motta den tilbake til brukerens datamaskin. De vanligste applikasjonsproblemene som løses av denne mekanismen er lagring av tilhørende informasjon, for eksempel bilder av varer, dokumenter knyttet til kontrakter, etc.

Metode Omfang

Midlertidig lagring

Midlertidig lagring er et spesialisert område av informasjonsbasen der binære data kan plasseres. Hovedformålet er midlertidig lagring av informasjon under klient-server-interaksjon før den overføres til databasen.

Behovet for midlertidig lagring oppstår fordi nettleserens driftsmodell krever at den brukervalgte filen overføres direkte til serveren uten mulighet for å lagre den på klienten. Når en fil overføres, legges den i midlertidig lagring og kan deretter brukes når du skriver et objekt til databasen.

Den mest typiske applikasjonsoppgaven som løses ved midlertidig lagring er å gi tilgang til filer eller bilder før objektet registreres i informasjonsbasen, for eksempel i form av et element.

En fil eller binære data som er lagret, identifiseres av en unik adresse, som senere kan brukes i skrive-, lese- eller sletteoperasjoner. Denne adressen er gitt av metoder for å skrive en fil til midlertidig lagring. En egen metode i det innebygde språket lar deg finne ut om den beståtte adressen er en adresse som peker til data i midlertidig lagring.

Informasjonsbase

Mekanismen lar deg få tilgang til binære data som er lagret i attributter av typen Value Storage.

Som ved midlertidig lagring er tilgang til informasjon mulig gjennom en spesiell adresse. Du kan få det gjennom en spesiell metode ved å sende en lenke til et objekt eller en registreringsnøkkel for informasjonsregister, og navnet på attributtet. Når det gjelder en tabelldel, er det i tillegg påkrevd å overføre radindeksen til tabelldelen.

Metoder for å jobbe med filer har begrensninger når man jobber med infobasedetaljer. For dem, i motsetning til midlertidig lagring, er det bare å lese informasjon som er tilgjengelig, men ikke å skrive eller slette den.

Beskrivelse av metoder for arbeid med filer

Lagre data til midlertidig lagring

Det mest typiske scenariet for å bruke denne mekanismen involverer først å plassere brukerdata i midlertidig lagring. Det er to metoder for dette: PlaceFile() og PlaceFileInTemporaryStorage().

Den første metoden, PlaceFile(), plasserer en fil fra det lokale filsystemet til midlertidig lagring. Metoden kan godta en måladresse i lagring. Hvis den ikke er definert eller er en tom streng, vil en ny fil opprettes og metoden vil returnere adressen sin gjennom den tilsvarende parameteren.

Hvis parameteren som bestemmer den interaktive driftsmodusen er True, vil metoden vise en standard filvalgsdialogboks der du kan velge en fil som skal lagres. I dette tilfellet vil metoden også returnere adressen til den valgte filen.

Som et resultat returnerer metoden False hvis brukeren interaktivt nektet å utføre en operasjon i filvalgsdialogen. Metoden er kun tilgjengelig på klienten.

Den andre metoden, PlaceFileInTemporaryStorage(), er lik den forrige, bortsett fra at den er tilgjengelig på serveren, og dataene som skal skrives til midlertidig lagring er ikke representert som en bane i filsystemet, men som en variabel av typen Binære data. På samme måte, hvis ingen måladresse er spesifisert, opprettes en ny fil i lagringen. Adressen returneres som et resultat av funksjonen.

Henter en fil fra midlertidig lagring

Når du skriver et objekt til infobasen, må du kanskje trekke ut data fra midlertidig lagring og plassere dem for eksempel i et attributt. Det er en tilsvarende servermetode for dette - GetFileFromTemporaryStorage(). Denne metoden henter data fra midlertidig lagring og returnerer dem som et resultat. For å gjøre dette må du spesifisere adressen i midlertidig lagring. Denne adressen returneres av metodene som er beskrevet ovenfor PlaceFile() og PlaceFileInTemporaryStorage() hvis de utføres vellykket.

Sletter en fil fra midlertidig lagring

Etter at dataene er lagret i detaljene, kan filen i midlertidig lagring slettes. For dette formålet er det en metode DeleteFileFromTemporaryStorage(), som sletter en fil fra midlertidig lagring. Metoden tar som parameter adressen til en fil i midlertidig lagring. Tilgjengelig på serveren.

Sjekker adressen for midlertidig lagring

Filadressen kan indikere både midlertidig lagring og detaljer i infobasen. For å sjekke typen, er det en metode This isTemporaryStorageAddress().

Den sjekker at den angitte adressen er en adresse som peker til butikken. Returnerer True hvis adressen peker på midlertidig lagring. Metoden er tilgjengelig på serveren.

Mottar rekvisittadressen

Etter at dataene er plassert i detaljene i infobasen, må du kanskje få tilgang til dem ved hjelp av filmetoder.

Men før du mottar data, for eksempel fra en eiendom, må du få adressen til denne eiendommen. For dette formålet er det en metode GetFileAddressInformationBase().

Hensikten er å returnere filadressen i infobasen i henhold til de opprinnelige parameterne. For å gjøre dette må du sende inn objektnøkkelen (dette kan enten være en lenke til objektet eller en registreringsnøkkel for informasjonsregister) og navnet på attributtet. Hvis du trenger å få adressen til en fil som er lagret i et tabelldelattributt, før attributtnavnet i parameteren som spesifiserer attributtnavnet, må du legge til navnet på tabelldelen og en prikk ".". Metoden er tilgjengelig både på klienten og serveren.

Henter en fil fra infobasen

GetFile()-metoden mottar en fil fra infobasen og lagrer den i brukerens lokale filsystem. Den første parameteren spesifiserer adressen til filen i rekvisittene eller midlertidig fillagring. Den andre parameteren spesifiserer målplasseringen til den resulterende filen. I ikke-interaktiv modus må du spesifisere banen. I interaktiv modus er parameteren valgfri.

Som standard utføres metoden i interaktiv modus, det vil si at den siste parameteren er True. Dette betyr at en dialogboks vises der du kan spesifisere en handling med den mottatte filen: kjør den eller lagre den på en brukerspesifisert plassering. Hvis interaktiv modus er aktiv og parameteren Target disk file path ikke er spesifisert, er ikke filåpningsoperasjonen tilgjengelig. Returnerer en boolsk verdi. False betyr at brukeren valgte å avbryte operasjonen i den interaktive dialogboksen for lagring av fil.

Eksempel på bruk av filmetoder

// Motta en fil fra disk i interaktiv modus // og plassere den i midlertidig lagring &På klienten Prosedyre SelectDiskFileAndWrite()

Variabel SelectedName; VariableTemporaryStorageAddress; Hvis PutFile(TemporaryStorageAddress, SelectedName, True) Then Object.FileName = SelectedName; PlaceObjectFile(TemporaryStorageAddress); slutt om;

Slutt på prosedyre

// Kopiere en fil fra midlertidig lagring til en katalog // attributt, registrere et objekt, slette en fil fra midlertidig // lagring &På serveren Prosedyre Plasser objektfil (midlertidig lagringsadresse)

Directory Element = Form AttributesValue("Objekt"); BinaryData = GetFileFromTemporaryStorage(TemporaryStorageAddress); Directory Element.File Data = NewValueStorage(BinaryData); FilePathOnDisk = Ny fil(DirectoryItem.FileName); Directory Item.FileName = FilePathOnDisk.Name; Directory element.Write(); Modifisert = False; DeleteFileFromTemporaryStorage(TemporaryStorageAddress); ValueВFormAttributes(Katalogelement, "Objekt");

Slutt på prosedyre

// Lese en fil fra rekvisittene og lagre den // på den lokale disken i interaktiv modus &På klienten Prosedyre ReadFileAndSaveToDisk()

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

Slutt på prosedyre

Støtte for adresser i bildefeltet

Bildefelt-kontrollen støtter visning av et bilde spesifisert av adressen til en fil i midlertidig lagring eller i en database.

For å gjøre dette må du angi et strengtypeattributt i Data-egenskapen til skjemaelementet. Verdien av dette attributtet vil bli tolket som adressen til bildet.

Eksempel // Binding av bildefeltet til bildeadressen i midlertidig // lagring. AddressPictures danner detaljer om strengtype

PlaceFile(PictureAddress,True)

Picture.Data = AddressPictures

Begrensninger ved arbeid med webklienten

Driften av den beskrevne mekanismen når du bruker webklienten har noen begrensninger. Disse begrensningene er relatert til nettleserens sikkerhetsmodell. Så for eksempel kan ikke klienten lagre en fil uavhengig til det lokale filsystemet, det vil si at bare den interaktive versjonen av klientmetodene PlaceFile() og GetFile() er tilgjengelig. Et unntak blir gitt når du prøver å bruke ikke-interaktiv modus. Dialogboksene som vises interaktivt er spesifikke for nettlesertypen din.

Funksjoner når du arbeider med Value Storage på klienten

Problem:

Når et dokument har et attributt av typen Verdilagring i tabelldelen, bremser det åpningen av dokumentskjemaet hvis dette attributtet inneholder store data.

Antatt grunn:

Kanskje, når du åpner et skjema, er det ikke lenken til dataene i Value Store som sendes til klienten, men selve dataene.

Løsning

  • I egenskapene til skjemaets tabellattributt er det et flagg "Bruk alltid". Hvis det er satt, overføres alltid innholdet i feltet mellom serveren og klienten - for eksempel ved åpning av et skjema. Dette flagget må være deaktivert, men dette må tas med i koden, siden det som standard ikke vil være noen verdi for dette feltet på klienten. Et eksempel finner du i 1C:Archive.

Det er enda bedre å bruke midlertidig lagring for å overføre filer mellom klient og server.

Vi har en katalog "Produkter", i attributtet "Data" hvor informasjon lagres i form av binære data. Selve attributtet har verditypen "Value Storage". Følgende skjermbilde viser katalogmetadatastrukturen.

For å legge ved en vilkårlig fil fra disk i form av et element, er kommandoen "AttachFile" implementert. Programkoden er presentert i følgende liste:

& På klientprosedyren AttachFile(Command) // Kommandobehandler på klienten. Filvalg // Dialog for å velge en fil fra disk Mode = FileSelectionDialogMode. Åpning; OpenFileDialog = NewFileSelectDialog(Mode); OpenFile Dialog. FullFileName = " " ; OpenFile Dialog. MultipleSelect = False; OpenFile Dialog. Title = "Velg filer" ; Hvis FileOpenDialog. Velg() Deretter FilePath = FileOpenDialog. FullFileName; // Motta binære fildata BinaryData = new BinaryData(PathToFile) ; // Overfør binære data til serveren AttachFileServer(BinaryData) ; Ellers tekst = "ru = " " Fil (s) ikke valgt!" " ; no =" " Fil (s) ikke valgt!" " " ; Advarsel(NStr(Text) ); EndIf ; EndProcedure & OnServer-prosedyre AttachFileServer(BinaryData) // Behandler på serveren for å registrere en fil i informasjonssikkerheten // Transform skjemaobjektet til et referanseobjekt ObjectCurrent = FormAttributesValue("Objekt" ) ; // Tilordne en ny verdi til "Data"-attributtet ObjectCurrent. Data = NewValueStorage(BinaryData) ; // Lagre endringer ObjectCurrent. Skrive() ; Slutt på prosedyre

Hvis vi beskriver algoritmen i generelle termer, velges først en fil fra disken på klienten. De resulterende binære fildataene sendes til serveren, hvor de registreres i informasjonsbasen, nemlig i "Data"-attributtet til det gjeldende katalogelementet.

I prinsippet fungerer alt. Når vi åpner et element, kan vi lese disse dataene etter behov. Hvis for eksempel et bilde er lagret i attributtet, så kan vi hente det og vise det i skjemafeltet. Denne løsningen har en plass, men i de fleste oppgaver er det ikke optimalt å bruke attributter med verditypen «Value Storage» i kataloger og dokumenter. Og det er derfor...

Ytelsespåvirkning

La oss kjøre noen ytelsestester. Testene vil bruke to elementer i "Produkter"-katalogen, med og uten en vedlagt fil. Størrelsen på den vedlagte filen er 5 megabyte.

Alle tester utføres ved hjelp av "GetElement"-behandlingen i testkonfigurasjonen. Du kan laste ned denne konfigurasjonen fra lenken på slutten av artikkelen.

La oss måle tiden det tar å åpne elementer i "Produkter"-katalogen. For å åpne et element brukes den globale kontekstmetoden "OpenValue()", som sendes en referanse til elementet som en parameter. La oss måle åpningstiden ved å bruke et standard verktøy for ytelsesmåling. Resultatene er presentert i følgende skjermbilde:

Som vi kan se, er tiden det tar å åpne et element med en vedlagt fil 10 ganger lengre! La oss ta en ny test. La oss kjøre "GetObject()"-metoden for å referere til produktkatalogelementet. Du kan se testresultatet i følgende skjermbilde.

Forskjellen er ganske betydelig. Å motta et element uten en vedlagt fil er 194 ganger raskere!

Dette skjer fordi "GetObject()"-metoden mottar alle dataene fra detaljene til katalogelementet ved referanse. Følgelig mottar metoden verdiene til ikke bare "Code" og "Name" attributtene, men også verdien av "Data" attributtet. Hvis den lagrer binære data på 5 megabyte i størrelse (som i vårt eksempel), så når objektet mottas, blir disse dataene plassert i RAM (som andre detaljer) og deretter overført til klientsiden. Det er mottak av data fra dette attributtet som øker tiden for å hente elementobjektet. Hvis en tynn kommunikasjonskanal brukes, vil åpningstiden øke enda mer på grunn av overføring av en stor mengde informasjon over nettverket.

Merk: når du kjører "OpenValue()"-metoden, hentes også katalogelementobjektet først, og deretter transformeres det til et skjemaobjekt og sendes til klienten (for administrerte skjemaer). Det vil si at når et element åpnes ved referanse, hentes også objektet.

La oss gjennomføre en siste test på tiden det tar å åpne og skrive et katalogelement med og uten en vedlagt fil. Resultatet vises i følgende skjermbilde.

Naturlig resultat. Tiden for å motta og deretter skrive for et katalogelement med en vedlagt fil viste seg å være ~19 ganger lengre. Som nevnt ovenfor, når du mottar et objekt, oppnås verdiene til alle detaljene, inkludert "Data" -attributtet der 5 megabyte med informasjon er lagret. Når et element skrives, blir denne datamengden igjen skrevet til infobasen. Følgelig vil lagring av data i et katalogattributt (eller dokument) med typen "Value Storage" påvirke ytelsen negativt både når du henter et objekt og når det plasseres i infobasen.

Hva er den mest korrekte måten å løse problemet med å lagre data for informasjonsbaseobjekter?

Riktig løsning

Hvis vi ser på implementeringen av denne mekanismen i typiske konfigurasjoner, vil vi se at for objekter lagres tilleggsinformasjon i en egen informasjonsregistertabell. Dette er for eksempel hvordan vedleggsfilmekanismen ser ut i en standardkonfigurasjon av "Trade Management" versjon 11.

"Nomenclature"-katalogen er eieren av "NomenclatureAttachedFiles"-katalogen. Dette er igjen assosiert med AttachedFiles-informasjonsregisteret, hvis AttachedFile-dimensjon refererer til elementet. Dermed blir data knyttet til informasjonsbaseobjekter faktisk lagret i informasjonsregistertabellen, hvis drift praktisk talt ikke påvirkes av mengden data som er lagret i ressursen. Den mellomliggende katalogen "Nomenklatur for vedlagte filer" er nødvendig for å lagre tilleggsinformasjon for den vedlagte filen, samt for å støtte tilgang til den vedlagte filen ved referanse.

Alt det ovennevnte bekrefter nok en gang den enorme ytelseseffekten av en riktig utformet konfigurasjonsmetadatastruktur.

Testkonfigurasjon med et eksempel fra artikkelen: LINK .

Plattform 1C:Enterprise gir mange muligheter for lagring av data av ulike typer.

Men ofte er ikke disse mulighetene nok. Og så kommer en spesiell gjenstand oss ​​til hjelp - Lagringsverdier. Dette objektet lar deg lagre i et spesielt format både standard 1C:Enterprise-objekter, for eksempel en verditabell, og ikke-standardobjekter som ikke er angitt en type i plattformen. Ikke-standardtyper kan inkludere filer. Ved å bruke et verdilager i en 1C-database kan du for eksempel lagre fotografier av ansatte, skanninger av dokumenter, ekstern behandling osv. Fordelen her er at alle disse objektene er lagret i selve databasen. Følgelig, når du distribuerer en ny database fra en sikkerhetskopi, vil alle disse objektene også være til stede i den nye databasen. På den annen side, hvis du lagrer store filer i databasen, kan dette øke volumet betydelig og påvirke ytelsen negativt. Derfor må det her opprettholdes en rimelig balanse.

La oss se på å jobbe med en verdibutikk ved å bruke et eksempel. La oss lage en spesiell katalog i konfiguratoren - la oss kalle den Eksterne objekter, og på sin side vil vi lage nødvendighetene for katalogen En gjenstand med type Lagringsverdier

Og nå kan vi lage elementer i denne katalogen, og i rekvisitter En gjenstand Hvert element skrives til en fil.

Å jobbe med en verdibutikk er veldig enkelt. Hvis vi ser på syntakshjelperen, vil vi se at dette objektet kun har en metode og en konstruktør.

Nå, for demonstrasjon, la oss skrive den enkleste koden som vil skrive en fil til rekvisittene En gjenstand et tidligere opprettet katalogelement, og les deretter denne filen fra rekvisittene og skriv den til disk, men under et annet navn.

&På serverprosedyren LoadUnloadFile(Directory Element)Directory Object =Directory Element. GetObject() ; //Plasser bildet i verdilageret LabelDownload = Nytt bilde("g:\musor\favicon.ico" ) NewValueStorage; //Skriv et katalogelement Katalogobjekt. DirectoryObject-objekt. Skrive() ; //Last opp bildet fra verdilageret til en fil Filnavn = "g:\musor\favicon_1.ico" ; LabelUpload = Katalogobjekt. En gjenstand. Få() ; LabelUpload. Skriv(Filnavn) ; Slutt på prosedyre

Og noen få forklaringer til koden.

  • Objektet plasseres i butikken direkte når butikken opprettes ved hjelp av konstruktøren.

For å lagre andre typer filer enn bilder i lagring, kan du bruke objektet Binære data. Rent teoretisk kan du til og med lagre katalogelementer, dokumenter osv. i verdilageret. Men i praksis gir dette ingen mening. Men det er noen ganger mulig å bruke et verdilager til å lagre en verditabell, et verditre og andre universelle samlinger.