Tillstånd i virtuell tabell 1c. "Fråga"-knappen i frågedesignern

Vid organisering av prover i verkliga problem organiseras i de allra flesta fall dataurvalet enligt vissa kriterier.

I fallet när valet görs från ett riktigt bord uppstår inga svårigheter. Uppgifterna behandlas helt trivialt:

I det fall då källan i frågan är en virtuell tabell blir situationen något mer komplicerad.


Frågespråket låter dig införa ett villkor för ett urval från virtuella tabeller på två sätt: i WHERE-satsen och med hjälp av virtuella tabellparametrar. Båda metoderna kommer att leda till samma resultat (med undantag för vissa specifika fall), men ändå är de långt ifrån likvärdiga.

Vi vet redan att virtuella tabeller kallas virtuella eftersom de faktiskt inte finns i databasen. De bildas endast i det ögonblick då en begäran görs till dem. Trots detta är det bekvämt för oss (det vill säga de som skriver frågan) att betrakta virtuella tabeller som riktiga. Vad kommer att hända i 1C Enterprise 8-systemet när frågan vi kompilerade fortfarande kommer åt den virtuella tabellen?

I det första steget kommer systemet att bygga en virtuell tabell. I det andra steget kommer poster att väljas från den resulterande tabellen som uppfyller villkoret som anges i WHERE-satsen:
Det är tydligt att det slutliga provet inte kommer att inkludera alla poster från den virtuella tabellen (och därför från databasen), utan bara de som uppfyller det givna villkoret. Och de återstående rekorden kommer helt enkelt att exkluderas från resultatet.

Således kommer systemet inte bara att göra onödigt arbete, utan dubbla onödigt arbete! Först kommer resurser att läggas på att bygga en virtuell tabell baserad på onödiga data (i figuren är de markerade som "dataområden A och B"), och sedan kommer arbete att göras för att filtrera denna data från slutresultatet.

Är det möjligt att omedelbart, vid konstruktionen av en virtuell tabell, sluta använda onödiga data? Det visar sig att det är möjligt. Det är exakt vad de virtuella tabellparametrarna är designade för:

Genom att parametrisera en virtuell tabell begränsar vi omedelbart mängden data som kommer att bearbetas av frågan.

Vad är skillnaden mellan värdena för den virtuella tabellparametern "Addition Method"?
När tilläggsmetoden är inställd på "rörelser" kommer endast de perioder som det förekom rörelser att returneras. När "Movements and Period Boundaries" är inställd, kommer 2 poster att läggas till ovanstående rörelser: rörelser i början och slutet av perioden som anges i VT-parametrarna. Fältet "Registrar" kommer att vara tomt för dessa 2 poster.

Information hämtad från sajten

Frågespråket i 1C 8 är en förenklad analog till det välkända "strukturerade programmeringsspråket" (som det oftare kallas, SQL). Men i 1C används den bara för att läsa data; en objektdatamodell används för att ändra data.

En annan intressant skillnad är den ryska syntaxen. Även om du faktiskt kan använda engelskspråkiga konstruktioner.

Exempelbegäran:

VÄLJA
Banks.Name,
Banks.CorrAccount
FRÅN
Directory.Banks HUR Banker

Denna begäran kommer att tillåta oss att se information om namn och korrespondentkonto för alla banker som finns i databasen.

Frågespråket är det enklaste och effektiv metod skaffa information. Som framgår av exemplet ovan måste du i frågespråket använda metadatanamn (detta är en lista över systemobjekt som utgör konfigurationen, dvs. kataloger, dokument, register, etc.).

Beskrivning av frågespråkskonstruktioner

Frågestruktur

För att få data räcker det att använda konstruktionerna "SELECT" och "FROM". Den enklaste begäran ser ut så här:

VÄLJ * FRÅN Kataloger.Nomenklatur

Där "*" betyder val av alla fält i tabellen och Directorys.Nomenclature – namnet på tabellen i databasen.

Låt oss titta på ett mer komplext och allmänt exempel:

VÄLJA
<ИмяПоля1>HUR<ПредставлениеПоля1>,
Belopp(<ИмяПоля2>) HUR<ПредставлениеПоля2>
FRÅN
<ИмяТаблицы1>HUR<ПредставлениеТаблицы1>
<ТипСоединения>FÖRENING<ИмяТаблицы2>HUR<ПредставлениеТаблицы2>
FÖRBI<УсловиеСоединениеТаблиц>

VAR
<УсловиеОтбораДанных>

GRUPP AV
<ИмяПоля1>

SORTERA EFTER
<ИмяПоля1>

RESULTAT
<ИмяПоля2>
FÖRBI
<ИмяПоля1>

I denna förfrågan vi väljer data för fälten "Fältnamn1" och "Fältnamn1" från tabellerna "Tabellnamn1" och "Tabellnamn", tilldelar synonymer till fälten med operatorn "HOW" och kopplar dem med ett visst villkor "Tabellanslutningsvillkor".

Från den mottagna informationen väljer vi endast data som uppfyller villkoret från "WHERE" "Datavalsvillkor". Därefter grupperar vi begäran efter fältet "Fältnamn1", samtidigt som vi summerar "Fältnamn2". Vi skapar summor för fältet "Fältnamn1" och det sista fältet "Fältnamn2".

Det sista steget är att sortera begäran med hjälp av ORDER BY-konstruktionen.

Allmänna mönster

Låt oss titta på de allmänna strukturerna för frågespråket 1C 8.2.

FÖRSTn

Genom att använda av denna operatör du kan få n antal första poster. Ordningen på posterna bestäms av ordningen i frågan.

VÄLJ FÖRSTA 100
Banks.Name,
Banker Kod AS BIC
FRÅN
Directory.Banks HUR Banker
SORTERA EFTER
Banks.Name

Förfrågan kommer att ta emot de första 100 posterna i katalogen "Banker", sorterade i alfabetisk ordning.

TILLÅTEN

Denna design är relevant för att arbeta med mekanismen. Kärnan i mekanismen är att begränsa läsning (och andra åtgärder) till användare för specifika poster i en databastabell, och inte tabellen som helhet.

Om en användare försöker använda en fråga för att läsa poster som är otillgängliga för honom kommer han att få ett felmeddelande. För att undvika detta bör du använda konstruktionen "ALLOWED", dvs förfrågan läser endast poster som är tillåtna för den.

VÄLJ TILLÅT
Arkiv med ytterligare information Länk
FRÅN
Directory.Repository av ytterligare information

OLIKA

Genom att använda "ANNÅNA" förhindrar du att duplicerade rader kommer in i 1C-frågeresultatet. Duplicering innebär att alla förfrågningsfält matchar.

VÄLJ FÖRSTA 100
Banks.Name,
Banker Kod AS BIC
FRÅN
Directory.Banks HUR Banker

TomTabell

Denna konstruktion används mycket sällan för att kombinera frågor. När du går med kan du behöva ange en tom kapslad tabell i en av tabellerna. Operatören "EmptyTable" är helt rätt för detta.

Exempel från 1C 8 hjälp:

VÄLJ Link.Number, TEM TABELL.(Nr., Artikel, Kvantitet) SOM komposition
FRÅN Document.Expense Invoice
KOMBINERA ALLT
VÄLJ Link.Number, Contents.(LineNumber, Product, Quantity)
FRÅN Document.Invoice Document.Invoice.Composition.*

ÄR INGET

En mycket användbar funktion som låter dig undvika många misstag. YesNULL() låter dig ersätta NULL-värdet med det önskade. Används mycket ofta för att kontrollera förekomsten av ett värde i sammanfogade tabeller, till exempel:

VÄLJA
Nomenklaturreferenslänk,
IsNULL(Item Remaining.QuantityRemaining,0) AS QuantityRemaining
FRÅN


Kan användas på andra sätt. Till exempel, om det för varje rad inte är känt i vilken tabell värdet finns:

ISNULL(FakturaMottaget.Datum, FakturaUtfärdad.Datum)

HOW är en operator som låter oss tilldela ett namn (synonym) till en tabell eller ett fält. Vi såg ett exempel på användning ovan.

Dessa konstruktioner är mycket lika - de låter dig få en strängrepresentation av det önskade värdet. Den enda skillnaden är att REPRESENTATION konverterar alla värden till strängtyp, och REPRESENTATIONLINKS är endast referenser. REFERENSREPRESENTATION rekommenderas att användas i datasammansättningssystemfrågor för optimering, såvida inte referensdatafältet är planerat att användas i urval.

VÄLJA
View(Link), //string, till exempel “Förhandsrapport nr 123 daterad 2015-10-10
View(DeletionMark) AS DeleteMarkText, //string, "Ja" eller "Nej"
ViewReferences(DeletionMark) AS DeleteMarkBoolean //boolean, True or False
FRÅN
Document.Advance Report

UTTRYCKA

Express låter dig konvertera fältvärden till rätt typ data. Du kan konvertera ett värde till antingen en primitiv typ eller en referenstyp.

Express för en referenstyp används för att begränsa de begärda datatyperna i fält av en komplex typ, som ofta används för att optimera systemets prestanda. Exempel:

EXPRESS(TabellKost.Subconto1 AS Katalog.Kostnadsposter).Typ av aktivitetFör skattRedovisningskostnader

För primitiva typer används denna funktion ofta för att begränsa antalet tecken i fält med obegränsad längd (sådana fält kan inte jämföras med). För att undvika felet " Ogiltiga parametrar i jämförelseoperation. Du kan inte jämföra fält
obegränsad längd och fält av inkompatibla typer
", måste du uttrycka sådana fält enligt följande:

EXPRESS(Kommentar AS Rad(150))

DIFERENCEDATE

Få 267 videolektioner på 1C gratis:

Ett exempel på användning av IS NULL i en 1C-förfrågan:

VÄLJA FRÅN
Ref
VÄNSTER ANSLUTNING Registrera Accumulations.ProductsInWarehouses.Remaining AS Product Remaining
Software NomenclatureRef.Link = Sålda varors kommittéerRemains.Nomenclature
DÄR INTE kvarvarande varor. Kvantitet Återstående ÄR NULL

Datatypen i en fråga kan bestämmas enligt följande: med funktionerna TYPE() och VALUETYPE() eller logisk operator LÄNK. De två funktionerna liknar varandra.

Fördefinierade värden

Förutom att använda passerade parametrar i frågor i 1C-frågespråket kan du använda fördefinierade värden eller . Till exempel överföringar, fördefinierade kataloger, kontoplaner etc. För detta används konstruktionen "Value()".

Användningsexempel:

WHERE Nomenclature.Type of Nomenclature = Value(Directory.Types of Nomenclature.Product)

WHERE Motparter.Typ av kontaktinformation = Värde(Uppräkning.Typer av kontaktinformation.Telefon)

VAR Kontosaldon. Redovisningskonto = Värde(Kontoplan.Profit.ProfitsLoss)

Anslutningar

Det finns 4 typer av anslutningar: VÄNSTER, HÖGER, KOMPLETT, INTERN.

VÄNSTER och HÖGER ANSLUTNING

Joins används för att länka två tabeller baserat på ett specifikt villkor. Funktion när VÄNSTER GÅ MEDär att vi tar den första specificerade tabellen i sin helhet och villkorligt binder den andra tabellen. Fälten i den andra tabellen som inte kunde bindas av villkor är fyllda med värdet NULL.

Till exempel:

Den kommer att returnera hela tabellen över motparter och fylla i "Bank"-fältet endast på de platser där villkoret "Motparter.Namn = Banker.Namn" kommer att uppfyllas. Om villkoret inte är uppfyllt sätts fältet Bank till NULL.

HÖGER JOIN på 1C-språk helt lika VÄNSTER anslutning, med undantag för en skillnad - i RÄTT TILL ANSLUTNING"Huvudtabellen" är den andra, inte den första.

FULL ANSLUTNING

FULL ANSLUTNING skiljer sig från vänster och höger genom att den visar alla poster från två tabeller och ansluter endast de som den kan koppla ihop med villkor.

Till exempel:

FRÅN

FULL ANSLUTNING
Directory.Banks HUR Banker

FÖRBI

Frågespråket returnerar båda tabellerna helt endast om villkoret för att ansluta till posterna är uppfyllt. Till skillnad från en vänster/höger-koppling är det möjligt för NULL att visas i två fält.

INRE KOPPLING

INRE KOPPLING skiljer sig från den fullständiga genom att den endast visar de poster som kan anslutas enligt ett givet villkor.

Till exempel:

FRÅN
Katalog Motparter AS Kunder

INRE KOPPLING
Directory.Banks HUR Banker

FÖRBI
Clients.Name = Banks.Name

Denna fråga returnerar endast rader där banken och motparten har samma namn.

Föreningar

JOIN- och JOIN ALL-konstruktionerna kombinerar två resultat till ett. De där. resultatet av att utföra två kommer att "sammanslagna" till en gemensam.

Det vill säga, systemet fungerar precis som vanliga, bara för ett tillfälligt bord.

Hur man använder INDEX BY

Det finns dock en punkt att ta hänsyn till. Att bygga ett index på en tillfällig tabell tar också tid att slutföra. Därför är det tillrådligt att använda " "-konstruktionen endast om det är säkert känt att det kommer att finnas mer än 1-2 poster i den tillfälliga tabellen. Annars kan effekten bli den motsatta - prestandan för indexerade fält kompenserar inte för den tid det tar att bygga indexet.

VÄLJA
Valutakurser Senaste tvärsnittet Valuta AS Valuta,
Valutakurser Senaste tvärsnitt.
PUT Valutakurser
FRÅN
Information Register.Valutakurser.Last Slice(&Period,) AS ValutakurserSista Slice
INDEXERA EFTER
Valuta
;
VÄLJA
PriserNomenklatur.Nomenklatur,
PriserNomenklaturer.Pris,
PriserNomenklaturer.Valuta,
Valutakurser.Rate
FRÅN
Informationsregister.Nomenklaturpriser.Sista segment(&Period,
Nomenklatur B (&nomenklatur) OCH PriceType = &PriceType) AS PriceNomenclature
VÄNSTER JOIN Valutakurser AS Valutakurser
ProgramvarupriserNomenclatures.Currency = Valutakurser.Valuta

Gruppering

1C frågespråk låter dig använda special aggregerade funktioner när du grupperar frågeresultat. Gruppering kan också användas utan aggregerade funktioner för att "eliminera" dubbletter.

Följande funktioner finns:

Belopp, Kvantitet, Antal olika, Maximum, Minimum, Genomsnitt.

Exempel #1:

VÄLJA
Försäljning av varor och tjänster varor. Nomenklatur,
SUM(Sales of GoodsServicesGoods.Quantity) AS Quantity,
SUM(Sales of GoodsServicesGoods.Amount) AS Amount
FRÅN

GRUPP AV
Försäljning av varor och tjänster varor Nomenklatur

Frågan tar emot alla rader med varor och sammanfattar dem efter kvantitet och belopp per artikel.

Exempel nr 2

VÄLJA
Banks.Code,
QUANTITY(OLIKA banker.länk) SOM antal dubbletter
FRÅN
Directory.Banks HUR Banker
GRUPP AV
Banks.Code

Det här exemplet visar en lista med BIC:er i katalogen "Banker" och visar hur många dubbletter som finns för var och en av dem.

Resultat

Resultat - ett sätt att få data från ett system med hierarkisk struktur. Aggregatfunktioner kan användas för sammanfattningsfält, precis som för grupperingar.

Ett av de mest populära sätten att använda resultat i praktiken är partiavskrivning av varor.

VÄLJA




FRÅN
Dokument Försäljning av varor och tjänster Varor HUR man Försäljning av varor och tjänster varor
SORTERA EFTER

RESULTAT
SUM(Quantity),
SUM(summa)
FÖRBI
Nomenklatur

Resultatet av frågan blir följande hierarkiska:

Allmänna resultat

Om du behöver få summor för alla "total", använd operatorn "GENERAL".

VÄLJA
Försäljning av varor och tjänster varor. Nomenclature AS Nomenclature,
Försäljning av varor och tjänster varor. Link AS Document,
Försäljning av varor och tjänster varor. Kvantitet AS Kvantitet,
Försäljning av varor och tjänster varor Belopp AS Belopp
FRÅN
Dokument Försäljning av varor och tjänster Varor HUR man Försäljning av varor och tjänster varor
SORTERA EFTER
Försäljning av varor och tjänster varor Länk Datum Datum
RESULTAT
SUM(Quantity),
SUM(summa)
FÖRBI
ÄR VANLIGA,
Nomenklatur

Som ett resultat av att utföra begäran får vi följande resultat:

I vilken 1 nivå av gruppering är aggregeringen av alla nödvändiga fält.

Arrangera

Operatorn ORDER BY används för att sortera resultatet av en fråga.

Sortering för primitiva typer (sträng, tal, boolean) följer de vanliga reglerna. För referenstypfält sker sortering genom den interna representationen av länken (den unika identifieraren), snarare än efter kod eller genom referensrepresentation.

VÄLJA

FRÅN
Directory.Nomenclature AS Nomenclature
SORTERA EFTER
namn

Begäran kommer att visa en lista med namn i nomenklaturkatalogen, sorterade i alfabetisk ordning.

Automatisk beställning

Resultatet av en fråga utan sortering är en kaotiskt presenterad uppsättning rader. 1C-plattformsutvecklare garanterar inte att rader matas ut i samma sekvens när identiska frågor körs.

Om du behöver visa tabellposter i en konstant ordning måste du använda Auto-Order-konstruktionen.

VÄLJA
Nomenclature.Name AS Namn
FRÅN
Directory.Nomenclature AS Nomenclature
AUTO BESTÄLLNING

Virtuella bord

Virtuella tabeller i 1C är en unik egenskap hos 1C frågespråk som inte finns i andra liknande syntaxer. Virtuellt bord – snabbt sätt få profilinformation från register.

Varje registertyp har sin egen uppsättning virtuella tabeller, som kan skilja sig åt beroende på registerinställningarna.

  • skär av den första;
  • skär av den senare.
  • matrester;
  • revolutioner;
  • saldon och omsättning.
  • rörelser från subconto;
  • revolutioner;
  • hastighet Dt Kt;
  • matrester;
  • saldon och omsättning
  • subconto.
  • bas;
  • grafdata;
  • faktiska giltighetstid.

För lösningsutvecklaren tas data från en (virtuell) tabell, men i själva verket tar 1C-plattformen från många tabeller och omvandlar dem till den form som krävs.

VÄLJA
Produkter i lagerrester och omsättning. Nomenklatur,
ProductsI WarehousesRemainingAndTurnover.QuantityInitialRemaining,
ProductsI WarehousesRemainsAndTurnover.QuantityOmsättning,
GoodsI WarehousesRemainsAndTurnover.QuantityIncoming,
GoodsI WarehousesRemainsAndTurnover.QuantityConsumption,
Produkter I LagerResterande Och Omsättning. Kvantitet Slutlig Återstående
FRÅN
RegisterAccumulations.GoodsInWarehouses.RemainsAndTurnover AS GoodsInWarehousesRemainsAndTurnover

Denna fråga låter dig snabbt hämta en stor mängd data.

Virtuella bordsalternativ

En mycket viktig aspekt av att arbeta med virtuella tabeller är användningen av parametrar. Virtuella tabellparametrar är specialiserade parametrar för val och konfiguration.

För sådana tabeller anses det vara felaktigt att använda urval i "WHERE"-konstruktionen. Förutom att frågan blir suboptimal är det möjligt att ta emot felaktig data.

Ett exempel på användning av dessa parametrar:

Register över ackumuleringar. Varor i lager. Saldon och omsättningar (& periodens början, & slutet av perioden, månaden, periodens rörelser och gränser, nomenklatur = & obligatorisk nomenklatur)

Algoritm för virtuella tabeller

Till exempel lagrar den mest använda virtuella tabellen av typen "Remains" data från två fysiska tabeller - balanser och rörelser.

När du använder en virtuell tabell utför systemet följande manipulationer:

  1. Vi får det närmast beräknade värdet vad gäller datum och mått i totaltabellen.
  2. Vi "lägger till" beloppet från rörelsetabellen till beloppet från totaltabellen.


Sådana enkla åtgärder kan avsevärt förbättra systemets prestanda som helhet.

Använder frågebyggaren

Frågebyggare– ett verktyg inbyggt i 1C Enterprise-systemet som i hög grad underlättar utvecklingen av databasfrågor.

Frågebyggaren har ett ganska enkelt, intuitivt gränssnitt. Låt oss ändå titta på att använda frågekonstruktorn mer i detalj.

Frågetextkonstruktorn startas från snabbmenyn (höger musknapp) på önskad plats i programkoden.

Beskrivning av 1C-förfrågningskonstruktören

Låt oss titta på varje flik av designern mer i detalj. Undantaget är fliken Builder, som är ett ämne för en annan diskussion.

Fliken Tabeller och fält

Den här fliken anger datakällan och fälten som måste visas i rapporten. I huvudsak beskrivs konstruktionerna SELECT.. FROM här.

Källan kan vara en fysisk databastabell, en virtuell registertabell, temporära tabeller, kapslade frågor, etc.

I snabbmenyn för virtuella tabeller kan du ställa in parametrar för virtuella tabeller:

Fliken Anslutningar

Fliken används för att beskriva kopplingar av flera tabeller och skapar konstruktioner med ordet CONNECTION.

Fliken Gruppering

På denna flik låter systemet dig gruppera och sammanfatta de obligatoriska fälten i tabellresultatet. Beskriver användningen av konstruktionerna GROUP BY, SUMMA, MINIMUM, AVERAGE, MAXIMUM, QUANTITY, ANTAL OLIKA.

Fliken Villkor

Ansvarig för allt som kommer i förfrågningstexten efter WHERE-konstruktionen, dvs för alla villkor som ställs på mottagna data.

Fliken Avancerat

Flik Dessutom fylld med alla möjliga parametrar som är väldigt viktiga. Låt oss titta på var och en av egenskaperna.

Gruppering Välja poster:

  • Första n– en parameter som endast returnerar N poster till frågan (den FIRST-operatorn)
  • Inga dubbletter– säkerställer att de mottagna posterna är unika (ANNON operatör)
  • Tillåten– låter dig välja endast de poster som systemet tillåter dig att välja med hänsyn till (TILLÅTEN konstruktion)

Gruppering Typ av begäran bestämmer vilken typ av begäran som kommer att vara: datahämtning, skapande av en temporär tabell eller förstörelse av en temporär tabell.

Nedanför finns en flagga Lås mottagen data för senare modifiering. Det låter dig aktivera möjligheten att ställa in datalåsning, vilket säkerställer säkerheten för data från det att de läses tills de ändras (endast relevant för Automatiskt läge förreglingar, design ATT ÄNDRA).

Fliken Joins/Alias

På den här fliken i frågedesignern kan du ställa in möjligheten att sammanfoga olika tabeller och alias (HOW-konstruktionen). Tabellerna visas på vänster sida. Om du sätter flaggorna mittemot tabellen kommer UNITE-konstruktionen att användas, annars - UNITE ALL (skillnader mellan de två metoderna). På höger sida indikeras överensstämmelsen mellan fält i olika tabeller, om korrespondensen inte är specificerad kommer frågan att returnera NULL.

Fliken Beställ

Detta anger i vilken ordning värdena sorteras (ORDER BY) - fallande (DESC) eller stigande (ASC).

Det finns också en intressant flagga - Automatisk beställning(i begäran - AUTO BESTÄLLNING). Som standard visar 1C-systemet data i en "kaotisk" ordning. Om du ställer in denna flagga kommer systemet att sortera data efter interna data.

Fliken Fråga Batch

På fliken frågedesigner kan du skapa nya och även använda den som navigering. I begärantexten separeras paket med symbolen ";" (komma).

"Fråga"-knappen i frågedesignern

I det nedre vänstra hörnet av förfrågningsdesignern finns en förfrågan-knapp, med vilken du kan se förfrågningstexten när som helst:

I det här fönstret kan du göra justeringar av begäran och utföra den.


Använda frågekonsolen

Query Console är ett enkelt och bekvämt sätt att felsöka komplexa frågor och snabbt få information. I den här artikeln kommer jag att försöka beskriva hur du använder Query Console och tillhandahålla en länk för att ladda ner Query Console.

Låt oss ta en närmare titt på det här verktyget.

Ladda ner 1C frågekonsol

Först och främst, för att börja arbeta med frågekonsolen måste du ladda ner den någonstans. Behandlingar är vanligtvis indelade i två typer - kontrollerade former och vanlig (eller ibland kallad 8.1 och 8.2/8.3).

Jag försökte kombinera dessa två typer i en behandling - in önskat läge operation öppnas den önskade formen (i hanterat läge fungerar konsolen bara i tjockt läge).

Beskrivning av 1C-frågekonsolen

Låt oss börja titta på frågekonsolen med en beskrivning av huvudbearbetningspanelen:

I frågekonsolens rubrik kan du se exekveringstiden för den sista frågan med millisekundsnoggrannhet, detta låter dig jämföra olika designs vad gäller prestanda.

Den första gruppen av knappar i kommandofältet är ansvarig för att spara aktuella frågor till en extern fil. Detta är mycket bekvämt, du kan alltid återgå till att skriva en komplex begäran. Eller, till exempel, lagra en lista med typiska exempel på vissa mönster.

Till vänster, i "Request"-fältet, kan du skapa nya förfrågningar och spara dem i en trädstruktur. Den andra gruppen av knappar är ansvarig för att hantera listan med förfrågningar. Med den kan du skapa, kopiera, ta bort, flytta en förfrågan.

  • Körbegäran– enkelt utförande och resultat
  • Utför paket– låter dig se alla mellanliggande frågor i en grupp av frågor
  • Visa tillfälliga tabeller– låter dig se resultaten som tillfälliga frågor returnerar i en tabell

Begär parametrar:

Låter dig ställa in aktuella parametrar för begäran.

I fönstret för frågeparametrar är följande intressant:

  • Knapp Få från förfrågan hittar automatiskt alla parametrar i begäran för att underlätta för utvecklaren.
  • Flagga Gemensamma parametrar för alla förfrågningar– när den är installerad rensar bearbetningen inte parametrarna när man flyttar från begäran till begäran i den allmänna listan över förfrågningar.

Ställ in en parameter med en lista med värden Det är väldigt enkelt, precis när du väljer ett parametervärde, klicka på knappen Rensa värde (kryss), systemet kommer att uppmana dig att välja datatyp, där du måste välja "Värdelista":

Också i den övre panelen finns en knapp för att ta fram frågekonsolens inställningar:

Här kan du ange parametrar för att automatiskt spara frågor och exekveringsparametrar.

Begärans text skrivs in i konsolens begäran. Detta kan göras genom att helt enkelt skriva ett frågetest eller genom att anropa ett specialverktyg - frågedesignern.

1C 8-frågedesignern anropas från snabbmenyn (höger musknapp) när du klickar på inmatningsfältet:

Även i denna meny finns sådana användbara funktioner, som att rensa eller lägga till radbrytningar (“|”) till begäran, eller få förfrågningskoden i det här bekväma formuläret:

Request = Ny begäran;
Request.Text = ”
|VÄLJ
| Valuta.Länk
|FRÅN
| Directory.Currencies AS Currencies”;
RequestResult = Request.Execute();

Det nedre fältet i frågekonsolen visar frågeresultatfältet, vilket är anledningen till att denna bearbetning skapades:



Dessutom kan frågekonsolen, förutom listan, visa data i form av ett träd - för frågor som innehåller totaler.

Frågeoptimering

En av de viktigaste punkterna för att öka produktiviteten för 1C enterprise 8.3 är optimeringförfrågningar. Denna punkt är också mycket viktig när klarar certifieringen. Nedan ska vi prata om typiska skäl inte optimal drift av frågor och optimeringsmetoder.

Val i en virtuell tabell med WHERE-konstruktionen

Det är nödvändigt att tillämpa filter på de virtuella tabelldetaljerna endast genom VT-parametrarna. Under inga omständigheter bör du använda WHERE-konstruktionen för val i en virtuell tabell, detta är ett allvarligt misstag ur optimeringssynpunkt. I fallet med val med WHERE kommer systemet faktiskt att ta emot ALLA poster och först då välja de nödvändiga.

HÖGER:

VÄLJA

FRÅN
Register över ackumuleringar. Ömsesidiga uppgörelser med deltagare i organisationer. Saldon (
,
Organisation = &Organisation
OCH Individuell = &Individuell) HUR Ömsesidiga uppgörelser med deltagare i organisationer balanserar

FEL:

VÄLJA
Ömsesidiga uppgörelser med deltagare i organisationer Saldo Belopp Saldo
FRÅN
Register över ackumuleringar Ömsesidiga avräkningar med deltagare i organisationer Saldon (,) HUR Ömsesidiga avräkningar med deltagare i organisationer balanserar
VAR
Ömsesidiga uppgörelser med deltagare i organisationer Balanser Organisation = & Organisation
OCH Ömsesidiga uppgörelser med deltagare i organisationer Saldon. Individuell = &Individuell

Att få värdet av ett fält av en komplex typ med hjälp av en punkt

När man tar emot data av en komplex typ i en fråga genom en punkt, ansluter systemet med en vänsterkoppling exakt så många tabeller som det finns möjliga typer i fältet för den komplexa typen.

Till exempel är det högst oönskat för optimering att komma åt registerpostfältet – registrar. Registraren har en sammansatt datatyp, däribland alla möjliga dokumenttyper som kan skriva data till registret.

FEL:

VÄLJA
Record Set.Recorder.Date,
RecordSet.Quantity
FRÅN
RegisterAccumulations.ProductsOrganizations AS SetRecords

Det vill säga, i själva verket kommer en sådan fråga inte att komma åt en tabell, utan 22 databastabeller (det här registret har 21 registrartyper).

HÖGER:

VÄLJA
VAL
NÄR ProductsOrg.Registrar LINK Document.Försäljning av produkter och tjänster
SÄN EXPRESS(ProductsOrganization.Registrar AS Document.Sales of GoodsServices).Datum
NÄR GoodsOrg.Registrar LINK Document.Receipt of GoodsServices
SEDAN EXPRESS(GoodsOrg.Registrar AS Document.Receipt of GoodsServices).Datum
SLUTA SOM DATUM,
ProdukterOrg. Kvantitet
FRÅN
Registrera Accumulations.ProductsOrganizations AS ProductsOrganisation

Eller det andra alternativet är att lägga till sådan information i detaljerna, till exempel i vårt fall att lägga till ett datum.

HÖGER:

VÄLJA
ProductsOrganisations.Date,
ProdukterOrganisationer. Kvantitet
FRÅN
Register över ackumuleringar.. Goods of Organisations AS Goods of Organisations

Underfrågor i anslutningsvillkor

För optimering är det oacceptabelt att använda underfrågor i anslutningsförhållanden, detta saktar ner frågan avsevärt. Det är lämpligt att använda VT i sådana fall. För att ansluta behöver du bara använda metadata och VT-objekt, efter att du tidigare har indexerat dem med anslutningsfält.

FEL:

VÄLJ…

VÄNSTER GÅ MED (
VÄLJ FRÅN RegisterInformation.Limits
VAR …
GRUPP AV...
) FÖRBI …

HÖGER:

VÄLJ…
PUT-gränser
FRÅN Information Register.Limits
VAR …
GRUPP AV...
INDEXERA EFTER...;

VÄLJ…
FRÅN Dokument Försäljning av varor och tjänster
LEFT JOIN Limits
FÖRBI …;

Ansluta poster med virtuella tabeller

Det finns situationer när systemet inte fungerar optimalt när du kopplar ett virtuellt bord till andra. I det här fallet, för att optimera frågans prestanda, kan du prova att placera den virtuella tabellen i en temporär tabell, utan att glömma att indexera de sammanfogade fälten i den tillfälliga tabellfrågan. Detta beror på det faktum att VT:er ofta finns i flera fysiska DBMS-tabeller; som ett resultat kompileras en underfråga för att välja dem, och problemet visar sig likna föregående punkt.

Använda urval baserade på icke-indexerade fält

Ett av de vanligaste misstagen när man skriver frågor är att använda villkor på icke-indexerade fält, detta motsäger regler för frågeoptimering. DBMS kan inte exekvera en fråga optimalt om frågan inkluderar urval på icke-indexerbara fält. Om du tar en tillfällig tabell måste du också indexera anslutningsfälten.

Det måste finnas ett lämpligt index för varje tillstånd. Ett lämpligt index är ett som uppfyller följande krav:

  1. Indexet innehåller alla fält som anges i villkoret.
  2. Dessa fält är i början av indexet.
  3. Dessa val är på varandra följande, det vill säga värden som inte är inblandade i frågevillkoret är inte "klädda" mellan dem.

Om DBMS inte väljer rätt index kommer hela tabellen att skannas - detta kommer att ha en mycket negativ inverkan på prestandan och kan leda till förlängd blockering av hela uppsättningen poster.

Använder logiskt ELLER under förhållanden

Det är allt, den här artikeln täckte de grundläggande aspekterna av frågeoptimering som varje 1C-expert borde känna till.

En mycket användbar gratis videokurs om frågeutveckling och optimering, jag rekommenderar starkt för nybörjare och mer!

Om min publikation är användbar för dig, glöm inte att ge den ett plus :-)

Här finns en rubrikator för alla uppgifter i samlingen(en sida som innehåller länkar till forumtrådar för varje uppgift)
http://chistov.spb.ru/forum/16-969-1

Nåväl, nu mina utvecklingar och anteckningar som jag skapade under förberedelseprocessen.
Jag ska försöka upprepa så lite som möjligt med de två ovan nämnda sista publikationer.

Så låt oss börja:


Om du tar det på distans bör du ha två objekt på skrivbordet i slutet av provet:

1. Slutlig lossning informationsbas(dt fil)
2. Förklarande anmärkning

Det ska inte finnas något annat, inga mellankopior osv.

Var noga med att skriva en förklarande anteckning!
Vid en vagt formulerad uppgift, se till att skriva där att du har valt exakt ett sådant och ett lösningsalternativ.
Också på viktiga ställen i koden är det bättre att lämna korta kommentarer, utan fanatism, men där examinatorn kan ha frågor är det bättre att skriva.

Men du kommer att få veta om detta i instruktionerna som du kommer att få läsa innan tentamen.
Det är bara bättre att veta i förväg)


Använda et-tecken i frågor.

Ibland går det snabbare att skriva från ett extra tangentbord än att byta layout fram och tillbaka, vilket sparar tid
& = Alt+38

*************************************************************************************************
Använder TimePoint() i frågor

I frågor till ackumulerings- och redovisningsregister är det nödvändigt att inte använda dokumentdatumet som en virtuell tabellparameter (period), utan Momentparametern, som definieras i koden enligt följande:

Moment = ?(Passeringsläge = Dokumentbokföringsläge. Operationellt, Odefinierat, Tidsögonblick());

*************************************************************************************************
Vid generering av dokumentförflyttningar per register, i början av bokföringsförfarandet, är det nödvändigt att rensa förflyttningarna av det aktuella dokumentet för register.

Koden är:

Movement.RegisterName.Write = Sant; Movements.RegisterName.Clear();

Det är möjligt att det under processen kommer att bli nödvändigt att analysera poster från detta register.
Så, så att när du analyserar de nuvarande posterna (gamla, innan dokumentet ändrades) de definitivt inte ingår i provet, kan du lägga till ytterligare en rad till de två ovanstående raderna:

Movement.RegisterName.Write();

Eller, när du analyserar poster, ange uttryckligen en gräns som inte inkluderar tidpunkten för det aktuella dokumentet.

Men överallt angav jag helt enkelt konstruktionen av dessa tre rader:

Movement.RegisterName.Write = Sant; Movements.RegisterName.Clear(); Movement.RegisterName.Write();

*************************************************************************************************
Det finns två sätt att blockera data, valet mellan dem beror på vilken metod som används - gammal eller ny:

1) Regelbunden kontrollerad blockering, gammal metod för dokumentbehandling (Data Blocking-objekt)

Ställ in om saldon först kontrolleras och sedan skrivs av.
I fallet då vi behöver ha lite information från registret för att bilda en rörelse.


Exempel:

I dokumentet - kvantitet, i registret - kvantitet och belopp (kostnad)
Så vi vet mängden varor från dokumentet - hur mycket vi skriver av, men kostnaden - inte.
Vi kan bara ta reda på det från registret, men för att säkerställa att ingen ändrar registret mellan tidpunkten för mottagning av saldonen och tidpunkten för registrering av rörelserna, måste vi låsa registret redan innan vi läser saldonen.
Så i det här fallet används Data Locking-objektet. Och när du skapar det är det mer korrekt att ange med vilka dimensioner vi blockerar registret (till exempel i vårt fall - endast av den artikel som anges i dokumentet) - så att det inte finns några onödiga lås och en annan användare kan sälja en annan Artikel.


1. Ställ in ett lås med Data Lock-objektet
2. Läs resten
3. Vi kontrollerar möjligheten till avskrivning
4. Vi skapar rörelser, till exempel avskriver varor
5. Efter att dokumentet har bokförts tas spärren automatiskt bort (spärringen är giltig som en del av bokföringstransaktionen och tas bort automatiskt av systemet). Det vill säga, det finns inget behov av att speciellt låsa upp objektet.

2) Ny metodik för handläggning av dokument (med LockForChange-egenskapen = True)

Den används om vi inte behöver information från registren för att bilda rörelser och vi kan kontrollera om vi har gått in i minus vid avskrivning om vi efter registrering tittar på saldona i registret och ser att det finns negativa. . I det här fallet kommer vi att förstå att vi har skrivit av för mycket och kommer att avbryta avskrivningsåtgärden.

Exempel:
Låt oss överväga hur man säljer en produkt.
I dokumentet - kvantitet, i registret - endast kvantitet
Så vi vet mängden varor från dokumentet.
Vi bildar rörelser med den mängd som anges i dokumentet och registrerar dem. Därefter läser vi registret, tittar på saldona och analyserar om det finns några negativa. Om det finns, visa ett fel och ställ in Refusal = True.

Det vill säga, sekvensen är så här:
1. För att gå igenom registret, ställ in BlockForChange-egenskapen = True
2. Vi skapar rörelser - skriv av varorna
3. Registrera rörelserna
4. Läs registret och se till att det inte finns några negativa saldon. Om det finns, så skrev de av överskottet, om inte, så är allt bra.

Så i det här fallet finns det inget behov av att ange med vilka dimensioner vi behöver blockera registret.
Vi ställer helt enkelt in BlockForChange-egenskapen till True innan vi registrerar våra rörelser, bildar rörelserna och registrerar.
Systemet självt kommer att blockera registret vid inspelningstillfället enligt de mätningar som behövs, efter att ha analyserat vad vi har registrerat.
När den är klar kommer blockeringen att tas bort.

Det här alternativet (det andra) är enklare, det kallas "den nya metoden för att behandla dokument" och 1C rekommenderar att du använder det om möjligt och drar av poäng om det första alternativet används, men i vissa fall kan det helt enkelt inte tillämpas och det första alternativet med Data Locking-objektet används (se exemplet ovan).

Jag noterar också att oavsett vald metod måste rörelserna rengöras innan man arbetar med dem (se tidigare råd)

*************************************************************************************************
Datablockering (blockeringsmetod nr 1 från ovanstående beskrivning)

Kontrollerad låsning krävs där data läses och rörelser görs utifrån dessa data
Det snabbaste sättet att få den hanterade låskoden är att ange "Datalåsning", ringa syntaxassistenten och helt enkelt kopiera exempelkoden därifrån. Ändra det sedan helt enkelt till namnet på ditt register och mått.

Det ser ut ungefär så här:

Lock = NewDataLock; Locking Element = Locking.Add("Accumulation Register.GoodsInWarehouses"); LockElement.Mode = DataLockMode.Exclusive; BlockingElement.DataSource = PM; Locking Element.UseFromDataSource("Nomenklatur", "Nomenklatur"); Lock.Lock();

*************************************************************************************************
Det är bättre att kalla den tabellformade delen av dokumenten helt enkelt "TC"

Det finns bara en tabelldel i 99 % av dokumenten. Ett sådant enhetligt namn tabellformade delar Det hjälper dig att spara mycket tid eftersom:
1) Mycket kort - skriv snabbt
2) Samma för alla dokument, du behöver inte komma ihåg vad det heter när du skriver kod

*************************************************************************************************
Frågeresultatet bör kontrolleras för tomhet innan det hämtas eller laddas upp till den tekniska specifikationen.

Generellt använde jag provtagning i alla uppgifter.

Sampling är mer optimalt för systemet när det gäller prestanda, eftersom det "vässas" endast för att läsa data (till skillnad från TK).

Men i alla fall, innan metoden Select() är det bättre att kontrollera frågeresultatet för tomhet, detta kommer att minska belastningen på systemet ytterligare.

Result = Query.Run(); Om inte Result.Empty() Then Select = Result.Select(TravelQueryResult.ByGrouping); ... EndIf;

Och om vi bara behöver få ett värde från förfrågan
(exempelvis endast avskrivningsmetoden i enlighet med den redovisningsprincip som fastställts för detta år):

Result = Query.Run(); Om inte Result.Empty() Then Select = Result.Select(); Selection.Next(); Kostnadsavskrivningsmetod = Sample.Cost Write-Off Method; endIf;

*************************************************************************************************
Dokument "Drift" för en redovisningsuppgift

Det är nödvändigt att skapa ett driftdokument för redovisningsuppgifter.

Vi inaktiverar bokföring för det helt (i egenskaperna "Kontering = Neka"), indikerar att det gör rörelser i redovisningsregistret och drar rörelserna till formuläret.

*************************************************************************************************
Snabb hantering av dokument:

Måste vara ingår:
Inom drift och redovisning. redovisning av dokument måste vara aktiverat (förutom för "Drift"-dokumentet, se nedan).

Måste vara avstängd:
i beräkningsuppgifter är det inte meningsfullt med ett lönedokument.

För dokumentet "Operation" bör postning inaktiveras helt (i dokumentegenskaperna "Posting = Prohibit"),
eftersom han skriver skriver helt enkelt data direkt till registret när han skriver.

*************************************************************************************************
Villkor i en begäran av formen "Antingen den angivna nomenklaturen eller någon, om inte specificerad"

I frågor påträffas följande uppgift: till exempel måste du välja dokument med en angiven nomenklatur eller alla dokument om nomenklaturen inte är specificerad.
Det löses av följande villkor i själva begäran:

Nomenklatur = &Nomenklatur ELLER &Nomenklatur = Värde(Directory.Nomenclature.EmptyLink)

Men det skulle vara mer optimalt och korrekt att omvandla detta tillstånd (tack yukon):


Request.Text = Request.Text + "WHERE Nomenclature = &Nomenklatur";

endIf;

Med tillkomsten av frågeobjektmodellen i 8.3.5 kommer det att vara möjligt att lägga till ett villkor på ett säkrare sätt:

Om ValueFilled (Nomenklatur) Då
Query1.Selection.Add("Artikel = &Nomenklatur");
Request.SetParameter("Nomenklatur", Nomenklatur);
endIf;

*************************************************************************************************
Sammanfoga tabeller i frågor:

Antalet totala poster beror inte på om fältet för den sammanfogade tabellen visas, det beror bara på de konfigurerade relationerna.
Det vill säga att fältet i den bifogade tabellen kanske inte visas.

Om du vill bifoga en tabell utan några villkor, skriv helt enkelt villkoret "TRUE" på fliken Villkor.
I det här fallet kommer bordet att sammanfogas exakt.

*************************************************************************************************
Använda planen för egenskaperstyper (PVC):

1. Använd som en mekanism för att beskriva objektens egenskaper.

1.1. Vi skapar PVC. Dessa kommer att vara Typer av egenskaper (till exempel färg, storlek, max. hastighet, etc.). I inställningarna, välj alla möjliga typer av karakteristiska värden och, om nödvändigt, skapa objektet från punkt 1.2 och ange det även i inställningarna.

1.2. För ytterligare värden av PVC skapar vi en underordnad katalog ExtraValues ​​of Characteristics (eller helt enkelt Values ​​of Characteristics).
Det kommer att lagra egenskaper om de inte finns i befintliga kataloger. Vi kanske inte skapar det om alla egenskaper vi behöver finns i befintliga kataloger, eller om dessa värden kan representeras av elementära datatyper. I PVC-inställningarna anger vi att denna katalog kommer att användas för ytterligare ändamål. egenskaper värden.

1.3. Vi skapar ett informationsregister som faktiskt kopplar samman tre objekt:
- Objektet som vi kopplar egenskaper mekanismen till
- Typegenskaper (PVC-typ)
- Egenskapsvärde (typ - egenskap, detta är en ny typ som dök upp i systemet efter skapandet av PVC
och beskriva alla möjliga datatyper som ett karakteristiskt värde kan ta).
I informationsregistret anger vi att Karakteristiktypen är ägare till Karakteristiskt värde (länk till urvalsparametern), samt typkopplingen för Karakteristiskt värde, återigen från Egenskapstypen.

En annan funktion är att för varje skapad typ av egenskap kan du ange typen av karakteristiskt värde, om du inte behöver alla möjliga typer för att beskriva värdet av denna egenskap.

2. Använda PVC för att skapa en sub-conto-mekanism för redovisningsregistret .

2.1. Vi skapar PVC-typer Subconto.

2.2. Vi skapar en underordnad katalog ValuesSubConto (som med egenskaper kommer den att innehålla subconto-värden om det inte finns sådana i andra kataloger).

2.3. Kommunikationen sker med hjälp av en kontoplan.

*************************************************************************************************
Bokföringsregisterresurser:

Belopp - balansräkning,
Kvantitet - utanför balansräkningen och associerad med redovisningsegenskapen Kvantitativ

*************************************************************************************************
Virtuella redovisningsregistertabeller:

Omsättning: omsättning för ett enda konto
OmsättningDtKt: omsättning mellan två valfria konton, det vill säga alla samma transaktioner för perioden.

*************************************************************************************************
Valutaredovisning i redovisningsregister - hur man implementerar:

Vi skapar ett redovisningsattribut "valuta" i kontoplanen.
I bokföringsregistret skapar vi dessutom:
- Valutadimension (förbud mot tomma värden, utanför balansräkningen, redovisningsattribut - valuta)
- resurs CurrencyAmount (utanför balansräkningen, redovisningsattribut - valuta, det kommer att lagra beloppet i valuta, det vill säga $100 till exempel)
Allt.

Registerstrukturen är alltså:

Mått:
- Valuta
Resurser
- Kvantitet
- Belopp (belopp i rubel)
- CurrencyAmount (belopp i valuta)

Således är valutaredovisning endast en förfining av konventionell redovisning i Republiken Vitryssland; det ändrar inte kärnan i till exempel resursbeloppet
(där är beloppet som vanligt i rubel, oavsett om kontot är i utländsk valuta eller inte).
Och om funktionen Valutaredovisning är avstängd för kontot, är detta den vanliga strukturen för Republiken Vitryssland (resurser - endast kvantitet och belopp).

*************************************************************************************************
När vi ställer in parametrarna för en virtuell tabell för att erhålla en del av den senare, ställer vi villkor på dimensioner och inte på resurser.

Annars får vi inte en bit av det senare, men sista posten med det angivna resursvärdet - det kanske inte är det sista i uppsättningen dimensioner

*************************************************************************************************
Resursens betydelse och uppgifter i beräkningsregistret

Att skapa en resurs i beräkningsregister gör det möjligt att ta emot den vid beräkning av basen med hjälp av detta register.
Och även i proportion till den givna perioden kommer resursvärdet att räknas om (om basperioden inte sammanfaller med registrets periodicitet).

Och värdet på attributet är endast tillgängligt i den verkliga tabellen i beräkningsregistret; det är inte tillgängligt i virtuella tabeller.

*************************************************************************************************
Kryssrutan "Basic" i egenskaperna för beräkningsregisterdimensionen
Innebär att denna mätning kommer att användas för att få en bas i framtiden och används för ytterligare indexering värden för detta fält.

*************************************************************************************************
Fördelning av semesterns giltighetstid per månad vid registrering av uppsättningar av registerposter,
om semester anges i dokumentet på en rad för flera månader samtidigt på en rad:

StartDate of CurrentMonth = Start of Month(TexLineMainAccruals.ActionPeriodStart); CurrentMonthEndDate = EndMonth(TexLineMainAccruals.ActionPeriodStart); CurrentMonth = Datum; WhileDateStartCurrentMonth<= НачалоМесяца(ТекСтрокаОсновныеНачисления.ПериодДействияКонец) Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодДействияНачало = Макс(ДатаНачалаТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияНачало); Движение.ПериодДействияКонец = КонецДня(Мин(ДатаОкончанияТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияКонец)); Движение.ПериодРегистрации = Дата; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаОсновныеНачисления.Подразделение; Движение.Сумма = 0; Движение.КоличествоДней = 0; Движение.График = ТекСтрокаОсновныеНачисления.График; Движение.Параметр = ТекСтрокаОсновныеНачисления.Параметр; Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(Дата, -3)); Движение.БазовыйПериодКонец = КонецДня(КонецМесяца(ДобавитьМесяц(Дата, -1))); ДатаНачалаТекМесяца = НачалоМесяца(ДобавитьМесяц(ДатаНачалаТекМесяца, 1)); ДатаОкончанияТекМесяца = КонецМесяца(ДатаНачалаТекМесяца); КонецЦикла; КонецЕсли;

*************************************************************************************************
Skapa ett Gantt-diagram:

Vi placerar ett element av typen "Gantt-diagram" på formuläret, kallar det DG, skapar sedan kommandot "Generera" och skriver följande i formulärmodulen:

&OnClient Procedur Generate(Command) GenerateOnServer(); Slut på procedur &På servern Procedur GenerateOn Server() DG.Clear(); DG.Update = Falskt; Request = New Request("SELECT |BasicAccrualsActualActionPeriod.Employee, |BasicAccrualsActualActionPeriod.CalculationType, |BasicAccrualsActualActionPeriod.ActionPeriodStart AS ActionPeriodAccrualsStart, |BasicAccrualsActualActionPeriod.EngASP d |FRÅN |Beräkningsregister.BasicAccruals.ActualPeriodActions AS BasicAccrualsActualPeriodActions |WHERE |BasicAccrualsActualPeriodActions.PeriodActions MELLAN &Startdatum OCH &Slutdatum "); Query.SetParameter("StartDate", Period.StartDate); Request.SetParameter("EndDate", Period.EndDate); Select = Query.Run().Select(); While Selection.Next() Loop Point = DG.SetPoint(Selection.Employee); Series = DG.SetSeries(Selection.CalculationType); Value = DG.GetValue(Point, Series); Intervall = Value.Add(); Interval.Start = Sample.PeriodActionStart; Interval.End = Sample.ActionPeriodEnd; EndCycle; DG.Update = Sant; Slut på förfarandet

Egentligen är det bara koden i slingan som är viktig för oss här, resten av sakerna är extra, jag gav bara hela implementeringen av denna deluppgift.
I begäran är det viktigt för oss att det finns en anställd, typ av betalning, startdatum och slutdatum för perioden.
Koden är faktiskt väldigt enkel, lätt att komma ihåg, bli inte orolig om den verkar krånglig

*************************************************************************************************
Bearbeta "återföring"-poster i beräkningsuppgifter:

I t(objektmodul) bildar vi alla rörelser, och om det sedan finns poster i andra perioder får vi dem så här
(systemet genererar dem automatiskt - hjälper oss):

Addition Records = Movements.MainAccruals.GetAddition(); // Inget behov av att spela in rörelser för att få tillägget

För varje teknisk linje från skivtilläggscykeln
Record = Movements.MainAccruals.Add();
FillPropertyValues(Record, TechString);
Record.RegistrationPeriod = TechString.RegistrationPeriodReversal;
Record.ActionPeriodStart = TechString.ActionPeriodStartReverse;
Record.ActionPeriodEnd = TechString.ActionPeriodEndReversal;
Slut på cykeln

Och när du beräknar poster, infoga kontroller:

Om TechMotion.Reversal Då
CurrentMovement.Sum = - CurrentMovement.Amount;
endIf;

*************************************************************************************************
Hur man avgör vad som ingår i de huvudsakliga periodiseringarna och vad som ingår i ytterligare periodiseringar i beräkningsuppgifter.

Men detta är inte alltid 100% tydligt, det finns också mer komplicerade fall, även om det finns en hel del av dem
(till exempel en bonus som beror på antalet arbetsdagar i en månad - det här är HE).

Grundavgifter:
Om typen av beräkning är beroende av tidsplanen (det vill säga ett register över uppgifter med kalenderdatum), så avser det huvudavgifterna.

Exempel OH:
- Lön
- Något som beräknas utifrån antalet arbetsdagar (och för detta behöver du använda ett schema): antingen i giltighetstiden (som lön) eller i basperioden

Extra avgifter:
Vad som anses antingen från det upplupna beloppet, eller tiden som ARBETS (och inte normen!), eller inte beror alls - detta är ytterligare. periodiseringar.

Det vill säga: periodiseringar för beräkningen av vilka tidsstandarden används (kanske också ett faktum) är OH, och för vilka faktiska data eller inget alls behövs är DN.

Eller med andra ord:

Om VR använder en tidsstandard måste giltighetstiden inkluderas för VR.

*************************************************************************************************
Lägg till möjligheten att öppna den inbyggda hjälpsektionen "Arbeta med referensböcker" i listformen i katalogen "Nomenklatur".

Kör kommandot på formuläret:

&OnClient
Procedurhjälp (kommando)
OpenHelp("v8help://1cv8/EnterprWorkingWithCatalogs");
Slut på förfarandet

Vi definierar sektionsraden enligt följande:
Gå till hjälpinformationen för konfigurationsobjektet (i konfiguratorn), skriv ett ord, välj det, gå till menyn Elements/Link och välj önskad del av 1C Hjälp, varefter länken infogas automatiskt. Det ser komplicerat ut, men i praktiken är det enkelt.

*************************************************************************************************
Implementering av interaktion mellan former, till exempel urval:

1. Från det aktuella formuläret, öppna det önskade med metoden “OpenForm()”, skicka strukturen med parametrar som den andra parametern (om nödvändigt). Den tredje parametern kan skicka en länk till detta formulär - ThisForm.

2. I det öppnade formuläret, i "When CreatedOnServer()"-hanteraren, kan vi fånga parametrarna som skickades i steg 1 till "Parameters.[ParameterName]". Formuläret som initierade öppnandet av detta formulär kommer att vara tillgängligt via "Ägare"-identifieraren (om det naturligtvis specificerades i steg 1).

Och viktigast av allt, exportfunktioner i ägarformuläret kommer att vara tillgängliga. Det vill säga att vi kan anropa exportfunktionen för källformuläret och skicka något dit som en parameter för att bearbeta urvalet. Och den här funktionen kommer redan att fylla i det som behövs i originalformuläret. Det finns bara en varning - du kan inte skicka en värdetabell mellan klientprocedurer, men vi kan placera den i tillfällig lagring och helt enkelt skicka VX-adressen och sedan extrahera den från VX.

*************************************************************************************************
Livscykel för formulärparametrar

Alla parametrar som överförts till formuläret vid tidpunkten för dess öppnande är endast synliga i proceduren "When CreateOnServer".
När de har skapats förstörs alla parametrar och är inte längre tillgängliga på formuläret.
Undantaget är för parametrar som deklareras i formulärredigeraren med attributet "Key Parameter".
De bestämmer formens unika karaktär.
Denna parameter kommer att finnas så länge som själva formuläret finns.

*************************************************************************************************
Använda Taxi-gränssnittet

Under utvecklingen kan du ställa in det vanliga hanterade gränssnittet 8.2 i konfigurationsegenskaperna - detta gör allt märkbart mer kompakt och bekant.
Detta gäller särskilt om du hyr på distans - skärmupplösningen är väldigt liten och det är omöjligt att göra något med "taxi"-gränssnittet.
Glöm bara inte att sätta "Taxi" igen när du är klar!Annars drar examinator av poäng!

*************************************************************************************************

PS: E Det finns separata standarddeluppgifter som används i alla uppgifter, och det är dessa som du behöver kunna lösa (till exempel att skriva av i partier, använda PVC (ja, detta är verkligen sällsynt) och andra). Och i alla uppgifter upprepas de helt enkelt (någonstans finns det några deluppgifter, någon annanstans, bara i olika kombinationer). Dessutom har de länge lovat att släppa en ny samling (om de inte redan har gjort det), där det borde finnas mycket fler problem, det vill säga det är ingen idé att memorera lösningar på individuella problem, det är vettigt att lära sig hur man lösa individuella standarddeluppgifter, så löser du alla problem.

PSS: Kolleger, om någon har någon annan användbar information om att förbereda sig för provet och klara det, skriv gärna i kommentarerna så lägger vi till artikeln.

Ackumuleringsregister i 1C:Enterprise-systemet är indelade i två typer: ackumuleringsregister matrester och ackumuleringsregister rpm.

Registertypen väljs när den skapas i konfiguratorn

Som namnet antyder är vissa avsedda att erhålla saldon från ett visst datum, och de andra är avsedda att erhålla omsättning för en vald period. Beroende på typen av ackumuleringsregister genererar 1C:Enterprise-plattformen en annan uppsättning virtuella tabeller. I den här artikeln kommer vi att titta på att arbeta med virtuella tabeller av ackumuleringsregister. För att göra detta kommer vi att skapa ett register för ackumulering av saldon - Produkter kvar och r- Produkter Omsättning.

Låt oss nu titta på vilka virtuella tabeller plattformen tillhandahåller för vart och ett av dessa register.

Revolutionens ackumulationsregister

För tydlighetens skull, låt oss öppna och se vilka tabeller som är tillgängliga för registret Produkter Omsättning. Detta är tabellen över själva registret - Produkter Omsättning, som finns fysiskt i databasen, och en virtuell tabell - ProdukterOmsättning.Omsättning

Med standardbordet är allt klart. Låt oss ta en närmare titt på den virtuella.

Virtuellt bord Omsättning

Denna tabell låter dig få resursomsättning i form av dimensioner. I vårt fall har vi två dimensioner: Stock Och Produkt. Och en resurs - Kvantitet

Låt vårt register ha följande poster

Låt oss gå tillbaka till frågedesignern och börja med att helt enkelt välja från tabellen ProdukterOmsättning.Omsättning alla områden

Följaktligen kommer begäran att se ut så här:

VÄLJ ProdukterOmsättningOmsättning.Lager, ProdukterOmsättningOmsättning.Produkt, ProdukterOmsättningOmsättning.MängdOmsättning FRÅN RegisterAccumulation.ProductsOmsättning.Omsättning(,) AS ProductsOmsättningOmsättning

Resultatet av frågan ser ut så här:

Det vill säga att vi fick omsättning i form av varor och lager under hela tiden. Låt oss anta att vi inte är intresserade av lager och vi vill få omsättning endast i form av varor.

För att göra detta utesluter vi dimensionen från begäran Stock

SELECT ProductsTurnoverTurnover.Product, ProductTurnoverTurnover.QuantityOmsättning FRÅN RegisterAccumulation.ProductsTurnover.Turnover(,) AS ProductsTurnoverOmsättning

och som ett resultat kommer vi bara att ha två rader kvar

Men i regel behöver man inte få omsättning under hela registrets existens. I grund och botten behövs de för en viss period: månad, kvartal, år, etc. Dessutom behövs vanligtvis val efter dimensioner (produkt, lager). Detta uppnås med hjälp av virtuella tabellparametrar. Det är bekvämt att fylla i parametrar från konstruktorn. Med knapp Virtuella bordsalternativ En dialogruta öppnas där du kan ange allt vi behöver:

Efter detta kommer vår ursprungliga begäran att ha följande form

VÄLJ GodsomsättningOmsättning.Lager, GodsomsättningOmsättning.Produkt, VaruomsättningOmsättning.MängdOmsättning FRÅN Registerackumulation.Varomsättning.Omsättning(&Periodens början, &Periodens slut, Lager = &Lager) AS GoodsTurnover

Som vi kan se är skillnaden att det inom parentes efter namnet på den virtuella tabellen finns parametrar som måste fyllas i innan frågan körs.

De som precis har börjat arbeta med virtuella tabeller frestas ofta att ställa in urval på vanligt sätt istället för att använda parametrar:

FROM RegisterAccumulations.ProductsTurnover.Turnover(,) HUR ProdukterOmsättningOmsättning WHERE ProdukterOmsättningOmsättning.Lager = &Lager

När vi fyllde i parametrarna missade vi Periodicitet. Låt oss öppna listan och välja från mängden av möjliga alternativ Månad. Vi tar bort alla andra parametrar för att inte bli förvirrade.

Efter detta ser vi att ett fält dyker upp i tabellfälten Period.

Genom att lägga till den i de valda fälten får vi följande begärantext:

VÄLJ ProdukterOmsättningOmsättning.Period, ProdukterOmsättningOmsättning.Lager, ProdukterOmsättningOmsättning.Produkt, ProdukterOmsättningOmsättning.MängdOmsättning FRÅN RegisterAccumulation.ProductsTurnover.Turnover.Turnover.Turnover(, Month,) AS ProductsTurnover

Vi utför begäran:

Sålunda kan vi inom det valda tidsintervallet dela upp varven i mindre intervall i enlighet med den valda frekvensen.

Balansackumuleringsregister

Precis som med det omvända registret, låt oss titta i frågedesignern vilka virtuella tabeller som är tillgängliga för saldoackumuleringsregistret

Som du kan se är tre virtuella tabeller tillgängliga för saldoackumuleringsregistret: Revolutioner, Matrester, Rester och omsättningar. Låt oss överväga var och en av dem separat.

Virtuellt bord Omsättning

Trots att registertypen är Matrester, vi kan ändå få omsättning från det. Dessutom har vi två ytterligare resurser här: Kommande Och Konsumtion

Låt mig påminna om att när en anteckning görs i saldoregistret anges typen av ackumuleringsrörelse (inkomst eller kostnad), medan för omsättningsregistret typ av rörelse inte anges. Därför har vi här en extra bonus i form av möjligheten att få inte bara den totala omsättningen för perioden, utan även intäkter och kostnader separat. Men naturligtvis, om metadata innehåller ett omvänt register med en liknande uppsättning mätningar, är det bättre att använda det för att få omsättning. I allmänhet liknar arbetet med den här virtuella tabellen som att arbeta med en virtuell tabell Revolutioner det förhandlingsbara registret som diskuterats ovan.

Virtuella bordssaldon

Den här tabellen används för att erhålla resursbalanser per dimension. I tabellparametrarna kan vi ange datumet för vilket vi tar emot saldon och ställa in val:

Låt oss titta på ett litet exempel. Vi har följande registerposter:

Låt oss välja alla tillgängliga fält och ställa in slutet av juni som datum för att ta emot saldon. Vi kommer inte att välja baserat på mått. Då kommer förfrågningstexten att se ut så här:

VÄLJ ProdukterResterande.Lager, ProdukterRester.Rester.Produkt,ProdukterRester.QuantityRemaining FROM RegisterAccumulations.ProductsRemainings.Remainings(&DateRemainings,) AS ProductsRemainingRemainings

Och efter att ha utfört det får vi det här resultatet

Virtuell tabell Saldon och omsättningar

Denna tabell kombinerar de två tidigare diskuterade och låter dig få omsättning för den valda tidsperioden, samt saldon i början och slutet av perioden. Du kan också ställa in val.

Användningen av denna tabell kan motiveras när du samtidigt behöver få både omsättning och saldon i början och slutet av perioden i en rapport. I andra fall bör du inte missbruka dess användning.