Opprette og jobbe med spørsmål (for nybegynnere). Opprettelse og arbeid med forespørsler (for nybegynnere) 1med en forespørsel om å velge dokumenter fra den siste

V. V. Klyuev

http://prof1c.kklab.ru

Skapelse ogjobbe med forespørsler. Enkleste operasjonerfor nybegynnere(Vanlig applikasjon)

God ettermiddag!

I dag vil jeg fortelle deg hvordan du begynner å jobbe med forespørsler og lærer (selvfølgelig gradvis) hvordan du arbeider med forespørsler i 1C. For de som er kjent med MS-spørsmål
SQL vil selvfølgelig være mye enklere.

Så la oss åpne konfiguratoren og lage en ny ekstern behandling.

Etter det får vi et vindu med behandlingen. La oss begynne å eksperimentere direkte med spørsmål, for dette vil vi opprette et nytt skjema i behandlingen - og for dette velger du Skjemaer i listen (hvitt felt) - og klikker (+) Legg til, er enig med alle de foreslåtte standard skjemaparametrene, og klikk ferdig.

Så vi har laget et tomt skjema med deg, med knapper og. I vinduet med skjemaet velger du kategorien og går direkte til å skrive koden som skal utføres når du klikker på utfør-knappen. For å gjøre dette, finner vi fremgangsmåten Button Execute Pressing (Button)

og skriv følgende kode:

Prosedyre Utfør knapp Trykk på (knapp) Forespørsel = Ny forespørsel (); Be om. Tekst = "VELG | * | FRA| Dokument ... Faktura for betaling til kjøper"; Resultat = Forespørsel. Utfør (). Last ut (); Sluttprosedyre

La oss kommentere det vi har skrevet her. Vi har valgt på forespørsel alle dokumenter "Faktura for betaling til kjøper". Jeg vil straks merke meg at avhengig av konfigurasjonen du eksperimenterer med - se på sammensetningen av konfigurasjonsdokumentene dine og erstatt ethvert dokumentobjekt fra listen over dokumenter i konfigurasjonen i stedet for den spesifiserte "Faktura til kjøper", det er ønskelig at dokumenter av denne typen opprettes i infobasen, for ikke å få et tomt søkeresultat. Jeg vil også merke et viktig poeng - hvis det er for mange slike dokumenter, kan utførelsen av forespørselen ta litt tid - på grunn av at vi ikke begrenser forespørselen med betingelser og velger alle feltene - det er det stjernen (*) forteller oss.

Med søkeordet "Velg", beordrer vi vår forespørsel om å velge alle felt (*) (dokumentdetaljer) fra dokumentet "Faktura for betaling til kjøper".

Viktig:
Jeg vil også merke seg at når du skriver et spørrespråk, bør du referere til konfigurasjonsobjekter i entall, ikke i flertall. I dette
Når det gjelder dokumentobjektet i konfigurasjonen (Dokumentgrenen), skrives et dokument i forespørselen. Også til sammensetningen av dokumentene - vi kommer gjennom prikken (.) - og navnet på dokumentet.

Vi får resultatet av spørringen i form av en verditabell, som det fremgår av metoden (parameteren) vi brukte - Løs ut, det vil si først vi utførte
query (Execute), og først da dumpet resultatet av spørringsutførelsen i verditabellen, og tabellen med verdier er i Result -variabelen.

Deretter lagrer vi behandlingen vår i en fil, for dette klikker vi File-> Save As og skriver filnavnet, for behandlingen min setter jeg navnet "ExternalProcessing1Demo", slik at du ikke ser etter behandling på lenge, du kan lagre det på skrivebordet, så må vi åpne det)).

La oss nå lære litt om det grunnleggende om feilsøking. For å gjøre dette, nå i feltet ved siden av teksten Resultat = ... dobbeltklikk på venstre museknapp for å få en rød sirkel til å vises, du bør få noe slikt:

Så vi har nå satt et brytpunkt på linjen med resultatet, la oss nå starte konfigurasjonen for feilsøking ved å trykke på (F 5) -tasten eller knappen
på verktøylinjen:

Nå, i 1C: Enterprise-modus som vi lanserte, åpner du den lagrede behandlingsfilen-> Åpne og finn stedet der du lagret behandlingsfilen, velg den og klikk på åpne. Vi trykker på "Utfør" -knappen i behandlingen. Hvis du gjorde alt riktig, går du automatisk inn i konfiguratormodus, og du vil se følgende på stedet der brytepunktet vårt ble angitt:

En pil har dukket opp i sirkelen vår - vi har gått til trinn-for-trinn-utførelse av koden vår, og så vil vi se det mest interessante. Hvis du gjorde alt riktig, kan du nå få resultatet av spørringen.

For en visuell fremstilling av forespørselen, gjør vi følgende: I toppmenyen i konfiguratoren finner du Debug -menyen og velger Tableau -kommandoen.

Et tomt vindu åpnes nederst i konfiguratorvinduet -> resultattavle. Det er linjer i dette vinduet som er tomme. Dobbeltklikk på den tomme markerte linjen og skriv ordet Resultat. Du burde ha noe slikt:

Så i vinduet vi spesifiserte, skulle vi få resultatet av utførelsen av koden vår, nemlig nå - variabelen "Resultat", siden vi ennå ikke har utført denne kodelinjen - vi har en tom verdi og datatypen variabelen er "Udefinert".

La oss ta et skritt - å utføre den angitte kodelinjen. For å gjøre dette, trykk på tasten eller i menyen Debug-> Step Through ... (F 10).

Og hva ser vi på resultattavlen:

Vi ser med deg - verdien av variabelen og typen av variabelen. Nå kan vi også se innholdet i verditabellen vår. For å flytte musepekeren til resultatfeltet, trykk på høyre museknapp og velg "Vis verdi i et eget vindu"

Vi får et vindu med dokumentene vi har valgt, som er i resultatvariabelen

Å oppsummere:

Du har lært hvordan du lager en enkel forespørsel, og deltok også i feilsøking av koden din og så til og med på resultatet av forespørselen vår i konfiguratoren.

Forespørsler er designet for å hente og behandle informasjon fra databasen for å gi brukeren i ønsket form. Behandling her betyr gruppering av felt, sortering av rader, beregning av totaler osv. Du kan ikke endre data ved hjelp av spørsmål i 1C!

Forespørselen utføres i henhold til de gitte instruksjonene - forespørselstekst... Forespørselsteksten er sammensatt i samsvar med syntaksen og reglene spørrespråk... Spørsmålsspråket 1C: Enterprise 8 er basert på standarden SQL, men har noen forskjeller og utvidelser.

Ordning for å jobbe med en forespørsel

Den generelle ordningen for å jobbe med en forespørsel består av flere sekvensielle stadier:

  1. Opprette et forespørselsobjekt og sette forespørselsteksten;
  2. Sette parametere for forespørsel;
  3. Utføre forespørselen og få resultatet;
  4. Omgå søkeresultatet og behandle mottatte data.

1. Objekt Be om har eiendommen Tekst som du vil tilordne spørringsteksten til.

// Valg 1
Request = Ny forespørsel;
Be om ... Tekst =
"VELGE
| Valutakurser. Periode,
| Valutakurser. Valuta,
| Valutakurser.
| FRA

| HVOR
;

// Alternativ 2
Forespørsel = Ny forespørsel("VELGE
| Valutakurser. Periode,
| Valutakurser. Valuta,
| Valutakurser.
| FRA
| Informasjonsregister. Valutakurser AS Valutakurser
| HVOR
| RatesCurrency.Currency = & Valuta ");

2. Innstilling av parameterverdiene utføres etter metoden SetParameter (< Имя>, < Значение>) ... Parametere i spørringsteksten er markert med symbolet " & »Og brukes vanligvis i valgforholdene (seksjon WHERE) og i parametrene til virtuelle tabeller.

Be om);

3. Etter at teksten er tilordnet og parametrene er angitt, må spørringen utføres og utførelsesresultatet oppnås. Utførelse utføres ved hjelp av Run () -metoden, som returnerer et objekt Resultat av forespørsel... Fra spørringsresultatet kan du:

  • få prøven ved hjelp av metoden Velg (< ТипОбхода>, < Группировки>, < ГруппировкиДляЗначенийГруппировок>) ;
  • dump verdier i en verditabell eller et tre med verdier ved hjelp av lossemetoden (< ТипОбхода>) .

// Få et utvalg

Prøve = Be om resultat. Velge();

// Få verditabellen
QueryResult = Spørring. Løpe ();
bord = Forespørselsresultat. Lesse();

4. Du kan omgå valget av søkeresultatet ved hjelp av en løkke:

Ha det Eksempel .Neste () Loop
Rapport (Eksempel. Kurs);
Slutt på syklus;

Et komplett eksempel på å jobbe med en forespørsel kan se slik ut:

// Fase 1. Opprette en forespørsel og stille inn forespørselsteksten
Request = Ny forespørsel;
Be om ... Tekst =
"VELGE
| Valutakurser. Periode,
| Valutakurser. Valuta,
| Valutakurser.
| FRA
| Informasjonsregister. Valutakurser AS Valutakurser
| HVOR
| RatesCurrency.Currency = & Valuta ";

// Trinn 2. Innstilling av parametere
Be om ... SetParameter ("Valuta", SelectedCurrency);

// Trinn 3. Utføre forespørselen og få valget
QueryResult = Spørring. Løpe ();
Prøve = Be om resultat. Velge();

// Omgå valg
Ha det Eksempel .Neste () Loop
Rapport (Eksempel. Kurs);
Slutt på syklus;

Sammensetning av forespørselsteksten

Forespørselsteksten består av flere seksjoner:

  1. Be om beskrivelse- en liste over valgbare felt og datakilder;
  2. Kombinere spørsmål- uttrykk "COMBINE" og "COMBINE ALL";
  3. Bestiller resultater- uttrykket "BESTILL AV ...";
  4. Automatisk bestilling- uttrykket "AUTO BESTILLING";
  5. Resultatbeskrivelse- uttrykket "RESULTATER ... PÅ ...".

Bare den første delen er nødvendig.

Midlertidige tabeller og batchforespørsler

1C spørrespråk støtter bruk av midlertidige bord- tabeller hentet som et resultat av å utføre en forespørsel og lagret midlertidig.

Du kan ofte møte en situasjon når du ikke trenger å bruke databasetabellene som en spørringskilde, men resultatet av en annen spørring. Denne oppgaven kan løses ved hjelp av nestede spørsmål eller midlertidige bord... Bruken av midlertidige tabeller lar deg forenkle teksten til en kompleks spørring ved å dele den i komponentdeler, samt i noen tilfeller øke hastigheten på spørringen og redusere antall låser. For å jobbe med midlertidige tabeller, brukes objektet Midlertidig bordleder... En midlertidig tabell opprettes ved hjelp av POST -søkeordet etterfulgt av navnet på den midlertidige tabellen.

ManagerBT = Ny leder for TemporaryTables;
Request = Ny forespørsel;
Be om ... TemporaryTable Manager = VT Manager;

Be om ... Tekst =
"VELGE
| Valutaer. Kode,
| Valutaer.
| PLASS VTCvalutaer
| FRA
| Katalog. Valutaer AS valutaer ";

QueryResult = spørring. Henrette();

For å bruke den midlertidige tabellen VTVCurrency i andre spørsmål, er det nødvendig å tilordne disse spørsmålene en vanlig administrator for midlertidige tabeller - Manager VT.

Batchforespørsel- dette er en forespørsel som inneholder flere forespørsler atskilt med ";" - symbolet. Når en batchforespørsel utføres, blir alle spørringene som er inkludert i den utført sekvensielt, med resultatene av alle midlertidige tabeller tilgjengelig for alle påfølgende søk. Det er ikke nødvendig å eksplisitt tilordne en midlertidig tabellbehandling til batch-spørsmål. Hvis det ikke er tilordnet noen midlertidig tabellbehandling, blir alle midlertidige tabeller slettet umiddelbart etter at spørringen er utført.

For batchforespørsler er ExecuteBatch () -metoden tilgjengelig, som utfører alle forespørsler og returnerer en rekke resultater. Midlertidige tabeller i en batch-spørring vil bli representert av en tabell med en rad og en kolonne "Count", som lagrer antall poster. For å feilsøke batchforespørsler kan du bruke metoden RunPacketWith IntermediateData(): den returnerer det faktiske innholdet i de midlertidige tabellene, ikke antall poster.

// Et eksempel på å jobbe med en batchforespørsel
Request = Ny forespørsel;
Be om ... Tekst =
"VELGE
| Valutaer.
| FRA
| Katalog. Valutaer som valutaer
|;
| VELG
| Nomenklatur.
| FRA
| Katalog. Nomenklatur AS Nomenklatur ";

PackageResult = Forespørsel. RunPackage ();

TK -valutaer = PacketResult [0]. Laste ut ();
TZNomenclature = ResultPackage [1]. Unload ();

// Et eksempel på bruk av midlertidige tabeller i en batchforespørsel
Request = Ny forespørsel;
Be om ... Tekst =
"VELGE
| Products.Link AS Produkt
| PLASS VTGoods
| FRA
| Directory.Nomenclature AS Produkter
| HVOR
| Produkter. Produsent = & produsent
|;
| VELG
| VTGoods. Varer,
| PTU.Nummer,
| PTU. Pris,
| PTU.Link AS -dokument
| FRA
| VTGoods AS VTGoods
| VENSTRE BLI MEDLEM Dokument. Innkommende varer. Varer som veterinær
| PÅ VTGoods.Goods = PTU.Nomenklatur "
;

Be om ... SetParameter ( "Produsent", Produsent);

QueryResult = Spørring. Løpe ();
Prøve = Be om resultat. Velge();

Ha det Eksempel .Neste () Loop

Slutt på syklus;

Virtuelle tabeller

Virtuelle tabeller Er tabeller som ikke er lagret i databasen, men som genereres av plattformen. I kjernen er dette nestede spørsmål på en eller flere fysiske tabeller utført av rammeverket. Virtuelle tabeller mottar kun informasjon fra registre og er hovedsakelig beregnet på høyt spesialiserte oppgaver.

Følgende virtuelle tabeller eksisterer (de mulige parameterne er angitt i parentes):

  • For informasjonsregistre:
    • SliceFirst (<Период>, <Условие>) - de tidligste postene for den angitte datoen;
    • SliceLast (<Период>, <Условие>) - de siste postene for den angitte datoen;
  • For akkumuleringsregistre:
    • Rester (<Период>, <Условие>) - saldo for den angitte datoen;
    • Omsetning (<НачалоПериода>, <КонецПериода>, <Периодичность>, <Условие>) - Omsetning for perioden;
    • Saldo og omsetning (<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <Условие>) - saldo og omsetning for perioden;
  • For regnskapsregistre:
    • Rester (<Период>, <УсловиеСчета>, <Субконто>, <Условие>) - saldoer fra den angitte datoen i forbindelse med konto, målinger og underkonto;
    • Omsetning (<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчета>, <Субконто>, <Условие>, <УсловиеКорСчета>, <КорСубконто>) - omsetning for perioden i forbindelse med regnskap, målinger, kor. kontoer, subconto, cor. subconto;
    • Rester og omsetninger (<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <УсловиеСчета>, <Субконто>, <Условие>) - saldi og omsetning i sammenheng med regnskap, målinger og underkontoer;
    • OmsetningDtKt (<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчетаДт>, <СубконтоДт>, <УсловиеСчетаКт>, <СубконтоКт>, <Условие>) - omsetning for perioden i forbindelse med konto Dt, konto Kt, Subkonto Dt, Subkonto Kt;
    • MovementsSubconto (<НачалоПериода>, <КонецПериода>, <Условие>, <Порядок>, <Первые>) - bevegelser sammen med verdiene til underkontoen;
  • For beregningsregistre:
    • Utgangspunkt(<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>) - grunnleggende data i beregningsregisteret;
    • DataGraphics (<Условие>) - grafdata;
    • Faktisk gyldighetsperiode (<Условие>) - den faktiske gyldighetsperioden.

Når du arbeider med virtuelle tabeller, bør du bruke valg i parametrene til virtuelle tabeller, og ikke i WHERE-tilstanden. Spørringstidspunktet avhenger av dette.

Spørringskonstruktør

For å øke hastigheten på innspill av spørringstekster, har plattformen spesialverktøy: Spørringskonstruktør og Spørringskonstruktør med resultatbehandling... For å ringe til konstruktørene, høyreklikk og velg ønsket element:

Også konstruktører kan kalles fra hovedmenyen Tekst.

Ved å bruke spørrekonstruktøren kan programmereren konstruere spørringsteksten interaktivt. For å gjøre dette velges de nødvendige tabellene og feltene med musen, lenker, grupperinger, totaler osv. Blir opprettet. Denne tilnærmingen lar deg spare tid og bli kvitt mulige feil. Som et resultat av arbeidet, genererer spørrekonstruktøren spørringsteksten.

Konstruktøren av en spørring med behandling av resultatet, i tillegg til å generere spørringsteksten, lager et ferdiglaget fragment av kode for mottak og behandling av data.

Be om skjemaobjekt

Plattformen lar deg programmatisk opprette og redigere spørringstekst ved hjelp av et objekt Forespørselsordning... Objektet har en enkelt eiendom Be om pakke, der objektet lagrer egenskapene til alle søk som for tiden redigeres. RequestSchema -objektet støtter følgende metoder:

  • SetRequestText (< Текст>) - fyller ut RequestBacket -egenskapen basert på den overførte forespørselsteksten;
  • GetRequest tekst() - returnerer forespørselsteksten som er dannet på grunnlag av QueryBatch-egenskapen;
  • FindParameters () - Returnerer søkeparametere.

La oss se på et eksempel på arbeid med QuerySchema -objektet. For å generere forespørselsteksten programmatisk

SORTER ETTER
Valutakode

Innebygd kode kan se slik ut:

RequestSchema = Ny RequestSchema;
Pakke 1 = QuerySchema. PackageRequests [0];
Operatør 1 = Pakke1. Operatører [0];
// legg til kilde
Registrer tabell = operatør 1. Kilder. Legg til( "Katalog. Valutaer", "Valutaer");
// legg til felt
FieldRef = Operatør1. SelectableFields. Legg til ("Currency.Link", 0);
Feltkode = Operatør1. SelectableFields. Legg til ("Valutaer. Kode", 1);
// spesifisere feltaliaser
Pakke1 ... Kolonner [0]. Kallenavn = "Valuta";
Pakke1 ... Kolonner [1]. Alias ​​= "Kode";
// legg til tilstand
Operatør 1 ... Utvalg. Legg til( "IKKE slettingsmerke");
// legg til bestilling
Pakke1 ... Rekkefølge. Legg til (feltkode);
QueryText = QuerySchema. GetRequest tekst();

En forespørsel er et kraftig verktøy som tjener til raskt (i sammenligning med alle andre metoder) å motta og behandle data som finnes i forskjellige objekter i 1C -infobasen.

Lag en forespørsel

Forespørselen opprettes som et eget objekt som har et obligatorisk attributt Tekst, der selve forespørselen faktisk er plassert. I tillegg kan forskjellige parametere som er nødvendige for utførelsen, overføres til forespørselen. Etter at tekst- og spørringsparameterne er fylt ut, må spørringen utføres, og resultatet må plasseres i et utvalg eller en verditabell. Det hele ser slik ut:

// Lag en forespørsel
Forespørsel = ny forespørsel;

// Fyll ut forespørselsteksten
Be om. Tekst = "Skriv forespørselsteksten her";

// Gi parametere til forespørselen
Be om. SetParameter ("ParameterName", ParameterValue);

// Utfør forespørselen
Resultat = forespørsel. Løpe ();

// Last opp spørreresultatet til utvalget
Prøve = Resultat. Velg ();

// Dump spørringsresultatet i en verditabell
Tabell = Resultat. Laste ut ();

// Nylige aktiviteter kan kombineres
Eksempel = spørring. Henrette (). Velg ();
//eller
Tabell = spørring. Henrette (). Laste ut ();

Grunnleggende om 1C-spørringsspråket

De enkleste og mest brukte søkene brukes til å hente data fra en kilde. Kilden kan være nesten alle objekter som inneholder data: kataloger, dokumenter, registre, konstanter, oppregninger, diagrammer over karakteristiske typer, etc.

Fra disse objektene kan du ved hjelp av en spørring hente verdiene til attributter, tabelldeler, attributter for tabelldeler, endringer, ressurser, etc.

For å få forespørselsteksten er det ofte praktisk å bruke Spørringskonstruktør. Det kalles når du høyreklikker hvor som helst i en kodemodul.

For eksempel, hvis du trenger å få verdiene for alle detaljene i katalogen Entreprenører, så vil forespørselen se slik ut:

Be om. Tekst = "VELGE
| *
| FRA
| Katalog. Entreprenører "
;

Hvis du trenger å få bare individuelle detaljer, så - slik:

Be om. Tekst = "VELGE
| Kode,
| Navn,
| Foreldre
| FRA
| Katalog. Entreprenører "
;

For å få en slik forespørsel, skriv inn tekst Spørringskonstruktør du må velge de aktuelle feltene i kategorien Tabeller og felt.

Du kan tilordne aliaser til elementene og kildene som er valgt i et spørsmål og bruke dem i fremtiden både i selve spørringen og når du arbeider med resultatet. I tillegg kan forespørselen inneholde felt med en forhåndsbestemt spesifikk verdi, eller med en beregnet verdi:

Be om. Tekst = "VELGE
| Kunder.Kode AS-nummer,

| 1000 AS felt med verdi
| FRA
;

Eksempel = Forespørsel. Henrette (). Velg ();

Mens prøvetaking. Neste () Sløyfe
ClientNumber = Eksempel. Antall;
ClientName = Eksempel. Navn;
Val = Prøve. FieldWithValue;
Slutt på syklus;

Bruk fanen for å angi aliaser Fagforeninger / aliaser i Spørringskonstruktør.

Og et felt med en fast eller beregnet verdi opprettes manuelt i fanen Tabeller og felt, i en kolonne Enger.

Alle valgte varer kan bestilles enten i forover eller bakover. I dette tilfellet kan du velge ett eller flere felt for bestilling. Sammen med bestilling er det noen ganger nyttig å velge bare ett eller noen få av de første elementene.

// Sorter klienter etter navn fra A til Å, og velg de første 10
Be om. Tekst = "VELG FØRSTE 10
| Kunder.Kode AS-nummer,
| Kunder. Beskrivelse AS navn,
| 1000 AS felt med verdi
| FRA

| BESTILL AV
| Navn"
;

// Velg den siste klienten alfabetisk
Be om. Tekst = "VELG FØRST 1
| Kunder.Kode AS-nummer,
| Kunder. Beskrivelse AS navn,
| 1000 AS felt med verdi
| FRA
| Directory. Contractors AS Clients
| BESTILL AV
| Navn DESCENDED "
;

Du kan begrense utvalget av varer til de som brukeren har tilgangsrettigheter for. Eller fjern dupliserte linjer fra søkeresultatet.

// Hent dataene som er tillatt for brukeren
Be om. Tekst = "VELG TILLATT
| Kunder.Kode AS-nummer,
| Kunder. Beskrivelse AS navn,
| 1000 AS felt med verdi
| FRA
| Directory. Contractors AS Clients "
;

// Hent ikke-repeterende elementer
Be om. Tekst = "VELG DIVERSE
| Kunder.Kode AS-nummer,
| Kunder. Beskrivelse AS navn,
| 1000 AS felt med verdi
| FRA
| Directory. Contractors AS Clients "
;

Rekkefølgen er satt på fanen Rekkefølge i Spørringskonstruktør, antall valgte elementer, oppløsning og repeterbarhetsparametere - på fanen I tillegg.

Fortsettelse følger…

Spørrespråket i 1C 8 er en forenklet analog av det velkjente "strukturerte programmeringsspråket" (som det ofte kalles, SQL). Men i 1C brukes den bare til å lese data, objektdatamodellen brukes til å endre data.

En annen interessant forskjell er den russiske syntaksen. Selv om du faktisk kan bruke engelskspråklige konstruksjoner.

Be om eksempel:

VELGE
Banker.
Banker.CorrAccount
FRA
Katalog Banker AS Banker

Denne forespørselen lar oss se informasjon om navnet og korrespondentkontoen til alle bankene som finnes i databasen.

Spørrespråket er den enkleste og mest effektive måten å skaffe informasjon på. Som du kan se fra eksemplet ovenfor, må du på spørrespråket anke med navnene på metadata (dette er en liste over systemobjekter som utgjør konfigurasjonen, dvs. kataloger, dokumenter, registre osv.).

Beskrivelse av Query Language Constructs

Forespørgselsstruktur

For å få data, er det nok å bruke konstruksjonene "SELECT" (select) og "FROM" (from). Den enkleste forespørselen ser slik ut:

VELG * FRA Kataloger. Nomenklatur

Hvor "*" betyr valg av alle felt i tabellen, og Referanser.Nomenklatur er navnet på tabellen i databasen.

La oss se på et mer komplekst og generelt eksempel:

VELGE
<ИмяПоля1>HVORDAN<ПредставлениеПоля1>,
Sum(<ИмяПоля2>) HVORDAN<ПредставлениеПоля2>
FRA
<ИмяТаблицы1>HVORDAN<ПредставлениеТаблицы1>
<ТипСоединения>FORBINDELSE<ИмяТаблицы2>HVORDAN<ПредставлениеТаблицы2>
PÅ<УсловиеСоединениеТаблиц>

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

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

SORTER ETTER
<ИмяПоля1>

RESULTATER
<ИмяПоля2>

<ИмяПоля1>

I dette spørsmålet velger vi dataene fra feltene "FieldName1" og "FieldName1" fra "TableName1" og "TableName" -tabellene, tilordner synonymer til feltene ved hjelp av "AS" -operatøren, blir med dem i henhold til en viss "TableCondition" betingelse.

Fra de mottatte dataene velger vi bare data som oppfyller betingelsen fra "WHERE" "DataFeed Condition". Deretter grupperer vi spørringen etter "FieldName1" -feltet mens vi summerer "FieldName2". Vi lager totaler for "FieldName1" -feltet og det siste feltet "FieldName2"

Det siste trinnet er å sortere forespørselen ved hjelp av ORDER BY-konstruksjonen.

Generelle konstruksjoner

La oss se på de generelle konstruksjonene til spørrespråket 1C 8.2.

FØRSTn

Ved å bruke denne operatøren kan du få n antall første poster. Rekkefølgen på oppføringene bestemmes av bestillingen i forespørselen.

VELG FØRSTE 100
Banker.
Banker Kode AS BIC
FRA
Katalog Banker AS Banker
SORTER ETTER
Banker.

Forespørselen vil motta de første 100 oppføringene i "Banks" -katalogen, sortert alfabetisk.

TILLATT

Denne designen er relevant for arbeid med en mekanisme. Essensen av mekanismen er å begrense lesing (og andre handlinger) til brukere for spesifikke poster i databasetabellen, og ikke tabellen som helhet.

Hvis en bruker prøver å lese poster som er utilgjengelige for ham med en forespørsel, vil han motta en feilmelding. For å unngå dette, bør du bruke "TILLATT" -konstruksjonen, det vil si at forespørselen bare leser postene som er tillatt for den.

VELG TILLATT
Tilleggsinformasjon Store.Link
FRA
Referanse Ekstra informasjon Lagring

DIVERSE

Ved å bruke "DIFFERENT" kan du ekskludere duplikatstrenger fra å angi 1C-søkeresultatet. Duplisering betyr at alle feltene i forespørselen stemmer overens.

VELG FØRSTE 100
Banker.
Banker Kode AS BIC
FRA
Katalog Banker AS Banker

EmptyTable

Denne konstruksjonen brukes veldig sjelden til å kombinere forespørsler. Når du blir med, kan det være nødvendig å angi et tomt nestet bord i et av bordene. Operatøren "EmptyTable" er bare egnet for dette.

Eksempel fra hjelp 1C 8:

VELG Referanse Nummer, TOM TABELL. (Nom, Tov, Antall) AS Sammensetning
FRA Dokument. Utgifter
KOMBINER ALLE
VELG Reference.Number, Composition. (LineNumber, Item, Quantity)
FRA Document.Invoice Document.Invoice.Content. *

ER NULL

En veldig nyttig funksjon som unngår mange feil. YesNULL () lar deg erstatte NULL-verdien med ønsket verdi. Det brukes veldig ofte i tester for tilstedeværelse av en verdi i sammenføyde tabeller, for eksempel:

VELGE
Nomenklatur Ref. Ref.
Det er NULL (Item Balance.Quantity Balance, 0) AS Quantity Balance
FRA


Du kan bruke den på en annen måte. For eksempel, hvis det for hver rad ikke er kjent i hvilken tabell verdien finnes:

ER NULL (InvoiceReceived.Date, InvoiceEdited.Date)

AS er en operatør som lar oss tilordne et navn (synonym) til en tabell eller et felt. Vi så et eksempel på bruk ovenfor.

Disse konstruksjonene er veldig like - de lar deg få en strengrepresentasjon av ønsket verdi. Den eneste forskjellen er at REPRESENTATION konverterer alle verdier til en strengtype, og REFERENCE REPRESENTATION konverterer bare referanseverdier. REFERANSERESPRESENTASJON anbefales å brukes i spørsmål til datasammensetningssystemet for optimalisering, med mindre selvfølgelig referansedatafeltet er planlagt brukt i filtrene.

VELGE
Se (lenke), // linje, for eksempel "Forhåndsrapport nr. 123 datert 10/10/2015
Representasjon (Slettingsmerke) AS Slettingsmerke Tekst, // streng, "Ja" eller "Nei"
Refererende visning (slettingsmerke) AS slettingsmerke boolsk // boolsk, sann eller usann
FRA
Document.Advance Report

UTTRYKKE

Express lar deg konvertere feltverdier til ønsket datatype. Du kan konvertere en verdi til enten en primitiv type eller en referansetype.

Express for referansetype brukes til å begrense de forespurte datatypene i felt av en kompleks type, ofte brukt for å optimalisere systemytelsen. Eksempel:

EXPRESS (Cost.Subconto1 Table AS A Reference.Cost Articles) .Aktivitetstype For regnskap for skattekostnader

For primitive typer brukes denne funksjonen ofte til å begrense antall tegn i felt med ubegrenset lengde (slike felt kan ikke sammenlignes med). For å unngå feilen “ Ugyldige parametere i sammenligningsoperasjonen. Kan ikke sammenligne felt
ubegrenset lengde og felt av inkompatible typer
", Det er nødvendig å uttrykke slike felt som følger:

EXPRESS (Kommentar AS linje (150))

FORSKJELL

Få gratis 267 1C videoopplæringsprogrammer:

Et eksempel på bruk av IS NULL i en 1C -forespørsel:

VELGE FRA
Spr
VENSTRE BLI MED Akkumuleringsregister.Produkter I lagre.VENSTRE AS Gjenstående varer
ProgramvarenomenklaturRef.Ref = ImplementedCommentsComponentsRemains.Nomenclature
HVOR ER VARENES BALANSER. Mengde Balansen ER NULL

Datatypen i et spørsmål kan defineres som følger: ved hjelp av funksjonene TYPE () og TYPE (), eller ved hjelp av den logiske operatoren REFERANSE. De to funksjonene er like.

Forhåndsdefinerte verdier

I tillegg til å bruke de passerte parametrene i forespørsler på 1C-spørringsspråket, kan du bruke forhåndsdefinerte verdier eller. For eksempel oppregninger, forhåndsdefinerte kataloger, kontoplaner osv. For dette brukes konstruksjonen "Value ()".

Brukseksempel:

HVOR Nomenclature.NomenclatureType = Verdi (Directory.NomenclatureTypes.Product)

HVOR Motparter.Type kontaktinformasjon = Verdi (oppregning. Typer kontaktinformasjon. Telefon)

HVOR Kontosaldoer.Konto = Verdi (Kontoplan. Selvbærende. Profittab)

Tilkoblinger

Det er 4 typer tilkoblinger: VENSTRE, IKKE SANT, HELT, INTERNT.

VENSTRE og HØYRE BLI MED

Joins brukes til å koble to tabeller i henhold til en bestemt tilstand. Funksjon kl VENSTRE FELLES ved at vi tar den første angitte tabellen i sin helhet og binder den andre tabellen etter betingelse. Feltene i den andre tabellen som ikke kunne være bundet av tilstand, er fylt med verdien NULL.

For eksempel:

Den vil returnere hele tabellen over motparter og fylle ut "Bank" -feltet bare på de stedene der vilkåret "Motparter. Hvis vilkåret ikke er oppfylt, vil Bank-feltet settes NULL.

HØYRE JOINT på 1C -språk absolutt det samme VENSTRE tilkobling, med unntak av en forskjell - i RETT TILKOBLING"Hoved" -tabellen er den andre, ikke den første.

FULLT TILKOBLING

FULLT TILKOBLING skiller seg fra venstre og høyre ved at den viser alle poster fra to tabeller, kobler seg bare til de som den kan bli med etter betingelse.

For eksempel:

FRA

FULLT TILKOBLING
Katalog Banker AS Banker


Spørrespråket returnerer begge tabellene i sin helhet bare hvis betingelsen for å bli med poster er oppfylt. I motsetning til venstre / høyre sammenføyning er det mulig for NULL å vises i to felt.

INTERN TILKOBLING

INTERN TILKOBLING skiller seg fra den komplette ved at den bare viser postene som kan kobles til av den angitte tilstanden.

For eksempel:

FRA
Directory. Contractors AS Clients

INTERN TILKOBLING
Katalog Banker AS Banker


Clients.Name = Banks.Name

Denne forespørselen returnerer bare linjer der banken og motparten har samme navn.

Foreninger

COMBINE og COMBINE ALL -konstruksjonen kombinerer to resultater til ett. De. resultatet av å utføre to vil bli "slått sammen" til ett, vanlig.

Det vil si at systemet fungerer på samme måte som vanlig, bare for et midlertidig bord.

Hvordan bruke INDEX SOFTWARE

Imidlertid er det ett poeng å vurdere. Det tar også tid å fullføre å bygge en indeks på et midlertidig bord. Derfor anbefales det å bruke konstruksjonen bare "" hvis det er kjent med sikkerhet at det ikke vil være 1-2 poster i den midlertidige tabellen. Ellers kan effekten være motsatt - ytelsen fra indekserte felt kompenserer ikke for indeksbyggingstiden.

VELGE
ValutakurserSliceLast.Currency AS Currency,
ValutakurserSliceLast.Course
POST valutakurser
FRA
Informasjonsregister. Valutakurser.SliceLast (& Period,) AS ValutakurserSliceLast
INDEKS AV
Valuta
;
VELGE
Priser
PriserNomenklaturer. Pris,
PriserNomenklatur. Valuta,
Valutakurser.
FRA
Informasjonsregister. Nomenklatur Priser. Slice Siste (& periode,
Nomenklatur B (& Nomenclature) OG PriceType = & PriceType) AS Priser
VENSTRE UNION Valutakurser AS Valutakurser
ON RatesNomenclature.Currency = RatesCurrency.Currency

Gruppering

1C -spørrespråket lar deg bruke spesielle aggregerte funksjoner når du grupperer spørringsresultater. Gruppering kan også brukes uten samlede funksjoner for å "eliminere" duplikater.

Følgende funksjoner er tilgjengelige:

Beløp, Antall, Antall forskjellige, Maksimum, Minimum, Gjennomsnitt.

Eksempel 1:

VELGE
Salg av varer, tjenester, varer, nomenklatur,
BELOPP (salg av varer, tjenester, varer. Mengde) som mengde,
BELØP (Salg av varerServicesGoods.Amount) AS beløp
FRA

LAST AV
Realization of GoodsServicesGoods.Nomenclature

Forespørselen mottar alle linjene med varer og oppsummerer dem etter mengde og beløp i sammenheng med varen.

Eksempel nr. 2

VELGE
Banker. Kode,
ANTALL (ULIKE Banks.Link) SOM Antall Dobler
FRA
Katalog Banker AS Banker
LAST AV
Bankkode

Dette eksemplet viser en liste over BIC-er i "Banks" -katalogen og viser hvor mange duplikater som finnes for hver av dem.

Utfall

Totaler er en måte å hente data fra et hierarkisk system. For sammendragsfelt kan samlede funksjoner brukes, som for grupperinger.

En av de mest populære måtene å bruke totaler i praksis er batch-avskrivninger av varer.

VELGE




FRA
Document.Realization ofGoodsServices.Goods AS Salg avGoodsServicesGoods
SORTER ETTER

RESULTATER
SUM (antall),
SUM (beløp)

Nomenklatur

Resultatet av spørringen blir følgende hierarkisk:

Generelt sammendrag

Hvis du vil få totaler for alle "totaler", bruker du "GENERELT" -operatoren.

VELGE
Realisering av varerServicesGood.Nomenclature AS Nomenclature,
Realisering av varerServicesGoods.Link AS -dokument,
Realisering av varer, tjenester, varer. Mengde AS Mengde,
Salg av varerServicesGoods.Mount AS beløp
FRA
Document.Realization ofGoodsServices.Goods AS Salg avGoodsServicesGoods
SORTER ETTER
Implementering av GoodsServicesGoods.Link.Date
RESULTATER
SUM (antall),
SUM (beløp)

GENERELL,
Nomenklatur

Som et resultat av spørringen, får vi følgende resultat:

Der det første nivået for gruppering er sammenleggelsen av alle de nødvendige feltene.

Bestilling

ORDER BY -operatøren brukes til å sortere spørringsresultatet.

Sortering etter primitive typer (streng, nummer, boolsk) følger de vanlige reglene. For felt med referansetyper skjer sorteringen etter koblingens interne representasjon (unik identifikator), ikke etter kode eller lenkerepresentasjon.

VELGE

FRA
Referanse.Nomenklatur AS Nomenklatur
SORTER ETTER
Navn

Spørringen vil vise en liste over navnene på nomenklaturens referansebok, sortert alfabetisk.

Automatisk bestilling

Resultatet av en spørring uten sortering er et kaotisk presentert sett med rader. Utviklerne av 1C-plattformen garanterer ikke produksjonen av strenger i samme rekkefølge når de utfører de samme spørsmålene.

Hvis du trenger å vise tabelloppføringer i en konsekvent rekkefølge, må du bruke "Autoorder" -konstruksjonen.

VELGE
Nomenklatur Navn AS Navn
FRA
Referanse.Nomenklatur AS Nomenklatur
AUTO BESTILLING

Virtuelle tabeller

Virtuelle tabeller i 1C er en unik funksjon ved 1C -spørrespråket, som ikke finnes i andre lignende syntakser. Den virtuelle tabellen er en rask måte å få profilinformasjon fra registre.

Hver av registertypene har sitt eget sett med virtuelle tabeller, som kan variere avhengig av registerinnstillingene.

  • bit av den første;
  • et kutt av sistnevnte.
  • rester;
  • revolusjoner;
  • balanser og omsetning.
  • bevegelser fra underkontoen;
  • revolusjoner;
  • RPM Dt Kt;
  • rester;
  • saldi og omsetning
  • subconto.
  • utgangspunkt;
  • graf data;
  • den faktiske gyldighetsperioden.

For en løsningsutvikler blir data hentet fra en (virtuell) tabell, men faktisk tar 1C -plattformen fra mange tabeller, og transformerer dem til ønsket form.

VELGE
Produkter På lager Balanser og omsetning. Nomenklatur,
Produkter I varehusBalanser og omsetning.MengdeBegynnelsessaldo,
Varer I LagerBalanser og Omsetninger.Antall Omsetning,
Varer i lagre Balanser og inntekter. Mengde Innkommende,
Varer I LagerBalanser og Omsetninger.MengdeForbruk,
Produkter I varehusBalanser og omsetninger.MengdeFinaldsaldo
FRA
Akkumuleringsregister.Gods i varehus.Balanser og omsetninger SOM varer i lagerBalanser og omsetninger

En slik spørring lar deg raskt få en stor mengde data.

Virtuelle tabellparametere

Et veldig viktig aspekt ved å jobbe med virtuelle tabeller er bruk av parametere. Virtuelle tabellparametere - spesialiserte parametere for valg og innstilling.

For slike tabeller anses det å være feil å bruke valg i "WHERE" -konstruksjonen. I tillegg til at forespørselen ikke blir optimal, er det mulig å motta feil data.

Et eksempel på bruk av slike parametere:

Akkumuleringsregister.Produkter i lagre. Forblir og omsetninger (& begynnelseperiode, og sluttperiode, måned, bevegelser og periodegrenser, nomenklatur = & ønsket nomenklatur)

Algoritme av virtuelle tabeller

For eksempel lagrer den mest brukte virtuelle tabellen av typen "Remains" data fra to fysiske tabeller - balanser og bevegelser.

Når du bruker et virtuelt bord, utfører systemet følgende manipulasjoner:

  1. Vi får den beregnede verdien nærmest når det gjelder dato og dimensjoner i totaltabellen.
  2. "Legg til" beløpet fra bevegelsestabellen til mengden fra tabellen med totaler.


Slike enkle handlinger kan forbedre ytelsen til systemet som helhet.

Ved hjelp av Query Builder

Spørringskonstruktør- et verktøy innebygd i 1C enterprise system, som i stor grad letter utviklingen av spørsmål til databasen.

Spørrekonstruktøren har et ganske enkelt, intuitivt grensesnitt. La oss imidlertid se nærmere på bruk av spørrekonstruktøren.

Søketekstkonstruktøren startes av hurtigmenyen (med høyre museknapp) på rett sted i programkoden.

Beskrivelse av 1C-spørrekonstruktøren

La oss se nærmere på hver designfane. Unntaket er kategorien Byggmester, som er et tema for en annen diskusjon.

Tabulatortabeller og felt

Denne fanen angir datakilden og feltene du vil vise i rapporten. Faktisk VELGER konstruksjonene .. FRA.

Kilden kan være en fysisk databasetabell, virtuelt registertabell, midlertidige tabeller, nestede forespørsler, etc.

I hurtigmenyen for virtuelle tabeller kan du angi parametrene til den virtuelle tabellen:

Fanen Koblinger

Fanen brukes til å beskrive sammenhenger av flere tabeller, lager konstruksjoner med ordet FORBINDELSE.

Grupperingsfane

På denne kategorien lar systemet deg gruppere og oppsummere de nødvendige feltene i tabellresultatet. Beskriver bruken av konstruksjonene GROUP BY, SUM, MINIMUM, GJENNOMSNITT, MAKSIMAL, KVANTITET, ANTALL ANNEN.

Fanen Betingelser

Ansvarlig for alt som står i forespørselsteksten etter WHERE -konstruksjonen, det vil si for alle betingelsene som er pålagt de mottatte dataene.

Avansert-fanen

Tab I tillegg er full av alle slags parametere som er veldig viktige. La oss vurdere hver av egenskapene.

Gruppering Henter poster:

  • Første n- en parameter som bare returnerer N-poster til spørringen (operator FIRST)
  • Ingen repeterende- sikrer unikheten til de mottatte postene (operatør DIFFERENT)
  • Tillatt- lar deg velge bare de postene som systemet lar deg velge med tanke på (konstruksjon tillatt)

Gruppering Forespørselstype bestemmer hvilken type søk: å hente data, opprette en midlertidig tabell eller ødelegge en midlertidig tabell.

Under er det et flagg Blokker mottatt data for senere endring... Det lar deg aktivere muligheten til å angi en datalås, som sikrer datasikkerheten fra det øyeblikket den leses til den endres (bare relevant for automatisk modus for låser, strukturen FOR ENDRING).

Fagforeninger / aliaser

På denne fanen til spørringsdesigneren kan du angi muligheten til å kombinere forskjellige tabeller og aliaser (HVORDAN konstruksjon). Tabeller er angitt til venstre. Hvis du setter flaggene foran bordet, vil UNION -konstruksjonen bli brukt, ellers - UNION ALL (forskjellene mellom de to metodene). Høyre side indikerer korrespondansen av felt i forskjellige tabeller. Hvis ingen samsvar er spesifisert, vil spørringen returnere NULL.

Bestill-fanen

Her angir du sorteringsrekkefølgen for verdier (ORDER BY) - synkende (DESCENT) eller stigende (RETURN).

Det er også et interessant flagg - Automatisk bestilling(i forespørselen - AUTOBESTILLING). Som standard viser 1C-systemet data i en ”kaotisk” rekkefølge. Hvis du angir denne avkrysningsboksen, vil systemet sortere dataene etter interne data.

Fanen Spørringspakke

I fanen til spørringsdesigneren kan du opprette nye, og også bruke den som en navigasjon. I forespørselsteksten skilles pakker med ";" (komma -periode).

Spørringsknapp i Query Builder

I nedre venstre hjørne av spørrekonstruktøren er det en spørringsknapp, som du når som helst kan se spørringsteksten med:

I dette vinduet kan du gjøre justeringer i forespørselen og utføre den.


Bruke spørringskonsollen

Spørrekonsollen er en enkel og praktisk måte å feilsøke komplekse spørsmål og få informasjon raskt. I denne artikkelen vil jeg prøve å beskrive hvordan du bruker spørringskonsollen og gi en lenke for å laste ned spørringskonsollen.

La oss se nærmere på dette verktøyet.

Last ned 1C Query Console

Først av alt, for å komme i gang med Query Console, må du laste den ned fra et sted. Prosesser er vanligvis delt inn i to typer - kontrollerte former og vanlige (eller noen ganger kalles de 8.1 og 8.2 / 8.3).

Jeg prøvde å kombinere disse to visningene i en behandling - i den nødvendige driftsmåten åpnes det nødvendige skjemaet (i kontrollert modus fungerer konsollen bare i tykk modus).

Beskrivelse av 1C-spørrekonsollen

La oss begynne å se på spørrekonsollen med en beskrivelse av hovedbehandlingspanelet:

I toppteksten til spørringskonsollen kan du se utførelsestiden for den siste spørringen med millisekund presisjon, dette lar deg sammenligne forskjellige konstruksjoner når det gjelder ytelse.

Den første gruppen av knapper i kommandolinjen er ansvarlig for å lagre gjeldende forespørsler i en ekstern fil. Dette er veldig praktisk, du kan alltid gå tilbake til å skrive et komplekst spørsmål. Eller hold for eksempel en liste over typiske eksempler på visse konstruksjoner.

Til venstre, i Query-feltet, kan du opprette nye spørsmål og lagre dem i en trestruktur. Den andre gruppen av knapper er bare ansvarlig for å administrere listen over forespørsler. Med den kan du opprette, kopiere, slette, flytte en forespørsel.

  • Henrettebe om- enkel utførelse og få resultatet
  • Kjør pakke- lar deg se alle mellomforespørsler i forespørselsbatchen
  • Viser midlertidige tabeller- lar deg se resultatene som returneres av midlertidige spørringer i tabellen

Be om parametere:

Lar deg stille inn gjeldende parametere for forespørselen.

I spørringsparametervinduet er følgende interessant:

  • Knapp Få fra forespørsel finner automatisk alle parametrene i forespørselen av hensyn til utvikleren.
  • Flagg Uniforme parametere for alle forespørsler- når den er installert, fjerner behandlingen ikke parametrene ved bytte fra forespørsel til forespørsel i den generelle listen over forespørsler.

Angi parameter som en liste over verdier det er veldig enkelt, når du velger en parameterverdi, trykker du på knappen for å tømme verdien (kryss), systemet vil tilby å velge en datatype, der du trenger å velge "Liste over verdier":

Også i toppanelet er det en knapp for å ringe innstillingene for søkekonsollen:

Her kan du angi alternativer for automatisk lagring av søk og alternativer for å utføre en spørring.

Spørringsteksten angis i konsoll -spørringsfeltet. Dette kan gjøres med en enkel spørretestpakke eller ved å ringe et spesialverktøy - spørrekonstruktøren.

1C 8 -spørrekonstruktøren kalles fra hurtigmenyen (høyre museknapp) når du klikker på inndatafeltet:

Også i denne menyen er det slike nyttige funksjoner som å fjerne eller legge til linjeskifttegn ("|") i forespørselen, eller å få forespørselskoden i en så praktisk form:

Request = Ny forespørsel;
Request.Text = "
| VELG
| Valutaer. Lenke
| FRA
| Katalog. Valutaer AS valutaer ”;
QueryResult = Query.Run ();

I det nedre feltet i spørrekonsollen vises søkeresultatfeltet, som denne behandlingen ble opprettet for:



I tillegg kan spørrekonsollen i tillegg til listen vise data i form av et tre - for søk som inneholder totaler.

Optimalisering av forespørsler

Et av de viktigste punktene i å øke produktiviteten til 1C Enterprise 8.3 er optimaliseringforespørsler... Dette punktet er også veldig viktig når bestått sertifisering... Nedenfor vil vi snakke om typiske årsaker til suboptimalt arbeid med spørsmål og metoder for optimalisering.

Valg i den virtuelle tabellen ved hjelp av WHERE-konstruksjonen

Det er nødvendig å bruke filtre på detaljene i den virtuelle tabellen bare gjennom BT-parametrene. I intet tilfelle skal du bruke WHERE-konstruksjonen for valg i en virtuell tabell, dette er en grov feil fra et optimaliseringsperspektiv. I tilfelle av valg med WHERE, vil systemet faktisk motta ALLE poster og først da vil de velge de nødvendige.

IKKE SANT:

VELGE

FRA
Akkumuleringsregister. Gjensidige oppgjør Med deponenterOrganisasjoner.Rester (
,
Organisasjon = & Organisasjon
Og individ = og individuelt) HVORDAN gjensidig bosetning med deponenter organisasjoner

IKKE RIKTIG:

VELGE
Gjensidig oppgjørMedDeponenterOrganisasjonerBalanser.AmountBalance
FRA
Akkumuleringsregister. Gjensidige bosetningerMed DeponentsOrganisasjoner.Balanser (,) AS Gjensidig oppgjørMedDeponentsOrganisasjonerBalanser
HVOR
SettlementsWith DeponentsOrganizationsBalances.Organization = & Organization
Og gjensidige bosetninger Med DeponentsOrganizationsBalances.Personal = & Individual

Få verdien av et komplekst type felt gjennom en prikk

Når du mottar data av en sammensatt type i et spørsmål gjennom en prikk, blir systemet sammen med en venstre sammenføyning nøyaktig så mange tabeller som det er typer mulig i feltet av den sammensatte typen.

For eksempel er det svært uønsket for optimalisering å referere til registerpostfeltet - registratoren. Registratoren har en sammensatt datatype, inkludert alle mulige typer dokumenter som kan skrive data til registeret.

IKKE RIKTIG:

VELGE
Record Set.Recorder.Date,
Sett med poster. Antall
FRA
Akkumuleringsregister.ProdukterOrganisasjoner AS SetRecords

Det vil si at en slik forespørsel ikke vil referere til en tabell, men til 22 databasetabeller (dette registeret har 21 typer registratorer).

IKKE SANT:

VELGE
VALG
NÅR GoodsOrg.Registrar LINK Document.Realization of GoodsServices
DERE UTTRYKK (GoodsOrg.Registrar AS Document.Realization of Goods Services) .Dato
NÅR GoodsOrg.Registrar LINK Document.Arrivly of GoodsServices
SÅ UTTRYKK (GoodsOrg.Registrar AS -dokument. Ankomst av varerTjenester) .Dato
SLUTT SOM Dato,
ProdukterOrg.antall
FRA
Akkumuleringsregister.ProdukterOrg

Eller det andre alternativet er å legge til slik informasjon i rekvisittene, for eksempel, i vårt tilfelle, legg til datoen.

IKKE SANT:

VELGE
Produkter Organisasjoner. Dato,
ProdukterOrganisasjoner.Nummer
FRA
Akkumuleringsregister. Varer fra organisasjoner AS Varer fra organisasjoner

Underforespørsler i sammenføyningstilstand

For optimalisering er det uakseptabelt å bruke delspørsmål i tilknytningsforhold, dette reduserer spørringen betydelig. Det er lurt å bruke VT i slike tilfeller. For å koble til, må du bare bruke metadata og BT-objekter, etter å ha indeksert dem tidligere av tilkoblingsfeltene.

IKKE RIKTIG:

VELG…

VENSTRE FELLES (
VELG FRA INFORMASJONSREGISTER. Grenser
HVOR …
LAST AV ...
) PÅ ...

IKKE SANT:

VELG…
POST-grenser
FRA informasjonsregisteret. Begrensninger
HVOR …
LAST AV ...
INDEKS AV…;

VELG…
FRA Document.Realization of Goods Services
VENSTRE JOIN Grenser
PÅ…;

Koble sammen poster med virtuelle tabeller

Det er situasjoner der systemet ikke fungerer optimalt når det blir et virtuelt bord med andre. I dette tilfellet kan du prøve å sette den virtuelle tabellen i den midlertidige tabellen for å optimalisere spørreytelsen. Husk å indeksere de sammenføyde feltene i den midlertidige tabellforespørselen. Dette skyldes at BT ofte er inneholdt i flere fysiske tabeller i DBMS, som et resultat blir det laget en underspørsel for å velge dem, og problemet ligner det forrige punktet.

Bruke filtre på ikke-indekserte felt

En av de vanligste feilene når du skriver spørsmål er å bruke forhold på ikke-indekserte felt, dette motsier regler for søkoptimalisering. DBMS kan ikke utføre et søk optimalt hvis spørringen overlapper ikke-indekserte felt. Hvis det tas en midlertidig tabell, er det også nødvendig å indeksere koblingsfeltene.

Det må være en passende indeks for hver tilstand. En indeks som oppfyller følgende krav er egnet:

  1. Indeksen inneholder alle feltene som er oppført i tilstanden.
  2. Disse feltene er helt i begynnelsen av indeksen.
  3. Disse valgene er på rad, det vil si at verdier som ikke er involvert i spørretilstanden ikke "klemmes" mellom dem.

Hvis DBMS ikke finner de riktige indeksene, vil hele tabellen bli skannet - dette vil ha en veldig negativ innvirkning på ytelsen og kan føre til langvarig blokkering av hele settet med poster.

Bruke logisk ELLER under forhold

Det er alt, denne artikkelen dekket det grunnleggende om spørringsoptimaliseringsaspekter som hver 1C -ekspert burde vite.

Et veldig nyttig gratis videokurs om utvikling av spørsmål og optimalisering, anbefaler sterkt for nybegynnere og ikke bare!

I denne artikkelen vil vi diskutere alt med deg 1c spørsmålsspråkfunksjoner, i tillegg til konstruksjon av spørrespråk... Hva er forskjellen mellom en funksjon og en konstruksjon? Funksjonen kalles med parenteser og mulige parametere i dem, og konstruksjonen er skrevet uten parentes. Utvilsomt alle konstruksjoner og funksjoner i 1c-spørringsspråket gjøre datainnsamlingsprosessen fleksibel og multifunksjonell. Disse funksjonene og konstruksjonene gjelder for søkefelt, og noen gjelder også under forhold.

1c spørsmålsspråkfunksjoner

Siden den klare beskrivelsen 1c spørsmålsspråkfunksjoner er mye mindre vanlig enn beskrivelsen av strukturer, bestemte vi oss for å begynne å se på nøyaktig funksjonene. La oss nå se på hver enkelt for seg, beskrive dens formål, syntaks og eksempel på bruk, så:

1. Funksjon DATO TID- denne funksjonen skaper et konstant felt med typen "Date".

Syntaks: DATO TID(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Brukseksempel:

2. DIFFERENCE-funksjon- returnerer differansen mellom to datoer i en av dimensjonene (år, måned, dag, time, minutt, sekund). Målingen blir bestått i en parameter.

Syntaks: FORSKJELL (<Дата1>, <Дата2>, <Тип>)

Brukseksempel:

Query.Text = "SELECT | DIFFERENCE (DATE TIME (2015, 4, 17), DATE TIME (2015, 2, 1), DAY) | AS Number of Days";

3. VALUE -funksjon- angir et konstant felt med en forhåndsdefinert post fra databasen, du kan også få en tom lenke av hvilken som helst type.

Syntaks: VALUE (<Имя>)

Brukseksempel:

Request.Text = "VELG // forhåndsdefinert element | VALUE (Directory.Currency.Dollar) AS Dollar, // tom lenke | VALUE (Document.Incoming GoodsService.EmptyLink) AS Inngående, // enumerert verdi | VALUE (Enumeration.Legal person . Individuell) AS Individuell, // forhåndsdefinert konto | VERDI (Kontoplan. Selvbærende. Materialer) AS Konto_10 ";

4. VELG-funksjon- før oss er en analog av IF-konstruksjonen som brukes i koden, brukes bare denne i 1C-forespørsler.

Syntaks: VALG NÅR<Выражение>DERETTER<Выражение>ELLERS<Выражение>SLUTTEN

Brukseksempel:

Request.Text = // hvis beløpet er mer enn 7500, bør det være en rabatt på 300 rubler, // så hvis tilstanden utløses, returnerer funksjonen // beløpet - 300 // ellers vil forespørselen bare returner summen "VELG | VELG | NÅR TCH Kvitteringer. Beløp> 7500 | SÅ PM kvitteringer. Beløp - 300 | ELSE PM kvitteringer. beløp | END AS beløp diskontert | FRA | Dokument. mottak av varerServices.Goods AS PM kvitteringer";

5. EXPRESS-funksjon- lar deg uttrykke et konstant felt med en bestemt type.

Syntaks: EXPRESS (FieldName AS Type Type)

Brukseksempel:

Query.Text = "VELG VERSKILLT | Salg.Registrar.Nummer, | VELG | NÅR Salg.Registrar LINK Dokument. Faktura | DAN UTTRYKT (Salg.Registrar AS Dokument.Kostnad) | ELSER VALG | NÅR Salg.Registrator KOBLER. DAN UTTRYKK ( Sales.Registrator AS Document.Realization) | END | ... | END AS Number | FRA | Akkumuleringsregister.Kjøp AS-kjøp ";

Det er også en variant av å bruke EXPRESS-funksjonen i felt av blandede typer, hvor finnes de? Det enkleste eksemplet er "Registrar" for ethvert register. Så hvorfor trenger vi å spesifisere typen i registraren? La oss vurdere situasjonen når vi velger "Nummer" -feltet fra registratoren, fra hvilken tabell vil nummeret bli valgt? Riktig svar av alle! Derfor, for at spørringen vår skal fungere raskt, bør du spesifisere en eksplisitt type ved hjelp av EXPRESS -funksjonen

Brukseksempel:

Query.Text = "SELECT | EXPRESS (Nomenclature.Comment AS Line (300)) AS Comment, | EXPRESS (Nomenclature.Sum AS Number (15,2)) AS Sum | FRA | Directory.Nomenclature AS Nomenclature";

6. ISNULL-funksjon(alternativ stavemåte ER NULL) - hvis feltet er av typen NULL, erstattes det med funksjonens andre parameter.

Syntaks: ISNULL (<Поле>, <ПодставляемоеЗначение>)

Brukseksempel:

Vær også oppmerksom på at det er tilrådelig å ALLTID erstatte NULL -typen med en viss verdi, siden sammenligning med type NULL evalueres alltid til FALSE, selv om du sammenligner NULL med NULL. Oftest dannes NULL -verdier som et resultat av sammenføyningstabeller (alle typer sammenføyninger bortsett fra interne).

Request.Text = // Velg hele elementet og saldoen på det // hvis det ikke er noen saldo i et element, vil det være et felt // NULL som vil bli erstattet av verdien 0 "SELECT | Referanse. Balanse | FRA | Directory.Nomenclature AS Nomenclature | LEFT JOIN Akkumuleringsregister. Produkter i lager. Forblir AS-produkter I lager

7. PRESENTASJON -funksjon- tillater å få en representasjon av forespørselfeltet.

Syntaks: OPPTREDEN(<НаименованиеПоля>)

Brukseksempel:

Request.Text = "SELECT | REPRESENTATION (Free Balances. Balances. Nomenclature) AS Nomenclature, | PRESENTATION (Free Balances. Balances. Warehouse) AS Warehouse, | Free Balances.

Konstruksjoner på 1c -spørrespråket

Ovenfor har vi vurdert med deg 1c spørsmålsspråkfunksjoner, nå er det på tide å vurdere konstruksjoner på 1c-spørringsspråket, de er ikke mindre viktige og nyttige, la oss komme i gang.

1. Byggreferanse- er en logisk operatør for å sjekke en referansetype. Ofte oppstått ved kontroll av et komplekst type felt for en bestemt type. Syntaks: LINK<Имя таблицы>

Brukseksempel:

Request.Text = // hvis verditypen til registraren er et dokument som mottar, // så vil forespørselen returnere "Varemottak", ellers "Salg av varer" "VELG | VELG | NÅR Saldoer. Registrar LINK Dokument. Varemottak av tjenester | SÅ "" Ankomst "" | ELSE "" Forbruk "" | SLUTT Slags bevegelse | FRA | Akkumuleringsregister.Godsbalanser i lager AS Balanser ";

2. Konstruksjon MELLOM- denne operatøren sjekker om verdien er innenfor det angitte området.

Syntaks: MELLOM<Выражение>OG<Выражение>

Brukseksempel:

Request.Text = // få all nomenklaturen hvis kode ligger i området fra 1 til 100 "SELECT | Nomenclature.Ref | FRA | Directory.Nomenclature AS Nomenclature | WHERE | Nomenclature.Code MELLOM 1 OG 100";

3. Konstruksjon B og B HIERARCHY- sjekk om verdien er i den overførte listen (matriser, verditabeller osv. kan sendes som en liste). Operatøren IN HIERARCHY lar deg se hierarkiet (eksempel på bruk av kontoplanen).

Syntaks: I(<СписокЗначений>), I HIERARKIEN (<СписокЗначений>)

Brukseksempel:

Request.Text = // velg alle underkontoer på kontoen "VELG | Selvstøttende.Link AS-konto | FRA | Kontoplan. Selvbærende AS Selvbærende | HVOR | Selvbærende. Referanse I HIERARCHY VERDI (Plan for kontoer. Selvbærende. varer) ";

4. Bygg som- denne funksjonen lar oss sammenligne en streng mot et strengmønster.

Syntaks: SOM "<ТекстШаблона>"

Alternativer for strengmønster:

% er en sekvens som inneholder et vilkårlig antall vilkårlige tegn.

En vilkårlig karakter.

[...] - et enkelt tegn, eller en sekvens av tegn som er oppført i parentes. Områder kan spesifiseres i oppregningen, for eksempel a-z, som betyr et vilkårlig tegn som er inkludert i området, inkludert endene på området.

[^ ...] - et enkelt tegn, eller en sekvens av tegn som er oppført i hakeparenteser, unntatt de som er oppført etter negasjonstegnet.

Brukseksempel:

Request.Text = // finn all nomenklaturen som inneholder roten TABUR og begynner // enten med en liten eller stor bokstav t "SELECT | Nomenclature.Ref | FROM | Directory.Nomenclature AS Nomenclature | WHERE | Products. Name LIKE" " [TT] abur% "" ";

5. Design TILLATT- denne operatøren lar deg bare velge postene fra databasen som den som ringer har rett til å lese. Disse rettighetene er konfigurert på postnivå (RLS).

Syntaks: TILLATT skrives etter søkeordet SELECT

Brukseksempel:

Request.Text = "VELG TILLATT | Contractors.Link | FRA | Directory.Contractors AS Contractors";

6. Konstruksjon FORSKELLIG- lar deg velge poster der det ikke er gjentatte poster.

Syntaks: DIFFERENT skrives etter søkeordet SELECT

Brukseksempel:

Request.Text = // velger poster som leseren har rettigheter til "VELG FORSKJELLIG | Contractors.Name | FRA | Directory.Contractors AS Contractors";

Konstruksjon VARIOUS kan også brukes med den TILLATTE operatøren og andre operatører.

Brukseksempel:

Request.Text = // velger forskjellige poster som leseren har rettighetene "SELECT TILLATT DIFFERENT | Contractors.Name | FROM | Directory.Contractors AS Contractors";

7. Bygging FØRST- velger antall poster som er spesifisert i parameteren fra søkeresultatet.

Syntaks: FIRST<число>

Brukseksempel:

Request.Text = // velg de første 4 GTD-numrene fra katalogen "SELECT FIRST 4 | GTD numbers.Link | FROM | Reference.GTD numbers AS GTD numbers";

8. DESIGN Å FORANDRE- lar deg låse et bord, fungerer bare i transaksjoner (kun relevant for automatiske låser).

Syntaks: FOR ENDRING<НаименованиеТаблицы>

Brukseksempel:

Query.Text = "VELG | Fri saldi. Saldo. Nomenklatur, | Saldo. Saldo. Lager, | Saldo. Saldo. På lager

9. Design ORDER BY- bestiller data etter et bestemt felt. Hvis feltet er en lenke, så når du setter flagget AUTO BESTILLING sorteringen vil skje ved linkens presentasjon, hvis flagget er av, blir linkene sortert etter prioriteten til lenkeadressen i minnet.

Syntaks: SORTER ETTER<НаименованиеПоля>AUTO BESTILLING

Brukseksempel:

Request.Text = "VELG | Fri gjenværende saldoer. Nomenklatur AS Nomenklatur, | Gratis gjenværende saldoer. Lager AS lager, | Fri saldoer.

10. Konstruksjon LOAD BY- brukes til å gruppere søkestrenger etter bestemte felt. Numeriske felt må brukes med en hvilken som helst aggregatfunksjon.

Syntaks: LAST AV<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Brukseksempel:

Request.Text = "VELG | Produkter I varehus. Nomenklatur AS Nomenklatur, | Produkter I lager. Lager, | BELOPP (Produkter I lager. På lager) AS Lager | FRA | Akkumuleringsregister.

11. DESIGN HAR- lar deg bruke en samlet funksjon på en datavalgtilstand, i likhet med WHERE-konstruksjonen.

Syntaks: HAR<агрегатная функция с условием>

Brukseksempel:

Request.Text = // velger grupperte poster der feltet på lager er større enn 3 "SELECT | ProductsIn Warehouses. GoodsIn Warehouses.Nomenclature, | GoodsIn Warehouses.Warehouse | | HAVING | AMOUNT (GoodsIn Warehouses In Stock)> 3";

12. Konstruksjon INDEX BY- brukes til indeksering av spørringsfeltet. Det tar lengre tid å fullføre et indeksert spørsmål, men gir raskere søk på indekserte felt. Kan bare brukes på virtuelle bord.

Syntaks: INDEKS AV<Поле1, ... , ПолеN>

Brukseksempel:

Request.Text = "VELG | Tz.Name OS, | Tz.Nummer på mappen, | Tz.codeOS, | Tz.Term, | Tz.Type | POST DataTz | FROM | & Tz AS Tz | | INDEX ON | Tz .Name OS, | Tz. .KodOS ";

13. Konstruksjon HVOR- lar deg innføre en betingelse for valgfelt. Bare poster som oppfyller betingelsen vil bli inkludert i resultatet.

Syntaks: HVOR<Условие1 ОператорЛогСоединения УсловиеN>

Brukseksempel:

Request.Text = // velger alle poster som gjenstår kompensasjon for<>0 og // SummaDlyaRaschKompOstatok> 100 "SELECT | KompensatsiyaRPOstatki.Kontragent, | KompensatsiyaRPOstatki.Rebenok, | KompensatsiyaRPOstatki.KompensatsiyaOstatok, | KompensatsiyaRPOstatki.SummaDlyaRaschKompOstatok | PUT DannyeTz | FRA | RegistrNakopleniya.KompensatsiyaRP.Ostatki KompensatsiyaRPOstatki HVORDAN | HVOR | KompensatsiyaRPOstatki.KompensatsiyaOstatok<>0 | Og kompensasjon for balansen i balansen.AmountForCalculationCompOstatok> 100 ";

14. KONSTRUKSJONSRESULTATER ... GENERELT- den brukes til å beregne totalsummer, designen spesifiserer feltene som totalene skal beregnes med, og samlede funksjoner brukes på de totale feltene. Når du bruker totaler for hvert felt etter TOTAL-konstruksjonen, blir dataene gruppert. Det er en GENEREL konstruksjon som tilleggsutstyr, og bruken gir også ytterligere gruppering. Du vil se et eksempel på søkeresultatet nedenfor.

Syntaks: RESULTATER<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>PÅ<ОБЩИЕ> <Поле1, ... , ПолеN>

Brukseksempel:

Request.Text = "Velg ;

I figuren er grupperingene som ble dannet under utførelsen av spørringen sirklet inn, den øverste tilhører GENERAL -delen og den andre til feltet ContractorAgreementContractView.