1s 8.2 Selecteer de opsommingswaarde in de aanvraag. Functiewaarde
Op verzoek de opsommingswaarde wordt opgegeven via de functie Value().
Let op, dat in het verzoek de naam van het metadata-object in het enkelvoud wordt gebruikt: “Enumeration «
Bijvoorbeeld:
SELECT VALUE(Opsomming.GenderIndividuals.Male) AS-veld
Lege (niet geselecteerde) waarde:
SELECT VALUE(Enumeration.GenderIndividuals.EmptyLink) AS-veld
De systeemopsomming wordt op een vergelijkbare manier verkregen, maar zonder “Opsomming” op te geven:
SELECTEER WAARDE(MovementTypeAccumulation.Receipt) AS-veld
Snelle sprong
En niet in het verzoek?
In modulecode kunt u op twee manieren een waarde verkrijgen:
Waarde = Overdrachten.GenderIndividuals.Male; //of Waarde = PredefinedValue("Enumeration.Gender of Individuals.Male");
De tweede is universeler, omdat wordt ook &OnClient uitgevoerd. De eerste aanroep van de waarde wordt langzamer uitgevoerd en vervolgens door het systeem in de cache opgeslagen.
In 8.1 is alleen de eerste optie beschikbaar.
Gedrag van Maximum() in een enum-query
Als we het Minimum of Maximum uit de opsommingswaarde halen, toont de zoekopdracht een stabiel maar niet duidelijk resultaat:
- buiten gebruik
- niet op naam
- niet op naamlengte
- hoogstwaarschijnlijk door het interne type waarde, dat niet op eenvoudige wijze voor ons beschikbaar is, vooral niet in een verzoek
Taak
Er is een opsomming met waarden
Het is noodzakelijk om de maximale of minimale waarde in het verzoek te verkrijgen volgens de bestelling
Oplossing
In dit geval wordt de oplossing bemoeilijkt door het ontbreken van echte gegevens voor u, omdat het niet nodig was om geneste joins uit te voeren - de volgorde kan rechtstreeks uit de waarde worden verkregen
SELECTEER WAARDE (Opsomming. Soorten verzekeringsproducten. Casco) AS Veld PLACE Overboekingen COMBINE ALL SELECT WAARDE (Opsomming. Soorten verzekeringsproducten. OSAGO) COMBINE ALL SELECT WAARDE (Opsomming. Soorten verzekeringsproducten. VZR) COMBINE ALL SELECT WAARDE (Opsomming .Soorten verzekeringsproducten.GO) COMBINEER ALLES SELECTEER WAARDE (Opsomming.Soorten verzekeringsproducten.OPO) ; SELECT ScoreMin.Ref als MinByOrder, Int.MinStandard, ScoreMax.Ref als MaxByOrder, Int.MaxStandard FROM (SELECT //Bepaal het maximum voor de voorbeeldwaarden MIN(enumerations.Order) AS Min, MAXIMUM(enumerations.Order) AS Max, MIN( opsomming.Field) AS MinStandard, MAXIMUM(opsommingen.Field) AS MaxStandard FROM (SELECT //definieer de volgorde voor elke waarde van Enumeration.Field AS Field, Typen verzekeringsproducten.Order AS Order FROM Opsomming AS Opsommingen LEFT JOIN Enumeration.Typen verzekeringsproducten AS Typen verzekeringsproducten PO-nummers Veld = Typen verzekeringsproducten Link) AS-opsommingen) AS Bijlage // Met behulp van bepaalde maxima bepalen we de vereiste waarde LEFT JOIN EnumerationMax PO Insertion.Max = EstimationMax.Order LEFT JOIN Enumeration.Types verzekeringsproducten AS EstimationMin PO Insertion.Min = EstimationMin.Order
Aandacht! Dit is een inleidende versie van de les, waarvan het materiaal mogelijk onvolledig is.
Log als student in op de site
Log in als leerling om toegang te krijgen tot schoolmateriaal
Querytaal 1C 8.3 voor beginnende programmeurs: VALUE-functie
Functie BETEKENIS bedoeld voor circulatie in de verzoektekst naar systeemopsommingswaarden En vooraf gedefinieerde gegevens.
Wat zijn deze opsommingen en vooraf gedefinieerde gegevens nog meer, vraagt u zich af. Laten we alles in volgorde bespreken.
Overdrachten
Overdrachten- dit is een applicatieobject (je herinnert je dat er ook Directory's En Documenten). Waarom was hij nodig?
Het punt is dat een opsomming een bijzonder object is. In tegenstelling tot naslagwerken en documenten alle mogelijke opsommingswaarden worden gespecificeerd in de configuratiefase en kan niet verder worden gewijzigd in de gebruikersmodus.
Onveranderlijkheid is hun belangrijkste troef. Dit zijn een soort databaseconstanten.
En als de programmeur in de configuratiemodus een opsomming met de naam heeft gemaakt Vloer en betekenissen Mannelijk En Vrouwelijk, dan kan hij er bij het schrijven van een programma zeker van zijn dat de waarden van deze opsomming in de toekomst niet zullen veranderen. Daarom heeft hij vanuit code veilig toegang tot deze waarden.
Stel je voor wat er zal gebeuren als hij de directory voor deze doeleinden probeert te gebruiken?
Ten eerste zal een gebruiker het nemen en een soort "Marsvloer" toevoegen.
Ten tweede zal een andere gebruiker doorgaan en een van de bestaande geslachten verwijderen of zijn naam wijzigen.
En hierdoor zal het programma kapot gaan, want om te kunnen werken is het noodzakelijk dat er precies twee geslachten zijn en precies met de namen “Man” en “Vrouw”.
Het is voor dergelijke gevallen dat er opsommingen bestaan: om alle mogelijke varianten van waarden één keer (in de configuratiefase) rigide te specificeren en ze vervolgens in programmacode te gebruiken.
Laten we eens kijken naar een voorbeeld van een dergelijke opsomming in onze "Gastronom"-database. Je leest een proefversie van de les, volledige lessen zijn beschikbaar.
Hier is onze opsomming met de naam Vloer. Welke waarden kan het aannemen?
Er zijn slechts twee betekenissen. Met de namen "Man" en "Vrouw". Precies wat we nodig hebben.
Waar kunnen we deze opsomming in de toekomst gebruiken? Nou ja, natuurlijk, in de directory Klanten. Houd er rekening mee dat er een nieuwe prop met de naam in de lijst is verschenen Vloer en typ Telling.Geslacht:
Bij het invullen van een klantenkaart die zich al in de gebruikersmodus bevindt, kunnen we dus slechts twee waarden selecteren als het geslacht van de klant: mannelijk en vrouwelijk:
Laten we nu een query maken die klanten en hun geslacht uit de database selecteert:
Laten we nu de vraag zo veranderen dat er alleen mannen overblijven. Als we iets proberen te schrijven als:
dan krijgen we niets:
Omdat opsommingswaarden op deze manier niet toegankelijk zijn. Ze moeten toegankelijk zijn via de functie BETEKENIS:
Eén van de taken van de functie dus BETEKENIS- gebruik van opsommingswaarden in query's.
Vooraf gedefinieerde gegevens
Ik kan beter met een voorbeeld laten zien wat vooraf gedefinieerde gegevens voor mappen zijn. Je leest een proefversie van de les, volledige lessen zijn beschikbaar.
Open in onze database "Gastronom" (in de gebruikersmodus) de directory "Meeteenheden":
Bekijk de elementen eens nader. Zie je de gele cirkels naast enkele elementen? Deze elementen (die cirkels hebben) zijn dat wel vooraf gedefinieerde gegevens.
Als een element van de directory vooraf is gedefinieerd (dat wil zeggen dat er een gele cirkel op staat), is dit over het algemeen een speciaal element.
Ten eerste betekent dit dat het element in de configuratiefase door de programmeur is aangemaakt (in ons geval zijn dit elementen met codes 1, 2 en 3).
En ten tweede betekent dit dat dit element erg belangrijk is voor het functioneren van het programma. Dat een bepaalde code in de database eraan is gekoppeld (of beter gezegd aan de vooraf gedefinieerde naam).
Dat is de reden waarom het simpelweg verwijderen van zo'n element niet zal werken. Probeer het te markeren voor verwijdering:
Laten we nu naar de configuratiemodus gaan en kijken waar deze vooraf gedefinieerde elementen (in dit geval voor de map Maateenheden) worden gemaakt:
Hier zijn al onze vooraf gedefinieerde elementen voor het naslagwerk Unit of Measurement. Houd er rekening mee dat alle vooraf gedefinieerde elementen een speciale naam hebben die niet wordt weergegeven in de gebruikersmodus.
Voor een element met code 1 is deze naam Ton, bij code 2 Gram enzovoort. Deze naam wordt genoemd vooraf gedefinieerde elementnaam en het is onder deze naam dat je er toegang toe hebt via de code (of via het verzoek in ons geval).
U vraagt zich misschien af waarom het niet mogelijk was om de meeteenheden eenvoudigweg op te sommen met de elementen Ton, Gram en Pack? En dat allemaal omdat het in dit geval belangrijk voor ons is dat het referentieboek voor de maateenheid altijd enkele specifieke elementen bevat (ton, gram en verpakking), maar tegelijkertijd willen we de gebruiker niet verbieden enkele van zijn eigen elementen toe te voegen elementen (kilogram, stuk enzovoort). Je leest een proefversie van de les, volledige lessen zijn beschikbaar.
Daarom zijn vooraf gedefinieerde elementen hier zeker geschikter dan opsommingen.
En we hebben toegang tot onze vooraf gedefinieerde elementen uit het verzoek met behulp van een functie die we al kennen BETEKENIS:
Doe de test
Test starten
1. Opsommingswaarden zijn ingesteld
2. Om een lijst met magazijnen in een bedrijf op te slaan, het type
3. Om een lijst met maateenheden in een magazijn op te slaan, moet u het type
4. Om belastingtarieven op te slaan, waarvan de lijst niet door de gebruiker mag worden gewijzigd, het type
5. Gebruik de functie om toegang te krijgen tot de opsommingswaarde in een aanvraag
6. Om belastingtarieven op te slaan, waarvan de lijst door de gebruiker, het type, wordt gewijzigd
7. Voorgedefinieerde gegevens worden meegeleverd
Soms moet u de waarde van een synoniem gebruiken om de naam van een opsomming of de naam van een opsommingswaarde te vinden en het gevonden resultaat naar het EnumerationReference-type converteren. Om een dergelijk programmeerprobleem op te lossen, kunnen we opties aanbieden voor de functies die in dit artikel worden besproken. Er wordt een algoritmische methode overwogen die gebruik maakt van de 1C-taal en de querytaal.
Een opsomming is een configuratieobject met gegevenswaarden die worden beschreven door de eigenschappen Naam en Synoniem. De naam wordt gebruikt in het algoritmische deel van de configuratie, het synoniem wordt gebruikt om een representatie te verkrijgen bij het uitvoeren van objecten om elementen of afgedrukte formulieren te vormen. Een andere definitie van een opsomming zijn de zogenaamde lijsten met waarden die tijdens de configuratie worden opgegeven.
Hoe u een enum-naam op synoniem kunt krijgen
Algoritmisch gezien kunt u een verzameling opsommingen uit de configuratie halen en, door ze te doorlopen, de waarde van het synoniemattribuut vergelijken met de functieparameter en de naam van de opsomming retourneren.
Broncode van de functie EnumNameBySynonym (SynonymEnumerations):
// Retourneert de enumnaam van een bekende synoniemwaarde // Voorbeeld pSysnonym Enumerations = tekenreeks van het type "Rechtspersoon", // retourwaardenaam = "YurFizLitso", typ tekenreeks Functie EnumerationNameBySynonym ( pSynonymEnumerations ) ExportEnumerationCollection = Metagegevens. Overboekingen; Voor elke pFoundValue uit de verzameling opsommingen Loop If pFoundValue. Synoniem = pSynonymEnumerations Vervolgens wordt pFoundValue geretourneerd. Naam; eindAls; Eindcyclus; Retour ongedefinieerd; Eindfunctie
// Opsommingsnaam op synoniem
Hoe u de naam van een opsommingswaarde kunt verkrijgen als het synoniem van de waarde bekend is
Als u de opsomming kent, en het is bekend dat een van de waarden een bij ons bekend synoniem heeft, dan kunt u door de verzameling opsommingswaarden te doorlopen de naam ervan achterhalen. Door de combinatie van de opsommingsnaam en de naam van de opsommingswaarde kunt u een link naar de opsomming verkrijgen, die al gebruikt kan worden als waarde voor de details van directory's, documenten en registers.
Broncode van de functie EnumerationValueNameBySynonym(EnumerationName,ValueSynonym): // De functie retourneert de naam van het opsommingsgegevensattribuut op naam // opsomming en zijn waardesynoniem // Geaccepteerde waarden: // pNaam van opsomming - tekenreekstype. Opsommingen configuratieobjectnaam // pSynonymValues - tekenreekstype. Eigenschapswaarde Synoniem voor opsommingsgegevensattribuut // Retourwaarde:// Opsommingsgegevens attribuutnaam Functie EnumerationValueNameBySynonym ( pEnumerName, pValueSynonym ) ExportValueCollectionEnumerations = Metagegevens. Opsommingen [opsommingsnaam] . Enum-waarden;
Voor elke pFoundValue uit de verzameling ValuesEnumerations Loop If pFoundValue. Synoniem = pSynonymValues Retourneer dan pFoundValue. Naam; EndIfEndCycle; Retour ongedefinieerd; Eindfunctie
// Enum-waardenaam op synoniem
Een verwijzing naar een opsommingswaarde verkrijgen met de naam van de opsomming en met de naam van de waarde ervan
Broncode van de functie GetReferenceToEnumerationValue(EnumerationName, ValueName)
// Retourneert een EnumerationReference op basis van de "Name" van de opsomming en de "Name" van de waarde // Voorbeeld pName Transfers = "Rechtspersoon", pName Values = "Rechtspersoon", // resultaat: link naar LegalPerson.LegalPerson overbrengen // Opsommingsnaam - tekenreekstype // pName - tekenreekstype Functie GetEnumerationValueReference(EnumerationName,ValueName) Exportpoging Retourneert Opsommingen[EnumerationName] [Waardenaam]; uitzonderingsrapport("Fout bij ophalen van verwijzing naar opsommingswaarde." + Opsomming nName + " :: " + Waarde nName) ;
Retour ongedefinieerd; Eindpoging; Eindfunctie
// Haal een verwijzing op naar de Enum-waarde
Een enum-waarde gebruiken in een query
De mogelijkheid om opsommingen in query's te gebruiken verscheen in versie 8.1.5. In de educatieve versie 8.1.9.57 wordt dit beschreven in de ingebouwde hulp van de configurator in de sectie: 1C:Enterprise -> Ingebouwde taal -> Werken met queries -> Querytaal -> Vooraf gedefinieerde configuratiegegevens gebruiken.
De verzoektekst kan systeemopsommingswaarden bevatten die kunnen worden toegewezen aan velden in de databasetabellen: Accumulatieverplaatsingstype, Accounttype en Boekhoudverplaatsingstype.<ПредставлениеЗначения>)
In query's worden vooraf gedefinieerde configuratiegegevens en systeemopsommingswaarden benaderd met behulp van een letterlijk functietype:
<ИмяСистемногоПеречисления>.<Значение>
BETEKENIS(
Voor systeemopsommingen is de weergave van de waarde: Een voorbeeldverzoek kan er als volgt uitzien: Verzoek = Nieuw verzoek; ( Verzoek. Tekst =
"SELECT | Typen nomenclatuur. Link als link, | Typen nomenclatuur. Volgorde | VAN | Opsomming. Typen nomenclatuur AS Typen nomenclatuur | WAAR | Typen nomenclatuur. Link = Waarde (Opsomming. Typen nomenclatuur. Service) "
;
TZ = Nieuwe waardentabel;
Een van de belangrijkste kenmerken van opsommingen, die ze onderscheiden van mappen, is dat de set opsommingswaarden niet verandert wanneer de eindgebruiker met het programma werkt. Het configuratiealgoritme kan er bijvoorbeeld op gericht zijn dat elke client een van de twee statussen heeft: 'permanent' of 'eenmalig'. In dit geval wordt de clientstatus aangegeven door een van de opsommingswaarden te selecteren. De gebruiker kan geen nieuwe status toevoegen.
In tegenstelling tot opsommingen worden voor mappen meestal specifieke waarden ingevoerd door de gebruiker tijdens het werken met het programma, bijvoorbeeld: namen van goederen, aannemers, enz.
De 1C-querytaal is een van de belangrijkste verschillen tussen versie 7.7 en 8. Een van de belangrijkste punten bij het leren van 1C-programmeren is de querytaal. In 1C 8.3 zijn query's het krachtigste en effectiefste hulpmiddel voor het verkrijgen van gegevens. Met de zoektaal kunt u op een gemakkelijke manier informatie uit de database verkrijgen.
De syntaxis zelf doet sterk denken aan klassiek T-SQL, behalve dat je in 1C, met behulp van de querytaal, alleen gegevens kunt ontvangen met behulp van de Select-constructie. De taal ondersteunt bijvoorbeeld ook complexere constructies (verzoek binnen een verzoek). Zoekopdrachten in 1C 8 kunnen zowel in het Cyrillisch als in het Latijn worden geschreven.
In dit artikel zal ik proberen te praten over de belangrijkste trefwoorden in de 1C-querytaal:
- kiezen
- toegestaan
- verscheidene
- nadrukkelijk
- Eerst
- veranderen
- betekenis
- waardetype (en REFERENCE-operator)
- keuze
- groeperen door
- hebben
- ISNIEUW
- Ja NUL
- aansluitingen - rechts, links, intern, vol.
Evenals enkele kleine trucjes van de 1C-taal, waarmee u de verzoektekst optimaal kunt construeren.
Om query's in het 1C 8.2-systeem te debuggen, is er een speciaal hulpmiddel beschikbaar: de queryconsole. U kunt de beschrijving bekijken en downloaden via de link -.
Laten we eens kijken naar de belangrijkste en interessantste operatoren van de 1C-querytaal.
SELECTEER
In de 1C Enterprise 8-querytaal begint elke query met een trefwoord KIEZEN. In de 1C-taal zijn er geen UPDATE-, DELETE-, CREATE TABLE- en INSERT-constructies; deze manipulaties worden uitgevoerd in objecttechnologie. Het doel is om alleen gegevens te lezen.
Bijvoorbeeld:
KIEZEN
Huidige directory.naam
VAN
Directory.Nomenclatuur AS Huidige directory
De query retourneert een tabel met itemnamen.
Dichtbij de structuur KIEZEN trefwoorden kunt vinden OM TE VERANDEREN, TOEGESTAAN, VERSCHEIDENE, EERST …
TOEGESTAAN— selecteert alleen records uit de tabel waarvoor de huidige gebruiker rechten heeft.
VERSCHEIDENE— betekent dat het resultaat geen dubbele regels bevat.
SELECTIE (GEVAL)
Heel vaak wordt dit ontwerp onderschat door programmeurs. Een voorbeeld van het gebruik ervan:
Huidige directory.naam,
WANNEER Huidige Directory.Service DAN
"Dienst"
EINDE HOE TE BEKIJKENNomenclatuur
Directory.Nomenclatuur AS Huidige directory
In het voorbeeld wordt een tekstwaarde geretourneerd in het veld 'Itemtype' - 'Product' of 'Service'.
WAAR
Het ontwerp van de 1C-querytaal, waarmee u selectie op de ontvangen gegevens kunt opleggen. Houd er rekening mee dat het systeem alle gegevens van de server ontvangt en alleen dan wordt geselecteerd op basis van deze parameter.
KIEZEN
Directory.Naam
VAN
Huidige map.Nomenclatuur AS Huidige map
WAAR CurrentDirectory.Service = WAAR
In het voorbeeld selecteren we records waarvoor de waarde van het attribuut “Service” is ingesteld op “True”. In dit voorbeeld kunnen we volstaan met de volgende voorwaarde:
"WAAR IS DE DIENST"
In wezen selecteren we rijen waarin de expressie na het trefwoord gelijk is aan 'Waar'.
U kunt directe voorwaarden in expressies gebruiken:
WAAR-code = "005215"
Gebruik de operator “VALUE()” in de voorwaarden om toegang te krijgen tot vooraf gedefinieerde elementen en opsommingen in een 1C-verzoek:
WHERE Artikeltype = Waarde(Opsomming.Itemtypen.Product)
Tijdwaarden kunnen als volgt worden gespecificeerd:
WHERE Ontvangstdatum > DATETIME(2012,01,01):
Meestal worden voorwaarden opgegeven als parameters die aan de aanvraag worden doorgegeven:
Ontvang gratis 267 videolessen over 1C:
WHERE NomenclatuurGroep= &NomenclatuurGroep
Er kan een voorwaarde worden opgelegd aan het attribuuttype als het een samengesteld type is:
Als u de selectie uit een lijst met waarden of een array wilt beperken, kunt u het volgende doen:
WAAR is het accumulatieregister.
De aandoening kan ook complex zijn en uit verschillende aandoeningen bestaan:
WHERE Ontvangstdatum > DATETIME(2012,01,01) AND NomenclatureGroup= &NomenclatureGroup AND NOT Service
GROEP DOOR
Ontwerp van de 1C 8.2-querytaal die wordt gebruikt om het resultaat te groeperen.
Bijvoorbeeld:
KIEZEN
Ontvangst van goederen en diensten Goederen.
SUM(Ontvangst van GoederenDienstenGoederen.Hoeveelheid) AS Hoeveelheid,
SUM(Ontvangst van GoederenDienstenGoederen. Bedrag) AS Bedrag
VAN
Document. Ontvangst van goederen en diensten. HOE Ontvangst van goederen en dienstenGROEP DOOR
Ontvangst van GoederenDienstenGoederen.Goederen
Dit verzoek vat alle ontvangsten samen per bedrag en aantal per artikel.
Naast het trefwoord SOM U kunt andere aggregatiefuncties gebruiken: HOEVEELHEID, AANTAL VERSCHILLENDE, MAXIMUM, MINIMUM, GEMIDDELD.
HEBBEN
Een ontwerp dat vaak vergeten wordt, maar wel heel belangrijk en nuttig is. Hiermee kunt u selectie specificeren in de vorm van een aggregatiefunctie, dit kan niet in het ontwerp WAAR.
Voorbeeld van het gebruik van HAVING in een 1C-verzoek:
KIEZEN
Ontvangst van goederen en diensten Goederen.
SUM(Ontvangst van GoederenDienstenGoederen.Aantal) AS Hoeveelheid,
SUM(Ontvangst van GoederenDienstenGoederen. Bedrag) AS Bedrag
VAN
Document. Ontvangst van goederen en diensten. HOE Ontvangst van goederen en dienstenGROEP DOOR
Ontvangst van goederen en dienstengoederenSUM(Ontvangst van GoederenDienstenGoederen.Hoeveelheid) > 5
We selecteren dus het aantal producten dat meer dan 5 stuks heeft ontvangen.
BETEKENIS()
Bijvoorbeeld:
WHERE Bank = Waarde(Directory.Banks.EmptyLink)
WHERE Nomenclatuurtype = Waarde(Directory.Nomenclatuurtypen.Product)
WHERE Itemtype = Waarde(Enumeration.Item Types.Service)
TYPE in aanvraag
Het gegevenstype kan worden gecontroleerd met behulp van de functies TYPE() en VALUETYPE() of met behulp van de logische REFERENCE-operator.
NADRUKKELIJK()
De Express-operator in 1C-query's wordt gebruikt om gegevenstypen te converteren.
Syntaxis: NADRUKKELIJK(<Выражение>HOE<Тип значения>)
Hiermee kunt u tekenreekswaarden converteren naar datum- of referentiewaarden naar tekenreeksgegevens, enzovoort.
In praktische toepassingen wordt de operator Express() heel vaak gebruikt om velden van onbeperkte lengte te converteren, omdat velden van onbeperkte lengte niet kunnen worden geselecteerd, gegroepeerd, enz. Als dergelijke velden niet worden geconverteerd, krijgt u een foutmelding U kunt velden van onbeperkte lengte niet vergelijken met velden van incompatibele typen.
KIEZEN
ContactInformatie.Object,
EXPRESS(ContactInfo.Bekijk AS RIJ(150)) ALS Weergave
VAN
Register van informatie Contactgegevens HOE ContactgegevensGROEP DOOR
EXPRESS(ContactInfo.Vertegenwoordiging AS ROW(150)),
ContactInformatie.Object
ISNULL (ISNULL)
Een behoorlijk nuttige functie van de 1C-querytaal die controleert of de waarde in het record gelijk is NUL, Hierdoor kunt u deze vervangen door uw eigen waarde. Meestal gebruikt bij het verkrijgen van virtuele tabellen met saldi en omzet om te verbergen NUL en zet een duidelijke 0 (nul).
ISNULL(Belastingen vóór de maand. Toegepast FSS-voordeel, 0)
Een dergelijke functie van de 1C-querytaal ISNULL retourneert nul als er geen waarde is, wat een fout voorkomt.
MEEDOEN
Er zijn 4 soorten verbindingen: LINKS, RECHTS, COMPLEET, INTERN.
LINKER- en RECHTERVERBINDING
Joins worden gebruikt om twee tabellen te koppelen op basis van een specifieke voorwaarde. Functie wanneer LINKS AANMELDEN is dat we de eerste gespecificeerde tabel in zijn geheel nemen en de tweede tabel voorwaardelijk binden. De velden van de tweede tabel die niet door een voorwaarde konden worden gebonden, worden gevuld met de waarde NUL.
Een voorbeeld van een left join in een 1C-verzoek:
Het retourneert de volledige tabel en vult het veld “Bank” alleen in op die plaatsen waar aan de voorwaarde “Tegenpartijen.Naam = Banken.Naam” is voldaan. Als niet aan de voorwaarde wordt voldaan, wordt het veld Bank ingesteld op NUL.
RECHTS JOIN in 1C 8.3 taal absoluut vergelijkbaar LINKSE aansluiting, met uitzondering van één verschil: in RECHT VAN VERBINDING De 'hoofd'-tabel is de tweede, niet de eerste.
VOLLEDIGE VERBINDING
VOLLEDIGE VERBINDING verschilt van links en rechts doordat het alle records uit twee tabellen weergeeft en alleen de records verbindt die op voorwaarde kunnen worden verbonden.
Bijvoorbeeld:
VOLLEDIGE VERBINDING
Directory.Banken HOE BankenDOOR
De querytaal retourneert beide tabellen alleen volledig als aan de voorwaarde voor het samenvoegen van records is voldaan. In tegenstelling tot een links/rechts-join is het mogelijk dat NULL in twee velden verschijnt.
BINNENSTE VERBINDING
BINNENSTE VERBINDING verschilt van volledig doordat het alleen die records weergeeft die op basis van een bepaalde voorwaarde kunnen worden verbonden.
Bijvoorbeeld:
VAN
Directory. Tegenpartijen AS-klantenBINNENSTE VERBINDING
Directory.Banken HOE BankenDOOR
Klanten.Naam = Banken.Naam
Deze zoekopdracht levert alleen rijen op waarin de bank en de tegenpartij dezelfde naam hebben.
Conclusie
Dit is slechts een klein deel van de syntaxis van de 1C 8-querytaal. Ik zal proberen enkele punten gedetailleerder te bekijken, te laten zien en nog veel meer!
Bij het werken met queries moet elke programmeur op de een of andere manier met lege waarden omgaan. Wat bedoelen we met lege waarde?
Een nulwaarde is geen waarde of de standaardwaarde voor het gegevenstype. Bij primitieve typen is alles vrij eenvoudig: de standaardwaarde is een initiële waarde die als uitgangspunt dient.
Soorten nulwaarden
Laten we eens kijken naar de soorten lege waarden die kunnen voorkomen of vereist zijn in een query.
- Voor het type Getal is de lege waarde nul – 0.
- Voor het String-type – een lege string – “”.
- Voor het datumtype – 1 januari van het eerste jaar – 01/01/0001 00:00:00. Vanaf deze datum wordt de tijd geteld in 1C.*
- Voor het Booleaanse type is de standaardwaarde technisch gezien False, maar logischerwijs worden beide waarden van het type opgevuld. Daarom is de beslissing of een lege waarde False is of niet gebaseerd op de logica van een specifiek algoritme.
*Let op, buiten 1C zijn er verschillende datumtelsystemen met verschillende uitgangspunten.
De ontbrekende waarde komt alleen volledig overeen met het type Nul. Dit type bevat slechts één waarde, wat geen waarde aangeeft.
Gelijksoortig type Ongedefinieerd bevat ook slechts één waarde, maar Ongedefinieerd betekent niet de afwezigheid van gegevens, maar alleen de onmogelijkheid om de standaardwaarde voor het type te bepalen. Ongedefinieerd is de standaardwaarde voor samengestelde typen, inclusief typen die niet expliciet zijn gedefinieerd. Bijvoorbeeld een waarde in een nieuwe rij van een waardentabel in een kolom waarvoor het type niet expliciet is gedefinieerd.
Co referentie soorten is er veel minder onzekerheid. Alle referentietypen bieden een nulwaarde. Een lege waarde is dezelfde referentie die het gegevenstype aangeeft, maar zonder een unieke identificatie voor de specifieke waarde. Dankzij dit kunnen we een lege link behandelen alsof het een gewone link is en alle methoden van het platform erop toepassen, ermee werken alsof het een volwaardige waarde is.
Werken met nulwaarden in een query
Of u nu expliciet een null-waarde in een queryresultaat moet invoeren of bestaande waarden met een null-waarde moet vergelijken, u moet weten hoe u null-waarden in uw query moet beschrijven.
Soorten Getal, Tekenreeks, Booleaanse waarde worden in het verzoek beschreven als in de ingebouwde taal:
SELECTEER 0 AS ExempleTypeNumber, "Hallo wereld" AS ExempleTypeString, True AS ExempleTypeBooleanOngedefinieerd, dat in wezen een primitief type is, wordt op dezelfde manier beschreven:
Selecteer Batch.Period uit accumulatieregister.Batch als batch waarbij Remains.DocumentBatch = OngedefinieerdLege referentiewaarden zijn iets moeilijker te definiëren. Alle referentieobjecten hebben een vooraf gedefinieerde servicewaarde EmptyRef. Dankzij dit is het mogelijk om op één manier een lege link te selecteren - via de functie Waarde:
Selecteer Waarde(Directory.Nomenclature.EmptyLink) Nomenclatuur leegmakenDe mogelijkheden om met Null-waarden te werken zijn wat rijker. Net als andere primitieve typen wordt Null op dezelfde manier beschreven als in de ingebouwde taal. Daarnaast is er een speciale operator Is Null en een functie IsNull.
- Met de operator Is Null kunt u een logische expressie maken die de geselecteerde waarde vergelijkt met de Null-waarde.
- De functie IsNull retourneert het eerste argument als dit niet Null is, en anders het tweede argument.
Expressies die lege waarden definiëren, kunnen worden gebruikt in alle querysecties die expressies ondersteunen. U kunt bijvoorbeeld een lege link toevoegen aan de sectie Selecteren of een nulcontrole toevoegen aan de voorwaarde.
Praktische voorbeelden
De functie Waarde gebruiken
Selecteer Products.Link As Nomenclature, Products.Link = Value(Directory.Nomenclature.EmptyLink) Like ThisLinkEmpty From TueProducts As TueProductsDe operator Is Null gebruiken
Selecteer Products.Link als nomenclatuur, Products.Link is nul, zoals deze linkLeeg van TueProducts As TueProductsNul aan de linkerkant of volledige join
Controleren op nul
Het voorbeeld demonstreert een veel voorkomende praktijksituatie waarbij er bij een left join geen match is voor de eerste tabel in de tweede. In dit geval zijn alle velden van de tweede tabel Null.
Selecteer TueProducts.Link als nomenclatuur, Remains.QuantityRemaining als hoeveelheid, Remains.QuantityRemaining is nul als NoRemaining van TueProducts als TueProducts Linkse aansluiting RegisterAccumulations.ProductsInWarehouses.Remains As Remains By TueProducts.Link = Remains.NomenclatureNulwaarden verwerken
Wijziging van de vorige query om een algemene techniek te demonstreren voor het verkrijgen van enkele standaardwaarden om ontbrekende waarden te vervangen. In dit voorbeeld wordt met behulp van de functie IsNull de ontbrekende restwaarde vervangen door de logisch correcte 0.
Selecteer TueProducts.Link als nomenclatuur, IsNull (Remaining.QuantityRemaining, 0) als hoeveelheid van TueProducts als TueProducts Linkse aansluiting RegisterAccumulations.ProductsInWarehouses.Remains As Remains By TueProducts.Link = Remains.NomenclatureIn dit artikel hebben we gekeken naar verschillende soorten lege waarden en hun eigenschappen, manieren bestudeerd om verschillende soorten lege waarden in queries te definiëren, en in het praktische gedeelte waren we overtuigd van het gebruiksgemak van het besproken materiaal.