Slå samman frågeresultat. Kombinera frågeresultat Hur man kombinerar frågor till en 1c

Frågespråket är en av de grundläggande mekanismerna i 1C 8.3 för utvecklare. Med hjälp av frågor kan du snabbt hämta all data som lagras i databasen. Dess syntax är mycket lik SQL, men det finns vissa skillnader.

De främsta fördelarna med frågespråket 1C 8.3 (8.2) framför SQL:

  • referensfält därav (referenser en eller flera punkter till objektdetaljer);
  • att arbeta med resultat är mycket bekvämt;
  • möjligheten att skapa virtuella tabeller;
  • begäran kan skrivas på både engelska och ryska;
  • förmåga att blockera data för att undvika låsningar.

Nackdelar med frågespråket i 1C:

  • till skillnad från SQL tillåter inte 1C-frågor att ändra data;
  • brist på lagrade procedurer;
  • omöjlighet att konvertera en sträng till ett tal.

Låt oss ta en titt på vår minihandledning om de grundläggande konstruktionerna av frågespråket 1C.

På grund av det faktum att frågor i 1C endast tillåter dig att ta emot data, måste varje fråga börja med ordet "SELECT". Efter detta kommando indikeras fälten från vilka data måste hämtas. Om du anger "*" kommer alla tillgängliga fält att väljas. Den plats från vilken data kommer att väljas (dokument, register, kataloger, etc.) anges efter ordet "FRÅN".

I exemplet som diskuteras nedan väljs namnen på hela nomenklaturen från katalogen "Nomenklatur". Efter ordet "HUR" anges alias (namn) för tabeller och fält.

VÄLJA
Nomenklatur Namn AS Namn på nomenklatur
FRÅN
Directory.Nomenclature AS Nomenclature

Bredvid kommandot "SELECT" kan du ange nyckelord:

  • OLIKA. Frågan kommer endast att välja rader som skiljer sig åt i minst ett fält (utan dubbletter).
  • Första n, Var n– antalet rader från början av resultatet som måste väljas. Oftast används denna konstruktion i samband med sortering (ORDER BY). Till exempel när du behöver välja ett visst antal dokument som är aktuella efter datum.
  • TILLÅTEN. Denna design låter dig välja från databasen endast de poster som är tillgängliga för den aktuella användaren. Baserat på användningen av detta nyckelord kommer användaren att få ett felmeddelande när han försöker söka efter poster som de inte har tillgång till.

Dessa nyckelord kan användas tillsammans eller separat.

FÖR FÖRÄNDRING

Detta förslag blockerar data för att förhindra ömsesidiga konflikter. Låst data kommer inte att läsas från en annan anslutning förrän transaktionen avslutas. I den här klausulen kan du ange specifika tabeller som måste låsas. Annars kommer alla att blockeras. Designen är endast relevant för det automatiska låsläget.

Oftast används "FOR CHANGE"-klausulen när man tar emot saldon. När allt kommer omkring, när flera användare arbetar i programmet samtidigt, medan en tar emot saldon, kan en annan ändra dem. I det här fallet kommer den resulterande resten inte längre att vara korrekt. Om du blockerar uppgifterna med detta förslag, tills den första anställde får rätt balans och utför alla nödvändiga manipulationer med det, kommer den andra anställde att tvingas vänta.

VÄLJA
Ömsesidiga uppgörelser. Anställd,
Ömsesidiga avräkningar Antal ömsesidiga avräkningar Saldo
FRÅN
Register över ackumuleringar Ömsesidiga avräkningar med anställda Saldon AS Ömsesidiga avräkningar
FÖR FÖRÄNDRING

VAR

Designen är nödvändig för att införa någon form av urval på den uppladdade informationen. I vissa fall av att hämta data från register är det mer rimligt att specificera urvalsvillkor i parametrarna för virtuella tabeller. När du använder "WHERE" hämtas alla poster först, och först därefter tillämpas urvalet, vilket avsevärt saktar ner frågan.

Nedan finns ett exempel på en förfrågan om att få kontaktpersoner för en specifik tjänst. Valparametern har formatet: &ParameterName (parameternamnet är godtyckligt).

URVAL (FALL)

Designen låter dig ange villkor direkt i förfrågans brödtext.

I exemplet nedan kommer "AdditionalField" att innehålla text beroende på om dokumentet är upplagt eller inte:

VÄLJA
TillträdeT&U.länk,
VAL
NÄR AntagningT&U.Utförs
DÅ "Dokumentet har godkänts!"
ANNAT "Dokumentet lades inte upp..."
AVSLUTA SOM Extrafält
FRÅN
Dokument Mottagande av varor och tjänster HUR Mottagningsvillkor

ANSLUTA SIG

Joins länkar två tabeller baserat på ett specifikt relationsvillkor.

VÄNSTER/HÖGER ANSLUTNING

Kärnan i LEFT join är att den första specificerade tabellen tas i sin helhet och den andra är länkad till den enligt anslutningsvillkoret. Om det inte finns några poster som motsvarar den första tabellen i den andra, ersätts NULL som deras värden. Enkelt uttryckt är huvudtabellen den först specificerade tabellen och data från den andra tabellen (om någon) har redan ersatt dess data.

Till exempel är det nödvändigt att få artikelartiklar från dokumenten "Mottagande av varor och tjänster" och priser från informationsregistret "Artikelpriser". I det här fallet, om priset för någon position inte hittas, ersätt NULL istället. Alla objekt från dokumentet kommer att väljas oavsett om de har ett pris eller inte.

VÄLJA
Kvitto&U.nomenklatur,
Priser.Pris
FRÅN
Dokument. Mottagande av varor och tjänster. Varor HUR Mottagande och specifikationer
INTERN JOIN RegisterInformation.PricesNomenclature.SliceLast AS Priser
Programvarukvitto&U.Nomenclature = Priser.Nomenklatur

I RÄTT är allt precis tvärtom.

FULL ANSLUTNING

Denna typ av anslutning skiljer sig från de tidigare genom att som ett resultat kommer alla poster i både den första tabellen och den andra att returneras. Om inga poster hittas i den första eller andra tabellen baserat på det angivna länkvillkoret kommer NULL att returneras istället.

När du använder en fullständig anslutning i det föregående exemplet kommer alla artikelartiklar från dokumentet "Mottagning av varor och tjänster" och alla de senaste priserna från registret "Artikelpriser" att väljas. Värdena för icke-funna poster i både den första och andra tabellen kommer att vara lika med NULL.

INRE KOPPLING

Skillnaden mellan en INNER JOIN och en FULL JOIN är att om en post inte hittas i minst en av tabellerna kommer frågan inte att visa den alls. Som ett resultat kommer endast de artikelartiklar från dokumentet "Mottagande av varor och tjänster" att väljas för vilka det finns register i informationsregistret "Artikelpriser", om vi i föregående exempel ersätter "FULL" med "INTERN".

GRUPP AV

Gruppering i 1C-frågor gör att du kan komprimera tabellrader (grupperingsfält) enligt en viss gemensam egenskap (grupperingsfält). Grupperingsfält kan endast visas med aggregatfunktioner.

Resultatet av följande fråga blir en lista över produkttyper med maxpriser för dem.

VÄLJA
,
MAX(Pris.Pris) AS Pris
FRÅN

GRUPP AV
Priser.Nomenklatur.Typ av nomenklatur

RESULTAT

Till skillnad från gruppering, när du använder totaler, visas alla poster och totala rader läggs till dem. Gruppering visar endast generaliserade poster.

Resultaten kan sammanfattas för hela tabellen (med nyckelordet "GENERAL"), för flera fält, för fält med hierarkisk struktur (sökord "HIERARKI", "ENDAST HIERARKI"). När man sammanfattar resultat är det inte nödvändigt att använda aggregerade funktioner.

Låt oss titta på ett exempel som liknar exemplet ovan med hjälp av gruppering. I det här fallet returnerar frågeresultatet inte bara grupperade fält utan även detaljerade poster.

VÄLJA
Priser.Nomenklatur.Typ av nomenklatur AS Typ av nomenklatur,
Priser.Pris AS Pris
FRÅN
Register över information. Priser på nomenklatur. Ögonblicksbild av de senaste AS-priserna
RESULTAT
MAXIMUM(Pris)
FÖRBI
TypNomenklatur

HAR

Den här operatorn liknar WHERE-operatorn, men används endast för aggregerade funktioner. De återstående fälten, förutom de som används av denna operatör, måste grupperas. WHERE-operatorn är inte tillämplig på aggregerade funktioner.

I exemplet nedan väljs maxpriserna för en vara om de överstiger 1000, grupperade efter artikeltyp.

VÄLJA

MAX(Pris.Pris) AS Pris
FRÅN
Register över information. Priser på nomenklatur. Ögonblicksbild av de senaste AS-priserna
GRUPP AV
Priser.Nomenklatur.Typ av nomenklatur
HAR
MAXIMUM(Priser.Pris) > 1000

SORTERA EFTER

Operatören ORDER BY sorterar resultatet av en fråga. För att säkerställa att poster visas i en konsekvent ordning, används AUTO ORDER. Primitiva typer sorteras enligt de vanliga reglerna. Referenstyper sorteras efter GUID.

Ett exempel på att få en lista över anställda sorterade efter namn:

VÄLJA
Anställda. Namn AS Namn
FRÅN
Directory.Employees HUR Anställda
SORTERA EFTER
namn
AUTO BESTÄLLNING

Andra 1C frågespråkskonstruktioner

  • KOMBINERA– resultat av två frågor till en.
  • KOMBINERA ALLT– liknande COMBINE, men utan att gruppera identiska rader.
  • TÖMT BORD– används ibland vid sammanfogning av frågor för att ange en tom kapslad tabell.
  • PLATS– skapar en tillfällig tabell för att optimera komplexa 1C-frågor. Sådana förfrågningar kallas för batchförfrågningar.

Språkfunktioner för frågor

  • SUBSTRING trunkerar en sträng från en angiven position till ett specificerat antal tecken.
  • ÅR...ANDRA låter dig få det valda värdet av en numerisk typ. Ingångsparametern är datumet.
  • BÖRJAN PÅ PERIODEN och SLUT PÅ PERIODEN används när man arbetar med datum. Typen av period (DAG, MÅNAD, ÅR, etc.) anges som en extra parameter.
  • ADDKDATE låter dig lägga till eller subtrahera en angiven tid av en viss typ från ett datum (ANDRA, MINUT, DAG, etc.).
  • DIFERENCEDATE bestämmer skillnaden mellan två datum och anger typen av utdatavärde (DAG, ÅR, MÅNAD, etc.).
  • ÄR INGET ersätter det saknade värdet med det angivna uttrycket.
  • REPRESENTATION och REPRESENTATIONSLÄNKAR få en strängrepresentation av det angivna fältet. Tillämpa på alla värden respektive endast referensvärden.
  • TYP, TYP VÄRDEN används för att bestämma typen av ingångsparameter.
  • LÄNKär en logisk jämförelseoperator för attributvärdetypen.
  • UTTRYCKA används för att konvertera ett värde till önskad typ.
  • DATUM TID får ett värde av typen "Datum" från numeriska värden (år, månad, dag, timme, minut, sekund).
  • MENANDE i en 1C-förfrågan används den för att indikera fördefinierade värden - kataloger, uppräkningar, planer för typer av egenskaper. Användningsexempel: " Där juridisk person = värde(uppräkning. juridisk person. individuell)«.

Frågebyggare

För att skapa frågor med 1C finns det en mycket bekväm inbyggd mekanism - frågedesignern. Den innehåller följande huvudflikar:

  • "Tabell och fält" - innehåller de fält som måste väljas och deras källor.
  • "Anslutningar" - beskriver villkoren för CONNECTION-strukturen.
  • "Gruppering" – innehåller en beskrivning av grupperingsstrukturer och summerade fält baserat på dem.
  • "Villkor" - ansvarar för att välja data i begäran.
  • "Avancerat" – ytterligare frågeparametrar, som nyckelord för kommandot "SELECT" osv.
  • "Joins/Aliases" - möjligheterna att sammanfoga tabeller anges och alias specificeras ("HOW"-konstruktionen).
  • "Order" ansvarar för att sortera resultatet av frågor.
  • "Totals" - liknande fliken "Gruppering", men används för "TOTALS"-konstruktionen.

Texten i själva begäran kan ses genom att klicka på knappen "Begäran" i det nedre vänstra hörnet. I detta formulär kan det korrigeras manuellt eller kopieras.


Begär konsol

För att snabbt se resultatet av en fråga i Enterprise-läge, eller felsöka komplexa frågor, använd . Den innehåller texten i begäran, ställer in parametrarna och visar resultatet.

Du kan ladda ner frågekonsolen på ITS-disken eller via .

Om du arbetar med en tabell behöver du inte använda en join. Det är en helt annan sak när man arbetar med flera tabeller och till exempel behöver få uppgifter om både köp och försäljning av varor.

En klausul används för att kombinera KOMBINERA. Vad som faktiskt händer är att resultaten av frågor slås samman, det vill säga att varje fråga samlar in data oberoende av varandra, och sedan kombineras dessa resultat till ett. Och endast på den sista begäran utförs andra operationer, till exempel beställning och beräkning av totaler.

Vid sammanslagning av frågor sker "vertikal limning" av resultat, det vill säga resultatraderna i den första frågan kommer först, sedan den andra.

Låt oss gå vidare till praktiken:
Kod 1C v 8.x SELECT
Nomenklatur,
Kvantitet,
Belopp
FRÅN
Dokument.Antagning.Varor

KOMBINERA

VÄLJA
Nomenklatur,
Kvantitet,
Belopp
FRÅN
Dokument.Antagning.Varor

Resultatet av denna fråga är följande:
Nomenklatur Kvantitet Belopp
A4 papper 25 14 500
Klistermärken 500l 8 4 880
Fil genomskinlig 5 4 100
Office set 8 8 840

Som ett resultat kommer vi att få två bord som kommer att kopplas till varandra. Det är svårt att se var kvittodokumentet slutar och utgiftsdokumentet börjar. Men vi ska göra något för att reda ut det:
Kod 1C v 8.x
VÄLJA
Nomenklatur,
Kvantitet AS Kol. Ankomst,
Belopp AS SumIncoming,
0 som kvantitetskostnad,
0 SOM Belopp Kostnad
FRÅN
Dokument.Antagning.Varor

KOMBINERA

VÄLJA
Nomenklatur,
0 AS KolPrikhod,
0 AS SumPrikhod,
Kvantitet AS Antal Konsumtion,
Belopp SOM AmountExpense
FRÅN
Document.Consumables.Goods

Som du kan se av förfrågningstexten sätter vi olika alias för kvantitet och belopp för varje dokument. I stället för de fält där vi kommer att få värdena för mängden och kvantiteten, kommer vi att sätta nollor. Detta är nödvändigt för att tomma kvantiteter och mängder ska ersättas med nollor.

A4 papper 25 14 500
Klistermärken 500l 8 4 880
Fil genomskinlig 5 4 100
Office set 8 8 840
Office set 1 1 105
Fil genomskinlig 1 820
Klistermärken 500l 1 610

Nu måste vi ta bort dubbletter av element från frågeresultatet. Vi har två frågor och om vi komprimerar var och en separat för att eliminera dubbletter av element kommer ingenting att fungera. Därför kommer vi att reducera begäran till följande form:
Kod 1C v 8.x
VÄLJA
Nomenklatur,
BELOPP (Inkomstnummer) AS Antal inkomst,
SUM(SumPrikhod) AS SumPrikhod,
AMOUNT (Quty of Expense) SOM Qty of Expense,
SUM(SumExpense) AS SumExpense
FRÅN

(VÄLJA
Nomenklatur,
Kvantitet AS Kol. Ankomst,
Belopp AS SumIncoming,
0 som kvantitetskostnad,
0 SOM Belopp Kostnad
FRÅN
Dokument.Antagning.Varor

KOMBINERA

VÄLJA
Nomenklatur,
0 AS KolPrikhod,
0 AS SumPrikhod,
Kvantitet AS Antal Konsumtion,
Belopp SOM AmountExpense
FRÅN
Document.Consumables.Goods) AS AttachedRequest

GRUPPER EFTER Nomenklatur

Så vi ser att hela vår fråga är omgiven av parentes och heter NestedQuery. Detta görs så att vi kan gruppera posterna från båda underfrågorna och eliminera dubbletter av element. Denna design kallas en kapslad fråga. Resultatet av denna fråga är följande:
Nomenklatur KolIncoming SumIncoming KolExpenditure SumExpenditure
A4 papper 25 14 500
Klistermärken 500l 8 4 880 1 610
Office set 5 4 100 1 1 105
Fil genomskinlig 8 8 840 1 820

Som ett resultat får vi en grupperad tabell där data från kapslade underfrågor förs till en begriplig form. Antalet delfrågor bör inte överstiga 255. Vi har använt fyra delfrågor här.

Om vi ​​bara vill lämna unika postvärden i frågan utan att använda gruppering. Du måste skriva en KOMBINERA mening utan nyckelordet ALLA.

Information hämtad från sajten

; Kapslade frågor (under utveckling).

Mottagande av varor och tjänster Och Returnera varor till leverantören för den angivna perioden.

Nya flikar: Fackföreningar/Alias.

Teoretisk del av lektion nr 4

1C Query Builder låter dig skapa frågekombinationer. Med deras hjälp kan du sekventiellt mata ut data som erhållits från flera frågor utan att använda anslutningar. Det enda villkoret för sammanslagning är samma uppsättning fält i varje enskild begäran.

Gå till fliken i designern Fackföreningar/Alias. Den är utformad för att skapa frågekopplingar och för att ställa in alias för frågefält. Fältalias behövs om du inte är nöjd med standarddatabasfältnamnen. Om ett frågefält endast består av ett databastabellfält krävs inget alias för det. Om du använde frågespråksfunktioner när du skapade ett fält, krävs ett alias för ett sådant fält. Frågedesignern skapar standardalias för sådana fält Fält1...FältN, dessa alias kan ersättas med de som är bekväma för dig.

Låt oss titta på avsnitten på fliken Fackföreningar/Alias:

  • Förfrågningar(röd ram). Det här avsnittet innehåller en tabell som visar alla kombinerade frågor. Genom att använda menyn ovanför detta avsnitt kan du lägga till nya, kopiera befintliga, ta bort valda och även byta plats. När du lägger till eller kopierar en begäran går designern till fliken Tabeller och fält, där du kan ange databastabeller och de obligatoriska fälten för en ny fråga. Du kan växla mellan frågor med hjälp av flikarna som kommer att visas på höger sida av designern när nya 1c-frågor läggs till;

  • I bordet Förfrågningar två kolumner:
    • namn. Ställ in automatiskt i formatet Begäran 1...Begäran N;
    • Inga dubbletter. Ställ in när det är nödvändigt att utesluta dubbletter av rader vid sammanslagning med en tidigare fråga. Det är värt att notera att denna flagga endast kommer att agera vid sammanslagning av begäran där den är inställd med den tidigare begäran.

  • Smeknamn(blå ram). I det här avsnittet kan du ställa in alias för frågefält, samt ställa in korrespondensen för fält för kombinerade frågor, så att de som ett resultat av frågan är i samma kolumn och visas under ett alias. Om fälten i de sammanslagna frågorna heter samma namn, justeras överensstämmelsen mellan dem automatiskt. För att konfigurera fältmatchning måste du hitta raden med önskat alias i tabellen, hitta önskad fråga i kolumnerna och välja fältet i rullgardinsmenyn.

Praktisk del av lektion nr 4

Låt oss titta på lösningen på problemet som gavs i början av lektionen. Låt mig påminna dig om villkoren:

Uppgift: använd en fråga för att välja alla postade dokument Mottagande av varor och tjänster Och Returnera varor till leverantören för den angivna perioden.

  1. Låt oss skapa en ny begäran;
  2. Låt oss starta frågedesignern;
  3. Låt oss välja en tabell Mottagande av varor och tjänster från tråden Dokumentation;
  4. Från bordet Mottagande av varor och tjänster välj ett fält Länk;
  5. Låt oss gå till fliken Betingelser;
  6. I kapitel Fält, låt oss öppna tråden Mottagande av varor och tjänster med "+"-knappen;
  7. Låt oss hitta rekvisita datum och dra den till villkorssektionen, välj jämförelseoperatorn Mellan och ange parametrarna för början och slutet av perioden, till exempel Början av perioden Och Slutet av perioden;
  8. Låt oss gå till fliken Fackföreningar/Alias.
  9. Lägg till en ny begäran, flagga Inga dubbletter det finns ingen anledning att ta upp det, eftersom vi använder olika typer av dokument;

  10. 1C Query Builder kommer automatiskt att gå till fliken Tabeller och fält. På höger sida av fönstret ser du att den andra anslutningsbegäran är aktiv;


  11. Låt oss upprepa punkterna 1 - 7 för tabellen Retur av varor till leverantören;
  12. Låt oss gå till fliken igen Fackföreningar/Alias. I aliastabellen kan du se att fälten Länk båda tabellerna är i samma rad, vilket innebär att länkar till båda dokumenten kommer att hittas i samma kolumn som ett resultat av frågan;
  13. Låt oss ändra kolumnnamnet från LänkDokumentera(ställ in fältaliaset). För att göra detta, dubbelklicka med vänster musknapp på fältnamnet. Därefter kan du ställa in ditt namn, skriv det där Dokumentera;

  14. Förfrågan är klar, klicka på knappen "OK" längst ned i designfönstret.

Som ett resultat kommer vi att få en förfrågan med följande text.

Det finns situationer när det är nödvändigt att kombinera flera frågor i en fråga, och tabellkopplingar kan inte hjälpa till med detta. Det enklaste sättet att visa det är med ett exempel.

Antag att fakta om köp och försäljning av varor i vårt system registreras av dokumenten Inkomst respektive Kostnad. Motparten kan vara antingen en köpare eller en leverantör. Skuld kan kvittas genom leverans av varor:

För att beräkna den totala skulden för en motpart måste du lägga ihop summan av alla utgifter för denna motpart och subtrahera summan av alla kvitton från samma motpart; det enklaste sättet att göra detta är att använda operatören KOMBINERA ALLA:

Request.Text =
"
//beräkna mängden vi skickade till entreprenörer
|VÄLJ
| Expense.Motpart,
|FRÅN
| Document.Expense AS Expense
|GRUPP EFTER
| Kostnad. Motpart
| KOMBINERA ALLA
//beräkna beloppet för motparterna
//levererat varor till oss
|VÄLJ
| Församling. Motpart,
//ta beloppet med ett negativt tecken,
//att det i kombination drogs av från utgiftsbeloppet
| AMOUNT(-Kvitto.Belopp)
|FRÅN
| Dokument Ankomst AS Ankomst
|GRUPP EFTER
| Ankomst. Motpart";

I den första begäran beräknar vi kostnadsbeloppet för varje motpart, i den andra - det belopp som varje motpart försåg oss med varor för. Beloppet i den andra begäran tas med ett minustecken, så att när den resulterande tabellen kollapsas dras det från beloppet för leverans till denna motpart. Som ett resultat får vi en tabell som:

Det är inte riktigt vad vi ville, men det är nära. För att uppnå önskat resultat återstår bara att gruppera efter motpart. För att göra detta måste frågan placeras i en temporär tabell (att arbeta med temporära tabeller diskuteras i stängd del av kursen ) och välj och gruppera fält från den:

Request = Ny begäran;
Request.Text =
"VÄLJA
| Expense.Motpart,
| AMOUNT(Expenditure.Belopp) SOM skuld
|Placera VT_Inkommande kostnad
|FRÅN
| Document.Expense AS Expense
|GRUPP EFTER
| Kostnad. Motpart
| KOMBINERA ALLA
|VÄLJ
| Församling. Motpart,
| AMOUNT(-Kvitto.Belopp)
|FRÅN
| Dokument Ankomst AS Ankomst
|GRUPP EFTER
| Socken.Motpart
|;
|////////////////////////////////////////////////////////////////////////////////
|VÄLJ
| VT_Inkommande utgifter. Motpart,
| SUM(VT_InkomstUtgifter.Skuld) AS Skuld
|FRÅN
| VT_IncomingConsumption AS VT_IncomingConsumption
|GRUPP EFTER
| VT_Inkommande utgifter. Motpart";

Krav för sammanslagning av frågor

När två frågor slås samman måste antalet fält vara detsamma, om någon av frågorna saknar fält måste de läggas till som konstanter. Låt oss titta på exemplet ovan, låt utgiftsdokumentet även ha ett rabattfält som minskar beloppet på motpartens skuld, men det finns inga rabatter i kvittodokumentet. Hur ska man vara i det här fallet? Så:

Request = Ny begäran;
Request.Text =
"VÄLJA
| Expense.Motpart,

|FRÅN
| Document.Expense AS Expense
|GRUPP EFTER
| Kostnad. Motpart
| KOMBINERA ALLA
|VÄLJ
| Församling. Motpart,
| SUM(-Kvitto.Belopp),
//lägg till en nullfältsrabatt
| 0
|FRÅN
| Dokument Ankomst AS Ankomst
|GRUPP EFTER
| Ankomst. Motpart";

Allt som återstår är att dra av rabatten och gruppen.

Ordningen är också viktig. Fälten kommer att slås samman exakt i den ordning som de anges i SELECT-sektionerna i båda frågorna. I förhållande till föregående exempel, låt oss byta rabatt- och beloppsfälten i urvalet av kvitton:

Request = Ny begäran;
Request.Text =
"VÄLJA
| Expense.Motpart,
| AMOUNT(Expenditure.Amount) AS Debt,
| AMOUNT(Expense.Rabatt) AS Rabatt
|FRÅN
| Document.Expense AS Expense
|GRUPP EFTER
| Kostnad. Motpart
| KOMBINERA ALLA
|VÄLJ
| Församling. Motpart,
//Byt platser
| 0,
| AMOUNT(-Kvitto.Belopp)
|FRÅN
| Dokument Ankomst AS Ankomst
|GRUPP EFTER
| Ankomst. Motpart";

God dag kära läsare av bloggsidan. Idag kommer vi att diskutera i detalj kombinera förfrågningar i 1C. Du kan också ladda ner för en standardkonfiguration Trade Enterprise Management for Kazakhstan, utgåva 1.0.

Om du arbetar med en tabell behöver du inte använda en join. Det är en helt annan sak när man arbetar med flera tabeller och till exempel behöver få uppgifter om köp och försäljning av varor.

En klausul används för att kombinera KOMBINERA / UNION. Händer faktiskt slå samman frågeresultat, det vill säga varje fråga samlar in data oberoende av varandra, och sedan kombineras dessa resultat till ett. Och endast på den sista begäran utförs andra operationer, till exempel beställning och beräkning av totaler.

Däremot, vid sammanslagning av frågor, sker "vertikal limning" av resultat, det vill säga resultatraderna i den första frågan kommer först, sedan den andra.

Låt oss gå vidare till praktiken:

VÄLJ artikel, kvantitet, belopp KOMBINERA VÄLJ artikel, kvantitet, belopp FRÅN Dokument.Förbrukningsvaror.Varor

Resultatet av denna fråga är följande:

Som ett resultat kommer vi att få två bord som kommer att kopplas till varandra. Det är svårt att se var kvittodokumentet slutar och utgiftsdokumentet börjar. Men vi ska göra något för att reda ut det:

VÄLJ Nomenklatur, Kvantitet HUR Antal församlingar, Belopp AS SumPrikhod, 0 HUR Kvantitet Förbrukning, 0 HUR SumExpenditure FRÅN Document.Admission.Products KOMBINERA Antal församlingar, 0 HUR SumPrikhod, Kvantitet AS Kvantitet Förbrukning, Belopp AS SumExpenditure FRÅN Document.Consumables.Goods

Som du kan se av förfrågningstexten sätter vi olika alias för kvantitet och belopp för varje dokument. I stället för de fält där vi kommer att få värdena för mängden och kvantiteten, kommer vi att sätta nollor. Detta är nödvändigt för att tomma kvantiteter och mängder ska ersättas med nollor.

Nomenklatur Antal församlingar SumPrikhod Kvantitet Förbrukning SumExpenditure
A4 papper 25 14 500
Klistermärken 500l 8 4 880
Fil genomskinlig 5 4 100
Office set 8 8 840
Office set 1 1 105
Fil genomskinlig 1 820
Klistermärken 500l 1 610

Nu måste vi ta bort dubbletter av element från frågeresultatet. Vi har två frågor och om vi komprimerar var och en separat för att eliminera dubbletter av element kommer ingenting att fungera. Därför kommer vi att reducera begäran till följande form:

VÄLJA
Nomenklatur,
BELOPP (Inkomstnummer) AS Antal inkomst,
SUM(SumPrikhod) AS SumPrikhod,
AMOUNT (Quty of Expense) SOM Qty of Expense,
SUM(SumExpense) AS SumExpense
FRÅN
(
VÄLJ Nomenklatur, Kvantitet HUR Antal församlingar, Belopp AS SumPrikhod, 0 HUR Kvantitet Förbrukning, 0 HUR SumExpenditure FRÅN Document.Admission.Products KOMBINERA VÄLJ objekt, 0 HUR Antal församlingar, 0 HUR SumPrikhod, Kvantitet AS Kvantitet Förbrukning, Belopp AS SumExpenditure FRÅN Document.Consumables.Goods ) AS NestedQuery
GRUPPER EFTER Nomenklatur

Så vi ser att hela vår fråga är omgiven av parentes och heter NestedQuery. Detta görs så att vi kan gruppera posterna från båda underfrågorna och eliminera dubbletter av element. Denna design kallas en kapslad fråga. Resultatet av denna fråga är följande:

Nomenklatur Antal församlingar SumPrikhod Kvantitet Förbrukning SumExpenditure
A4 papper 25 14 500
Klistermärken 500l 8 4 880 1 610
Office set 5 4 100 1 1 105
Fil genomskinlig 8 8 840 1 820

Som ett resultat får vi en grupperad tabell där data från kapslade underfrågor förs till en begriplig form.
Antalet underfrågor bör inte överstiga 255. Vi använde fyra underfrågor här.