Vänster och höger anslutning 1s


1C-frågespråket är en av de största skillnaderna mellan version 7.7 och 8. En av de viktigaste punkterna för att lära sig 1C-programmering är frågespråket. I 1C 8.3 är frågor det mest kraftfulla och effektiva verktyget för att få data. Frågespråket låter dig få information från databasen på ett bekvämt sätt.

Syntaxen i sig påminner mycket om klassisk T-SQL, förutom att du i 1C, med frågespråket, bara kan ta emot data med Select-konstruktionen. Språket stöder också mer komplexa konstruktioner, till exempel (begäran inom en begäran). Frågor i 1C 8 kan skrivas på både kyrilliska och latinska.

I den här artikeln kommer jag att försöka prata om de viktigaste nyckelorden i 1C frågespråk:

  • välja
  • tillåten
  • olika
  • uttrycka
  • först
  • för förändring
  • menande
  • värdetyp (och REFERENSoperator)
  • val
  • Grupp av
  • har
  • ÄR INGET
  • Ja NULL
  • anslutningar - höger, vänster, intern, full.

Samt några små knep i 1C-språket, med hjälp av vilka du optimalt kan konstruera förfrågningstexten.

För att felsöka frågor i 1C 8.2-systemet tillhandahålls ett speciellt verktyg - frågekonsolen. Du kan se beskrivningen och ladda ner den via länken -.

Låt oss titta på de viktigaste och mest intressanta operatorerna för 1C frågespråk.

VÄLJ

I frågespråket 1C Enterprise 8 börjar varje fråga med ett nyckelord VÄLJA. I 1C-språket finns inga UPDATE, DELETE, CREATE TABLE, INSERT-konstruktioner som utförs i objektteknologi. Dess syfte är att endast läsa data.

Till exempel:

VÄLJA
Nuvarande Directory.Name
FRÅN
Directory.Nomenclature AS Current Directory

Frågan returnerar en tabell med objektnamn.

Nära strukturen VÄLJA du kan hitta nyckelord FÖR FÖRÄNDRING, TILLÅTEN, OLIKA, FÖRST

TILLÅTEN— väljer endast poster från tabellen som den aktuella användaren har rättigheter till.

OLIKA— betyder att resultatet inte kommer att innehålla dubbletter av rader.

URVAL (FALL)

Mycket ofta underskattas denna design av programmerare. Ett exempel på dess användning:

Nuvarande Directory.Name,

NÄR Aktuell Directory.Service DÅ

"Service"

SLUTA HUR MAN VISAR Nomenklatur

Directory.Nomenclature AS Current Directory

Exemplet returnerar ett textvärde i fältet "Artikeltyp" - "Produkt" eller "Tjänst".

VAR

Utformningen av 1C-frågespråket, som gör att du kan lägga val på mottagna data. Observera att systemet tar emot all data från servern och först då väljs den baserat på denna parameter.

VÄLJA
Directory.Name
FRÅN
Current Directory.Nomenclature AS Current Directory
WHERE CurrentDirectory.Service = TRUE

I exemplet väljer vi poster för vilka värdet på attributet "Service" är satt till "True". I det här exemplet skulle vi kunna klara oss med följande villkor:

"VAR ÄR TJÄNSTEN"

I huvudsak väljer vi rader där uttrycket efter nyckelordet är lika med "True".

Du kan använda direkta villkor i uttryck:

WHERE-kod = "005215"

Använd "VALUE()"-operatorn i villkoren, använd åtkomst till fördefinierade element och uppräkningar i en 1C-förfrågan:

WHERE Artikeltyp = Värde(Enumeration.Artikeltyper.Produkt)

Tidsvärden kan anges enligt följande:

WHERE Mottagningsdatum > DATETIME(2012,01,01):

Oftast anges villkor som parametrar som skickas till begäran:

Få 267 videolektioner på 1C gratis:

WHERE NomenclatureGroup= &NomenclatureGroup

Ett villkor kan ställas på attributtypen om den är av en sammansatt typ:

Om du behöver begränsa urvalet från en lista med värden eller en matris kan du göra följande:

VAR är ackumulationsregistret B (&lista över dokument för urval)

Tillståndet kan också vara komplext och består av flera tillstånd:

WHERE Mottagningsdatum > DATETIME(2012,01,01) AND NomenclatureGroup= &NomenclatureGroup AND NOT Service

GRUPP AV

Design av frågespråket 1C 8.2 som används för att gruppera resultatet.

Till exempel:

VÄLJA
Mottagande av varor och tjänster varor,.
SUM(Receipt of GoodsServicesGoods.Quantity) AS Quantity,
SUM(Receipt of GoodsServicesGoods.Amount) SOM Belopp
FRÅN
Dokument mottagning av varor och tjänster HUR Mottagande av varor och tjänster

GRUPP AV
Mottagande av varorTjänsterGoods.Goods

Denna begäran kommer att sammanfatta alla kvitton efter belopp och kvantitet per artikel.

Förutom nyckelordet BELOPP Du kan använda andra aggregerade funktioner: KVANTITET, ANTAL OLIKA, MAXIMAL, MINIMUM, GENOMSNITT.

HAR

En design som ofta glöms bort, men den är väldigt viktig och användbar. Det låter dig specificera urval i form av en aggregerad funktion, detta kan inte göras i designen VAR.

Exempel på användning av HAVING i en 1C-förfrågan:

VÄLJA
Mottagande av varor och tjänster varor,.
SUM(Receipt of GoodsServicesGoods.Quantity) AS Quantity,
SUM(Receipt of GoodsServicesGoods.Amount) SOM Belopp
FRÅN
Dokument mottagning av varor och tjänster HUR Mottagande av varor och tjänster

GRUPP AV
Mottagande av varor och tjänster varor

SUM(Receipt of GoodsServicesGoods.Quantity) > 5

Så vi kommer att välja antalet produkter som anlände mer än 5 stycken.

MENANDE()

Till exempel:

WHERE Bank = Value(Directory.Banks.EmptyLink)

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

WHERE Artikeltyp = Värde(Enumeration.Item Types.Service)

TYP på begäran

Datatypen kan kontrolleras genom att använda funktionerna TYPE() och VALUETYPE() eller med den logiska REFERENCE-operatorn.

UTTRYCKA()

Express-operatorn i 1C-frågor används för att konvertera datatyper.

Syntax: UTTRYCKA(<Выражение>HUR<Тип значения>)

Med hjälp av det kan du konvertera strängvärden till datum eller referensvärden till strängdata och så vidare.

I praktiska tillämpningar används Express()-operatorn mycket ofta för att konvertera fält med obegränsad längd, eftersom fält med obegränsad längd inte kan väljas, grupperas, etc. Om sådana fält inte konverteras får du ett felmeddelande Du kan inte jämföra fält med obegränsad längd och fält av inkompatibla typer.

VÄLJA
ContactInformation.Object,
EXPRESS(ContactInfo.View AS ROW(150)) AS View
FRÅN
Register över information Kontaktinformation HUR kontaktinformation

GRUPP AV
EXPRESS(ContactInfo.Representation AS ROW(150)),
ContactInformation.Object

ISNULL (ISNULL)

Ganska användbar funktion av 1C frågespråk som kontrollerar värdet i posten, och om det är lika NULL, Detta gör att du kan ersätta det med ditt värde. Används oftast när man skaffar virtuella tabeller över saldon och omsättning för att gömma sig NULL och sätt en tydlig 0 (noll).

ISNULL(Pre-month Taxes.AppliedFSS Benefit, 0)

En sådan funktion av 1C frågespråk ISNULL kommer att returnera noll om det inte finns något värde, vilket kommer att undvika ett fel.

ANSLUTA SIG

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.

Ett exempel på en vänsteranslutning i en 1C-förfrågan:

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

HÖGER JOIN i 1C 8.3 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:

FULL ANSLUTNING
Directory.Banks HUR Banker

FÖRBI

Frågespråket returnerar båda tabellerna fullständigt endast om villkoret Join records ä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 full 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.

Slutsats

Detta är bara en liten del av syntaxen från frågespråket 1C 8. I framtiden kommer jag att försöka överväga några punkter mer i detalj, visa och mycket mer!

; Kapslade frågor (under utveckling).

Uppgift nr 1: använd en fråga för att välja alla postade dokument Försäljning av varor och tjänster,

Förklaring: konfigurationer Redovisning 2.0 / 3.0 Implementeringen lagrar ingen länk till den utfärdade fakturan. Kopplingen mellan dessa dokument är omvänd: i fakturan (i detaljerna En dokumentbas) en hänvisning till den implementering som den avser lagras. För att förstå vilka implementeringar som inte har fakturor, måste du använda två tabeller i frågan: Försäljning av varor och tjänster Och Faktura utfärdad.

Uppgift nr 2: låt oss säga i katalogens databas Motpartsavtal skapad ytterligare information Senareläggning(registrera lagringsplats ytterligare information). Använd en fråga för att välja alla kontrakt för den angivna motparten med en fördröjning från 0 till 10 dagar.

Förklaring: i denna uppgift skulle det vara möjligt att klara sig utan att använda två tabeller, om inte för ett villkor: valet av kontrakt med noll uppskov. Poängen är att i registret ytterligare information Tomma värden för ytterligare information lagras inte, så det kommer inte att finnas några poster för noll uppskov där. Därför måste du bifoga detta register till katalogen Motpartsavtal, om det inte finns någon post med anstånd för något av kontrakten är det noll.

Nya flikar: Anslutningar

Nya mekanismer: söker efter null i 1C-förfrågan.

Teoretisk del av lektion nr 3

Om en 1C-fråga endast använder en tabell, tas data endast från den. Men om du behöver välja data från flera tabeller bör du ställa in relationer mellan dessa tabeller. Relationer är nödvändiga för att jämföra raderna i en databastabell med raderna i en annan tabell och på så sätt erhålla, när man skapar en fråga, en sluttabell som kommer att innehålla nödvändiga data från alla frågetabeller.

Varje specifik relation konfigureras mellan två tabeller, en av dem kallas Vänster, Övrig Höger. Det finns tre typer av anslutningar:

  • INRE KOPPLING- en post från den vänstra tabellen visas i frågeresultatet endast om anslutningsvillkoret är uppfyllt, en post från den högra tabellen visas i frågeresultatet endast om anslutningsvillkoret är uppfyllt;
  • VÄNSTER ANSLUTNING- en post från den vänstra tabellen kommer att inkluderas i frågeresultatet i alla fall, en post från den högra tabellen kommer att inkluderas i urvalet endast om anslutningsvillkoret är uppfyllt. Analogen till vänstern är RÄTT GÅ MED uppgifterna från den högra tabellen ingår i resultatet i alla fall, uppgifterna från den vänstra tabellen endast om villkoret är uppfyllt. Vanligtvis används den när man skriver en fråga Vänster anslutning, om du använder den högra, nästa gång du öppnar frågan, kommer frågedesignern att konvertera den till den vänstra och byta tabeller;
  • FULL ANSLUTNING- en post från den vänstra tabellen kommer att visas i frågeresultatet först i alla fall, sedan endast om anslutningsvillkoret är uppfyllt, kommer en post från den högra tabellen att visas i frågeresultatet först i alla fall, sedan endast om anslutningsvillkoret är mött. I detta fall exkluderas de resulterande dubblettraderna från provet.

I teorin är det ganska svårt att förena frågetabeller för en otränad 1C-programmerare, men när man studerar exemplen kommer alla otydliga punkter att bli tydligare.

Fliken Relationer i Query Designer

Gå till fliken i frågedesignern Anslutningar. Det är en tabell där det erforderliga antalet anslutningar skapas för alla olika tabellpar. Du kan lägga till, ta bort, kopiera och ändra anslutningar med knapparna ovanför tabellen (vi kommer inte att analysera var och en i detalj).

När du har lagt till en ny anslutning måste du fylla i alla kolumner i tabellen. Låt oss titta på varje kolumn i anslutningstabellen:

  • bord 1. Den vänstra kommunikationstabellen väljs i denna kolumn. Du kan bara använda tabeller som valts på fliken Tabeller och fält;
  • Allt. Flaggan i denna kolumn placeras om du behöver välja all data för den vänstra tabellen (för Vänster eller Full anslutningar);
  • Tabell 2. Den högra anslutningstabellen väljs i denna kolumn;
  • Allt. Flaggan i denna kolumn placeras om du behöver välja all data för rätt tabell (för Höger eller Full anslutningar);
  • fri. Flagga med vilken du kan växla till manuellt redigeringsläge för anslutningsvillkoret;
  • Anslutningens skick. Ett villkor på ett frågespråk, liknande villkoren som diskuteras i . Det är ett uttryck som alltid måste returnera ett av två värden: Sann eller Lögn. Vanligtvis består ett länkvillkor av tre delar:
    • Vänster sida. Vanligtvis ett fält i den vänstra tabellen, men det kan också vara ett fält i den högra tabellen eller en parameter (endast i redigeringsläge för anpassat villkor);
    • Jämförelseoperatör. Som standard, "=", "<>», «<«, «>», «>=», «<=». Но в произвольном режиме редактирования можно использовать и некоторые другие, например «Между»;
    • Höger del. Vanligtvis ett fält i den högra tabellen, men det kan också vara ett fält i den vänstra tabellen eller en parameter (endast i redigeringsläge för anpassat villkor);

Fyllning och redigering Villkor för kommunikation, liknande att redigera ett vanligt villkor som diskuterades i förra lektionen, med undantaget att som standard inte en parameter ställs in i den högra delen av villkoret, utan ett fält i den högra tabellen. I fritt läge finns även en friuttrycksredigerare tillgänglig.

Praktisk del av lektion nr 3

Låt oss titta på lösningen på problemen som ges i början av lektionen.

Uppgift nr 1

Välj alla bokförda dokument med en fråga Försäljning av varor och tjänster, för den angivna perioden, för vilken en faktura inte har skapats.

  • Låt oss skapa en ny begäran;
  • Låt oss välja tabeller Försäljning av varor och tjänster Och Faktura utfärdad från tråden Dokumentation;
  • Från bordet Försäljning av varor och tjänster välj ett fält Länk;
  • Låt oss gå till fliken Betingelser;
  • I kapitel Fält, låt oss öppna tråden Försäljning av varor och tjänster med "+"-knappen;
  • Låt oss hitta rekvisita datum och dra den till villkorssektionen, välj jämförelseoperatorn Mellan och ange parametrarna för till exempel början och slutet av perioden Början av perioden Och Slutet av perioden;
  • Från avsnitt Fält låt oss dra rekvisitan Genomfört, sätt en flagga i linje med villkoret fri och radera den extra delen av villkoret "= &Godkänd";
  • Låt oss gå till fliken Kommunikation;
  • Låt oss skapa en ny anslutning med knappen "Lägg till";
  • I fält bord 1 välj ett bord Försäljning av varor och tjänster(detta kommer att vara det vänstra bordet) ;
  • För att korrekt lösa problemet måste vi få alla implementeringar, bifoga fakturor till dem och om fakturan inte hittas, visa implementeringen som ett resultat av begäran. Låt oss dela upp denna uppgift i två deluppgifter:
    • Låt oss välja alla försäljningar och, med hjälp av anslutningen, försöka hitta deras faktura;
    • Med hjälp av villkoret väljer vi endast de rader där det inte finns någon faktura;
  • Av föregående stycke följer att vi måste använda Vänster anslutning, för att välja alla implementeringar. Låt oss därför sätta en flagga i kolumnen Allt
  • I fält Tabell 2 välj ett bord Faktura utfärdad(det här kommer att vara rätt bord);
  • Eftersom länken till implementeringen lagras i fakturainformationen D DocumentBase, i anslutningsvillkoret väljer vi:
    • På vänster sida av fältet Försäljning av varor och tjänster;
    • På höger sida av fältet: InvoiceInvoiceIssued.DocumentBase.
  • Anslutningskonfigurationen är klar;

Med en vänsterkoppling, om det för en rad i den vänstra tabellen inte finns en enda rad i den högra tabellen som uppfyller anslutningsvillkoren, har alla fält i den högra högra tabellen för en given rad i den vänstra tabellen värdet NULL. Låt oss använda detta för att bara välja de rader i den vänstra tabellen för vilka det inte finns någon faktura;

Frågespråket 1C har en speciell logisk operator som låter dig kontrollera om ett fält innehåller ett värde NULL, dess syntax <Поле>ÄR INGET. Det returnerar ett värde Sann om fältet har ett värde NULL Och Lögn- i motsatt fall.

Observera att kontrollera fältvärdet med NULLär endast möjligt med den angivna funktionen, konstruktion <Поле>= NULL Denna kontroll kommer inte att vara möjlig.

  • Låt oss gå till fliken Betingelser;
  • Dra ett av tabellfälten till villkorssektionen Faktura utfärdad, till exempel fält Länk;
  • Sätt en flagga i raden fri och lägg till operatören efter fältet ÄR INGET, efter att tidigare ha raderat den onödiga delen av tillståndet;

Request = Ny begäran; Request.SetParameter("StartPerid" , StartPerid); Request.SetParameter("End of Period", End of Period); Request.Text = "VÄLJ | Försäljning av varor och tjänster. Länk | FROM | Dokument. Försäljning av varor och tjänster AS Försäljning av varor och tjänster | VÄNSTER ANSLUTNING Dokument. Faktura utfärdad AS Faktura utfärdad faktura | Programvara Försäljning av varor och tjänster. Länk = Faktura utfärdad |. Försäljning av varor och tjänster |.

Uppgift nr 2

  • Låt oss skapa en ny begäran;
  • Låt oss starta frågebyggaren;
  • På fliken Tabeller och fält Låt oss välja två tabeller: Avtal mellan motparter från tråden Kataloger Och Ytterligare information från tråden Informationsregister;
  • Från bordet Avtal mellan motparter välj ett fält Länk;

Enligt villkoret bör förfrågningsresultatet inkludera kontrakt med endast en motpart, vars värde kommer att skickas till begäran med hjälp av en parameter. Motparten som kontraktet tillhör lagras i fältet Ägare katalog Motpartsavtal.

  • Låt oss gå till fliken Betingelser. Från bordet Avtal mellan motparter flytta fältet till villkorssektionen Ägare. På höger sida av villkoret kommer vi att ställa in namnet på parametern till vilken vi ska överföra motparten vi behöver, låt oss kalla det Motpart;
  • Vi kommer också att dela upp uppgiften att välja kontrakt med förseningar från 0 till 10 i två deluppgifter:
    • Låt oss välja alla kontrakt och, med hjälp av anslutningar, försöka hitta deras uppskov;
    • genom att använda villkoret väljer vi endast kontrakt med de uppskjutningar vi behöver;
  • Låt oss skapa kopplingar mellan kontrakt och ytterligare information. Låt oss gå till fliken Anslutningar och lägga till en ny anslutning;
  • I fält bord 1 välj ett bord Avtal mellan motparter(detta kommer att vara det vänstra bordet);
  • Eftersom vi behöver alla kontrakt kommer vi att använda Vänster anslutning. Låt oss sätta en flagga i kolumnen Alla, som tillhör den vänstra tabellen;
  • I fält Tabell 2 välj ett bord Ytterligare information(det här kommer att vara rätt bord);
  • Eftersom referensen till kontraktet lagras i dimensionen Ett objekt informationsregister Ytterligare information, i anslutningsvillkoret väljer vi:
    • På vänster sida av fältet Avtal med motparter;
    • Låt oss lämna standardoperatorn för jämförelse "=";
    • På höger sida av fältet: YtterligareInfo.Object.

Vi har lagt till en länk med vilken vi kommer att välja alla ytterligare. information om varje avtal. Men eftersom vi bara behöver en extra. blanda - Senareläggning måste vi lägga till ytterligare en anslutning. I detta fall Senareläggningär en ytterligare fastighet. Ytterligare egenskaper är av typ Plan över typer av egenskaper Ytterligare detaljer och information. I registret Ytterligare information mervärde egenskaper lagras i dimension Fast egendom. Därför måste vi lägga till en relation som begränsar ytterligare information endast till egenskapen Deferral.

  • Låt oss lägga till en ny anslutning;
  • I fält bord 1 välj ett bord Avtal mellan motparter;
  • Det är viktigt att veta att om du har flera relationer på samma tabellpar måste du använda samma kopplingstyp för dem. I vårt fall är detta Vänster anslutning. Låt oss därför sätta en flagga i kolumnen Allt, avseende den vänstra tabellen;
  • I fält Tabell 2 välj ett bord Ytterligare information;
  • I relationsvillkoret behöver vi inte använda det vänstra tabellfältet, istället kommer vi att lägga ett villkor på dimensionen Fast egendom, likställer det med ytterligare. fast egendom Senareläggning, som kommer att skickas till begäran med hjälp av parametern;
  • Låt oss sätta flaggan fri i mening Sann och skriv manuellt följande villkorstext: “Additional Information.Property = &PropertyDelay”;

  • Anslutningskonfigurationen är klar;

Nu återstår bara att ställa ett villkor på anståndsbeloppet. Eftersom vi använder intervallet från 0 till 10, kommer det att vara nödvändigt att använda jämförelseoperatorn Between. Eftersom nollbackoff inte lagras i ytterligare information kommer alla registerfält att returnera värdet när de är anslutna i detta fall NULL. För att ersätta värdet i ett tillstånd NULL till 0 kommer vi att använda frågespråksfunktionen ÄR INGET(<Выражение1>, <Выражение2>) . Funktionen återkommer Uttryck 1, om det inte är lika NULL Och Uttryck 2 annat.

  • Låt oss gå till fliken Betingelser frågedesigner och lägg till ett nytt villkor;
  • Låt oss sätta en flagga i den fri och gå till friuttrycksredigeraren;
  • Låt oss utöka grenen i avsnittet om språkfunktioner Funktioner -> Övriga funktioner;
  • Låt oss dra en funktion till uttryckssektionen ÄR INGET;
  • Efter den resulterande konstruktionen kommer vi att ange jämförelseoperatorn Mellan och ställa in intervallet: 0 och 10;
  • Klicka på OK, villkoret är klart;

Det sista du kan göra är att visa uppskjutningsvärdet i förfrågningsfälten. För att istället NULL värdet 0 visades, vi använder även friuttrycksredigeraren och funktionen ÄR INGET.

  • Låt oss gå till fliken Tabeller och fält och lägg till ett nytt fält;
  • Välj funktionen i friuttrycksredigeraren som öppnas ÄR INGET;
  • Istället för uttryck 1, infoga fältet AdditionalInformation.Value, och istället för uttryck 2, infoga 0;
  • Klicka på OK, fältet är klart;

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

Request = Ny begäran; Query.SetParameter("PropertyDelay", PropertyProperty); Request.SetParameter("Konto", Konto); Query.Text = "SELECT | Motpartsavtal. Länk, | ISNULL(Ytterligare information. Värde, 0) AS Fält1 | FRÅN | Katalog. Motpartsavtal AS Motpartsavtal | LEFT JOIN Information Register. Ytterligare information | AS Ytterligare information | ON Motpartsavtal . Länk = Ytterligare information |

Läs även artiklar om frågespråket 1C 8.

När vi vill se data från flera tabeller samtidigt, d.v.s. för att samla flera tabeller till en, uppstår konceptet att koppla ihop tabeller och relationer mellan dem. Det finns fyra typer av anslutningar:

  • vänster;
  • höger,
  • inre;
  • komplett.

Vi kommer att titta på varje typ med hjälp av ett abstrakt exempel. Det finns 2 tabeller, i den första lagrar vi beskrivande information om föremålet, i den andra om dess saldon:

För att få en från dessa tabeller måste vi uttryckligen ange vilka fält vi kommer att ansluta, med vilket villkor och typ. Nu ska det bli tydligare.

Vänster anslutning

Med hjälp av en vänsterkoppling berättar vi för systemet att vi som ett resultat vill se alla poster från den vänstra tabellen och de poster från höger som uppfyller anslutningsvillkoret. Anta att vi kopplar samman tabeller med produktfältet med samma villkor, då får vi en tabell som:

Request.Text =
"VÄLJA
| Nomenklatur.Produkt,
| Nomenclature.Color AS ColorNomenclature,
| Remains.Color AS ColorRemains,
| Saldon. Kvantitet
|FRÅN

";

Det fanns inga matchningar för stolen från tabellen över rester, så fälten fylldes med NULL-värden, som måste bearbetas av ISNULL-funktionen, se 1C 8 Query Language Functions.

Den vänstra kopplingen fungerar ungefär som en slinga i en slinga - den tar den första posten från den vänstra tabellen och går igenom alla poster från den högra tabellen för att säkerställa att anslutningsvillkoret är uppfyllt. Sedan tas den andra posten från den vänstra tabellen, och så vidare. Om plötsligt flera poster från den högra tabellen uppfyller anslutningsvillkoret, kommer flera rader att läggas till i den resulterande tabellen (enligt antalet framgångsrika anslutningar som vi kan se är den resulterande tabellen inte informativ, data återspeglar inte). den verkliga essensen, så det är bättre att koppla ihop dessa tabeller med två fält: Produkt och Färg, bara den här gången kommer vi att hantera NULL:

Request.Text =
"VÄLJA
| Nomenklatur.Produkt,
| Nomenclature.Color,
| ISNULL(Remaining.Quantity, 0) AS Quantity
|FRÅN
| Nomenklatur AS Nomenklatur
| VÄNSTER GÅ MED Remainders AS Remainders
| Software Nomenclature.Product = Remaining.Product

Rätt anslutning

Den högra anslutningen skiljer sig i huvudsak inte från den vänstra. Om du byter tabeller kommer den högra kopplingen att förvandlas till en vänster koppling.

Inre koppling

Med hjälp av en inre koppling säger vi till systemet att vi som ett resultat bara vill se de poster som uppfyller anslutningsvillkoret från både den högra tabellen och den vänstra. Således kommer antalet resulterande poster att vara mindre än eller lika med antalet poster för det kortaste bordet som deltar i kopplingen. Låt oss tillämpa en inre koppling till produkt- och färgfälten i våra tabeller:

Request.Text =
"VÄLJA
| Nomenklatur.Produkt,
| Nomenclature.Color,
| Resterande Kvantitet AS Kvantitet
|FRÅN
| Nomenklatur AS Nomenklatur
| INNER JOIN Remainders AS Remainders
| Software Nomenclature.Product = Remaining.Product
| And Nomenclature.Color = Remaining.Color";

Full anslutning

En full join kommer att resultera i alla poster från båda tabellerna, de poster som uppfyller anslutningsvillkoret kommer att kopplas, de poster som inte uppfyller anslutningsvillkoret kommer fortfarande att hamna i frågeresultatet, men med några NULL-fält. Komplett är som vänster och höger anslutningar i ett.

Det kan finnas många problem i detta ämne, låt oss försöka lösa ett av dem. Vår organisation är återförsäljare av 2 möbelfabriker: "Zarya" och "Rassvet". Sortimentet med kostnaden för var och en av fabrikerna lagras i olika tabeller. Det är nödvändigt att upprätta en enda prislista och inkludera produkter i den till minimipriset:

Låt oss använda en fullständig anslutning med ett urval av alla fält, vi kommer att ansluta efter produkt:

Request.Text =
"VÄLJA
| NomenklaturZarya.Product AS ProductZarya,
| NomenklaturZarya.Price AS PriceZarya,
| Nomenklatur Rassvet Produkt AS Produkt Rassvet,.
| NomenklaturRassvet.Pris AS PrisRassvet
|FRÅN

Det här är inte exakt vad vi behöver, låt oss kombinera produktfältet till ett och bearbeta NULL:

Request.Text =
"VÄLJA
//ISNULL-konstruktionen diskuterades i avsnittet om frågespråksfunktioner
//om priset inte är definierat, initialisera det
//varför 1000000 se förklaring nedan
| ISNULL(NomenclatureZarya.Price, 1000000) AS PriceZarya,
| ISNULL(NomenklaturRassvet.Pris, 1000000) AS PriceRassvet
|FRÅN
| NomenclatureZarya AS NomenclatureZarya
| FULL ANSLUTNING NomenclatureDawn AS NomenclatureDawn
| Software NomenclatureZarya.Product = NomenclatureDawn.Product";

Allt som återstår är att välja minimipris. Den slutliga texten för begäran kommer att se ut så här:

Request.Text =
"VÄLJA
| ISNULL(NomenclatureZarya.Product, NomenclatureDawn.Product) AS Produkt,
| VAL
| NÄR DET ÄR ISNULL(NomenclatureZarya.Price, 1000000) > ISNULL(NomenclatureRassvet.Price, 1000000)
| THEN ISNULL(NomenklaturRassvet.Pris, 1000000)
| ELSE ISNULL(NomenclatureZarya.Price, 1000000)
| SLUT SOM PRIS
|FRÅN
| NomenclatureZarya AS NomenclatureZarya
| FULL ANSLUTNING NomenclatureDawn AS NomenclatureDawn
| Software NomenclatureZarya.Product = NomenclatureDawn.Product";

Om priset inte är definierat (NULL), måste det initialiseras med något värde, annars misslyckas jämförelseoperationen för mer/mindre med ett fel. Vi initierar priset med ett orealistiskt stort belopp så att det "förlorar" i jämförelseoperationen, eftersom vi enligt villkoren för problemet väljer det lägsta priset.

← Funktioner för 1C frågespråk 8 | Går med i 1C 8-frågor →

Redaktörens val
Hur skiljer sig ett låneavtal från ett låne- eller kreditavtal, och hur man korrekt formaliserar utfärdandet av pengar till en anställd i programmet...

Råvarurapport i 1C Accounting 8.3 Råvarurapport i 1C Accounting 8.3-programmet är en enhetlig form av TORG-29,...

I den här artikeln vill jag överväga aspekter av beräkning och innehållande av personlig inkomstskatt i 1C 8.3, samt utarbetande av rapporter på blanketter 2-NDFL och...

Vad gör man om en felaktig bokföring görs? För att göra detta kan du använda speciella tekniker för att korrigera sådana poster Om ett fel...
Det finns minst 5 skäl att vägra köpa och använda förfalskade affärsprogramvara. Dessa är: Icke-ekonomiska risker:...
Hur man monterar och demonterar varor i programmet med hjälp av exemplet Trade Management? Det händer att det finns ett behov...
I den här artikeln vill jag överväga aspekter av beräkning och innehållande av personlig inkomstskatt i 1C 8.3, samt utarbetande av rapporter på blanketter 2-NDFL och...
1C-frågespråket är en av de största skillnaderna mellan version 7.7 och 8. En av de viktigaste punkterna i att lära sig 1C-programmering är...
KUDIR är en bok med inkomster och utgifter som måste upprätthållas av alla organisationer och enskilda entreprenörer (artikel 346.24 i Ryska federationens skattelag). Intyga boken med skatten...