Hur man programmatiskt fyller i och öppnar ett nytt dokumentformulär? Hur öppnar man en form av ett befintligt objekt? Öppna formuläret för ett nytt dokument programmässigt 1s 8.3

Att programmatiskt öppna formulär i en hanterad 1C-applikation skiljer sig markant från att öppna dem i en vanlig applikation. Låt oss först titta på den gamla metoden. Det består av att ta emot ett formulär och sedan öppna det i normalt eller modalt läge (när det öppnas i modalt läge blockerar formuläret programmet).

GetForm() . Öppen()

Detta är den långsammaste metoden att öppna formulär. Det låter dig dock bearbeta formuläret programmatiskt innan du öppnar det. För att bearbeta koden måste du ändra lite:

Form = GetForm( "Dokument. Mottagande av varor och tjänster. Dokumentformulär") ;
//Här utför vi åtgärder med formuläret
Form. Öppen();

Det bör beaktas att när formuläret tas emot kommer en annan händelseprocedur att utföras WhenCreatedOnServer.

Låt oss titta på andra metoder som låter dig öppna formulär i en hanterad 1C-applikation snabbare och mer bekvämt. Beroende på den specifika situationen kan olika metoder användas.

1. Hur man öppnar ett objektformulär i en hanterad applikation om det finns en länk till det.

I det här fallet är allt extremt enkelt.

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

2. Hur man öppnar urvalsformuläret och får sedan det valda värdet.

Det finns en funktion för detta EnterValue(). Funktionen har 3 parametrar:

  • Variabeln som det valda värdet kommer att skrivas in i;
  • Ett tips som kommer att visas i urvalsfönstret;
  • Beskrivning av typerna av valda värden. Det kan finnas flera typer, i vilket fall du blir ombedd att välja en typ innan du väljer ett specifikt värde.

Som ett resultat av att funktionen körs öppnas standardvalsformuläret för ett objekt av den angivna typen.

Variabelt värde;
Array= ny Array;
Array. Lägg till(Typ( "DirectoryLink.Nomenclature") ) ;
Array. Lägg till(Typ( "DirectoryLink. Motparter") ) ;

TypeDescription= new TypeDescription(Array) ;

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

Tidigare metoder gjorde det bara möjligt för dig att öppna standardformulären för objekt (objektform eller urvalsform). Om du behöver öppna ett anpassat formulär kan du använda funktionen OpenForm().

Denna funktion har en hel del parametrar. Låt oss titta på några av dem:

  • Formnamn— här kan du välja någon av standardobjektformerna, till exempel, Urvalsformulär eller Listformulär. Eller en specifik form skapad av utvecklarna.
  • alternativ— låter dig överföra det till formuläret i formuläret strukturer några parametrar innan du öppnar den, och bestämmer därmed utdata. Parametrar kan vara vilken data som helst som kan skickas från klienten till servern. De parametrar som skickas när formuläret öppnas kan bearbetas i proceduren WhenCreatingOnServer() när formuläret öppnas.
  • Formöppningsläge— har 3 alternativ: oberoende, blockera hela gränssnittet, blockera ägarformuläret.

Låt oss titta på hur funktionen används OpenForm() i olika situationer.

3. Hur man öppnar formen av ett befintligt objekt

Varje formulär har ett nyckelattribut. Det är markerat med fet stil i listan med formulärdetaljer och kallas vanligtvis Ett objekt i form av inslag av referensböcker och dokument. Andra objekt kan ha ett annat namn. För att öppna ett formulär för ett befintligt objekt måste du skicka en parameter till formuläret som öppnas Nyckel med värdet som en referens till ett objekt.

&OnClient
Procedur Kommando1 (Kommando)
Parameter= ny struktur;
Parameter. Insert("Key" , FindC() );
OpenForm(, Parameter) ;
Slut på förfarandet

&På server
Funktion FindC();
Returnera kataloger. Motparter. FindByRequisites ("TIN", "745107734623")
EndFunction

4. Hur man öppnar ett nytt objektformulär

En enkel funktion kommer att fungera här OpenForm() utan några parametrar.

&OnClient
Procedur Kommando1 (Kommando)
OpenForm( "Katalog. Motparter. Objektform") ;
Slut på förfarandet

5. Hur man öppnar ett nytt objektformulär och fyller i det utifrån något

Du måste skicka en parameter Bas, vars värde kommer att vara en referens till fyllningsbasobjektet. Detta kommer att starta proceduren ProcessFill().

&OnClient
Procedur Kommando1 (Kommando)
Parameter= ny struktur;
Parameter. Insert("Base", LinkToBuyerAccount) ;
OpenForm( "Dokument. Försäljning av varor och tjänster. Objektform", Parameter) ;
Slut på förfarandet

Detta exempel kommer att skapa ett dokument Försäljning av varor och tjänster och fylls i på basis av en faktura för betalning till köparen, vars länk skickades.

6. Hur man öppnar ett formulär och ställer in ett urval på det

Urval på 1C-formulär kan vara enkelt eller komplext. Enkelt urval innebär uttryck som Organisation = Horns and Hooves LLC. Komplext urval innebär andra typer av jämförelser, t.ex. På listan. I den här artikeln kommer vi att överväga organisationen av enkelt urval, och en separat artikel kommer att ägnas åt komplext urval.

För att organisera ett enkelt urval måste du skicka en parameter med en nyckel till formuläret som öppnas Urval, kommer värdet att vara en struktur där nyckeln är namnet på det dynamiska listfältet och värdet är den data som söks.

Låt oss till exempel öppna kataloglistans formulär GTD-nummer och gör ett urval där av ägare - katalogelement Nomenklatur.

&OnClient
Procedur Kommando1 (Kommando)
Parameter= ny struktur;

Urval= ny struktur;
Urval. Insert("Ägare", LinkToNomenclature) ;

Parameter. Insert("Selection", Selection) ;

OpenForm( "Katalog.GTD-nummer. Listformulär", Parameter) ;
Slut på förfarandet

7. Hur man öppnar anmälningsformuläret för informationsregistret

För att göra detta behöver du inmatningsnyckeln för informationsregistret.

Spela in nyckel— det här är värdena för alla mätningar och perioden (om registret är periodiskt). Det vill säga, en postnyckel är de parametrar med vilka en post kan identifieras unikt.

Öppningsalgoritmen är som följer:

  1. Vi matar in nyckeldata med de nödvändiga värdena i strukturen.
  2. Vi placerar den resulterande strukturen i en array.
  3. Vi skapar en inspelningsnyckel från arrayen.
  4. Vi skickar en parameter till formuläret som öppnas Nyckel med inspelningsnyckeln från steg 3 som värde.

&OnClient
Procedur Kommando1 (Kommando)
Parameter= ny struktur;

KeyParameters= ny struktur;
Nyckelparametrar. Insert("Nomenklatur", LinkToNomenclature) ;
Nyckelparametrar. Insert("PriceType", LinkToPriceType) ;
Nyckelparametrar. Insert("Period", Datum) ;

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

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

Parameter. Insert("Key", RecordKey) ;

OpenForm( "Informationsregister. Nomenklaturpriser. Registreringsformulär", Parameter) ;
Slut på förfarandet

Hem För nybörjare utvecklare Lär dig programmera

Hur öppnar man en form av ett befintligt objekt?

När du öppnar ett formulär för ett befintligt objekt måste du förutom namnet på formuläret även ange det objekt vars formulär ska öppnas. För att göra detta, använd parametern Nyckelformulär och en länk till objektet som är intressant för oss.

Till exempel, om du från listan över organisationers formulär behöver öppna formuläret för organisationen där markören är placerad, kan du göra detta på följande sätt:

Vi skickar formulärparametrar i form av en struktur, där namnet på strukturelementet motsvarar namnet på formulärparametern, och värdet är det värde som vi vill ställa in formulärparametern till.

Om du inte vill öppna huvudformen, utan en godtycklig form av ett objekt skapat i konfiguratorn, istället för standardnamnet på huvudformuläret (ObjectForm), ange ordet Form följt av en punkt - namnet på formen skapad i konfiguratorn.

Till exempel:

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

Det bör noteras att i det fall då, förutom en länk till ett objekt, inga parametrar behöver skickas till formuläret som öppnas och det är huvudformen för det befintliga objektet som behövs, kan du använda en enklare metod - öppna formuläret med hjälp av proceduren OpenValue():

OpenValue(Items.List.CurrentRow);

Denna metod är mindre mångsidig, men i vissa fall sparar den tid och ansträngning. Till exempel, i det aktuella fallet, kan en sådan rad ersätta hela den treradiga proceduren vi skrev tidigare.

Försiktighet måste dock iakttas när du använder denna procedur. I vissa fall kan det orsaka ytterligare anrop till servern, till exempel när du behöver öppna ett hierarkiskt katalogobjektsformulär. När denna procedur används kommer plattformen att göra ett ytterligare anrop till servern för att avgöra om ett element är en grupp eller inte, eftersom olika formulär måste öppnas för elementet och för gruppen.

Samtidigt kan denna information vara känd i förväg för utvecklaren inom sin algoritm, och med hjälp av funktionen OpenForm() kan utvecklaren öppna det önskade formuläret utan ytterligare anrop till servern, och omedelbart specificera standardnamnet på huvudet form.

Goddag allihop!
Jag tror att informationen i detta ämne kommer att vara mycket användbar för många besökare på detta forum.
Under en lång tid kunde jag inte lösa problemet - hur öppnar jag formuläret för ett nytt dokument så att det inte öppnas tomt, men redan delvis ifyllt programmatiskt, medan själva dokumentet ännu inte har registrerats i databasen? Jag tillbringade mycket tid med att söka efter en lösning på detta problem på Internet, besökte många forum där denna fråga togs upp, men bara ett fåtal av dem hittade lösningar. Det enklaste av dem är att först programmatiskt skapa ett nytt dokument, programmatiskt fylla i nödvändiga detaljer, skriva dokumentet till databasen och sedan öppna det för användaren. Vad händer om användaren inte vill spara den? Tänk om han ändrar sig och stänger den öppna formen? I det här fallet kommer det redan registrerade dokumentet att finnas kvar i databasen. Och vem behöver extra dokument i databasen?
Och om du inte sparar dokumentet är det mest populära alternativet att använda GetForm-metoden ("Dokument. Obligatorisk dokumenttyp. Dokumentformulär"). Men i det här fallet kan du få ett tomt dokumentformulär och helt enkelt visa det med metoden Open(). Detta är inte heller ett alternativ...
Efter en tid löstes problemet med den globala kontextfunktionen "Fyll i egenskapsvärden."

Globalt sammanhang
FillPropertyValues
Syntax:
Fyll PropertyValues(<Приемник>, <Источник>, <Список свойств>, <Исключая свойства>)
Beskrivning:
Kopierar egenskapsvärden<Источника>till fastigheter<Приемника>. Matchning sker med egenskapsnamn.

Med min uppgift som exempel skulle jag vilja förklara hur du kan använda den här funktionen för att fylla i ett formulär för ett nytt dokument. Uppgiften var följande: Det finns ett dokument (Arbetsorder), vars krav på tabelldelen är ett annat dokument (Tillhandahållande av tjänster). Så det var nödvändigt att se till att när ett nytt dokument "Leverande av tjänster" lades till i tabelldelen av "Arbetsordern", visades formen för det nya dokumentet "Leverande av tjänster" på skärmen med detaljerna redan ifyllt, hämtat från arbetsordern från vilken skapandet orsakades. Samtidigt har det nya dokumentet i sig, när dess form visas på skärmen, ännu inte registrerats i databasen. Detta måste göras om användaren plötsligt bestämmer sig för att inte fylla i dokumentet och helt enkelt stänger formuläret.
Här är ett kodfragment med en lösning på problemet:

&Om klientproceduren EnterRecord()RecordForm = GetForm("Document.Provision of Medical Services.ObjectForm"); Fyll iPropertyValues(RecordForm.Object,Object,"Datum,Specialist,Specialisering,Sköterska,Exekutivstatus",); // Fyll i värdena för detaljer vars namn är desamma i båda dokumenten TextStr = Elements.Reception.CurrentData; //Data för den aktuella raden i källdokumentetProperty Structure = New Structure; // Strukturen innehåller värdena för de detaljer som behöver fyllas i i formuläret för det nya dokumentet, men som inte finns i källdokumentet StructureProperties.Insert("Arbetsorder", Object.Link); PropertyStructure.Insert("ReceptionTime",TexStr.ReceptionTime); Fyll iPropertyValues(RecordForm.Object,PropertyStructure,"RecordOrder,AutpointmentTime",); EntryForm.Open(); Slut på förfarandet

Det vill säga att vi utför alla operationer direkt på klienten, utan att kontakta servern, inom en självständigt skapad procedur. Faktum är att på detta sätt kan du fylla i och öppna formuläret för vilket dokument eller referensbok som helst. Först fyllde jag i detaljerna från ett formulär till ett annat med hjälp av formulärobjekt, och sedan, med hjälp av objektet "Struktur", där jag infogade de saknade detaljerna, fyllde jag i ytterligare några detaljer om formuläret som öppnades och öppnade sedan form.
Jag hoppas att detta ämne kommer att spara tid för många som ställs inför en liknande uppgift!