Karmanov enkla logiska uttryck i 1s. Logisk verksamhet (1s företag)

Karmanov enkla logiska uttryck i 1s.  Logisk verksamhet (1s företag)
Karmanov enkla logiska uttryck i 1s. Logisk verksamhet (1s företag)

Som regel börjar studiet av vilket programmeringsspråk som helst med ett exempel på att skriva det första det enklaste programmet("Hej världen!"). Detta görs för att visuellt visa arbetet med grundläggande syntaktiska konstruktioner. Vi kommer inte att göra ett undantag från detta vanliga sätt att presentera material när vi lär oss en ny utvecklingsmiljö, och därför bör vår första artikel betraktas i samma veva. I den kommer vi att analysera i detalj svaren på följande frågor om programmering på 1C:Enterprise 8-plattformen:

  • Var och med vilken hjälp att skriva programkod i det inbyggda 1C-språket?
  • Vad har hänt mjukvarumoduler Vilka är reglerna för att arbeta med dem?
  • Vad är en variabel, hur arbetar man med den, hur och var ska den deklareras?
  • Vilka är jämförelse-, tilldelnings- och villkorsoperatorerna och hur använder du dem?
  • Booleska operationer - vad är de och hur man arbetar med dem?
  • Varför behövs slingor och hur man använder dem?

Artikeln kommer att vara användbar för alla som ännu inte är bekanta med utveckling på plattformen 1C:Enterprise 8, men som vill lära sig hur man programmerar i 1C.

Tillämplighet

Materialet är relevant för plattformen "1C:Enterprise 8"-utgåvor 8.2. och 8,3.

Variabler och operatörer

I den här artikeln börjar vi studera det inbyggda språket 1C:Enterprise 8. Körbar kod som finns i programvarumoduler.

Det finns nog Ett stort antal moduler som är designade för att hantera olika händelser.

Så, användarinloggningen behandlas i en modul, och behandlingen av användaren som klickar på en viss knapp hanteras i en helt annan.

Således beskriver varje modul beteendet hos konfigurationen vid en viss punkt. Modulen innehåller först och främst en variabeldeklaration. De där. vi kan deklarera vissa variabler i en modul.

I framtiden kan de användas i den här modulens procedurer och funktioner. Om en variabel definieras med nyckelordet Export, kommer den att vara tillgänglig utanför denna modul. Exempel på variabeldeklarationsrad:

Rem Warehouse, Division, Storekeeper Export;

Efter deklarationen av variabler finns det ett avsnitt med procedurer och funktioner.

Bakom dem finns avsnittet av huvudprogrammet, som kommer att köras vid tidpunkten för åtkomst till denna modul.

Till exempel kan du i huvudprogramdelen initiera variabler, d.v.s. ge dem några initiala värden:

Tillstånd=1;
NewExpression=2;
resultat=3;

En modul kan ses som en kombination av olika operatörer som utför olika åtgärder vi behöver.

Operatörseparatorn är tecknet ";" (semikolon). Detta tecken är ett tecken på slutet av operatören. De där. operator kan skrivas så här:

Resultat=100X200
+400
-600;

Det spelar ingen roll hur många rader uttalandet står på.

Visst är det ofta mer bekvämt och tydligare att placera operatören på en linje, men ibland är operatörerna ganska långa (antalet linjer kan rimligen nå flera tiotal).

Ett semikolon kan utelämnas i slutsatsen för en given konstruktion, till exempel en procedur. De där. följande kod kommer att fungera:

Procedur CalculateValue()

InitialValue = 100;
IntermediateValue = InitialValue / 5;
FinalValue = InitialValue+IntermediateValue

Slutprocedur

Det är dock bättre att använda semikolon i slutsatsen. Det är möjligt att bygget med tiden kommer att fortsätta, och den slutliga operatören kommer inte längre att vara slutgiltig. Vi kommer att behöva övervaka denna situation specifikt.

Variabler är utformade för att hålla ett visst värde av vilken datatyp som helst. De används för mellanlagring av information för bearbetning.

I nästan alla programvarumoduler som utför någon åtgärd finns det olika variabler. Variabeltypning efter värden i Plattform 1C:Enterprise 8 är mjuk.

Till exempel kan en variabel innehålla ett värde av en datatyp och några rader senare en annan typ:

Skapad = falskt;
Skapad = sant;
Skapad =100;

I de två första påståendena är variablernas värde booleskt och i det tredje ändras det till ett numeriskt värde. De där. skrivning beror på värdet som tilldelas denna variabel.
Variabler kan deklareras på två sätt:

  • implicit sätt (omnämnande på vänster sida av tilldelningsoperatorn beskriver den givna variabeln, nr preliminär beskrivning variabel med ordet Variabel, dvs. det finns ingen särskild variabeldeklaration).
  • explicit deklaration av variabler (Variable ControlData;). En explicit deklaration av variabler används till exempel om efterföljande överföring av denna variabel till en funktion förväntas.

För namn på variabler används den klassiska beskrivningen av identifieraren. Identifieraren består av bokstäver, siffror och understreck. En identifierare måste börja med antingen en bokstav eller ett understreck.

I det här fallet bör namnet på variabeln återspegla betydelsen av denna variabel. Variabelnamn med en bokstav (som A, B, C) är dåliga exempel. De återspeglar inte essensen av variablerna.

Exempel på korrekta variabelnamn: Räknare (inkrementerande variabel för slingan), Contractor. Om variabelnamnet innehåller flera ord, bör varje nytt ord, för tydlighetens skull, börja med en stor bokstav.

Reserverade ord, som Procedur, Funktion, Loop, EndCycle, etc., kan inte användas i variabelnamn. (dessa konstruktioner är markerade med rött i programmodulen).

Reserverade ord är inbyggda språkoperatorer och det finns en hel del av dem. Alla presenteras i Syntaxassistent.

Det bör noteras att datatyper inte är reserverade ord (till exempel Array, Boolean, True, False). Systemet kommer att uppfatta sådana variabelnamn korrekt.

För att skriva programkod spelar skiftläge ingen roll. Till exempel kan ordet Procedur skrivas med både stora och små bokstäver. Dessutom kan versaler och gemener interfolieras i ett ord.

Det spelar ingen roll för plattformen. Men enligt reglerna för gott uppförande ska början av ett ord skrivas med stor bokstav, alla andra bokstäver med små bokstäver.

Om språket. Du kan använda både ryska och engelska, och en kombination av två språk. Om det är bekvämt för någon kan du säkert använda engelska för att skriva programkod, samt kombinera ryska och engelska. Det spelar ingen roll för plattformen.

Många namn för engelska språket ganska svårt att komma ihåg. När du använder en kombination av två språk försämras programkodens läsbarhet.

booleska operationer

Jämförelseoperatorer använder ofta boolesk logik som returnerar True eller False.

Till exempel, i en villkorlig operator kan du jämföra: Om Händelse = Försäljning Då kommer algoritmen att gå längs en gren (dvs. om värdet är True), enligt False-villkoret exekveras en annan gren av algoritmen.

Villkor kan vara ganska komplexa, de kan kombineras med hjälp av följande operatorer: AND, OR och NOT. Så, för AND-operatören:

Sanning OCH Sanning = Sant;
Sant OCH Falskt = Falskt;
Falskt OCH Sant = Falskt;
Falskt OCH Falskt = Falskt.

För OR-operatorn räcker det att en av operanderna är lika med True, då blir värdet på kombinationen True. Värdet är False endast om båda operanderna är False.

NOT-operatorn inverterar helt enkelt nuvarande värde(False to Truth, Truth to False).

Genom att använda en kombination av dessa operatörer kan du bygga ganska komplexa förhållanden. När du komponerar komplexa villkorliga uttalanden, ta hänsyn till företräde.

NOT-operatorn har den högsta prioritet, följt av AND-operatorn, följt av OR-operatorn. Allt inom parentes har högsta prioritet och exekveras först.

Låt oss till exempel prioritera (exekveringssekvens) för operationerna i uttrycket ovan:

INTE(Skick1 ELLER Villkor2) OCH Villkor3 ELLER Villkor4
1.Resultat1 = (villkor1 ELLER villkor2);
2. Resultat2 = INTE Resultat1;
3. Resultat3 = Resultat2 OCH Villkor1;
4. Resultat = Resultat3 ELLER Villkor4;

Det finns en omvandlingsregel:

INTE (villkor1 ELLER skick2) = INTE skick1 OCH INTE skick2.

Man bör dock inte alltid sträva efter att förenkla uttrycket, eftersom ofta, logiskt, är det utökade uttrycket lättare att läsa.

uppdragsoperatör

Uppdragsoperatören ska inte förväxlas med jämlikhet, trots att de har samma stavning.

Principen för tilldelningsoperatorn är sådan att det vänstra värdet (variabeln på vänster sida) tilldelas värdet som är till höger om likhetstecknet. Låt oss ta ett exempel:

Variabel1 = Variabel2 = Variabel3;

Variabel1 tilldelas värdet av likhet från boolesk logik, dvs. Sant om Variable2 = Variable3, eller False annars.

När man testar positionen för en nybörjare, används ofta uppgiften: att byta ut värdena för två variabler på platser.

Detta problem löses med hjälp av uppdragsoperatören och har två lösningar.

Lösning #1 med temporär variabel:
TempVar = Variabel1;
Variabel1 = Variabel2;
Variable2 = TempVariable;

Lösning #2:
Variabel1 = Variabel1 + Variabel2;
Variabel2 = Variabel1 – Variabel2;
Variabel1 = Variabel1 – Variabel2;

Villkorlig operatör

Det finns en sådan operatör If, varefter det är nödvändigt att beskriva något tillstånd (tillståndet i sig kan vara ganska stort). Villkoret följs av ordet Then och de satser som ska utföras.

Detta kan följas av nyckelordet Else och en rad andra påståenden. Om det finns flera olika villkor kan du använda en rad nyckelord ElseIf(se exempel nedan). Hela strukturen måste kompletteras med nyckelordet EndIf följt av semikolon.

Förutom de enkla och multipla villkoren finns det en förkortad form av den villkorliga operatorn: ?(Condition, Expression1, Expression2);

Om villkoret är sant, då Uttryck 1, annars - Uttryck 2. Kodexempel: ExpensiveItem = ?(Item.Price>100000, True, False);

I praktiken, i stället för jämförelse poster med värdet Sann (Lögn) typ:

Om variabel = sant då
Och
Om variabel = Falskt då

motsvarande notation används faktiskt:

Om variabel då
Och
Om INTE Variabel då

Cykliska operatörer

För alla typer av cykel krävs en explicit indikation på slutet av denna cykel nyckelord EndCycle. Det finns flera typer av cykler.

Cykla för räknare- en cykel med ett fast antal repetitioner. Villkoret för att lämna slingan är att gränsvärdet har överskridits. Ett exempel på att använda för att beräkna värdet av A!

A = 5;
Faktoriell = 1;
För räknare = 1 i en slinga
Faktoriell = Faktoriell * Räknare;
EndCycle;

Slinga efter skick- exekveras medan villkoret är sant denna cykel. Exempel:

RemainderSum = 1000;
Ytterligare artikelpris = 243;
Kvantitet = 0;
Medan RemainingAmount>0 Cykel
Kvantitet = Kvantitet+1;
Återstående belopp = Återstående belopp - Kvantitet * Pris på ytterligare varor;
ExtraArtikelpris = ExtraArtikelpris * 0,8;
EndCycle
Kvantitet = Kvantitet-1;

Denna slinga beräknar hur många enheter av en produkt som kan köpas för ett givet belopp (1000 rubel) om, efter att ha köpt varje enhet av en produkt, dess tidigare pris multipliceras med en faktor på 0,8. Det ursprungliga priset på varorna är 243 rubel.

Ett exempel på ett misstag när nybörjare använder den här typen av loop är en evig loop, när loopvillkoret initialt är sant, men inom själva loopen förändras det inte på något sätt.

Gå igenom samlingar (ett annat namn är För varje).

Plattformen har ett ganska stort antal samlingar (detta är behållare som innehåller element av en viss typ).

Du kan iterera över elementen i en samling med en speciell typ av loop.

Till exempel, det finns en array av tal, du måste beräkna summan av alla element i arrayen:

Summa = 0;
För varje element från Array Loop
Sum=Summa+Artikel;
EndCycle;

Det finns speciella operatörer för loopar: Fortsätta Och avbryta.

Om vid någon tidpunkt i slingan exekveringen av ytterligare satser av denna slinga blir meningslös, används operatören för att återgå till början av slingan och organisera dess nästa slinga. Fortsätta.

Operatör avbryta tillåter slingan att sluta även om slingvillkoret är sant.

Detta avslutar vår första bekantskap med utvecklingen i det interna språket i 1C.

Hur är det med Hello World? Vi har väl inte skrivit det än? Ja, men ingenting hindrar dig från att göra det själv, eftersom. kunskap räcker redan. Tja, om det inte fungerar kan du titta här.

Den här artikeln är ett slags svar på publikationen "Varför 1C är dålig och varför 1C-programmerare är så ogillade". Jag har hållit på med 1C-programmering i många år och jag vill säga att de tittar snett på oss just på grund av sådana artikelförfattare. Låt oss ta en titt på vad vi har nu.

Plattform

Vi har en plattform och konfigurationer skrivna för den.

Plattformsuppdateringen ger ytterligare funktionalitet, tar bort ett antal buggar och ger naturligtvis några. I princip, enligt min personliga åsikt, är det inte rätt att gnälla över att efter att ha uppdaterat plattformen har arbetet på kontoret gått upp. För det första bör säkerhetskopiering av databas före uppdatering rädda dig från problem med databaser. Nåväl, ingen avbröt möjligheten att återvända till den gamla plattformen. Det är som att skylla på Microsoft eller friprogramförfattarna för det faktum att efter släppet av patchen / uppdateringen gick allt fel, och tanken på att göra en kopia av data slog dig inte upp. Ja, det finns problem med programvara nycklar. Men du kan använda hårdvaran (de är lite dyrare), eller så kan du installera icke-ortodoxa patchar för underhållsarbetet för att återställa kontoret till att fungera, vilket tillfälligt hjälper till att lösa problemet med nyckelns frånvaro / oförmåga. Arbetet med ett kontor med 30-40 personer är viktigare.

Konfigurationer

Här finns det var man kan ströva omkring i kritikerna, men låt oss gå i ordning.

Låt oss säga att vi har en vanlig branschorganisation och att funktionaliteten i Trade Management 10.3/11-konfigurationen räcker för oss.

Här har vi två alternativ för att använda denna mjukvaruprodukt:

1. Använd endast de grundläggande funktionerna och uppdatera varje månad när nya versioner av konfigurationen släpps.
2. Uppdatera inte alls och lägg vid behov till den funktionalitet vi behöver.

Faktum är att det andra alternativet används oftast. Konfigurationen är inställd, konfigurerad och under hela organisationens liv uppdateras den praktiskt taget inte. Maximum - utskrivna blanketter korrigeras enligt bestämmelserna. Det är i princip det. Varför ständigt lider och överför förändringar från release till release är inte klart.

Visst kan man invända och säga att organisationen har till exempel bokföring. Låt oss överväga det här alternativet.

Bokföringen behöver ständigt uppdateras på grund av förändringar i lagstiftning, skattesatser och pensionsfonder och annat vardagligt hårt arbete av revisorer.

För att överföra data mellan handel och bokföring används vanligtvis växlingsregler. Detta är någon sorts regel skriven i xml, som beskriver vilka dataobjekt som laddas ur, hur de laddas; du kan också ange ytterligare bearbetning före, efter vid tidpunkten för lossning/lastning. Om vår handelskonfiguration är oförändrad, rör vi inte uppladdningsreglerna (med sällsynta undantag, om det plötsligt har skett kardinaländringar). Vi kommer inte att ändra uppladdningsreglerna särskilt ofta heller. Faktumet om mottagande / försäljning av varor kommer alltid att överföras. Men proceduren för att beräkna skatter och annat kommer redan att beräknas i den uppdaterade bokföringen och detta kommer inte att påverka handelskonfigurationen på något sätt.

Jag tycker att det är dumt att påminna, men jag vågar ändå. Det är alltid värt att göra säkerhetskopior innan uppdateringar och ändringar. Tja, du måste erkänna, det är dumt att gnälla över att efter uppdateringen gick allt sönder och hela företaget är värt en insats. Därför att det finns inget sätt att sälja, skriva eller ringa. Alla kontakter, konton och information i databasen.

Använder 1C inom olika affärsområden

Ja, 1C är ett monopol på marknaden programvara utformad för att automatisera redovisning och leverans bokslut.

Om vi ​​pratar om småföretagssegmentet, så kan nästan alla program som är lite mer komplicerade användas för redovisning i de flesta företag. pivottabeller i excel. Redovisning av styckevaror/tjänster, redovisning av leverantörsreskontra/skulder, löneadministration. Rapportering är möjlig genom tredjepartsprogram, där de slutliga siffrorna helt enkelt körs in.
Om verksamheten är större så är 1C-konkurrenter Navision, Oracle, i mycket stora exempel är det SAP.

Men här står vi inför en annan specificitet. Vår lagstiftning ändras ganska ofta. Och utländska, om de redan är engagerade i att stödja deras relevans mjukvaruprodukter, de hänger inte alltid med i förändringarna. Eftersom antalet implementeringar av "NOT 1C-program" är litet, blir ägandekostnaden hög. Det är svårt att hitta en specialist som snabbt kan uppdatera (beroende på tillgängligheten av en uppdatering) eller konfigurera/konfigurera en befintlig mjukvaruprodukt.

1C har otvivelaktiga fördelar med anslutning av kommersiell utrustning (vågar, skannrar, terminaler, resultattavlor). Dessutom, i standardkonfigurationer, görs detta på användarnivå. Lägg till anslutning extern bearbetning Och tryckta blanketter för att utöka funktionaliteten skaffar du ytterligare rapporter utan att göra ändringar i konfigurationen. Som ett resultat, om du närmar dig korrekt, är det ingen mening att klättra "inuti" konfigurationen.

En annan sak är att det är lättare och billigare att montera en krycka, som kommer att falla av efter uppgraderingen, och sätta klienten på nålen. Vattna sedan hela tiden 1C och säg att det är så ofta de släpper det, och kommer till klienten med samma frekvens och får lite pengar av honom.

Det förefaller mig som att huvudorsaken till den negativa inställningen till 1C är att koden är öppen. Ingen har sett hur Word eller Navision skrivs, och ingen kommer att klättra dit för att lägga till sina egna knappar, som kommer att agera helt annorlunda än vad utvecklarna tänkt sig. Det är dumt att skriva att allt är uppdaterat, även det jag inte använder. Uppdatera inte modulen som ansvarar för bokmärken i webbläsaren, jag använder den inte. Eller sidhuvuden och sidfötter i Word behövs inte alls, ta bort dem från uppdateringen. Om du inte gillar det, uppdatera det inte, eller läs vad som har ändrats när du uppdaterar.

Från mig själv vill jag tillägga att jag inte är en representant för franchisetagare eller en partner. Jag har varit engagerad i redovisningsautomation för 1C i mer än 7 år. Om du är intresserad kan jag berätta mer om redovisningens krångligheter i vår tids verklighet.

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

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

Exempel på begäran:

VÄLJA
Banks.Name,
Banks.CorrectAccount
FRÅN
Katalog Banker AS Banker

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

Frågespråket är det enklaste och effektiv metod skaffa information. Som du kan se från exemplet ovan, i frågespråket, måste du överklaga med metadatanamn (är en lista över systemobjekt som utgör konfigurationen, d.v.s. kataloger, dokument, register, etc.).

Beskrivning av frågespråkskonstruktioner

Begäran struktur

För att få data räcker det att använda konstruktionerna SELECT (välj) och FRÅN (från). Den enklaste begäran som följer:

VÄLJ * FRÅN Kataloger Nomenklatur

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

Tänk på ett mer komplext och allmänt exempel:

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

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

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

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

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

I given begäran vi väljer data för fälten "Fältnamn1" och "Fältnamn1" från tabellerna "Tabellnamn1" och "Tabellnamn", tilldelar synonymer till fälten med hjälp av operatorn "HOW", ansluter dem enligt ett visst villkor "Tabellanslutningsvillkor".

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

Det sista steget är att sortera frågan med konstruktionen "ORDER BY".

Allmänna mönster

Betrakta de allmänna konstruktionerna av frågespråket 1C 8.2.

FÖRSTn

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

VÄLJ FÖRSTA 100
Banks.Name,
Banks.Code AS BIC
FRÅN
Katalog Banker AS Banker
SORTERA EFTER
Banks.Name

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

TILLÅTEN

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

Om användaren försöker läsa poster som inte är tillgängliga för honom med en fråga får han ett felmeddelande. För att undvika detta bör du använda konstruktionen "TILLÅTAT", dvs förfrågan läser endast poster som är tillåtna för den.

VÄLJ TILLÅT
RepositoryAdditionalInformation.Link
FRÅN
Katalog. Lagring av ytterligare information

OLIKA

Användningen av "ANNARNA" kommer att göra det möjligt att utesluta dubbletter av rader från att komma in i resultatet av en 1C-fråga. Duplicering innebär att alla fält i begäran matchar.

VÄLJ FÖRSTA 100
Banks.Name,
Banks.Code AS BIC
FRÅN
Katalog Banker AS Banker

TomTabell

Denna konstruktion används mycket sällan för att kombinera frågor. Vid sammanfogning kan det vara nödvändigt att ange en tom kapslad tabell i en av tabellerna. Operatören "EmptyTable" är helt rätt för detta.

Exempel från hjälp 1C 8:

VÄLJ Referensnummer, TOMTABELL.(Nom, Tov, Antal) SOM KOMPOSITION
FRÅN Document.Invoice
FÖRENA ALLA
VÄLJ Link.Number, Composition.(LineNumber, Product, Quantity)
FRÅN Document.Invoice Document.Invoice.Composition.*

ÄR INGET

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

VÄLJA
NomenclatureRef.Reference,
IsNULL(Product Remaining.QuantityRemaining,0) AS QuantityRemaining
FRÅN


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

ISNULL(InvoiceInvoiceReceived.Date, InvoiceIssued.Date)

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

Dessa konstruktioner är väldigt lika - de låter dig få en strängrepresentation önskat värde. Den enda skillnaden är att VIEW konverterar alla värden till en strängtyp, medan REF VIEW endast konverterar referensvärden. REFERENSREPRESENTATION rekommenderas att användas i datasammansättningssystemförfrågningar för optimering, såvida inte referensdatafältet är planerat att användas i filter.

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

UTTRYCKA

Express låter dig konvertera fältvärdena till önskad datatyp. Du kan konvertera ett värde till antingen en primitiv typ eller en referenstyp.

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

EXPRESS(Table of Costs.Subconto1 AS Directory.Cost Items).Typ av aktivitetFör skatteredovisning av kostnader

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

EXPRESS(Comment AS String(150))

DATUMSKILLNAD

Få 267 1C-videolektioner gratis:

Ett exempel på användning av IS NULL i en 1C-fråga:

VÄLJA FRÅN
Ref
VÄNSTER GÅ MED
programvara
VAR INTE rester av varor. Kvantitetsrester ÄR NULL

Datatypen i en fråga kan bestämmas enligt följande: med funktionerna TYPE() och VALUETYPE() eller med den logiska REFERENCE-operatorn. Dessa två funktioner liknar varandra.

Fördefinierade värden

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

Användningsexempel:

VAR

WHERE Counterparties.KindofContactInformation = Value(Enumeration.Types ofContactInformation.Phone)

VAR Kontosaldon. Redovisningskonto = Värde(Kontoplan.Självförsörjande.Vinst-Förlust)

Anslutningar

Anslutningar är av 4 typer: VÄNSTER, HÖGER, KOMPLETT, INTERN.

VÄNSTER och HÖGER GÅR MED

Joins används för att länka två tabeller med ett visst villkor. Inslag kl VÄNSTER GÅ MED genom att vi tar den första specificerade tabellen helt och binder den andra tabellen efter villkor. Fälten i den andra tabellen som inte kunde länkas av villkor är fyllda med värdet NULL.

Till exempel:

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

HÖGER JOIN på 1C-språk helt lika VÄNSTER gå med förutom en skillnad - i HÖGER GÅ MED"master"-tabellen är den andra, inte den första.

FULL ANSLUTNING

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

Till exempel:

FRÅN

FULL ANSLUTNING
Katalog Banker AS Banker

FÖRBI

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

INRE KOPPLING

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

Till exempel:

FRÅN
Katalog Motparter AS Kunder

INRE KOPPLING
Katalog Banker AS Banker

FÖRBI
Clients.Name = Banks.Name

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

Föreningar

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

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

Hur man använder INDEX BY

En punkt bör dock beaktas. Att bygga ett index på en tillfällig tabell tar också tid att slutföra. Därför är det tillrådligt att använda ” ”-konstruktionen endast om det är säkert känt att det kommer att finnas fler än 1-2 poster i den tillfälliga tabellen. Annars kan effekten bli den motsatta - prestandan för indexerade fält kompenserar inte för indexuppbyggnadstiden.

VÄLJA
ValutaCurrencySliceLast.Currency AS Valuta,
ValutaCurrencySliceLast.Course
PUT Valutakurser
FRÅN
DataRegister.Currency Rates.SliceLast(&Period,) AS Currency RatesSliceLast
INDEXERA EFTER
Valuta
;
VÄLJA
PriserNomenklatur.Nomenklatur,
PriserNomenklatur.Pris,
PriserNomenklatur.valuta,
PriserCurrency.Course
FRÅN
RegisterInformation.PricesNomenclature.SliceLast(&Period,
Artikel B (&nomenklatur) OCH PriceType = &PriceType) AS Artikelpriser
VÄNSTER JOIN Valutakurser AS Valutakurser
ProgramvarupriserNomenclature.Currency = RatesCurrency.Currency

gruppering

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

Det finns följande funktioner:

Summa, Kvantitet, Antal olika, Maximum, Minimum, Average.

Exempel #1:

VÄLJA
Realisering av varor, tjänster, varor. Nomenklatur,
SUM(Försäljning av varor, tjänster, varor. Kvantitet) AS Kvantitet,
SUM(Försäljning av varor, tjänster, varor. Belopp) AS Sum
FRÅN

GRUPP AV
Realisering av varor, tjänster, varor Nomenklatur

Frågan tar emot alla rader med varor och sammanfattar dem efter kvantitet och belopp i varans sammanhang.

Exempel #2

VÄLJA
Banks.Code,
ANTAL(OLIKA banker.Referens) SOM Antal dubbletter
FRÅN
Katalog Banker AS Banker
GRUPP AV
Banks.Code

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

Resultat

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

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

VÄLJA




FRÅN
Document.Sale of GoodsServices.Goods AS Realisering av GoodsServicesGoods
SORTERA EFTER

RESULTAT
SUMMA(tal),
SUM(Amount)
FÖRBI
Nomenklatur

Frågan kommer att resultera i följande hierarkiska :

Allmänna resultat

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

VÄLJA
Realisering av varor, tjänster, varor. Nomenclature AS Nomenclature,
Realisation Varor Tjänster Varor. Referens AS Document,
Försäljning av varor, tjänster, varor. Kvantitet AS Kvantitet,
Realisering av varor av tjänster varor. Belopp AS Belopp
FRÅN
Document.Sale of GoodsServices.Goods AS Realisering av GoodsServicesGoods
SORTERA EFTER
Realisering av varor och tjänster varor, referens, datum
RESULTAT
SUMMA(tal),
SUM(Amount)
FÖRBI
ÄR VANLIGA,
Nomenklatur

Som ett resultat av att köra frågan får vi följande resultat:

I vilken 1 nivå av gruppering är aggregeringen av alla obligatoriska fält.

beställning

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

Sortering för primitiva typer (sträng, tal, boolean) följer de vanliga reglerna. För fält med referenstyper sker sortering på den interna representationen av referensen (unik identifierare), och inte på koden eller på representationen av referensen.

VÄLJA

FRÅN
Katalog Nomenklatur AS Nomenklatur
SORTERA EFTER
namn

Frågan kommer att visa en lista med namn på nomenklaturens referensbok, sorterade i alfabetisk ordning.

Automatisk arrangemang

Resultatet av en osorterad fråga är en slumpmässigt representerad uppsättning rader. Utvecklarna av 1C-plattformen garanterar inte utdata av rader i samma sekvens när de kör samma frågor.

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

VÄLJA
Nomenklatur Namn AS Namn
FRÅN
Katalog Nomenklatur AS Nomenklatur
AUTO BESTÄLLNING

Virtuella tabeller

Virtuella tabeller i 1C är en unik egenskap hos frågespråket 1C, som inte finns i andra liknande syntaxer. Virtuellt bord - snabb väg få profilinformation från register.

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

  • skär först;
  • en bit av den senare.
  • matrester;
  • omsättning;
  • saldon och omsättningar.
  • rörelser från subconto;
  • omsättning;
  • varv Dt Kt;
  • matrester;
  • saldon och omsättningar
  • subconto.
  • bas;
  • grafdata;
  • faktiska giltighetstid.

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

VÄLJA
Varor I lagerRester och omsättningar.Nomenklatur,
VarorI LagerRester Och Omsättningar.Mängd
Varor I lagerRemainsAndOmsättningar.QuantityOmsättning,
VarorI lagerresterOch omsättning.MängdInkommande,
VarorI LagerResterOch Omsättning.Mängd Förbruk
Varor På lager Återstod och omsättning. Kvantitet
FRÅN
Ackumuleringsregister. Varor i lager. Resterande och omsättningar SOM Varor i lagerrester och omsättningar

En sådan fråga låter dig snabbt få en stor mängd data.

Virtuella bordsalternativ

En mycket viktig aspekt av att arbeta med virtuella tabeller är användningen av parametrar. Virtuella bordsalternativ är specialiserade alternativ för urval och anpassning.

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

Ett exempel på användning av sådana parametrar:

Ackumuleringsregister.GoodsInWarehouses.RemainsAndTurnovers(&StartPeriod, &EndPeriod, Month, Movements ANDPeriodBorders, Nomenclature = &NecessaryNomenclature)

Algoritm för virtuella tabeller

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

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

  1. Vi får det beräknade värdet närmast efter datum och dimensioner i totaltabellen.
  2. "Lägg till" beloppet från rörelsetabellen till beloppet från totaltabellen.


Sådan enkla steg kan avsevärt förbättra systemets prestanda som helhet.

Använder frågebyggaren

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

Frågebyggaren har en ganska enkel, intuitiv tydligt gränssnitt. Låt oss ändå överväga användningen av frågekonstruktorn mer i detalj.

Frågetextkonstruktorn startas av snabbmenyn (högerklicka) på rätt plats i programkoden.

Beskrivning av 1C-frågekonstruktorn

Låt oss överväga varje flik hos designern mer i detalj. Undantaget är Builder-fliken, detta är ett ämne för en separat diskussion.

Fliken Tabeller och fält

Den här fliken anger datakällan och fälten som ska visas i rapporten. I själva verket beskrivs här konstruktioner SELECT.FROM.

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

I snabbmenyn för virtuella tabeller kan du ställa in parametrarna för den virtuella tabellen:

Fliken Länkar

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

Fliken Gruppering

På denna flik låter systemet dig gruppera och sammanfatta de önskade fälten i tabellresultatet. Användningen av GRUPPER EFTER, SUMMA, MINIMUM, AVERAGE, MAXIMUM, ANTAL, ANTAL OLIKA strukturer beskrivs.

Fliken Villkor

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

Fliken Avancerat

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

gruppering Välj Records:

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

gruppering Typ av begäran bestämmer vilken typ av fråga som kommer att vara: hämta data, skapa en temporär tabell eller förstöra en temporär tabell.

Nedanför finns en flagga Lås mottagen data för senare modifiering. Det låter dig aktivera möjligheten att ställa in datalås, vilket säkerställer säkerheten för data från det ögonblick de läses till modifierade (endast relevant för Automatiskt läge förreglingar, konstruera FÖR FÖRÄNDRING).

Fliken Joins/Alias

På den här fliken i frågedesignern kan du ställa in möjligheten att sammanfoga olika tabeller och alias (AS-konstruktionen). Tabellerna är listade på vänster sida. Om du sätter flaggorna framför bordet kommer JOIN-konstruktionen att användas, annars - JOIN ALL (skillnader mellan de två metoderna). På höger sida visas fältöverensstämmelse i olika tabeller, om en korrespondens inte anges returnerar frågan NULL.

Fliken Beställ

Här anger du sorteringsordningen för värden (ORDER BY) - fallande (DESC) eller stigande (ASC).

Det finns också en intressant flagga - Automatisk arrangemang(i frågan - AUTOORDNING). Som standard visar 1C-systemet data i en "kaotisk" ordning. Om du ställer in denna flagga kommer systemet att sortera data efter interna data.

Fliken Fråga Batch

Du kan skapa nya på fliken Frågedesign och även använda den som en navigering. I texten i begäran separeras paketen med symbolen ";" (semikolon).

Fråga-knapp i frågebyggaren

Det finns en begäran-knapp i det nedre vänstra hörnet av frågebyggaren, med vilken du kan se texten i frågan när som helst:

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


Använda frågekonsolen

Query Console - enkel och bekväm väg för att felsöka komplexa frågor och snabbt få information. I den här artikeln kommer jag att försöka beskriva hur du använder Query Console och tillhandahålla en länk för att ladda ner Query Console.

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

Ladda ner begäran konsol 1C

Först och främst, för att komma igång med frågekonsolen måste du ladda ner den någonstans. Bearbetningar är vanligtvis indelade i två typer - hanterade former och konventionella (eller ibland kallas de 8.1 och 8.2 / 8.3).

Jag försökte kombinera dessa två vyer i en bearbetning - i önskat driftläge öppnas det önskad form(i hanterat läge fungerar konsolen bara i tjockt läge).

Beskrivning av 1C-frågekonsolen

Låt oss börja vår övervägande av frågekonsolen med en beskrivning av huvudbearbetningspanelen:

I rubriken på frågekonsolen kan du se exekveringstiden för den senaste frågan med en noggrannhet på millisekunder, detta låter dig jämföra olika designs vad gäller prestanda.

Den första gruppen av knappar i kommandofältet är ansvarig för att spara aktuella förfrågningar under extern fil. Detta är mycket bekvämt, du kan alltid återgå till att skriva en komplex fråga. Eller, till exempel, lagra en lista typiska exempel en eller annan struktur.

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

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

Begär parametrar:

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

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

  • Knapp Få från förfrågan hittar automatiskt alla parametrar i begäran för att underlätta för utvecklaren.
  • Flagga Enstaka parametrar för alla förfrågningar– när den är inställd, rensar dess bearbetning inte parametrarna när man går från begäran till begäran i den allmänna listan över förfrågningar.

Ställ in en parameter som en lista med värden mycket enkelt, det räcker att klicka på knappen för värderensning (kryss) när du väljer ett parametervärde, systemet kommer att uppmana dig att välja datatyp, där du måste välja "Värdelista":

Också i topppanelen finns en knapp för att anropa frågekonsolens inställningar:

Här kan du ange alternativ för autospara och körningsalternativ för fråga.

Begärans text skrivs in i konsolens begäran fält. Detta kan göras med en enkel frågetestuppsättning eller genom att anropa ett specialverktyg - frågebyggaren.

Begäran konstruktor 1C 8 anropas från innehållsmeny (höger knapp mus) när du klickar på inmatningsfältet:

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

Request = Ny begäran;
Query.Text = ”
|VÄLJ
| Valuta.Länk
| FRÅN
| Handbok Valutor AS Valutor”;
QueryResult = Query.Execute();

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



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

Frågeoptimering

En av de viktigaste punkterna för att förbättra produktiviteten för 1C enterprise 8.3 är optimeringförfrågningar. Denna punkt är också mycket viktig för godkänd certifiering. Följande är en diskussion om typiska orsaker till optimal prestanda frågor och metoder för optimering.

Val i en virtuell tabell med WHERE-konstruktionen

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

HÖGER:

VÄLJA

FRÅN
Ackumuleringsregister. Ömsesidiga avräkningar med Insättare av Organisationer. Balans(
,
Organisation = &Organisation
OCH Individuell = &Individuell) HUR Ömsesidiga avräkningar med InsättareOrganisationerSaldon

FEL:

VÄLJA
Ömsesidiga uppgörelser med InsättareOrganisationerSaldon.BeloppBalans
FRÅN
Ackumuleringsregister. Ömsesidiga uppgörelser med organisationers insättare. Saldon(,)
VAR
Ömsesidiga uppgörelser med InsättareOrganizationsBalances.Organization = &Organisation
OCH Ömsesidiga uppgörelser med InsättareOrganisationsBalances.Individual = &Individual

Att få värdet av ett fält av en sammansatt typ genom en punkt

Vid hämtning av data av en sammansatt typ i en prickad fråga, sammanfogar systemet exakt så många tabeller som det finns möjliga typer i fältet för den sammansatta typen.

Till exempel är det högst oönskat för optimering att referera till registerfältet - registrar. Registraren har en sammansatt datatyp, bland annat finns alla möjliga typer av dokument som kan skriva data till registret.

FEL:

VÄLJA
RecordSet.Registrar.Date,
RecordSet.Number
FRÅN
Ackumuleringsregister.GoodsOrganization AS A Set Of Records

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

HÖGER:

VÄLJA
VAL
NÄR GoodsOrg.Registrar LINK Document.Sale of GoodsServices
SÄN EXPRESS(GoodsOrg.Registrar AS Document.Sale of GoodsServices).Datum
NÄR GoodsOrg.Registrar LINK Document.Receipt of GoodsServices
SEDAN EXPRESS(Goods Org. Registrar AS Document. Mottagande av varor/tjänster). Datum
SLUT SOM Datum,
GoodsOrg.Quantity
FRÅN
RegisterAccumulation.GoodsOrganizations AS GoodsOrg

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

HÖGER:

VÄLJA
GoodsOrganisations.Date,
Varor Organisationer. Kvantitet
FRÅN
RegisterAccumulation.GoodsOrganizations AS GoodsOrganizations

Underfrågor i anslutningsvillkor

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

FEL:

VÄLJ…

VÄNSTER GÅ MED (
VÄLJ FRÅN Register över information.Begränsningar
VAR …
GRUPP AV…
) FÖRBI …

HÖGER:

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

VÄLJ…
FRÅN Document.Realization of GoodsServices
LEFT JOIN Limits
FÖRBI …;

Länka poster till virtuella tabeller

Det finns situationer när systemet inte fungerar optimalt när du kopplar ett virtuellt bord till andra. I det här fallet, för att optimera prestandan för frågan, kan du försöka sätta virtuellt bord till ett temporärt, och kom ihåg att indexera de sammanfogade fälten i den tillfälliga tabellfrågan. Detta beror på det faktum att VT ofta finns i flera fysiska tabeller i DBMS, som ett resultat kompileras en underfråga för deras val, och problemet liknar föregående stycke.

Använda filter på icke-indexerade fält

Ett av de vanligaste misstagen vid sammanställning av frågor är användningen av villkor på icke-indexerade fält, detta motsäger regler för frågeoptimering. DBMS kan inte utföra frågan optimalt om frågan filtreras av icke-indexerade fält. Om en temporär tabell tas är det också nödvändigt att indexera anslutningsfälten.

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

  1. Indexet innehåller alla fält som anges i villkoret.
  2. Dessa fält är i början av indexet.
  3. Dessa val går i rad, det vill säga värden som inte deltar i frågevillkoret "kilas" inte mellan dem.

Om DBMS inte plockar upp de korrekta indexen kommer hela tabellen att skannas - detta kommer att ha en mycket negativ inverkan på prestandan och kan leda till en lång låsning av hela postuppsättningen.

Använder logiskt ELLER under förhållanden

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

En mycket användbar gratis videokurs om att utveckla och optimera frågor, rekommenderar starkt nybörjare och mer!

27.06.2017

NULL, ISNULL() och IS NULL i 1C-frågor

Vad är NULL

NULL som ett resultat av en fråga betyder det inget värde (det är det inte tomt värde, inte null, inte en nollreferens).
Till exempel, som ett resultat av sammanfogning av frågetabeller, hittades inget värde i en av tabellerna vid länkning med sammanfogningsfält. Eller så hänvisar begäran till ett icke-existerande attribut (egenskap).

NULL är inte lika med NULL!

Om du vill införa ett urval (villkor) med en kontroll för NULL i en 1C-fråga, kommer alltid en konstruktion som "WHERE VT.Field1 = NULL" att returnera LÖGN! För att kontrollera bör du använda en speciell operatör

DET ÄR NULL i 1C-förfrågan

För att testa ett värde (eller arbeta med värden) för NULL måste du använda följande konstruktion "WHERE VT.Field1 IS NULL" Eller ett annat exempel, använd i konstruktionen VAL"VAL | NÄR VT.Field1 ÄR NULL | DÅ" Det är värt att notera att funktionen att kontrollera ett fält för NULL är en av de mest resurskrävande i 1C-frågor. Därför, om du vill använda den i ett frågetillstånd, överväg om det är möjligt att ersätta en sådan check inre anslutning(en typ av join in-frågor, där endast poster som finns i båda tabellerna finns kvar i urvalet).

ISNULL()-funktionen i 1C-fråga

Fungera ÄR INGET() låter dig ersätta det saknade värdet i begärandefältet med det angivna värdet (standardvärde, stub).
Till exempel, om det inte finns någon information om kostnaden för varorna, anger vi att den är lika med 0 (noll) "SELECT | HAVE NULL(T.Price, 0) AS Price | FROM Remaining Goods AS VT"

Slutsats

Skriv frågor korrekt och optimalt. Eftersom en dålig begäran är en brake and shit-kod)

I alla programmeringsspråk finns det grenutlåtanden (villkorliga uttalanden). När, beroende på sanningen i ett visst tillstånd, en eller annan uppsättning kommandon exekveras.

I programmeringsspråket 1C tjänas detta syfte av konstruktionen

Om< Логическое выражение>Sedan //Instruktionsuppsättning 1 ElseIf< Логическое выражение>Sedan //Instruktionsuppsättning 2 Else //Instruktionsuppsättning 3 EndIf ;

Algoritmen för arbetet är ganska enkel. De logiska uttrycken som följer efter operatorerna kontrolleras i tur och ordning Om Och ElseIf. Så snart nästa logiska uttryck tar ett värde Sann uppsättningen kommandon som följer efter detta logiska uttryck exekveras. Inga fler kontroller görs och blockexekvering If...EndIf; det här tar slut. Om alla logiska uttryck har ett värde Lögn, kommer den uppsättning kommandon som följer efter satsen att köras Annat.
Design ElseIf<Логическое выражение>Sedan kan upprepas så många gånger som behövs. Det får dock inte användas alls, som operatören Annat. Det vill säga i det enklaste fallet har vi:

Om< Логическое выражение>Sedan //Command set EndIf ;

Booleska uttryck kan använda matematiska operatorer jämförelser (=, >,<, >=, <=, <>) och booleska operationer (AND, OR, NOT). Det är viktigt att förstå att ett booleskt uttryck måste återkomma heller Lögn eller Sann.

Och då blir det tydligt att booleska variabler och även funktioner kan användas som det. Här är ett par exempel:

&AtClient Funktion CheckPermissions() Returnera True ; EndFunction &AtClient GetWhatNumber() Return 1 ; EndFunction &AtClient Procedur BooleanExpressions() Failure = False ; If NOT Failure Then //Instruction Set EndIf ; If GetWhatNumber() = 1 Then //Instruction set EndIf ; If CheckPermissions() Then //Set of commands EndIf ; Slutprocedur

Tänk nu på en funktion som är kopplad till användningen av booleska operationer. Låt oss säga att vi har något sånt här:

Om< ЛогическоеВыражение_1>ELLER< ЛогическоеВыражение_2>Sedan

Det är klart att om vi BooleanExpression_1 = Sant, kontrollera sedan sanningen BooleanExpression_2 det är ingen mening, eftersom i det här fallet i alla fall BooleanExpression_1 ELLER BooleanExpression_2 = Sant. Och från och med version 8.0 gör plattformen just det, d.v.s. efterföljande logiska uttryck kommer att utvärderas endast om de redan utvärderade inte tillåter entydig bestämning av resultatet som helhet. Genom att känna till detta faktum kan du undvika fel och minska mängden kod.
Som ett exempel, låt oss titta på en vanlig situation där vi har ett attribut av en sammansatt typ och vi måste kontrollera det för fyllighet. Låt oss säga att vi har en sammansatt typ av rekvisita motpart, som kan ta typen Directory.Individuals eller Katalog.Organisationer. För tiden för detta exempel, glöm funktionen ValueFilled(). Som ni vet, när vi ännu inte har valt typen av ett sammansatt attribut är dess värde lika med Odefinierad. Således är attributet tomt när dess värde är odefinierat eller en nollreferens. Och vi kan skriva vårt tillstånd i två versioner:

// Option_1 Om entreprenör = Odefinierad ELLER entreprenör. Empty() Then Message = New MessageToUser; Meddelande. Text = "Ingen motpart har valts"; Meddelande. Att rapportera() ; EndIf ; // Alternativ_2 Om Motpart. Empty() OR Contractor = Odefinierad Then Message = New MessageToUser; Meddelande. Text = "Ingen motpart har valts"; Meddelande. Att rapportera() ; EndIf ;

Så, bara det första alternativet kommer att fungera korrekt, för när typen ännu inte har valts och värdet på attributet är lika med Odefinierad det finns ingen metod för det tömma() och det andra alternativet i det här fallet kommer att misslyckas, och i det första alternativet kommer plattformen inte att kontrollera värdet för en nollreferens om typen inte är definierad, eftersom det första villkoret kommer att räcka för henne. Som du kan se ändras ibland resultatet väldigt mycket från omarrangemanget av termerna.

I vissa fall kan du använda en förkortad notation av en konstruktion med ett villkor. Dess syntax är följande:

? (< Логическое выражение> , < ВыражениеЕслиИстина> , < ВыражениеЕслиЛожь> )

Som regel används den när det är nödvändigt att tilldela en variabel olika betydelser beroende på att något villkor är uppfyllt. Den är också bekväm att använda vid formning. Med dess hjälp kan vi till exempel följande kod:

If Failure Then MessageText = "Fel" ; Else MessageText = "Operationen avslutad"; EndIf ;

skriv bara på en rad:

MessageText = ? (Avvisning, "Fel", "Operationen avslutad") ;