Hvordan fylle ut og åpne et nytt dokumentskjema programmatisk? Hvordan åpne en form av et eksisterende objekt? Åpne skjemaet til et nytt dokument programmert 1s 8.3

Å åpne skjemaer i en administrert 1C-applikasjon er vesentlig forskjellig fra å åpne dem i en vanlig applikasjon. La oss først se på den gamle metoden. Det består av å motta et skjema og deretter åpne det i normal eller modal modus (når det åpnes i modal modus, blokkerer skjemaet programmet).

GetForm() . Åpen()

Dette er den tregeste metoden for å åpne skjemaer. Det lar deg imidlertid programmere behandle skjemaet før du åpner det. For å behandle koden må du endre litt:

Form = GetForm( "Dokument. Mottak av varer og tjenester. Dokumentskjema") ;
//Her utfører vi handlinger med skjemaet
Skjema. Åpen();

Det bør tas i betraktning at når skjemaet mottas, vil en annen hendelsesprosedyre bli utført WhenCreatedOnServer.

La oss se på andre metoder som lar deg åpne skjemaer i en administrert 1C-applikasjon raskere og mer praktisk. Avhengig av den spesifikke situasjonen kan forskjellige metoder brukes.

1. Hvordan åpne et objektskjema i en administrert applikasjon hvis det er en lenke til det.

I dette tilfellet er alt ekstremt enkelt.

RefLink = Kataloger. Nomenklatur. FinnByKode("000000001" );
OpenValue(RefLink) ;

2. Hvordan åpne utvalgsskjemaet og deretter hente den valgte verdien.

Det er en funksjon for dette EnterValue(). Funksjonen har 3 parametere:

  • Variabelen som den valgte verdien skal skrives inn i;
  • Et hint som vil vises i valgvinduet;
  • Beskrivelse av typene valgte verdier. Det kan være flere typer, i så fall vil du bli bedt om å velge en type før du velger en bestemt verdi.

Som et resultat av å utføre funksjonen, åpnes standardvalgskjemaet for et objekt av den angitte typen.

Variabel verdi;
Array= ny Array;
Array. Legg til(Type( "DirectoryLink.Nomenclature") ) ;
Array. Legg til(Type( "DirectoryLink. Motparter") ) ;

TypeDescription= ny TypeDescription(Array) ;

Res = EnterValue(Verdi, "Hint" , TypeDescription) ;

Tidligere metoder tillot deg bare å åpne standardskjemaene for objekter (objektform eller utvalgsskjema). Hvis du trenger å åpne et tilpasset skjema, kan du bruke funksjonen OpenForm().

Denne funksjonen har ganske mange parametere. La oss se på noen av dem:

  • Skjemanavn— her kan du velge en av standard objektformene, for eksempel, Valgskjema eller Listeskjema. Eller et spesifikt skjema laget av utviklerne.
  • Alternativer— lar deg overføre det til skjemaet i skjemaet strukturer noen parametere før du åpner den, og dermed bestemme utdataene. Parametere kan være alle data som kan sendes fra klienten til serveren. Parametrene som sendes ved åpning av skjemaet kan behandles i prosedyren WhenCreatingOnServer() når skjemaet åpnes.
  • Skjemaåpningsmodus— har 3 alternativer: uavhengig, blokker hele grensesnittet, blokker eierskjemaet.

La oss se på hvordan funksjonen brukes OpenForm() i ulike situasjoner.

3. Hvordan åpne skjemaet til et eksisterende objekt

Hvert skjema har ett nøkkelattributt. Den er uthevet med fet skrift i listen over skjemadetaljer og kalles vanligvis En gjenstand i form av elementer av oppslagsverk og dokumenter. Andre objekter kan ha et annet navn. For å åpne et skjema for et eksisterende objekt, må du sende en parameter til skjemaet som åpnes Nøkkel med verdien som en referanse til et objekt.

&På klient
Prosedyre Kommando1 (Kommando)
Parameter= ny struktur;
Parameter. Insert("Key" , FindC() );
OpenForm(, Parameter) ;
Slutt på prosedyre

&På server
Funksjon FinnC();
Returkataloger. Motparter. FindByRequisites ("TIN", "745107734623")
EndFunction

4. Hvordan åpne et nytt objektskjema

En enkel funksjon vil gjøre her OpenForm() uten noen parametere.

&På klient
Prosedyre Kommando1 (Kommando)
OpenForm( "Katalog. Motparter. Objektskjema") ;
Slutt på prosedyre

5. Hvordan åpne et nytt objektskjema og fylle det ut basert på noe

Du må sende en parameter Utgangspunkt, hvis verdi vil være en referanse til fyllingsbasisobjektet. Dette vil starte prosedyren ProcessFill().

&På klient
Prosedyre Kommando1 (Kommando)
Parameter= ny struktur;
Parameter. Insert("Base", LinkToBuyerAccount) ;
OpenForm( "Dokument. Salg av varer og tjenester. Objektskjema", Parameter) ;
Slutt på prosedyre

Dette eksemplet vil lage et dokument Salg av varer og tjenester og fylt ut på grunnlag av en faktura for betaling til kjøper, lenken til denne ble overført.

6. Hvordan åpne et skjema og angi et utvalg på det

Utvelgelse på 1C-skjemaer kan være enkelt eller komplekst. Enkelt utvalg innebærer uttrykk som Organisasjon = Horns and Hooves LLC. Kompleks utvalg innebærer andre typer sammenligning, f.eks. På listen. I denne artikkelen vil vi vurdere organiseringen av enkelt utvalg, og en egen artikkel vil bli viet til komplekst utvalg.

For å organisere et enkelt valg, må du sende en parameter med en nøkkel til skjemaet som åpnes Utvalg, vil verdien være en struktur der nøkkelen er navnet på det dynamiske listefeltet, og verdien er dataene som søkes etter.

La oss for eksempel åpne kataloglisteskjemaet GTD tall og gjør et valg der etter eier - katalogelement Nomenklatur.

&På klient
Prosedyre Kommando1 (Kommando)
Parameter= ny struktur;

Utvalg= ny struktur;
Utvalg. Insert("Eier", LinkToNomenclature) ;

Parameter. Insert("Utvalg", Utvalg) ;

OpenForm( "Directory.GTD Numbers.List Form", Parameter) ;
Slutt på prosedyre

7. Slik åpner du registreringsskjemaet for informasjonsregisteret

For å gjøre dette trenger du informasjonsregisteret.

Opptaksnøkkel— dette er verdiene for alle målinger og perioden (hvis registeret er periodisk). Det vil si at en postnøkkel er parametrene som en post kan identifiseres med.

Åpningsalgoritmen er som følger:

  1. Vi legger inn nøkkeldataene med de nødvendige verdiene i strukturen.
  2. Vi plasserer den resulterende strukturen i en matrise.
  3. Vi lager en rekordnøkkel fra arrayet.
  4. Vi sender en parameter til skjemaet som åpnes Nøkkel med opptaksnøkkelen fra trinn 3 som verdi.

&På klient
Prosedyre Kommando1 (Kommando)
Parameter= ny struktur;

KeyParameters= ny struktur;
Nøkkelparametere. Insert("Nomenklatur", LinkToNomenclature) ;
Nøkkelparametere. Insert("PriceType", LinkToPriceType) ;
Nøkkelparametere. Insert("Periode", Dato) ;

KeyArray = New Array;
KeyArray. Add(KeyParameters) ;

EntryKey = New( "Information RegisterRecord Key.PricesNomenclature", KeyArray);

Parameter. Insert("Key", RecordKey) ;

OpenForm( "Informasjonsregister. Nomenklaturpriser. Registreringsskjema", Parameter) ;
Slutt på prosedyre

hjem For nybegynnere utviklere Lær å programmere

Hvordan åpne en form av et eksisterende objekt?

Når du åpner et skjema for et eksisterende objekt, må du i tillegg til navnet på skjemaet også angi objektet hvis skjema skal åpnes. For å gjøre dette, bruk nøkkelskjemaparameteren og en lenke til objektet av interesse for oss.

For eksempel, hvis du fra listen over organisasjonsskjemaet trenger å åpne skjemaet til organisasjonen som markøren er plassert på, kan du gjøre dette på følgende måte:

Vi sender skjemaparametere i form av en struktur, hvor navnet på strukturelementet tilsvarer navnet på skjemaparameteren, og verdien er verdien vi ønsker å sette skjemaparameteren til.

Hvis du ikke vil åpne hovedformen, men en vilkårlig form av et objekt opprettet i konfiguratoren, i stedet for standardnavnet til hovedformen (ObjectForm), angi ordet Form etterfulgt av en prikk - navnet på formen opprettet i konfiguratoren.

For eksempel:

ReferenceToDirectoryElement = Elements.List.CurrentRow; FormParameters = New Structure("Nøkkel", ReferenceToDirectoryElement); OpenForm("Directory.Organizations.Form.UniversalObjectForm",FormParameters);

Det skal bemerkes at i tilfelle når det i tillegg til en lenke til et objekt, ingen parametere trenger å sendes til skjemaet som åpnes og det er hovedformen til det eksisterende objektet som trengs, kan du bruke en enklere metode - åpne skjemaet ved å bruke prosedyren OpenValue():

OpenValue(Items.List.CurrentRow);

Denne metoden er mindre allsidig, men i noen tilfeller sparer den tid og krefter. For eksempel, i det aktuelle tilfellet, kan en slik linje erstatte hele den tre-linjers prosedyren vi skrev tidligere.

Imidlertid må du være forsiktig når du bruker denne prosedyren. I noen tilfeller kan det føre til flere anrop til serveren, for eksempel når du trenger å åpne et hierarkisk katalogelementskjema. Ved bruk av denne prosedyren vil plattformen foreta et ekstra anrop til serveren for å avgjøre om et element er en gruppe eller ikke, siden forskjellige skjemaer må åpnes for elementet og for gruppen.

Samtidig kan denne informasjonen være kjent på forhånd for utvikleren innenfor hans algoritme, og ved å bruke OpenForm()-funksjonen kan utvikleren åpne ønsket skjema uten ytterligere anrop til serveren, umiddelbart spesifisere standardnavnet på hovedenheten form.

God dag alle sammen!
Jeg tror at informasjonen i dette emnet vil være veldig nyttig for mange besøkende på dette forumet.
I lang tid kunne jeg ikke løse problemet - hvordan åpne skjemaet til et nytt dokument slik at det åpnes ikke tomt, men allerede delvis fylt ut programmatisk, mens selve dokumentet ennå ikke er registrert i databasen? Jeg brukte mye tid på å søke etter en løsning på dette problemet på Internett, besøkte mange fora der dette problemet ble tatt opp, men bare noen få av dem kom over løsninger. Den enkleste av dem er å først programmatisk opprette et nytt dokument, programmatisk fylle ut de nødvendige detaljene, skrive dokumentet til databasen og deretter åpne det for brukeren. Hva om brukeren ikke vil lagre den? Hva om han ombestemmer seg og lukker den åpne formen? I dette tilfellet vil det allerede registrerte dokumentet forbli i databasen. Og hvem trenger ekstra dokumenter i databasen?
Og hvis du ikke lagrer dokumentet, er det mest populære alternativet å bruke GetForm-metoden ("Documents. Required Document Type. Document Form"). Men i dette tilfellet kan du få et tomt dokumentskjema og ganske enkelt vise det ved å bruke Open()-metoden. Dette er heller ikke et alternativ...
Etter en tid ble problemet løst ved å bruke den globale kontekstfunksjonen "Fyll inn egenskapsverdier."

Global kontekst
FillPropertyValues
Syntaks:
Fyll eiendomsverdier(<Приемник>, <Источник>, <Список свойств>, <Исключая свойства>)
Beskrivelse:
Kopierer egenskapsverdier<Источника>til eiendommer<Приемника>. Matching gjøres av eiendomsnavn.

Ved å bruke oppgaven min som eksempel, vil jeg gjerne forklare hvordan du kan bruke denne funksjonen til å fylle ut et skjema for et nytt dokument. Oppgaven var som følger: Det er ett dokument (Arbeidsordre), hvor forutsetningen for den tabellformede delen er et annet dokument (Tjenester). Så det var nødvendig å sørge for at når et nytt dokument "Gjengivelse av tjenester" ble lagt til i tabelldelen av "Arbeidsordren", ble skjemaet til det nye dokumentet "Gjengivelse av tjenester" vist på skjermen med detaljene allerede fylt ut, hentet fra arbeidsordren som opprettelsen ble forårsaket fra. Samtidig er selve det nye dokumentet, på det tidspunktet dets form vises på skjermen, ennå ikke registrert i databasen. Dette måtte gjøres hvis brukeren plutselig bestemmer seg for ikke å fylle ut dokumentet og bare lukker skjemaet.
Her er et kodefragment med en løsning på problemet:

&På klientprosedyren EnterRecord()RecordForm = GetForm("Document.Provision of Medical Services.ObjectForm"); Fyll innPropertyValues(RecordForm.Object,Object,"Dato,Spesialist,Spesialization,Sykepleier,Execution Status",); // Fyll inn verdiene til detaljer hvis navn er det samme i begge dokumentene TextStr = Elements.Reception.CurrentData; //Data for gjeldende linje i kildedokumentetProperty Structure = New Structure; // Strukturen inneholder verdiene til de detaljene som må fylles ut på skjemaet til det nye dokumentet, men som ikke er i kildedokumentet StructureProperties.Insert("Arbeidsordre", Object.Link); PropertyStructure.Insert("ReceptionTime",TexStr.ReceptionTime); Fyll innPropertyValues(RecordForm.Object,PropertyStructure,"RecordOrder,AppointmentTime",); EntryForm.Open(); Slutt på prosedyre

Det vil si at vi utfører alle operasjoner direkte på klienten, uten å kontakte serveren, innenfor en uavhengig opprettet prosedyre. Faktisk kan du på denne måten fylle ut og åpne skjemaet til ethvert dokument eller oppslagsverk. Først fylte jeg ut detaljene fra ett skjema til et annet ved å bruke skjemaobjekter, og deretter, ved å bruke "Struktur"-objektet, der jeg satte inn de manglende detaljene, fylte jeg ut noen flere detaljer om skjemaet som ble åpnet, og åpnet deretter form.
Jeg håper at dette temaet vil spare tid for mange som står overfor en lignende oppgave!