Uttrykk som i forespørselen. HVOR er rutepunktet =

I denne artikkelen vil vi analysere mulighetene for typekonvertering i 1C-spørringsspråket, som leveres av "Express" -funksjonen.
La oss se på flere alternativer for å bruke denne funksjonen.
Og det første alternativet er å avrunde tall.

For å gjøre dette, må du bruke Express-funksjonen i følgende format:

Uttrykke(<Число>som nummer(<ДлинаЧисла>,<Точность>))

Hvor:
Antall— feltet som må avrundes
LengdeTall— maksimal nummerlengde
Nøyaktighet— nøyaktighet av tallavrunding

Parametrene både lengde og presisjon må være positive heltall.
Se hvordan denne funksjonen fungerer på bildet nedenfor.

Den andre brukssaken er strengstøping. Svært ofte bruker konfigurasjoner strenger med ubegrenset lengde, noe som pålegger noen begrensninger. For eksempel kan vi ikke sammenligne strenger med ubegrenset lengde.
I spørringen nedenfor er FullName-feltet av typen streng med ubegrenset lengde, og denne spørringen vil ikke fungere.

For at det skal fungere, er det nødvendig å konvertere et felt med ubegrenset lengde til en streng med en viss lengde dette gjøres ved å bruke Express-funksjonen i følgende format:

Uttrykke(<Строка>som streng(<ДлинаСтроки>)

Hvor
Linjelengde– maksimal lengde som strengen skal reduseres til.
La oss omarbeide spørringen: i betingelsen vil vi konvertere en ubegrenset streng til en streng med en viss lengde. Da blir det ingen feil.

La oss vurdere det siste og, jeg vil si, det viktigste alternativet for bruken: når du arbeider med felt av en sammensatt type.
Nedenfor er to spørringer som bruker sammensatte felt. Den første er feil og den andre er riktig.

De. Når du trenger å få et felt av en eller annen kompleks type, får du alltid verdien av dette feltet først etter å ha castet typen ved hjelp av Express-funksjonen. I dette tilfellet vil dokumentene og oppslagsbøkene ha følgende format:

Uttrykke(<Документ>som dokument.<ИмяТаблицы>)
Uttrykke(<Справочник>som en katalog.< ИмяТаблицы >)
.

Hvor
Tabellnavn— navnet på objektet i .

Bruk alltid ekspressfunksjonen når du arbeider med sammensatte typer, den optimerer spørringen betraktelig.

Hvis du fortsatt "svømmer" i konstruksjonene til spørringsspråket, og selv de enkleste spørringene forårsaker vanskeligheter for deg, anbefaler jeg deg kurset mitt "Spørringer i 1C fra nybegynner til proff." Hvor disse og mange andre problemstillinger diskuteres mer detaljert.

Hva er spesielt med dette kurset:
Kurset er laget for de som ikke er kjent med spørrespråket i 1C;
Undervisningsmateriellet er godt lagt opp og lett å lære;
Flere dusin leksjoner;
Nyttige praktiske eksempler;
Alle leksjoner presenteres i et klart og enkelt språk

For mine lesere, 25% rabattkupong: hrW0rl9Nnx

Jeg prøver å gi ut forskjellige interessante gratis artikler og videoopplæringer så ofte som mulig. Derfor vil jeg være veldig glad hvis du støtter prosjektet mitt ved å overføre et hvilket som helst beløp:

Du kan overføre et hvilket som helst beløp direkte:
Yandex.Money - 410012882996301
Web Money - R955262494655

Bli med i gruppene mine.

Mange tolker EXPRESS-funksjonen i spørringsspråket 1C 8 som en typekonvertering, men den er ikke ment for disse formålene i det hele tatt. Detaljer under kuttet...

Så mange tror feilaktig at de kan konvertere et felt med type Linje i feltet med type Antall eller lenke i kø. Faktisk kan EXPRESS-operatøren konvertere:

  • primitive typeinnstillinger;
  • et felt av en sammensatt type til et felt av en enkelt type;

La oss se på disse situasjonene mer detaljert...

Konvertering av Primitive Type Settings

La oss vurdere en situasjon når vi ønsker å gruppere data etter en streng av en ubegrenset type, for eksempel er en slik streng ofte en kommentar i dokumenter. I dette tilfellet vil vi ikke kunne gruppere etter kommentar. Derfor må vi konvertere en streng med ubegrenset lengde til en streng med begrenset lengde, og deretter gruppere den. La oss for eksempel telle antall dokumenter med de samme kommentarene:

VELGE
EXPRESS(Admission.Comment AS LINE(300)) AS Kommentar,
QUANTITY(Incoming.Link) AS Link
FRA
Dokument Entre AS Entre

GRUPPE AV
EXPRESS(Admission.Comment AS ROW(300))

En annen situasjon er når forespørselen bruker beregninger, ved utgangen kan vi få et tall med et stort antall desimaler (1100.001568794). For ikke å behandle dette tallet etter at spørringen er fullført, kan du umiddelbart trimme det til ønsket lengde, men det er viktig å forstå at tallet trimmes og ikke avrundes. Eksempel:

VELGE
Salg.Produkt,
EXPRESS(Salg.Antall * Salg.Pris SOM NUMMER(15, 2)) SOM Beløp
FRA

Konvertering av en sammensatt type til en enkelt type

Registerregistre har ofte en sammensatt type for å konvertere den til en enkelt type, bruk konstruksjonen UTTRYKKE Imidlertid, hvis du på prøvetakingsstadiet prøver å konvertere implementeringsdokumentet til et kvitteringsdokument, vil forespørselen definitivt mislykkes med en feil, så før du konverterer bør du sjekke typen lenke. Dette er så tull))) Hvorfor er alt dette nødvendig, spør du. Jeg svarer, dette er et av øyeblikkene med implisitt spørringsoptimalisering på bekostning av kortfattet skriving. La oss se på anvendelsen av dette punktet med et eksempel.

La oss si at du ønsker å få nummeret til hver registrar fra RN Sales. skriv en forespørsel:

VELG DIVERSE
Salgsregistratornummer
FRA
Registrer Akkumuleringer.Salg HVORDAN Salg

Egentlig kan ingenting være enklere. Men 1C, på utførelsesstadiet, konverterer denne forespørselen uten noen tilkoblinger til en forespørsel med så mange venstre tilkoblinger som vi har mulige registrarer. De. hvis 20 dokumenter skrives til dette registeret, vil vi få en SQL-spørring med 20 venstre sammenføyninger. Hvorfor skjer dette? Fordi den innebygde 1C-optimalisatoren ikke behandler felt mottatt gjennom en prikk særlig godt, er det i dette tilfellet Number-attributtet. Dette er kakene, hvis vi ofte ønsker å motta dokumentnummeret, er det mest rimelig å inkludere det i registerdetaljene eller bruke EXPRESS-operatøren, men på bekostning av korthet:

VELG DIVERSE
Salgsregistratornummer,
VALG
NÅR Sales.Registrar LINK Document.Consumable
SÅ EXPRESS(Sales.Registrar AS Document.Consumable)
ANNET VALG
NÅR Sales.Registrar LINK Document.Implementation
SÅ EXPRESS(Sales.Registrar AS Document.Implementation)
SLUTT
...
SLUTT SOM Nummer
FRA
Registrer Akkumuleringer.Salg HVORDAN Salg

Nå vil venstre sammenføyning involvere én spesifikk tabell.

Generelt bør du nøye referere til data gjennom en prikk, fordi 1C bruker i dette tilfellet en venstre sammenføyning i SQL-spørringen, noe som kan påvirke ytelsen betydelig. Dette er et av optimaliseringspunktene.

La oss se på resten nå.

Funksjoner for arbeid med strenger i 1C-spørringer

Det er få funksjoner og operatorer for å jobbe med strengdata i 1C-spørringer.

For det første kan strenger i spørringer legges til. For å gjøre dette, bruk "+"-operatoren:

Be om. Tekst = "VELG
" "Linje: " " + Kilde.Navn
;

For det andre kan du velge en del av linjen. For å gjøre dette, bruk funksjonen SUBSTRUKSJON. Funksjonen ligner på det innebygde 1C-språket. Den har tre parametere:

  1. Kildestreng.
  2. Nummeret på tegnet som den valgte linjen skal begynne med.
  3. Tegn.

Be om. Tekst= "VELGE
SUBSTRING("
"Linje: " ", 4, 3) SOM resultat"; // Resultat: ok

Funksjon ISNULL

NULL er en spesiell datatype på 1C:Enterprise-plattformen. Det er også den eneste mulige verdien av denne typen. NULL kan vises i spørringer i flere tilfeller: når du kobler til spørringskilder, hvis en tilsvarende verdi ikke ble funnet i en av tabellene; når du får tilgang til detaljene til et ikke-eksisterende objekt; hvis NULL ble spesifisert i listen over søkefelt (for eksempel når du kombinerer utvalgsresultater fra flere tabeller), etc.

Fordi NULL verken er null eller den tomme strengen, heller ikke en verdi Udefinert, det er ofte nyttig å erstatte den med en mer nyttig datatype. Det er dette funksjonen er til for. ISNULL.

Den har to parametere:

  1. Verdien som kontrolleres.
  2. Verdien som skal erstatte den første parameteren med hvis den viser seg å være NULL.

Be om. Tekst= "VELGE
ISNULL(Source.Remainder, 0) AS Remainder"
; // Hvis resultatet av forespørselen er feltet rest = NULL,
// så vil den bli erstattet med 0, og du kan utføre matematiske operasjoner med den

Funksjoner OPPTREDEN Og INTRODUKSJONSLINKER

Disse funksjonene er utformet for å oppnå strengrepresentasjoner av forskjellige verdier. Det vil si at de konverterer referanser, tall, booleaner osv. til ren tekst. Forskjellen mellom dem er at funksjonen OPPTREDEN konverterer alle datatyper til tekst (streng), og funksjonen INTRODUKSJONSLINKER- bare linker, og returnerer de gjenværende verdiene som de er, ikke konvertert.

Be om. Tekst= "VELGE
REPRESENTATION(TRUE) AS Boolean,
REPRESENTASJON (4) SOM ET Nummer,
REPRESENTASJON (Source.Link) AS Link,
REPRESENTATION(DATETIME(2016,10,07)) AS Dato"
;
// Boolean = "Ja", Tall = "4", Link = "Dokument Kontantkvittering ordrenr... fra..."
// Date="07.10.2016 0:00:00"

Be om. Tekst= "VELGE
REPRESENTATIONREFERENCE(TRUE) AS Boolean,
REPRESENTASJONSREFERANSE(4) SOM NUMMER
PRESENTINGLINK(Source.Link) AS Link,
REPRESENTATIONREFERANCE(DATETIME(2016,10,07)) AS Date"
;
// Boolean = TRUE, Number = 4, Link = "Dokument Kontantkvitteringsordre nr... fra..."
// Dato=07.10.2016 0:00:00

Funksjoner TYPE Og TYPE VERDIER

Funksjon TYPE returnerer datatypen 1C:Enterprise-plattform.

Be om. Tekst= "VELGE
TYPE (nummer)
TYPE (streng),
TYPE (Dokument. Kontantordre for utgifter)"
;

Funksjon TYPE VERDIER returnerer typen verdi som er sendt til den.

Be om. Tekst= "VELGE
VERDIER TYPE (5) SOM Nummer,
TYPE ("
"Linje" ") AS-streng,
TYPE (Kilde.Link) AS Referanse
Fra Directory.Source AS Source"
;
//Number=Nummer, String=String, Directory = DirectoryLink.Source

Disse funksjonene er praktiske å bruke, for eksempel når du skal finne ut om et felt mottatt i en forespørsel er en verdi av en eller annen type. La oss for eksempel få kontaktinformasjonen til motparter fra kontaktinformasjonsregisteret (kontakter til ikke bare motparter, men også organisasjoner, enkeltpersoner osv. er lagret der):

Be om. Tekst= "VELGE

FRA

HVOR
VALUES TYPE(ContactInformation.Object) = TYPE(Katalog.Motparter)"
;

Funksjon BETYDNING

Funksjon Betydning lar deg bruke 1C-konfigurasjonsobjekter direkte i en forespørsel, uten å bruke .

La oss legge til en betingelse til i forrige eksempel. Du trenger bare å få telefonnumrene til dine motparter.

Be om. Tekst= "VELGE
ContactInformation.Introduksjon
FRA
Register over informasjon Kontaktinformasjon HVORDAN kontaktinformasjon
HVOR
VALUES TYPE(ContactInformation.Object) = TYPE(Katalog.Motparter)
OG ContactInfo.Type = VERDI(Enum.ContactInfoTypes.Phone)"
;

Det skal bemerkes at denne funksjonen kun kan brukes med forhåndsdefinerte verdier, dvs. med verdier som kan nås direkte fra konfiguratoren. Det vil si funksjonen BETYDNING kan ikke brukes med katalogelementer opprettet av brukere, men kan arbeide med opplistinger, med forhåndsdefinerte katalogelementer, med verdier EmptyLink.

Operatør LINK

Operatør LINK er designet for å sjekke verdiene som returneres av en forespørsel for å se om de tilhører en bestemt referansetype. Den samme oppgaven kan utføres ved hjelp av funksjoner TYPE Og TYPE VERDIER(som har et bredere omfang og ble diskutert ovenfor).

For eksempel kan oppgaven med å velge kontaktinformasjon for motparter løses på denne måten:

Be om. Tekst= "VELGE
ContactInformation.Introduksjon
FRA
Register over informasjon Kontaktinformasjon HVORDAN kontaktinformasjon
HVOR
ContactInformation.Object LINK Directory.Counterparties"
;

Operatør UTTRYKKE

Operatør UTTRYKKE brukt i 1C-spørringer i to tilfeller:

  • når du trenger å endre egenskapene til en primitiv type;
  • når du trenger å gjøre om et felt med en sammensatt datatype til et felt med en enkelt type.

Primitive datatyper inkluderer: tall, streng, dato, boolsk. Noen av disse datatypene har tilleggsegenskaper. Type Antall har lengde og presisjon, type Linje - lengde eller ubegrenset.

Operatør UTTRYKKE lar deg endre ikke datatypen, men tilleggsegenskaper. Han kan for eksempel gjøre om en streng med ubegrenset lengde til en streng med begrenset lengde. Dette kan være nyttig hvis du trenger å gruppere søkeresultater etter et slikt felt. Du kan ikke gruppere etter felt med ubegrenset lengde, så vi konverterer den til en streng med en lengde på 200 tegn.

Be om. Tekst= "VELGE
KVANTITET (forskjellig ankomst av varer og tjenester. Link) AS Link
FRA
Dokumenter mottak av varer og tjenester HVORDAN mottak av varer og tjenester
GRUPPE AV
EXPRESS(mottak av varer og tjenester. Kommentar SOM RAD (200))"
;

I noen tilfeller kan det hende at spørsmål til felt med en sammensatt datatype ikke behandles optimalt av 1C-plattformen. Dette resulterer i lengre tid for utføring av spørringer, så det kan være nyttig å konvertere den sammensatte typen til en enkelt type på forhånd.

Be om. Tekst= "VELGE
EXPRESS(Movement of GoodsTurnover.Order AS Document.Customer Order).Dato AS Order Date,
Bevegelse av varer Omsetning.Nomenklatur
FRA
Registrer Akkumuleringer.Movement of Goods.Turnover AS Movement of GoodsOmsetning
HVOR
Movement of GoodsTurnover.Order LINK Document.Client Order"
;

Operatører VALG Og ER NULL

Operatør VALG ligner på operatør HVIS i det innebygde 1C-språket, men har noe redusert funksjonalitet.

La oss si at vi ønsker å motta kontaktinformasjon fra kontaktinformasjonsregisteret og samtidig angi i et eget forespørselsfelt om den tilhører en motpart eller en enkeltperson.

Be om. Tekst= "VELGE
ContactInformation.Introduction,
VALG
NÅR VERDIER TYPE(Kontaktinformasjon.Objekt) = TYPE(Katalog.Motparter)
DERETTER "
Motpart "
ANNET VALG
NÅR VERDIER TYPE(Kontaktinformasjon.Objekt) = TYPE(Katalog.Individer)
DERETTER "
Individuell"
ANDET "Noen andre" "
SLUTT
SLUTT SOM EIER
FRA
Register over informasjon Kontaktinformasjon AS.
;

Som det fremgår av eksempelet, i designet VALG det er alltid en betingelse etter ordet NÅR; verdi brukt hvis betingelsen er sann etter ordet DERETTER og verdien brukt hvis betingelsen ikke er oppfylt, etter ordet ELLERS. Alle tre designelementene VALG er obligatoriske. Utelat element ELLERS, på samme måte som når du bruker operatøren HVIS i det innebygde 1C-språket er det umulig. Også fra operatøren VALG det er ingen analog til designet ELLER HVIS, men du kan investere en VALG i en annen, slik det ble gjort i vårt eksempel.

Operatør ER NULL brukt i design VALG for å sammenligne et spørringsfelt med typen NULL.

Be om. Tekst= "VELGE
VALG
NÅR VERDEN ER NULL, SÅ 0
ELSE Betydning
SLUTT"
;

I tillegg kommer operatøren ER NULL kan brukes i spørringsforhold, for eksempel i en setning HVOR.

Det er få mekanismer for å jobbe med strenger i 1C-spørringer. Først kan linjene legges til. For det andre kan du ta en delstreng fra en streng. For det tredje kan strenger sammenlignes, inkludert etter mønster. Det er nok alt som kan gjøres med strenger.

Strengtilsetning

For å legge til rader i en spørring, brukes "+"-operasjonen. Du kan bare legge til strenger med begrenset lengde.

VELG "Navn: " + Motparter Navn AS Kolonne 1 FRA Motparter AS Motparter Link = &Link

Substring funksjon

SUBSTRING(<Строка>, <НачальнаяПозиция>, <Длина>)

En analog av Environment()-funksjonen fra objektmodellen. Substring()-funksjonen kan brukes på strengdata og lar deg velge et fragment <Строки> , som starter med tegnnummeret <НачальнаяПозиция> (tegn i en linje er nummerert fra 1) og lengde <Длина> tegn. Resultatet av funksjonsberegningen har en strengtype med variabel lengde, og lengden vil anses som ubegrenset hvis <Строка> har ubegrenset lengde og parameter <Длина> er ikke en konstant eller større enn 1024.

Hvis lengden på strengen er mindre enn spesifisert i den andre parameteren, vil funksjonen returnere en tom streng.

Merk følgende! Det anbefales ikke å bruke SUBSTRING()-funksjonen til å konvertere strenger med ubegrenset lengde til strenger med begrenset lengde. I stedet er det bedre å bruke cast-operatøren EXPRESS().

Funksjon lignende

Hvis vi må forsikre oss om at et strengattributt oppfyller visse kriterier, sammenligner vi det:

VELG Motparter Navn AS Kolonne 1 FRA Motparter AS Motparter Name = "Gazprom".

Men hva om du trenger en mer subtil sammenligning? Ikke bare likhet eller ulikhet, men likhet med et bestemt mønster? Det er akkurat dette SIMILAR-funksjonen ble laget for.

LIKE — Operator for å sjekke en streng for likhet med et mønster. Analog av LIKE i SQL.

SIMILAR-operatoren lar deg sammenligne verdien av uttrykket som er spesifisert til venstre for det med mønsterstrengen som er spesifisert til høyre. Verdien til uttrykket må være av typen streng. Hvis verdien av uttrykket samsvarer med mønsteret, vil resultatet av operatoren være TRUE, ellers vil det være FALSE.

Følgende tegn i malstrengen er tjenestetegn og har en annen betydning enn strengtegnet:

  • % (prosent): en sekvens som inneholder et hvilket som helst antall vilkårlige tegn;
  • _ (understrek): ett vilkårlig tegn;
  • […] (ett eller flere tegn i hakeparenteser): ethvert enkelt tegn oppført innenfor hakeparentesene. Oppregningen kan inneholde områder, for eksempel a-z, som betyr et vilkårlig tegn inkludert i området, inkludert endene av området;
  • [^...] (i hakeparentes et negasjonstegn etterfulgt av ett eller flere tegn): ethvert enkelt tegn annet enn de som er oppført etter negasjonstegnet.

Ethvert annet symbol betyr seg selv og bærer ingen ekstra belastning. Hvis et av de oppførte tegnene må skrives som seg selv, må det innledes med<Спецсимвол>. Meg selv<Спецсимвол>(hvilket som helst passende tegn) er definert i den samme setningen etter nøkkelordet SPECIAL CHARACTER.

Så la oss begynne. En spørring er et spesielt objekt i 1C 8.2 som brukes til å generere og utføre spørringer til databasetabeller i systemet. For å utføre en spørring må du komponere en spørringstekst som beskriver hvilke tabeller som skal brukes som spørringsdatakilder, hvilke felt som må velges, hvilke sorteringer og grupperinger som skal brukes osv. Du kan lese mer om spørringer i boken "1C 8.2 Developer's Guide". Spørringsspråket 1C 8.2 er veldig likt i syntaks til andre SQL-databasespørringsspråk, men det er også forskjeller. Blant hovedfordelene med det innebygde spørringsspråket er det verdt å merke seg referansen til felt, tilstedeværelsen av virtuelle tabeller, praktisk arbeid med totaler og utypede felt i spørringer. Ulempene er at du ikke kan bruke en spørring som et utdatafelt, du kan ikke bruke lagrede prosedyrer, og du kan ikke konvertere en streng til et tall.

1. For å øke lesbarheten til forespørselen og redusere antall forespørselsparametere, kan du bruke en bokstav for å få tilgang til forhåndsdefinerte konfigurasjonsdata i forespørselen VERDI (VERDIREPRESENTASJON). Som en representasjon av verdier, verdiene av oppregninger, forhåndsdefinerte data for kataloger, planer for beregningstyper, planer for typer egenskaper, kontoplaner, tomme lenker, verdier av rutepunkter, verdier for systemoverføringer ( for eksempel kan akkumuleringsbevegelsestype, kontotype) brukes.

HVOR By = VERDI(Directory.Cities.Moskva)

HVOR By = VERDI(Directory.Cities.EmptyLink)

WHEREProductType = VERDI(Enumeration.ProductTypes.Service)

WHEREMovementType = VERDI(AkkumulationMovementType.Incoming)

HVOR er rutepunktet =

VERDI(BusinessProcess.Agreement.RoutePoint.Agreement)

Uttrykket i parentes begynner alltid med et entallsord (Katalog, Enumeration, etc.) som samsvarer med typen til den forhåndsdefinerte verdien.

2.Auto-bestilling i en spørring kan i stor grad bremse prosessen. Hvis sortering ikke er nødvendig, er det bedre å ikke bruke det i det hele tatt. I mange tilfeller er det mer effektivt å skrive sortering med et nøkkelord SORTER ETTER.

3. Du må sørge for at det ikke vises et tvetydig felt når du bruker aliaser. Ellers vil ikke systemet forstå hvilket objekt som må åpnes.

Eksempel på en forespørsel med et tvetydig felt:

VELGE

Resterende varerRemaining.QuantityRemaining

Directory.Nomenclature AS Nomenclature

VENSTRE TILKOBLING Registrere Resterende varer

Software Remaining ProductsRemainings.Nomenclature = Nomenclature.Link

Det er nødvendig å korrigere tabellaliaset, for eksempel slik: "Directory.Nomenclature AS Nomenclature1", og "Nomenclature.Link" bør korrigeres tilsvarende til "Nomenclature1.Link".

4. Noen ganger er det nyttig å få en representasjon av referansefelt ved hjelp av et nøkkelord OPPTREDEN sammen med en lenke slik at det ikke er gjentatt tilgang til databasen. Dette er nyttig når du viser resultatet av en spørring i en tabell.

VELGE

REPRESENTASJON(Dokument.motpart) SOM mottaker,

PRESENTASJON(Dokument.Base)

Document.Invoice AS Dokument

5. Bruk i en forespørsel EXPRESS(Felt AS Type) lar deg fjerne unødvendige tabeller fra en forbindelse med et felt av en kompleks datatype. Derved fremskyndes utførelsen av forespørselen.

Eksempel (registrator er et felt med en sammensatt type for den fysiske tabellen i registeret over akkumulering av gjenværende varer, i forespørselen velges dato og antall dokumenter for mottak av varer, mens når du får tilgang til detaljene i dokumentet Dato og nummer gjennom registratoren, er det ingen multippel kobling av registertabellen med tabeller over dokumenter som er registrarer for restvareregisteret):

VELG DIVERSE
EXPRESS(Resterende varer.Registrator AS Dokument. Varemottak). Nummer SOM KVITTERINGSNUMMER,

EXPRESS(Resterende varer. Registrar AS Dokument. Varemottak). Dato AS MOTTAKSDATO

FRA
Register over Akkumuleringer AS Restgods
HVOR
(EXPRESS(Resterende varer.Registrator AS Document.Receipt of Goods) ER IKKE NULL)

6. Når det i 1C-konfigurasjonen er brukere som har begrensede rettigheter til visse konfigurasjonsobjekter, må nøkkelordet brukes i forespørselen til slike objekter TILLATT slik at forespørselen utføres uten feil (Velg Tillatt...)

7.Når du slår sammen tabeller som inneholder nestede tabeller (for eksempel et dokument med en tabelldel), kan nøkkelordet være nyttig TØM BORD når for eksempel et av dokumentene ikke har en tabelldel.

KOMBINER ALT

FRA Document.Invoice

8. Når du arbeider med sammenføyninger av tabeller som inneholder én rad hver, kan det være nødvendig å slå sammen radene i tabellene (i begge tabellene er det ikke noe felt som de kan slås sammen med). Dette kan oppnås ved å bruke konstruksjonen " FULL TILKOBLING Tabell etter TRUE" Hvis tabellene har mer enn én rad, vil resultatet være et antall rader som er lik produktet av antall rader i begge tabellene. Hvis det er O-rader i en tabell, vil antallet rader i den resulterende tabellen være lik antall rader i den andre tabellen. For å koble til slike tabeller kan du også bruke det kartesiske produktet av tabeller, der alle kombinasjoner av rader fra begge tabellene vises i den resulterende tabellen. Vi må huske at hvis det er 0 rader i en av tabellene, vil det kartesiske produktet være 0, så en full sammenføyning vil være bedre. Generelt, i stedet for en fullstendig tilkobling AV SANT Du kan bruke en hvilken som helst annen type sammenføyning, men i dette tilfellet er det også mulig at den resulterende tabellen vil ha 0 rader, selv om en av tabellene har et antall rader som ikke er null. Ved full sammenføyning vil denne situasjonen kun oppstå i ett tilfelle, hvis antall rader i begge tabellene er 0. Hvis du vet at det er nøyaktig minst én rad i tabellen, så kan du bruke VENSTRE FORBINDELSE med et annet bord med tilstand AV SANT.

Eksempel (riktignok konstruert, for Full Join):

VELGE

K. Motpart

Oppregning AS Kjønn

FULL TILKOBLING (Velg Første 1 D. Motpart FRA Dokument. Salg av varer HVORDAN D Ordne etter D. Tidspunkt) HVORDAN DU

PÅ (SANT)

9. For å få unike poster for et bestemt felt er det riktigere å bruke et nøkkelord i stedet for å gruppere DIVERSE i forespørselen, fordi denne konstruksjonen er mye klarere og nøkkelordet GRUPPE AV har bredere anvendelse og brukes ofte hvis det i tillegg er nødvendig å beregne aggregerte funksjoner etter grupperinger. I noen tilfeller er det nødvendig å skrive ut et begrenset antall linjer. For å gjøre dette, bør du spesifisere nøkkelordet i forespørselsbeskrivelsen FØRST og etter det - det nødvendige antall linjer.

Eksempel for FØRST:

Velg første 5

Directory.Nomenclature.Name,

Directory.Nomenclature.PurchasingPrice

Sorter etter

Directory.Nomenclature.PurchasePrice Synkende

Eksempel for DIVERSE:

Velg Diverse

Document.Consumable.Motpart

10.Aggregasjonsfunksjoner i en spørring kan brukes uten nøkkelord GRUPPE. I dette tilfellet vil alle resultater grupperes i én linje.

Velge

Beløp(Faktura.Beløp) Som Beløp

Document.Invoice.Composition Som faktura

11.I spørringer i utvalgsfeltene kan du fritt få tilgang til detaljene i utvalgsfeltene. Denne funksjonen kalles select field dereference. Hvis datakilden er en nestet tabell (tabelldelen av dokumentet), kan du i utvalgsfeltene også få tilgang til feltene til hovedtabellen (for eksempel, gjennom koblingsfeltet, få tilgang til feltet til hovedtabellen Konto)

VELGE


Mottak av varer og tjenester Varer Kvantitet AS Kvantitet,.
Mottak av varer og tjenesterGoods.Link.Counterparty
FRA

HVOR
Mottak av varer og tjenesterGoods.Link = &Link

Det er en særegenhet ved å bruke feltdereferering hvis det er grupperinger i forespørselen. I alle spørringer med grupperinger i listene over søkefelt kan du fritt få tilgang til detaljene for grupperingsfeltene.

VELGE

Mottak av varer og tjenester, varer.

Nomenklatur for varer og tjenester.

SUM (Receipt of Goods and Services Goods. Quantity) AS Quantity,

Dokumentmottak av varer og tjenester HVORDAN mottak av varer og tjenester

GRUPPE AV

Mottak av varer og tjenester, varer.

1C-hjelpen sier at hvis det er gruppering, kan bare grupperingsfelt og aggregerte funksjoner for utvalgsfeltene delta i søkeutvalgsfeltene. Det er ett unntakstilfelle når aggregerte funksjoner brukes på felt i en nestet tabell. I dette tilfellet, i listen over utvalgsfelt, er det mulig å få tilgang til feltene i toppnivåtabellen, uten å gruppere resultatene etter disse feltene.

VELGE

Mottak av varer og tjenester (SUM (mengde), nomenklatur.

Mottak av varer og tjenester

Dokumenter mottak av varer og tjenester HVORDAN mottak av varer og tjenester

GRUPPE AV

Mottak av varer og tjenester (nomenklatur).

12. Noen ganger, i stedet for å spesifisere et hvilket som helst felt i grupperingen, er det nyttig å inkludere følgende parameter i feltene for valg av spørring:

VELGE
DocProducts.Nomenclature,
&motpart,
&Periode,
SUM(DocProducts.Quantity * DocProducts.K) AS Quantity,
SUM(DocProducts.Amount) AS Amount
FRA
Document.Admission.Products AS DocProducts
HVOR
DocProducts.Link = &Link

GRUPPE AV
DocProducts.Nomenclature

Og sett deretter parameteren i forespørselsteksten:

Request.SetParameter("&Account", SelectAccount);

Query.SetParameter("&Period", Dato);

13. I universelle spørringer kan parametere brukes i beskrivelsen av spørringsdatakilder, under betingelsene HVOR, i tabellforbindelsesforhold og virtuelle tabellparametere. Det er to teknikker for å lage generiske søk:

A) ved å bruke strengsammenkoblingsmekanismen, legge til variabler i forespørselsteksten;

OrderingType = ?(NOE VARIABLER,"","DESC");

Query.Text = "Velg... Ordne etter felt1 " + OrderType + "...";

Query.Text = "Velg felt1...";

Hvis NOEN VARIABEL = 1, så

Request.Text = Request.Text + ",Felt2 ...";

slutt om;

B) bruk parametere i ulike deler av forespørselen (for eksempel i datakildedelen av forespørselen), og deretter den innebygde språkmetoden - STREPLACE(). Når du designer universelle spørringer, er det nyttig å få tilgang til egenskapene til objekter METADATA(), med hvilken du kan bestemme navnet på tabellen for en lenke (for eksempel for et dokument vil det være noe sånt som dette - Link . METADATA().NAME), sendt gjennom en parameter til en universell prosedyre.

Velge

DocTch.Nomenclature,

&Noen DocTC AS DocTC

Og sett deretter parameteren i forespørselsteksten

Request.Text = StrReplace(Request.Text, "&SomeDocTCH", "Document."+Link.Metadata().Name+".Products");

Parametere kan brukes i spørringsbetingelser for å aktivere en valgfri betingelse &Parameter OR NOT SomeProperty:

Request.SetParameter(“&Parameter”, “Counterparty.Name=””Ivanov”””);

Ved hjelp av en bokstavelig EKTE du kan fjerne visse filtre i forespørselen

Query.SetParameter("&Parameter", True);

14. Veldig nyttig i spørringsdesigneren er tabellkontekstmenykommandoen - " Gi tabell nytt navn...", som du kan komme opp med et generalisert navn for datakilden. For å lage spørringer for tabeller av samme type, lignende struktur, kan det være nyttig for den andre tabellen å kopiere spørringsteksten til den første tabellen, gå til spørringsdesignervinduet og velg elementet i kontekstmenyen i tabellen - Bytt bord... og velg den andre tabellen.

15.Når du arbeider med å lage nestede spørringer i delene av betingelsene eller parameterne til virtuelle tabeller til spørringsdesigneren, brukes teknikken for å fremheve et mellomrom i parentes, deretter vises "Query Designer"-elementet i kontekstmenyen, og når du redigerer en nestet spørring, er hele spørringen i parentes uthevet i betingelsen.

Eksempel på et nestet søk:

Produkt B (Velg produkt...)

16. Når du designer ACS-rapporter i spørringer for å balansere registre, er det mer praktisk og riktig å bruke uttrykket som Periode-parameteren AddToDate(EndPeriod(Period,DAY),SECOND,1), siden virtuelle saldoer oppnås ved begynnelsen av perioden, ikke inkludert siste sekund. +1 sekund-teknikken kan ikke brukes med dokumenter: i henhold til den nye metoden for postering av dokumenter, må registersaldoer mottas for perioden spesifisert av grenseobjektet med tidspunktet for dokumentet inkludert (og ikke på datoen for dokument +1 sekund!), og i henhold til den gamle metoden for postering - på tidspunktet for dokumentet (og ikke på datoen for dokumentet!). Når man analyserer omsetning eller data for en periode, er det praktisk å legge til en parameter med typen StandardPeriode(i dette tilfellet er det ikke nødvendig å oppgi siste dato for intervallet på slutten av dagen). For standardfeltet «Start of Period», i «Expression»-feltet må du skrive inn "&Periode.Startdato" Og for standardfeltet "End of Period" i "Expression"-feltet skriv " &Periode.sluttdato". Mye nyttig informasjon om spørringsspråket finner du ikke i syntaksassistenten, men i full hjelp av 1C 8.2-konfiguratoren (F1-knapp)

17. Spørrefunksjon IsNull(det er mer praktisk å skrive den engelske versjonen IsNull) brukes vanligvis for å bli kvitt nullverdier for numeriske søkefelt. I noen tilfeller, for eksempel en fullstendig sammenføyning av to tabeller, funksjonen IsNull (Parameter1,Parameter2) kan erstatte designet VALG NÅR... SÅ..ANNET....SLUT, når for et hvilket som helst felt NULL-verdier kan være både i den første tabellen og i den andre (denne konstruksjonen lar deg få en ikke-Null-verdi for feltet). Men vi må huske det, i motsetning til den betingede operatøren VALG funksjon IsNull konverterer typen av det andre argumentet til typen av det første argumentet, som må tas i betraktning hvis argumenttypene er forskjellige!

IsNull(Reg.Remaining,0)

IsNull(Doc.Product,Doc1.Item)

18. Ved betinget konstruksjon VALG Det finnes en alternativ syntaks for det enkle tilfellet med å teste likhet til en viss verdi, men den er imidlertid udokumentert:

Valguttrykk Når 1 Deretter "Høy" Når 2 Deretter "Mellom" Ellers "Lav" slutt

19. NULL-verdikontrolloperatør Ja null(Vi kan anbefale å bruke den engelske versjonen Er null). Denne konstruksjonen dukket opp fordi enhver operasjon som sammenligner to verdier, hvorav minst én er Null, alltid er falsk. Skrive Hvor Navn = Null feil. Formen for negasjon av denne operatøren er også interessant Nei Null– feil, men rett Ja ikke null eller form Ikke (felt 1 er null)- dette er en betydelig forskjell fra alle operatører som brukes sammen med He-operatøren.

20. Noen ganger er operatørskjemaet nyttig I for å se etter samsvar med en av de oppførte verdiene.

...Hvor er produktnavnet B ("husholdningsapparater", "datamaskiner")

For oppslagsverk kan operatørskjemaet være nyttig I kontroll av hierarkimedlemskap.

...Hvor er nomenklaturen I HIERARKIET (&GRUPPEN)

Operatør I brukes ofte til å sjekke om en verdi er inkludert i resultatet av en underspørring.

I en underspørring kan du få tilgang til de ytre søkefeltene i en tilstand.

// Velg navnene på produktene som var til stede

// i fakturaer

VELGE

Products.Name

Directory.Nomenclature HVORDAN produkter

(VELGE

InvoiceComposition.Nomenclature

Document.Invoice.Composition AS InvoiceComposition

InvoiceContent.Nomenclature = Products.Link)

Operasjon I kan brukes med matriser, verdilister, verditabeller, nestede spørringer. I dette tilfellet er det mulig å redusere forholdene

Syntaks for en underspørring

(uttrykk1, uttrykk2,...,uttrykkN) I (Velg uttrykk1, uttrykk2,...,uttrykkN...)

Syntaks for verditabell

(uttrykk1, uttrykk2,...,uttrykkN) I (&TK), hvor de første N kolonnene brukes i tabellen over TK-verdier

20. Det er en vits på Internett om hvordan spørringsdesigneren alltid gjør VENSTRE slå sammen tabeller (og bytte dem), uansett hvordan vi spesifiserer IKKE SANT:

1C: Bedriften elsker "til venstre".

21. Det er praktisk å feilsøke komplekse spørringer i spørringskonsollen. Det er mange av dem på Internett. Etter å ha feilsøkt spørringen, kan du kopiere den, og i spørringsdesigneren er det en fantastisk knapp " Be om", hvor du kan lime den inn i samme skjema og lagre den (tidligere var det bare mulig å kopiere den i konfiguratoren og formatere forespørselen med linjeskifttegnet). I vinduet som åpnes når du klikker på "Query" -knappen, kan du redigere spørringen og se utførelsesresultatet, noe som er ganske praktisk.

22. Når du designer ACS-rapporter, må du huske at hvis du trenger å gi filtrering etter et bestemt felt, er det ikke nødvendig å legge til en parameter i forespørselsteksten. Spørringsbyggeren har en fane " Datasammensetning", hvor du kan legge til parametere til betingelsene. I tillegg er det på ACS-rapportnivå en betingelsesfane hvor du kan legge til vilkårlige betingelser og lagre dem i hurtiginnstillinger. I dette tilfellet vil betingelsene være universelle (likhet, ulikhet, tilhørighet, inkludering i listen, etc.).

23. Når du arbeider med dokumenter, må du kanskje legge til sortering etter et virtuelt tabellfelt TIDSØyeblikk, men uflaks - i nestede søk fungerer ikke sortering etter dette feltet riktig. Å danse med tamburiner hjelper: sortering etter virtuelt felt TIDSØyeblikk erstattes av to sorteringer: etter dato og etter lenke. Du kan også løse problemet gjennom en midlertidig tabell ved å flytte den nestede spørringen til en separat spørring. For mange utgivelser har denne funksjonen eller feilen ikke blitt fikset.

Et eksempel på en funksjonsfeil forespørsel som mottar det sist postede dokumentet for den angitte motparten (eller rettere sagt, den tabellformede delen av dokumentet):

VELGE

Forbruksvarer. Linjenummer,

ConsumableProducts.Product,

Forbruksvarer. Antall,

Pris for forbruksvarer,

Forbruksvarer.Beløp

Document.Consumable AS D

Mulige løsninger:

A) Erstatt med SORTER ETTER

BESTILL INNEN D.Dato DESK.

B) Du kan flytte den nestede spørringen til en midlertidig tabell:

Document.Consumable AS D

Og D.motpart = &motpart

////////////////////////////////////////////////////////////////////////////////

VELGE

Forbruksvarer. Linjenummer,

ConsumableProducts.Product,

Forbruksvarer. Antall,

Forbruksvarer Pris,

Forbruksvarer.Beløp

Document.Consumables.Goods AS ConsumablesGoods

C) Du kan referere til hovedtabellen i dokumentet, og først da til tabelldelen

VELG TOPP 1

Linjenummer,

Produkt,

Mengde,

Pris,

Sum

Document.Consumables AS Consumables

Expense.Counterparty = &Motpart

Og forbruksvarer. Utført

SORTER ETTER

Forbruksvarer. Tidsøyeblikk MINSK

24. Når du får tilgang til hovedtabellen til et dokument (katalog), kan du også få tilgang til dataene i den underordnede tabellen (tabelldelen). Denne muligheten kalles derereferansetabellfelt. Et eksempel på en oppgave er oppgaven med å søke etter dokumenter som inneholder et spesifikt produkt i tabelldelen.

Fordelen med denne spørringen fremfor en spørring på den nestede tabellen Receipt.Goods er at hvis det er duplikater i dokumenter, vil søkeresultatet bare returnere unike dokumenter uten å bruke nøkkelordet DIVERSE.

Sammenligne:

Dette er sannsynligvis alt som er nødvendig. Det er tydelig at det fortsatt er mange spørsmål i spørrespråket som jeg ikke har dekket. For å skrive denne artikkelen brukte jeg informasjonen jeg mottok etter å ha fullført grunnkurset 1C 8.2 spec8.ru, samt fra boken "1C 8.2 Developer's Guide" og Internett.