Aangepaste query in dynamische lijst

Naast primitieve gegevenstypen die in elke programmeertaal te vinden zijn, zijn er unieke typen in 1C. Elk van hen heeft zijn eigen eigenschappen, methoden, functies, doel en nuances van gebruik in het systeem. Een van deze typen is een dynamische lijst, die veel toegepaste taken enorm vergemakkelijkt. Daarom moeten ontwikkelaars deze universele tool kennen en kunnen hanteren.

Kenmerken van dynamische lijsten in 1C

Het doel van dit type is om informatie uit alle databasetabellen weer te geven, ongeacht het type. Het mechanisme is gemaakt op basis van SKD en heeft vergelijkbare mogelijkheden. Maar dit betekent niet dat u noodzakelijkerwijs een verzoek in de 1C-taal moet schrijven, hoewel deze mogelijkheid bestaat en moet worden benut. U kunt eenvoudig de tabel specificeren waarvan de informatie u interesseert en 1C zal zelfstandig een eenvoudige zoekopdracht genereren.

Om te zien hoe een dynamische lijst wordt gevormd en welke gegevens deze toont, moet u de beheerde formulieren openen waar deze zich in de configurator bevinden: gebruik in de lijst met details het contextmenu om de eigenschappen ervan te openen en let op de “Aangepaste lijst” Verzoek”-item. Als er geen selectievakje is, weerspiegelt de parameter “Hoofdtabel” de databasetabel waaruit de gegevens zijn gehaald. Anders weerspiegelt de dynamische lijst de gegevens van een aangepaste query, die u kunt bekijken door de lijstinstellingen te openen.

Het aangepaste queryschema wordt veel vaker gebruikt, omdat dit een uitstekende mogelijkheid biedt om een ​​grote verscheidenheid aan gegevens te combineren en weer te geven. Meestal wordt dit mechanisme gebruikt om magazijnsaldi, artikelprijzen, ontvangsten, uitgaven of aankopen weer te geven. U moet het zorgvuldig gebruiken, omdat de prestaties kunnen afnemen bij complexe zoekopdrachten.

Een andere nuttige eigenschap van een dynamische lijst wordt geopend wanneer u op de inscriptie "Lijstinstellingen" klikt. Met dit menu kunt u informatie toegankelijker en begrijpelijker maken voor eindgebruikers, zelfs als u een standaardset velden gebruikt. Ongeacht of het verzoek willekeurig is of niet, u ziet het tabblad ‘Instellingen’, waar u het volgende kunt opgeven:

  • Dynamische lijstselectie;
  • Groepen;
  • Sorteren;
  • Decor.

Het gebruik van parameters maakt dynamische lijsten universeel en behoorlijk flexibel. U kunt ze ook koppelen aan details op een beheerd formulier, en de gegevens zullen veranderen afhankelijk van de door de gebruiker geselecteerde parameters. Het gebruik van deze mechanismen kan worden begrepen en gewaardeerd door voorbeelden van problemen uit het echte leven te overwegen.

Beschouw als voorbeeld de taak om de overblijfselen van de nomenclatuur weer te geven in een gecontroleerde vorm. In de praktijk komen dergelijke orders vrij vaak voor in verschillende configuraties, en een dynamische lijst is ideaal als hulpmiddel. Voor deze taak zullen we een aangepaste query, dynamische lijstparameters en de bijbehorende instellingen moeten gebruiken.

Laten we voor meer duidelijkheid een afzonderlijke externe verwerking maken en er een dynamische lijst op plaatsen. Om onze plannen uit te voeren zal de tabel met de nomenclatuur niet voldoende zijn, dus moeten we een willekeurige vraag toestaan. Daarin beschrijven we de linkerverbinding van de directory met de lijst met items en het saldiregister en stellen we de directory in als hoofdtabel. Met dit schema kunnen gebruikers, die met een dynamische lijst werken, items toevoegen of wijzigen.



SELECT NomenclatureList.Name AS Naam, GoodsInWarehousesRemainings.Warehouse AS Magazijn, GoodsInWarehousesRemainings.QuantityRemaining AS HoeveelheidRemaining FROM Directory.Nomenclatuur AS NomenclatureList LINKS VERBINDING RegisterAccumulations.GoodsInWarehouses.Remainings(&CurrentDate,) AS GoodsOnUS treasuresRemaining software NomenclatureList.Link = ProductsInWarehouses Restanten.Nomenclatuur WAAR

Omdat ons verzoek de parameter 'CurrentDate' gebruikte, moeten we de waarde ervan instellen voordat we verwerking gebruiken. Om dit te doen, wijst u in de formuliermodule in de procedure "When CreatedOnServer" met behulp van een standaardopdracht de functie "CurrentSessionDate" toe. We moeten ook de dynamische lijst op het besturingsformulier weergeven en de volgorde van de velden wijzigen voor de duidelijkheid. Sleep het attribuut “Resterende nomenclatuur” naar de formulierelementen (linksboven) en gebruik de blauwe pijlen om de volgorde van de velden in de tabel op het formulier te wijzigen.

&Op de serverprocedure wanneer gemaakt op de server (fout, standaardverwerking) Nomenclatuur blijft behouden. Parameters. Set ParameterValue("CurrentDate", CurrentSessionDate()) EndProcedure


Al in dit stadium kunnen we onze externe verwerking in 1C openen en zien dat de dynamische lijst werkt. We kunnen naar saldi kijken, items en groepen aanmaken en zoeken. Vaak vragen klanten om de mogelijkheid toe te voegen om de datum te kiezen waarop ze saldi zullen zien. In het geval van een formulier met een dynamische lijst wordt dit bereikt door een extra veld in te stellen en daarmee parameters in te stellen.

Voeg het attribuut “DateRemaining” van het type “Date” toe en breng dit over naar de formulierelementen. In de veldgebeurtenissen maken we de gebeurtenis ‘OnChange’ en schrijven we de code voor het instellen van de parameter ‘CurrentDate’ die in het dynamische verzoek wordt gebruikt. Zodat de gebruiker bij het openen van het formulier direct begrijpt op welke datum hij de saldi ziet, zullen we kleine wijzigingen aanbrengen in de “When CreatedOnServer” procedure.



&OnServerProcedureWhenCreatingOnServer(Failure, StandardProcessing)RemainingDate = CurrentSessionDate(); Item Remains.Parameters.SetParameterValue("CurrentDate", RemainingDate); Einde van de procedure &Op de clientprocedure Remaining DateWhenChanged(Element)Nomenclatuur Remaining.Parameters.SetParameterValue("CurrentDate",RemainingDate); Einde procedure

Als gevolg hiervan kan ons Dynamische Lijst-formulier saldi van elke datum weergeven.

We hebben slechts een klein deel van de mogelijkheden van deze toolkit bekeken, maar dit is al voldoende om het gemak van dit soort dynamische lijsten te begrijpen. Een soortgelijk mechanisme wordt voor veel taken gebruikt, maar wordt meestal aangetroffen in typische configuraties in beheerde formulieren:

  1. Selectie;
  2. Lijsten.

Om een ​​dynamische lijst en de aanvraag ervan in standaard beheerde formulieren te ontvangen, moet de ontwikkelaar het gewenste formulier in de configurator openen. Zoek in het detailgedeelte de details met het gegevenstype “DynamicList” (meestal is dit vetgedrukt). De eigenschappen ervan bevatten de verzoektekst, selecties en andere instellingen.

Home Notities van door het kijkglas

21-04-2014 Dynamische lijstgegevens ontvangen

Geïmplementeerd in versie 8.3.6.1977.

We hebben de mogelijkheid geïmplementeerd om eenvoudig en gemakkelijk gegevens te verkrijgen die worden weergegeven met behulp van een dynamische lijst.

Mogelijk hebt u dynamische lijstgegevens nodig om deze in een niet-standaard, “specifieke” vorm af te drukken. Of om er bepaalde handelingen mee uit te voeren. Stuur bijvoorbeeld een brief naar alle aannemers die u op basis van bepaalde criteria in de lijst heeft geselecteerd.

Daarnaast zijn er een aantal taken waarbij de gebruiker naast de lijst met elementen ook de samenvattende gegevens wil zien die bij deze lijst horen. Als hij bijvoorbeeld producten van een bepaalde productgroep en een bepaalde leverancier heeft geselecteerd, wil hij direct het totaal aantal van dergelijke producten in de database zien.

Een dynamische lijst op zichzelf kan u deze informatie niet verschaffen. Het doel van een dynamische lijst is om snel grote hoeveelheden gegevens te kunnen bekijken. Daarom leest het de gegevens in stukjes die nodig zijn om op één of twee schermen weer te geven. En ‘weet bijvoorbeeld niets’ van de totale hoeveelheid data die hij moet tellen.

Om aanvullende informatie te krijgen die de gebruiker wil, moet u over het algemeen een databasequery uitvoeren. Precies hetzelfde als degene die in de dynamische lijst wordt gebruikt.

Vroeger kon je dit. Maar het was niet altijd gemakkelijk. Naast de tekst van het oorspronkelijke verzoek waarop de dynamische lijst werkt, moest u immers alle selecties, sorteringen en andere parameters kennen die de gebruiker interactief instelde in de tabel die de gegevens weergeeft.

Nu kan dit probleem eenvoudig worden opgelost. De dynamische lijsttabel heeft nu twee nieuwe methoden:

  • GetExecutableDataCompositionSchema();
  • GetExecutableDataCompositionSettings().

U krijgt dus het gegevenslay-outschema zelf, en, belangrijker nog, alle instellingen ervan, waardoor de gebruiker de lijst precies zo ziet. Het enige wat u hoeft te doen is de lay-out programmatisch samenstellen en deze weergeven in een verzameling waarden (voor programmaverwerking) of in een spreadsheetdocument (voor weergave):

Als gevolg hiervan ontvangt u een structuur (of rapport) met kolommen en rijen die worden weergegeven in een dynamische lijsttabel.

Het belangrijke punt is dat de lay-out en instellingen die u uit de dynamische lijsttabel ontvangt, onder andere rekening houden met de zichtbaarheid van de kolommen en de toegepaste zoekopdracht. Omdat de instellingen afzonderlijk worden verkregen, kunt u de samenstelling van de velden voor uw eigen doeleinden wijzigen en bijvoorbeeld alle kolommen van de lijst verkrijgen, en niet alleen de kolommen die zichtbaar zijn voor de gebruiker.

Bij het uitvoeren naar een spreadsheetdocument is er nog een prettig moment. Over het algemeen komt het uiterlijk van het rapport overeen met het uiterlijk van de dynamische lijsttabel op het moment dat het schema en de instellingen worden ontvangen. Inclusief het voorwaardelijke ontwerp van de tafel. U heeft alleen enkele aanvullende acties nodig als u een voorwaardelijk formulierontwerp aan het rapport wilt toevoegen.

Afdrukken (Ctrl+P)

Dynamische lijst

1. Algemene informatie

Een dynamische lijst is een speciaal gegevenstype waarmee u willekeurige informatie uit databasetabellen op een formulier kunt weergeven. Om dit te doen, moet u de tabel opgeven waaruit u gegevens wilt weergeven, of de resulterende selectie beschrijven in een querytaal.
Het mechanisme is gebaseerd op een gegevenscompositiesysteem en biedt mogelijkheden voor het sorteren, selecteren, zoeken, groeperen en voorwaardelijk formatteren van de ontvangen gegevens. In dit geval is de gegevensbron een verzoek dat automatisch door het systeem wordt gegenereerd (op basis van de opgegeven gegevens) of handmatig door de ontwikkelaar wordt geschreven.

Rijst. 1. Opties voor het maken van een dynamische lijst

Bij het maken van formulierattributen van het type DynamischeLijst een ontwikkelaar kan op twee manieren kiezen om een ​​dataquery te vormen:
● Door de hoofdtabel op te geven - in dit geval hoeft u alleen maar de tabel (eigenschap Hoofdtabel) op te geven waarvan u gegevens wilt ontvangen, en het systeem zal automatisch een query voor de gegevens genereren (zie het rechtergedeelte in Afb. 1).
● Handmatig een verzoek genereren - hiervoor moet u de eigenschap Aangepast verzoek instellen (zie de linkerkant van figuur 1). Hierna zal het handmatig genereren van een verzoek om gegevens uit de infobase te verkrijgen beschikbaar zijn.
Een query kan gegevens uit meerdere tabellen ophalen, dus u kunt een primaire tabel opgeven. Dit is zodat de dynamische lijst kan bepalen welke gegevens primair en welke secundair zijn, en informatie correct kan selecteren en weergeven, en standaardopdrachten kan bieden. Als het echter onmogelijk is om de hoofdtabel in de query te bepalen, dan kan deze niet worden gespecificeerd, maar dan
de dynamische lijst biedt geen opdrachten die verband houden met de hoofdtabel. Bovendien zal in dit geval (zonder de hoofdtabel te specificeren) de efficiëntie van het verkrijgen van gegevens via een dynamische lijst aanzienlijk worden verminderd.
Om de prestaties te verbeteren, wordt aanbevolen dat alle joins die in een aangepaste query worden gebruikt om alleen aanvullende gegevens te verkrijgen, optioneel worden gemaakt door een querytaalextensie voor gegevenscompositie te gebruiken.
Voor een dynamische lijst, het belangrijkste vormattribuut, is het mogelijk om selectiewaarden in te stellen met behulp van een formulierparameter Selectie. Om dit te doen, is het noodzakelijk dat de naam van de structuureigenschap zich in de parameter bevindt Selectie,
viel samen met de naam van het dynamische lijstselectieveld. In dit geval wordt de waarde van de structuureigenschap ingesteld als de juiste waarde van het selectie-element. Als een array, een vaste array of een lijst met waarden wordt doorgegeven als de waarde van een element van de parameter Selectie van een dynamische lijstvorm, dan wordt een voorwaarde met de optie In Lijst toegevoegd aan de selectie, in de juiste waarde waarvan een lijst met waarden wordt geplaatst (waarnaar de array en de vaste array worden geconverteerd).
Een willekeurige query in een dynamische lijst kan een query zijn waarin een parameter wordt gebruikt om de waarde van een veld te genereren, bijvoorbeeld:

KIEZEN
KEUZE
WANNEER Levering.Coëfficiënt = 1 DAN &Presentatie
ANDERS Levering. Coëfficiënt
EINDE ALS-verhouding
VAN

Bovendien, als het type parameterwaarde verschilt van het type objectattribuut (bijvoorbeeld Rekwisieten1 heeft type Nummer en de parameterwaarde is type Lijn), en om het veld correct weer te geven, moet u de parameterwaarde expliciet naar het gewenste type casten:

KIEZEN
KEUZE
WANNEER Levering.Coëfficiënt = 1 THEN EXPRESS(&Representatie AS String(100)) ELSE Levering. Coëfficiënt
EINDE ALS-verhouding
VAN
Document.Levering van producten HOE te leveren

Als het veld waarmee de selectie wordt ingesteld, wordt uitgeschakeld met behulp van functionele opties, wordt de selectie door een dergelijk veld niet geïnstalleerd, zelfs niet als de selectiewaarde wordt doorgegeven als formulierparameters of selectieparameterkoppelingen.
Met behulp van de eigenschap Dynamische gegevens lezen geeft u aan een dynamische lijst de noodzaak aan om gegevens in kleine porties te lezen
(zie hieronder voor meer details over manieren om gegevens te verkrijgen met behulp van een dynamische lijst en datacaching). Ongeacht dit kenmerk zijn de volgende voorwaarden van toepassing:

● Als de weergavemodus is ingesteld op een hiërarchische lijst, worden alleen de gegevens van de huidige groep en de gegevens van alle bovenliggende elementen (zonder onderliggende elementen) gelezen.
● Als de boomweergavemodus is ingesteld, worden alleen gegevens van open boomknooppunten gelezen.
● Het eenmalig laden van dynamische lijstgegevens wordt niet ondersteund als hiërarchisch bladeren is ingesteld (de eigenschap Weergave is ingesteld op Boom) en de initiële boomweergave is ingesteld op Alle niveaus uitbreiden. Om gegevens te verkrijgen, worden er evenveel verzoeken aan de server gedaan als er knooppunten in de weergegeven lijst zijn.
Binnen een enkele gegevensophaling hergebruikt een dynamische lijst eerder gemaakte tijdelijke tabellen als aan de volgende voorwaarden wordt voldaan:
● De lijstbatchquery heeft geen query's na de hoofdbatchquery.
● De samenstelling van tijdelijke tabellen en de velden daarin is ongewijzigd ten opzichte van de vorige uitvoering van het batchverzoek.

In zijn werk gebruikt de dynamische lijst de waarden van de volgende eigenschappen van metadata-objectdetails:
● formaat,
● bewerkingsformaat,
● hint,
● teken voor het markeren van negatieve waarden,
● masker,
● meerregelig modusbord,
● teken van geavanceerde bewerking,
● wachtwoordmodus.
Bij het weergeven en bewerken van de selectie en parameters van het gegevenscompositiesysteem wordt het bewerkingsformaat van het overeenkomstige veld gebruikt.

2. Beperkingen en kenmerken

Houd er bij het instellen van selectie in een dynamische lijst rekening mee dat selectie geen invloed heeft op groepen als de weergavemodus voor de dynamische lijst Hiërarchische lijst of Boom is. Met “groepen” bedoelen we een element van een map of plan met karakteristieke typen waarvan de eigenschap ThisGroup is ingesteld op True.
Kwalificaties worden automatisch door een dynamische lijst toegepast op de standaardgegevens Eigenaar, Ouder, Datum, Periode en Deze groep worden toegepast
met behulp van standaard systeemtools voor gegevenscompositie. Selectie, automatisch toegepast door een dynamische lijst op sleutelvelden, kan zowel via standaardmiddelen van het datacompositiesysteem als door het direct toevoegen van voorwaarden aan de verzoektekst worden toegepast IN naar de velden van de hoofdtabel. Als resultaat van het toepassen van selecties met behulp van lay-outtools, kunnen ze zowel in geneste query's als in parameters van virtuele tabellen worden toegepast.

Bij het ontwikkelen van dynamische lijsten wordt aanbevolen om alle dynamische lijsten te testen met aangepaste query's. Tijdens het verificatieproces moet u ervoor zorgen dat als een lijstquery geneste query's of virtuele tabellen bevat en daarin velden met aliassen die overeenkomen met de aliassen van de standaarddetails Eigenaar, Bovenliggend, Datum, Periode, DezeGroep of sleutelvelden beschikbaar zijn voor selectie, dan zijn deze velden geldig en komen overeen met de standaardgegevens waarmee hun bijnaam overeenkomt. Als dit niet het geval is, moet u de aanvraag wijzigen zodat deze overeenkomt met of
de bijnaam was anders.
Als u ervoor kiest om handmatig een verzoek te genereren, worden er enkele beperkingen aan het verzoek opgelegd:
● Het gebruik van de FIRST-instructie in een dynamische lijstquery wordt niet ondersteund. Als u een selectie moet gebruiken die wordt beperkt door het aantal records in een dynamische lijst, moet u het verzoek voor het genereren van een dynamische lijst zodanig herwerken dat de feitelijke inhoud van het verzoek in een subquery wordt geplaatst en het aantal records beperken. ontvangen in deze subquery. U kunt ook een tijdelijke tabel gebruiken in plaats van een subquery.
● Selectie, sorteren en groeperen worden niet ondersteund:

  • Volgens de details van de tabelonderdelen.
  • Velden bekijken.
  • Gegevensversieveld.
  • Vooraf gedefinieerdDataName-veld.
  • Veld met tabeltype rekeningschema.
  • Veld Type verplaatsing van de accumulatieregistertabel.
  • VeldtypeWaarden van de kenmerkende typeplantabel.
  • Type veld Type;
  • Veld van het type String (onbeperkte lengte).
  • Veld van het type BinaryData.

● Sorteren en groeperen op Subconto-velden wordt niet ondersteund<НомерСубконто>en ViewSubconto<НомерСубконто>Tabellen BewegingenSubconto van het boekhoudregister.
● Groeperen op velden die querytaalexpressies zijn die aggregatiefuncties bevatten, wordt niet ondersteund.
● Wanneer de hoofdtabel is geselecteerd, heeft de dynamische lijstquery de volgende beperkingen:

  • Joins worden niet ondersteund.
  • De ORDER BY-sectie wordt niet ondersteund. U moet een query zonder hoofdtabel gebruiken of de benodigde volgorde instellen via de dynamische lijstinstellingen.

● Als een dynamische lijst wordt weergegeven als een hiërarchische lijst of boomstructuur, wordt een item niet weergegeven als een dynamische lijst, tenzij ten minste één ouder van dat item wordt weergegeven. Met andere woorden: om een ​​element van een hiërarchische lijst weer te geven, moet een dynamische lijst ook alle bovenliggende elementen van dat element bovenaan de lijst weergeven. In dit geval bedoelen we met bovenaan de lijst een van beide
het hoofdelement van het hiërarchische object dat wordt weergegeven door een dynamische lijst, of het element dat is ingesteld als de eigenschap ParentTopLevel van een formuliertabelextensie voor een dynamische lijst.

Het gebruik van de volgende tabellen als hoofdtabel van een dynamische lijst wordt niet ondersteund:

● Een tabel die geen sleutel heeft die elke tabelrecord op unieke wijze identificeert (een referentie voor objecttabellen en een recordsleutel voor registertabellen). De volgende tabellen kunnen echter worden ingesteld als de hoofdtabel van een dynamische lijst (ondanks dat ze geen sleutel hebben):

● Subcontotabel van het boekhoudregister;
● alle virtuele tabellen van het boekhoudregister, behalve de tabel MovementsSubconto;
● tabellen met constante waarden (inclusief de tabel Constanten);
● tabellen met externe gegevensbronnen zonder sleutelvelden;
● kubustabellen van externe gegevensbronnen;
● accumulatieregistertabellen:

  • revolutie tafel;
  • balans tafel;
  • tabel met omzet en saldi.

● berekeningsregistertabellen:

  • tabel met werkelijke geldigheidsduur;
  • planningsgegevens;
  • basis data.

● Tabellen met tabelvormige delen van objecten;
● Registratietabellen wijzigen (gebruikt in mechanismen voor gegevensuitwisseling);
● Volgordetabellen;
● Conversietabellen (gebruikt in periodieke afwikkelingsmechanismen).
● Een tabel die alleen in een outside join in een query wordt gebruikt.

Met andere woorden: een dynamische lijst met de opgegeven hoofdtabel zal correct werken als, als gevolg van het uitvoeren van de query,
gespecificeerd als gegevensbron, neemt het aantal rijen verkregen uit de hoofdtabel niet toe (rekening houdend met de opgelegde selectie). Als als gevolg van het uitvoeren van een zoekopdracht het aantal rijen dat door de zoekopdracht uit de hoofdtabel wordt verkregen, toeneemt, zal dit leiden tot een schending van de uniciteit van de sleutel van de records van de tabel die door de lijst worden weergegeven. In dit geval moet u het gebruik van de dynamische hoofdlijsttabel uitschakelen.
Wanneer u met een dynamische lijst werkt, moet u rekening houden met de toegangsrechten tot de gegevens die in de lijst worden weergegeven:
● Gegevens uit dynamische lijstkolommen die zijn gemarkeerd met de eigenschap Altijd gebruiken, maar waarvoor de huidige gebruiker niet over het weergaverecht beschikt, worden niet naar de client verzonden. Toegang tot gegevens van dergelijke kolommen (met behulp van de eigenschap CurrentData en de methode RowData())
aan de klantzijde niet mogelijk.
● Als de huidige gebruiker niet over het recht Bekijken beschikt voor een sleutelveld van een dynamische lijst, resulteert het ophalen van gegevens uit die dynamische lijst in een toegangsfout.
Voor een dynamische lijst die een opsommingslijst weergeeft, is er geen optie om de lijst interactief aan te passen.
De samenstelling van de kolommen en instellingen van de dynamische lijst zijn gekoppeld aan de zoekvelden met behulp van aliassen van de selectievelden. Als een alias niet expliciet is opgegeven in een query voor een selectieveld en het veld een systeemveld is, wordt de veldnaam voor de Engelse versie van de ingebouwde taal als alias gebruikt.
De opgegeven relatie betekent dat bij het wijzigen (of expliciet opgeven van een alias voor een veld waarvoor een automatische alias is gebruikt)
alias van het queryveld dat de dynamische lijstgegevens genereert, de attribuutinstellingen van de dynamische lijst zullen verloren gaan, de formulierelementen zullen de weergegeven details “verliezen”, de dynamische lijstinstellingen zullen onjuist worden, enz.
Als de gegevensbron van een dynamische lijst een tabel is (normaal of virtueel), waarmee u een selectie op periode kunt instellen, en als de gebruiker de weergaveperiode in zo'n dynamische lijst instelt (opdracht Datuminterval instellen...),
de opgegeven periodegrenzen worden ingesteld als selectiewaarden of virtuele tabelparameters. Indien door middel van taalextensie
Bij query's voor het gegevenscompositiesysteem werden de namen van de virtuele tabelparameters expliciet gespecificeerd - de parameters met de opgegeven
namen. Tabellen waarvoor het mogelijk is om de periode voor het weergeven of verwerken van gegevens te beheren:
● registertabellen (hoofd of virtueel), waarvoor het mogelijk is om op periode te selecteren (voor het berekeningsregister - op registratieperiode);
● hoofdtabellen met documenten, bedrijfsprocessen en taken;
● hoofdtabellen van documentjournalen;
● hoofdreekstabellen, reeksgrenstabellen.
De dynamische lijstqueryparameter kan een array of een lijst met waarden zijn. Als de parameter echter een lijst met waarden is, wordt alleen de eerste waarde in de lijst gebruikt als selectiewaarde. Als een dynamische lijst een query met parameters gebruikt, moet de initiële instelling van parameterwaarden worden uitgevoerd in de OnCreateOnServer-handler.
Houd bij het weergeven van dynamische lijstgegevens rekening met het volgende:
● Wanneer u de eigenschappen van een dynamische lijst programmatisch wijzigt, worden de opdrachtpanelen die aan de lijst zijn gekoppeld, niet automatisch opnieuw gevuld.
met deze dynamische lijst.
● Als meerdere velden in een groep zijn gegroepeerd met de groeperingsmodus in een cel en in de gegroepeerde velden is er een veld dat wordt weergegeven als een selectievakje, dan wordt dit selectievakje altijd als eerste weergegeven in de resulterende cel (links van de tekst).
In een dynamische lijst wordt bij het bepalen van het gegevenstype voor velden waarvan de expressies parameters, velden of letterlijke waarden bevatten, het resulterende type bepaald door de typen velden en letterlijke waarden. Als het parameterwaardetype niet is opgenomen in het resulterende gegevenstype, wordt de waarde ervan afgekapt.
In het volgende voorbeeld is het veld bijvoorbeeld van het type Nummer.

KEUZE
ALS HET EEN LEUGEN IS
DAN 5
ANDERS
&Parameter
EINDE

Als u de parameter Parameter instelt op een waarde van een ander type, krijgt de dynamische lijst voor dat veld de waarde 0 (de standaardwaarde voor het type Getal).
Als u in een dergelijke situatie een parameter van een ander type moet selecteren, wordt aanbevolen om de querytaalconstructie te gebruiken NADRUKKELIJK. Bijvoorbeeld,
als u in het bovenstaande voorbeeld een string van niet meer dan 100 tekens in de parameter moet doorgeven, dan moet u de eenvoudige indicatie van de parameter vervangen door een expressie met een expliciet type cast:

KEUZE
ALS HET EEN LEUGEN IS
DAN 5
ANDERS
EXPRESS(&Parameter AS-tekenreeks(100))
EINDE

Als de willekeurige tekst van een dynamisch lijstverzoek parameters gebruikt in de expressies van de selectievelden, moet u het type parameters expliciet aangeven met behulp van de constructie NADRUKKELIJK. In plaats van bijvoorbeeld &Nomenclatuur AS-nomenclatuur gebruik
EXPRESS(&Nomenclatuur AS Directory.Nomenclatuur) AS-nomenclatuur. Anders kan het zoeken via de zoekbalk werken
onjuist zijn of fouten veroorzaken.

3. Methoden voor het ophalen en cachen van gegevens met een dynamische lijst

Bij het verkrijgen van gegevens om weer te geven, gebruikt een dynamische lijst een van de volgende drie methoden:
1. Het lezen uit de database wordt uitgevoerd in blokken met een aantal gegevenselementen dat iets groter is dan het aantal rijen dat tegelijkertijd door de lijst wordt weergegeven (maar niet minder dan 20). Gegevens worden niet in de cache op de server opgeslagen.
2. Het lezen uit de database gebeurt in pagina's van 1.000 gegevensitems. Gegevens worden in de cache op de server opgeslagen. Hiërarchische gegevens worden in de cache opgeslagen: er worden niet meer dan 2 pagina's met elementen in de cache opgeslagen voor elke ouder. Per dynamische lijst worden niet meer dan 20 pagina's met items in het cachegeheugen opgeslagen. Caching wordt mogelijk gemaakt door een dynamische lijst voor de volgende tabellen:
● Selectiecriteria;
● Alle tabellen van het boekhoudregister, behalve de hoofdtabel en de tabel MutatiesSubconto;
● Alle accumulatieregistertabellen, behalve de hoofdtabel;
● Alle tabellen van het informatieregister, behalve de hoofdtabel;
● Alle tabellen van het rekenregister, behalve de hoofdtabel;
● Virtuele tabel met taken per uitvoerder;
● Tabellen met externe bronnen zonder sleutels;
● Kubussen van externe bronnen.

3. Het lezen uit de database gebeurt in pagina's van 1.000 elementen. Het eerste deel is gelijk aan 1 pagina. Elk volgend deel wordt met 1 pagina vergroot (wanneer het einde van het vorige voorbeeld is bereikt). Hoe dichter het “gezichtspunt” bij het einde van de weergegeven gegevens komt, hoe groter het monster uit de database wordt gelezen en uiteindelijk gelijk wordt aan alle weergegeven gegevens. Gegevens worden in de cache op de server opgeslagen. Het maximale aantal vermeldingen in de cache en dynamische lijst is 1.000.000.
Afhankelijk van wat er door de hoofdtabel van de dynamische lijst is geselecteerd en welke waarde de eigenschap Dynamisch lezen heeft, wordt een of andere methode voor het lezen van gegevens gebruikt:

● Een van de volgende tabellen is opgegeven als de waarde van de eigenschap Hoofdtabel: uitwisselingsplan, directory, lijst met documenten, documentjournaal, typen plan met kenmerken, rekeningschema, typen berekeningsplannen, bedrijfsproces, taak, tabel met bedrijfsprocespunten:



● Een van de volgende tabellen wordt opgegeven als de waarde van de eigenschap Hoofdtabel: de hoofdtabel van het informatieregister, het accumulatieregister, het boekhoudregister, het rekenregister, de virtuele tabel van het boekhoudregister MovementsSubconto:

● Dynamische leeseigenschap:
● Geïnstalleerd: methode 1 wordt gebruikt (beschrijving van methoden vindt u hierboven).
● Reset: Methode 2 wordt gebruikt (beschrijving van methoden vindt u hierboven).

● De eigenschap Hoofdtabel bevat de selectiecriteriatabel of takentabel per uitvoerder (Taken per uitvoerder):
● Sleutel die een tabelrij identificeert: Link.

● De eigenschap Hoofdtabel specificeert de virtuele tabel van het informatieregister SliceFirst of SliceLast:
● Sleutel die een tabelrij identificeert: RecordKey.
● De eigenschap Dynamisch lezen is niet van toepassing.
● Er wordt gebruik gemaakt van methode 2 (beschrijving van de methoden vindt u hierboven).

● De eigenschap Hoofdtabel is ingesteld op een van de virtuele registertabellen, behalve de hierboven genoemde:

● De eigenschap Dynamisch lezen is niet van toepassing.

● De eigenschap Hoofdtabel is niet opgegeven, er wordt een willekeurige query gebruikt:
● Sleutel die een tabelrij identificeert: Nummer.
● De eigenschap Dynamisch lezen is niet van toepassing.
● Er wordt gebruik gemaakt van methode 3 (beschrijving van de methoden vindt u hierboven).

Voor weergave worden gegevens in porties naar de cliënt overgedragen, waarvan de grootte vergelijkbaar is met de portiegrootte bij de eerste methode voor het lezen van gegevens (beschreven aan het begin van deze sectie).
Wanneer u een formulier maakt dat een dynamische lijst bevat, worden voor elke zichtbare dynamische lijst in eerste instantie 45 gegevensitems doorgegeven aan de client (als de lijst meer dan 45 items bevat). Als de dynamische lijst meer dan 45 rijen weergeeft, wordt er een extra serveroproep gedaan wanneer het formulier wordt geopend om de ontbrekende gegevensitems op te halen.

4. Dynamische lijstinstellingen

Instellingen eigenschappenlijst - als u op de hyperlink Openen klikt, wordt een formulier geopend voor het instellen van de weergave van een dynamische lijst. Het opzetten van een lijst gebeurt op dezelfde manier als soortgelijke handelingen in een datacompositiesysteem.


Rijst. 2. Voorwaardelijke styling van een dynamische lijst

Bij het instellen van een dynamische lijst in de configuratie heeft de applicatieontwikkelaar de mogelijkheid om het volgende te doen:
● stel de velden in waarop u wilt sorteren;
● beschrijf de selectie van gegevens in de lijst;
● voorwaardelijke weergave-instellingen specificeren;
● stel de velden in waarop u de gegevens wilt groeperen.
Het is zinvol om de sortering in te stellen op de ontwikkelaar als u niet tevreden bent met de standaardsortering die door het systeem is geïnstalleerd.

ADVIES. Er moet aan worden herinnerd dat een slechte selectie van sorteervelden (evenals selectie en groepering van gegevens) een negatieve invloed heeft op de efficiëntie van dynamische bemonstering.
Vanuit het oogpunt van een applicatieontwikkelaar bestaan ​​dynamische lijstinstellingen uit verschillende delen die met elkaar verbonden zijn. De belangrijkste eigenschap waarmee u de instellingen van een dynamische lijst kunt beheren is Linkerinstellingen. Dit object bevat drie sets instellingen die, wanneer het systeem draait, de uiteindelijke instellingen bepalen die op de dynamische lijst worden toegepast:
● Instellingen – instellingen gemaakt in de Configurator-modus. De eigenschap Order van de dynamische lijst biedt snelle toegang tot de eigenschap Settings.Order van de instellingenbouwer van de dynamische lijst, zodat de volgende constructies gelijkwaardig zijn:
Lijst.Order en Lijst.SettingsLinker.Settings.Order;
● Gebruikersinstellingen – dit zijn instellingen die door de gebruiker worden gewijzigd in de 1C:Enterprise-modus;
● Vaste instellingen – deze instellingen worden ingesteld vanuit de ingebouwde taal. Deze eigenschap bevat ook selectiewaarden die met behulp van de parameters naar het formulier worden overgebracht. De dynamische lijsteigenschappen Selectie, Opties en Voorwaardelijke weergave bieden snelle toegang tot de vaste instellingen van de bouwer van dynamische lijstinstellingen. Met andere woorden, deze oproepen zijn gelijkwaardig:
List.Settings Composer.FixedSettings.Selection en List.Selection.
Bij het maken van de definitieve instellingen voor een dynamische lijst worden verschillende instellingsopties als volgt gecombineerd:
● Als een bepaald type instellingen geheel als aangepast is gemarkeerd, omvatten de resulterende instellingen ook de aangepaste instellingen
(Lijst.ComposerSettings.UserSettings). Als bovendien instellingenelementen als niet-beschikbaar zijn gemarkeerd, worden deze instellingen in de resulterende instellingen van de eigenschap List.Settings Composer geplaatst. Instellingen.
● Als een bepaald type instellingen niet geheel als aangepast, maar element voor element is gemarkeerd, dan:
● Items die als aangepast zijn gemarkeerd, worden opgenomen in de resulterende instellingen van de eigenschap List.SettingsComposer.CustomSettings.
● Items die als niet-beschikbaar zijn gemarkeerd, worden opgenomen in de resulterende instellingen van de eigenschap List.SettingsComposer.Settings.
● Vaste instellingen (List.SettingsComposer.FixedSettings) worden 'as is' toegevoegd aan de resulterende instellingen. Tegelijkertijd is het onaanvaardbaar dat de vaste en gebruikersinstellingen instellingen met dezelfde naam bevatten, bijvoorbeeld een selectie met dezelfde linkerwaarde in de voorwaarde.

Als de dynamische lijstinstellingen instellingen bevatten die zijn uitgeschakeld met behulp van functionele opties, worden deze instellingen verwijderd uit de lijst met beschikbare instellingen wanneer de dynamische lijstgegevens worden opgehaald.
In het venster met dynamische lijstinstellingen bepaalt u welke instellingen beschikbaar zijn voor de gebruiker en welke niet.


Rijst. 3. Beheer opname in gebruikersinstellingen

Het selectievakje onder aan het venster (zie figuur 3) is verantwoordelijk voor het plaatsen van het hele type instellingen in de instellingen (normaal of snel). Deze functie is beschikbaar voor selectie, ordening, groepering en conditionalisatie. Als de instellingen zijn opgegeven in de bewerkingsmodus Snelle selectie, moet u in de eigenschap Gebruikersinstellingengroep van de tabel van het formulier dat de dynamische lijst weergeeft, een lege groep van het formulier opgeven waarin de elementen die zijn gekoppeld aan de snelle gebruikersinstellingen van de dynamische lijst wordt gelokaliseerd. Als de groep niet is opgegeven, worden snelle gebruikersinstellingen niet weergegeven op het formulier. Het is ook mogelijk om expliciet het maken van aangepaste instellingen aan te roepen met behulp van de ingebouwde taal met behulp van de CreateCustomSettingsFormItems() -methode van de dynamische lijstextensie.
Ook is het mogelijk om te kiezen of u specifieke instellingsitems in de gebruikersinstellingen wilt plaatsen. Deze functie is beschikbaar voor selectie- en voorwaardelijke ontwerpelementen (zie figuur 3).

Als er speciale instellingen moeten worden geladen bij het openen van een dynamische lijst, kan dit op twee manieren worden gedaan:
● Gebruik van de dynamische lijstformulierparameter UserSettings. De gegevens in deze parameter worden in de dynamische lijstinstellingen van de gebruiker geplaatst.
● Met behulp van het dynamische lijstformulier parameterUserSettingsKey. Als u deze parameter opgeeft bij het openen van een formulier, worden de gebruikersinstellingen die zich in de instellingenopslag bevinden met de opgegeven sleutel in de dynamische lijst geladen, wat het hoofdkenmerk van het formulier is.

5. Zoek in een dynamische lijst

Een dynamische lijst op het formulier biedt de mogelijkheid om interactief in de weergegeven gegevens te zoeken. Het zoeken kan worden uitgevoerd met behulp van de volgende hulpmiddelen: zoekbalk, zoekdialoog, zoeken naar de huidige waarde, gebruik maken van de zoekgeschiedenis en instellen van de periode (voor dynamische lijsten die documenten weergeven). Het zoekresultaat is een beperkte set records
een dynamische lijst (van degenen die beschikbaar zijn voor een bepaalde gebruiker) die overeenkomen met de zoekcriteria.
Om de zoekmogelijkheden van een dynamische lijst te beheren, zijn er drie tabeleigenschappen op het beheerde formulier waarin de dynamische lijst wordt weergegeven:
● Zoekreekspositie – bepaalt de positie van de zoekreeks. Kan de volgende waarden aannemen: Auto, Commandobalk, Geen, Boven, Onder.


Rijst. 4. Zoekreeks in een dynamische lijst

Als de waarde van deze eigenschap is ingesteld op Commandopaneel, wordt de zoekreeks weergegeven in het formulieropdrachtpaneel (als de dynamische lijst het hoofdvormattribuut is) of in het opdrachtpaneel dat aan de dynamische lijst is gekoppeld. De zoekbalk die in de opdrachtbalk is geplaatst, wordt altijd tegen de rechterrand van de opdrachtbalk gedrukt (samen met de knoppen rechts van de zoekbalk).
Als de eigenschap is ingesteld op Nee, staat de zoekreeks niet op het formulier en wanneer u de zoekreeks begint te typen, wordt er een dialoogvenster geopend.
Als de eigenschap is ingesteld op Top, bevindt de zoekbalk zich tussen de lijstopdrachtbalk en de tabel die de dynamische lijst weergeeft. Als de eigenschap is ingesteld op Bottom, wordt de zoekreeks onmiddellijk na de tabel geplaatst die de dynamische lijst weergeeft.


● Als de eigenschap Compatibiliteitsmodus is ingesteld op Niet gebruiken of ouder dan versie 8.3.4 – is de waarde Commandopaneel.
Ga als volgt naar de zoekregel:
● Door op de toetsencombinatie Ctrl+F te drukken;
● Muis;
● Wanneer u begint met typen in een dynamische lijst (rekening houdend met de waarde van de eigenschap SearchOnTyping van de dynamische lijst).
● Positie weergavestatus – beschrijft waar de weergavestatus wordt weergegeven: welke velden zijn doorzocht en welke waarden
gezocht in elk veld. Kan de volgende waarden aannemen: Auto, Geen, Boven, Onder


Rijst. 5. Zoek status in dynamische lijst

Als de eigenschap is ingesteld op Nee, is de weergavestatus niet aanwezig op het formulier. Als gevolg hiervan zal het mogelijk zijn om te bepalen of de zoekopdracht al dan niet is voltooid, alleen aan de hand van de beschikbaarheid van de knop Zoekopdracht annuleren.
Als de eigenschap is ingesteld op Top, bevindt de weergavestatus zich tussen de lijstopdrachtbalk en de tabel die de dynamische lijst weergeeft. Als de eigenschap is ingesteld op Bottom, wordt de weergavestatus onmiddellijk na de tabel geplaatst die de dynamische lijst weergeeft.
Als het formulier is gemaakt in 1C:Enterprise versie 8.3.4 en eerder, wordt de eigenschap ingesteld op Nee. Als het formulier is gemaakt in 1C:Enterprise versie 8.3.5 en ouder, wordt de eigenschap ingesteld op Auto. De werkelijke waarde van het onroerend goed wordt in dit geval als volgt bepaald:
● Als de eigenschap Compatibiliteitsmodus is ingesteld op Versie 8.3.4 (en lager) – waarde Nee;
● Als de eigenschap Compatibiliteitsmodus is ingesteld op Niet gebruiken of ouder dan versie 8.3.4 – waarde Top;
● Zoekbedieningspositie – Bepaalt waar de zoekbedieningsknop verschijnt. De knop opent een menu met de volgende informatie: opdrachten Zoeken op huidige waarde, Geavanceerd zoeken, Zoeken annuleren, Periode instellen (voor document- en tijdschriftlijsten) en Zoekquerygeschiedenis (laatste 5 zoekopdrachten). De eigenschap kan de volgende waarden aannemen: Auto, Geen, Commandopaneel.


Rijst. 6. Zoeken in een dynamische lijst beheren

Als de eigenschap is ingesteld op Nee, staat de zoekknop niet op het formulier (maar zijn de opdrachten wel beschikbaar via het menu Meer). De eigenschapswaarde van de opdrachtbalk plaatst een knop op de opdrachtbalk die is gekoppeld aan een tabel die een dynamische lijst weergeeft.
Als het formulier is gemaakt in 1C:Enterprise versie 8.3.4 en eerder, wordt de eigenschap ingesteld op Nee. Als het formulier is gemaakt in 1C:Enterprise versie 8.3.5 en ouder, wordt de eigenschap ingesteld op Auto. De werkelijke waarde van het onroerend goed wordt in dit geval als volgt bepaald:
● Als de eigenschap Compatibiliteitsmodus is ingesteld op Versie 8.3.4 (en lager) – waarde Nee;
● Als de eigenschap Compatibiliteitsmodus is ingesteld op Niet gebruiken of ouder dan versie 8.3.4 – is de waarde Commandopaneel;
Als er meerdere opdrachtpanelen op een formulier staan, waarvan de bron van opdrachten één tabel van het beheerde formulier is (die dynamische lijstgegevens weergeeft), dan bevinden de zoekregel en de zoekcontroleknop zich in slechts één opdrachtpaneel:
● Of in de opdrachtbalk van de dynamische lijst zelf (als automatisch aanvullen is ingeschakeld)
● Of in een van de overige commandopanelen.

Laten we eens kijken naar de kenmerken van het gebruik van zoeken in een dynamische lijst:
● Om het zoeken handiger te maken (ook qua prestaties), moet u zoeken in de volledige tekst inschakelen voor alle configuratieobjecten die als hoofdtabel van de dynamische lijst kunnen worden gebruikt. Ook moet de zoekopdracht in de volledige tekst alle details bevatten van configuratieobjecten die in een dynamische lijst kunnen worden weergegeven en waarvoor mogelijk een zoekopdracht nodig is.
Als een object wordt uitgesloten van zoeken in de volledige tekst, zal het betreffende zoekmechanisme werken, maar de prestaties van een dergelijke zoekopdracht zullen extreem laag zijn. Het wordt niet aanbevolen om te zoeken op objecten die niet zijn geïndexeerd door zoeken in de volledige tekst.
● De toepassingsoplossing moet een routinetaak hebben die regelmatig de zoekindex in de volledige tekst bijwerkt.

● Er wordt niet gezocht in alle kolommen van de dynamische lijst (en configuratieobject), maar alleen in de kolommen die in de tabel worden weergegeven.
● Zoeken in een dynamische lijst op velden van referentietypen met willekeurige representatie wordt uitgevoerd door velden waarvoor gebruikt wordt
representatievorming (zie hier). De velden in de weergave worden verkregen rekening houdend met de ViewFieldGettingProcessing()-handler van het overeenkomstige object.
● Voor dynamische lijsten met een gespecificeerde hoofdtabel wordt in de hoofdtabel gezocht in de volledige tekst. Alle niet-geïndexeerde links uit de hoofdtabel worden toegevoegd aan de full-text zoekresultaten. Het resultaat van een zoekopdracht in de volledige tekst van de hoofdtabel wordt gebruikt als selectie op basis van sleutelvelden. Er wordt ook in de volledige tekst gezocht naar velden die in de lijst uit andere tabellen worden weergegeven (als het veld en het configuratieobject zoeken in de volledige tekst gebruiken). Als zoeken in volledige tekst niet is ingeschakeld, kunnen gegevens wel worden weergegeven
gevonden, maar het zoeken zelf zal erg traag zijn.
Als er een fout optreedt bij het zoeken naar de volledige tekst, wordt de zoekopdracht uitgevoerd zonder de zoekopdracht in de volledige tekst toe te passen.
Dit kan bijvoorbeeld gebeuren bij het zoeken naar één letter en een groot aantal regels in de informatiebasis die met deze letter beginnen.
● Als voor een veld in de hoofdtabel van een dynamische lijst een selectie met het vergelijkingstype Equals wordt gebruikt, wordt bij het uitvoeren van een zoekopdracht in de volledige tekst een selectiewaarde toegevoegd aan de zoekopdracht voor deze tabel.
● De zoekreeks wordt opgesplitst in woorden. Deze partitie wordt uitgevoerd volgens de volgende regels:
● De lijn wordt onderbroken met spatie- en tabtekens als scheidingstekens.
● Vervolgens wordt elk resulterend fragment verwerkt:
● Als het fragment een datumrepresentatie is (met of zonder tijd) op basis van de huidige sessielandinstelling, dan is het woord het fragment.
● Anders wordt het fragment verder gesplitst met de tekens “,.-/\” als scheidingstekens. In dit geval wordt elk resulterend fragment van de string als een woord opgevat.

● Voor elk woord wordt een eigen set voorwaarden gevormd, die worden gecombineerd “door OR”. Deze set voorwaarden wordt gegenereerd als een volledige tekstzoekopdracht voor een bepaald woord in de tabel waaruit dit veld is verkregen ten minste één object oplevert, of als er voor dit veld geen volledige tekstzoekopdracht is uitgevoerd. De voorwaarden zijn als volgt gevormd:
● Voor een veld van het type String is de voorwaarde Veldnaam LIKE %Word%.
● Voor een veld van het type Getal heeft de voorwaarde de vorm Veldnaam=Waarde, waarbij Waarde een woord is dat is geconverteerd naar het type Getal. Als de cast niet kan worden uitgevoerd, wordt de veldzoekopdracht niet uitgevoerd.
● Het woord wordt opgezocht als een subtekenreeks in de standaard Booleaanse representatie die voor de huidige sessie is gedefinieerd. Als het zoekwoord in een weergave wordt gevonden, wordt gezocht naar de waarde die overeenkomt met de weergave waarin het woord is gevonden. In dit geval wordt bij de zoekopdracht geen gebruik gemaakt van weergaven die zijn opgegeven met de eigenschap Formulierelement Formaat.
● Voor een veld van het type Datum ziet de voorwaarde er als volgt uit: Veldnaam>=StartvanDag(Word) ANDVeldnaam<=КонецДня(Слово). Если Слово подобно дате, в которой год
aangegeven met één of twee cijfers, wordt het jaartal teruggebracht tot de huidige eeuw en wordt deze waarde toegevoegd aan de zoekvoorwaarde.
● Voor referentievelden wordt gezocht op de velden die worden gebruikt om de referentieweergave te vormen. Zoek in elk van deze velden
uitgevoerd volgens de hierboven beschreven regels. Bij de zoekopdracht worden geen velden gebruikt die worden gebruikt om een ​​aangepaste gegevensweergave te vormen.
De reeks voorwaarden voor elk woord wordt gecombineerd met “EN”.
● Voor waarden met voorloopnullen kunt u zoeken in de tekenreeks met voorloopnullen of in de opgegeven tekenreeks zonder voorloopnullen.
● Als een dynamische lijst een lijst met documenten of een documentgeschiedenis weergeeft, wordt het lijstweergave-interval dat u opgeeft ook weergegeven in het gebied van het formulier dat is gereserveerd voor het weergeven van de weergavestatus voor de gewenste dynamische lijst.
● Het commando Zoeken op huidige waarde is niet beschikbaar als de hoofdtabel van de dynamische lijst het selectiecriterium is.
● Gevonden tekenreeksfragmenten worden gemarkeerd wanneer ze in de tabel worden weergegeven.
● Er wordt slechts één zoekreeks ondersteund voor één kolom. Wanneer u een nieuwe zoekopdracht toevoegt voor een kolom waarin al wordt gezocht, wordt de zoekuitdrukking vervangen in plaats van dat de twee zoekopdrachten bij elkaar worden opgeteld.
● Als het formulier geen formulierelementtoevoeging heeft van het formulier Zoekreeksweergave die is gekoppeld aan de tabel (toevoeging van formulierelement Broneigenschap), waarbij een dynamische lijst wordt weergegeven, wordt door het indrukken van de toetscombinatie Ctrl+F het zoekdialoogvenster geopend.


Rijst. 7. Dialoogvenster Zoeken

Als het formulier een formulierelementtoevoeging bevat van de formulierzoekreeksweergave die is gekoppeld aan een tabel (toevoeging van formulierelement Broneigenschap) die een dynamische lijst weergeeft, dan moet u de opdracht Geavanceerd zoeken gebruiken om het zoekdialoogvenster te openen.
● Houd bij het gebruik van het zoekdialoogvenster rekening met de volgende punten:
● Als u het zoekdialoogvenster opent met behulp van een sneltoets, wordt de waarde van de huidige cel weergegeven in de regel Wat zoeken, en wordt de waarde van de schakelaar Hoe zoeken ingesteld op Op exacte overeenkomst.

● Het openen van het zoekdialoogvenster door direct te beginnen met het typen van een zoekreeks in de dynamische lijst leidt ertoe dat de waarde van de schakelaar Hoe zoeken wordt ingesteld op de waarde Op deel van de tekenreeks, en dat de getypte tekst terechtkomt in het veld Wat naar zoekveld.

6. De gegevens laten weergeven door een dynamische lijst

Wanneer u dynamische lijsten gebruikt, moet u mogelijk verschillende acties uitvoeren op de gegevens die momenteel door de dynamische lijst worden weergegeven, rekening houdend met de toegepaste selecties en zoekopdrachten. Dergelijke acties omvatten: het verwerken van de weergegeven informatie, bijvoorbeeld het opnieuw verzenden van geselecteerde documenten of het instellen van enkele details voor geselecteerde objecten, het genereren van een lijst met beschikbare objecten (met ontwerp, enz.), bijvoorbeeld om af te drukken of op te slaan in een spreadsheetdocument.
Om gegevens te verkrijgen die door een dynamische lijst worden weergegeven, moet u de GetExecutableDataCompositionSchema() en
GetExecutableDataCompositionSettings().
Voorbeeld van het ontvangen van gegevens:

Schema = Elements.List.GetExecutableDataCompositionSchema();
Instellingen = Items.List.GetExecutableDataCompositionSettings();
LayoutLinker = newDataCompositionLayoutLinker();
LayoutLayout = LayoutComposer.Execute(Schema, Instellingen);
CompositionProcessor = nieuweDataCompositionProcessor;
LayoutProcessor.Initialize(LayoutLayout);
OutputProcessor = Nieuwe OutputProcessorDataCompositionResultInTabularDocument;
ReturnOutputProcessor.Output(CompositieProcessor);

Gegevens in een waardenverzameling (tabel of lijst met waarden) plaatsen gaat op dezelfde manier.
Het op deze manier verkrijgen van dynamische lijstgegevens heeft een aantal kenmerken waarmee rekening moet worden gehouden bij het ontwikkelen van applicatieoplossingen:
● Het volgende tafelontwerp wordt niet ondersteund:
● Afwisselende lijnkleuren;
● Kopafbeelding;
● Foto van de kelder;
● Achtergrondkleur voettekst;
● Voettekstkleur;
● Voettekstlettertype;
● Horizontale ligging in de kelder;
● Wachtwoordmodus.
● De voorwaardelijke weergave die is opgegeven voor een beheerd formulier wordt niet ondersteund;
● Wanneer u een hiërarchische tabel in oplopende volgorde rangschikt op basis van een veld van het type Link, worden records met een lege link altijd als eerste geplaatst.

Platform 1C:Enterprise 8.2 kan op een dynamische manier met veel records in een databasetabel werken, dat wil zeggen gegevens in gedeelten lezen. Eerder in artikelen hebben we gekeken naar het mechanisme van dynamische lijsten en methoden om het werken ermee te optimaliseren.

Vandaag zullen we een niet-standaard probleem voor dynamische lijsten oplossen. We moeten het totaal berekenen met behulp van het documentkenmerk 'Bedrag' en dit weergeven in de voettekst van de lijst. Bereken op dezelfde manier de gemiddelde waarde voor het veld "Beoordeling" en geef deze ook weer in de voettekst van de dynamische lijst. Bij de berekening van de totaalvelden moet rekening worden gehouden met de selectie die de gebruiker heeft ingesteld in de instellingen van de documentenlijst.

De hele moeilijkheid ligt in het feit dat een dynamische lijst niet alle vermeldingen in één keer ontvangt, maar in gedeelten. Dienovereenkomstig kunnen we niet onmiddellijk een samenvatting krijgen van alle documenten die overeenkomen met de huidige selectie. Hoe het totaal berekenen?

Implementatie

En dus gaan we verder met het oplossen van het probleem. Laten we beginnen met het veranderen van de vorm, daarna zullen we het algoritme beschrijven voor het verkrijgen van de uiteindelijke waarden.

Vorm en interface

Laten we eerst een documentformulier voorbereiden om de resulterende velden weer te geven. Om dit te doen, voegen we twee stringdetails toe van de vorm “Beoordeling” en “Bedrag”.

In deze gegevens worden de totaalwaarden van de documenten vastgelegd.

Om de waarden van details in de voettekst van een dynamische lijst weer te geven, moet u de overeenkomstige optie inschakelen voor het bijbehorende element van het lijstformulier (zie de volgende schermafbeelding).

Nu moet u beslissen bij welke gebeurtenis de resultaten in de voettekst van de lijst worden bijgewerkt. Laten we voor het gemak van de ontwikkeling de opdracht "Bijwerken" en het bijbehorende formulierelement aan het opdrachtpaneel toevoegen. Wanneer deze opdracht wordt uitgevoerd, worden de totalen bijgewerkt.

In de testconfiguratie, die je kunt downloaden via de link aan het einde van het artikel, heb ik ook een samenvattende update-gebeurtenis toegevoegd bij het opnemen van een document. In dit geval wordt het formuliermeldingsmechanisme gebruikt. Wij zullen hier niet dieper op ingaan.

Algoritme

Het meest problematische deel blijft: je moet de totale waarden verkrijgen. Laten we als volgt te werk gaan: we zullen een verzoek indienen bij de database om de waarden van de laatste velden te verkrijgen in overeenstemming met de selectie die is ingesteld in de dynamische lijst. Het is de moeite waard om te overwegen dat de selectie een complexe voorwaarde uit groepen kan hebben.

Let op: de instellingen voor dynamische lijsten (zie screenshot hierboven) zijn gebaseerd op de mechanismen van het datacompositiesysteem (DCS). Dienovereenkomstig kunt u er op een vergelijkbare manier mee werken (programmatisch toevoegen, wijzigen, lezen, enz.).

De fasen voor het vormen van een verzoek om resultaten te verkrijgen zijn als volgt:

1. Wij ontvangen de eerste aanvraag voor de dynamische lijst.

Zoals we kunnen zien, selecteert het verzoek alle documentdetails. Om wat meer complexiteit toe te voegen, heb ik mijn eigen veld 'Beoordelingsniveau' toegevoegd, gegenereerd door de constructie 'SELECT'.

2. Wij vormen de tekst van de aanvraagvoorwaarden (sectie “WAAR”) en vervangen deze in de oorspronkelijke aanvraag.

We moeten voorwaarden toevoegen aan de ontvangen bronverzoektekst in overeenstemming met de geconfigureerde dynamische lijstselectie.

De procedure genereert, afhankelijk van het type van het doorgegeven selectie-element (groep of selectie-element), de bijbehorende voorwaardetekst. Alle voorwaarden in een groep staan ​​tussen haakjes, en de voorwaarden in de groep staan ​​ook tussen haakjes. De voorwaarden tussen expressies zijn afhankelijk van de bovenliggende groep (een “AND”-voorwaarde wordt tussen de bovenste elementen in de hiërarchie geplaatst).

Als voor een element een gebruiksvlag is ingesteld (de eigenschap "Usage"), wordt het element verwerkt. De gegenereerde tekst is ook afhankelijk van de vergelijkingsvoorwaarde (Gelijk, niet gelijk, in een lijst, etc.). De afhankelijkheid van de gegenereerde conditietekst van het type vergelijking kunt u zien in de volgende functie.

Een andere interessante functie is naar mijn mening “GetFieldTextByView”. Dit is nodig om velden die worden gevormd door querytaalexpressies te vervangen in de queryvoorwaarden. Hierboven heb ik het veld 'Beoordelingsniveau' toegevoegd aan het oorspronkelijke verzoek. Als de gebruiker deze bij de selectie gebruikt, moet de volledige expressie in de queryvoorwaarde worden vervangen. Deze functie haalt de veldtekst uit de aanvraag op basis van de representatie ervan. Voor dergelijke complexe velden wordt de volledige tekst van de expressie geretourneerd.

Zie de testconfiguratie bij het artikel voor meer informatie over het algoritme. Hieronder ziet u een screenshot van de selectie-instellingen en de daarvoor gegenereerde aanvraagvoorwaarden.

De gegenereerde voorwaardetekst wordt toegevoegd aan het oorspronkelijke dynamische lijstverzoek. Het resultaat van de query wordt in een tijdelijke tabel geplaatst.

3. We plaatsen de eerste zoekopdracht in een tijdelijke tabel en voeren groepering uit op samenvattingsvelden met de nodige aggregatiefuncties.

Ik wil u eraan herinneren dat we de gemiddelde waarde voor het veld 'Beoordeling' en het totaalbedrag voor het veld 'Bedrag' nodig hebben. We hebben al een verzoek gegenereerd waarbij rekening wordt gehouden met de selecties; het enige dat overblijft is het berekenen van de totale waarden. Dit gebeurt met het volgende verzoek:

Na het uitvoeren van het verzoek verwerken we het resulterende resultaat, sturen het terug naar de klant en schrijven het in de formuliergegevens die we eerder hebben gemaakt. Uiteindelijk kregen we de resultaten weergegeven in de voettekst van de dynamische lijst (zie de eerste schermafbeelding in het artikel).

Optimaliteit van de oplossing

Over het algemeen kan deze aanpak een negatief effect hebben op de prestaties. Als het programma bijvoorbeeld het totaal berekent zonder een vaste selectie in een dynamische lijst, kan het aantal geselecteerde records enorm zijn (bijvoorbeeld over meerdere jaren). Hierdoor kan elke update van de resultaten tientallen (!!!) seconden duren. Daarom is het zinvol om de resultaten alleen te berekenen als er sprake is van selectie. Deze voorwaarden heb ik in een testconfiguratie gesteld.

Bovendien kunnen we alleen de totalen en verzoeken aan de serverzijde berekenen. Daarom moet u de server serieus benaderen, omdat de procedure voor het bijwerken van de totalen heel vaak kan worden uitgevoerd. Stel je een kassabonnenjournaal voor in een brancheorganisatie, waar maximaal 5 bonnetjes per minuut kunnen worden ingevoerd, en maximaal 300 bonnetjes per uur. Telkens wanneer een document wordt geschreven, worden de totalen bijgewerkt. Daarom zou het redelijk zijn om het verzonden verkeer te verminderen door gebruik te maken van procedures die buiten de context vallen.

De volgende schermafbeelding toont de programmacode voor het aanroepen van een serverfunctie die buiten de context valt en die totalen retourneert.

De eerste parameter geeft de dynamische lijstselectie door, de tweede is een structuur van het type “SelectionFieldNameSelectionFieldValueType”. Houd er rekening mee dat de eerste parameter in de functie als zijn eigen waarde wordt verkregen. Waarom kan ik niet precies zeggen, maar als je de selectie als link doorgeeft, geeft het platform een ​​foutmelding dat de selectie niet gewijzigd kan worden. Alleen op deze manier werd de fout omzeild.->

Let op: door het gebruik van procedures die buiten de context vallen, kunt u de omvang van het verzonden verkeer meerdere keren verkleinen, omdat formuliergegevens niet naar de server worden verzonden, in tegenstelling tot contextgevoelige serverprocedures ("&OnServer" -richtlijn).

Conclusie

Concluderend wil ik zeggen dat deze benadering van het berekenen van totalen in een dynamische lijst onjuist is vanuit het oogpunt van ontwikkelingsmethodologie. Het zou correct zijn om het totaal via registers te verkrijgen. In het chequejournaal kunnen we bijvoorbeeld opnieuw het geldbedrag in de huidige kassa halen uit documenten of uit het overeenkomstige accumulatieregister.

Bovendien kunt u dankzij het gebruik van accumulatieregisters totalen berekenen zonder rekening te houden met selectie, omdat het systeem optimaal werkt met reeds berekende totalen van voorgaande maanden.

Niettemin vindt de in het artikel beschreven methode plaats bij het oplossen van problemen.

Bestanden om te downloaden:

Tijdens het finaliseren van configuraties komt elke 1C-programmeur dynamische lijsten tegen.
Een dynamische lijst is een interfaceobject dat wordt gebruikt om verschillende lijsten met databaseobjecten of niet-objectgegevens weer te geven: registervermeldingen.
Een dynamische lijst wordt bijvoorbeeld gebruikt om een ​​lijst met items weer te geven:

Om de mogelijkheden van een dynamische lijst te demonstreren, gaan we externe verwerking maken en het hoofdformulier toevoegen. Laten we een nieuw attribuut aan het formulier toevoegen met het type “Dynamische Lijst”. Laten we de eigenschappen ervan bekijken en kijken wat er is.
Wij zijn geïnteresseerd in de eigenschap "Aangepast verzoek". Als u dit inschakelt, worden alle mogelijkheden van een dynamische lijst getoond. We kunnen een verzoek schrijven met bijna alle mogelijkheden van de 1C: Enterprise-systeemquerytaal. Vink het vakje aan en klik op de link 'Openen':

Standaard toont onze lijst een lijst met artikelen met het totale saldo voor alle magazijnen. Om een ​​dergelijke lijst te implementeren, voegt u de volgende query toe:


Als hoofdtabel selecteren we "Directory.Nomenclatuur", hierdoor kunnen we met een dynamische lijst werken, zoals met een lijst met nomenclatuur - directory-elementen toevoegen, wijzigen en markeren voor verwijdering. Bovendien maakt het installeren van de hoofdtabel het mogelijk om gegevens dynamisch te lezen - dit betekent dat de selectie indien nodig in gedeelten wordt gemaakt.
Vervolgens moeten we formulierelementen voor onze lijst maken:

Als we onze verwerking in deze vorm proberen uit te voeren, krijgen we een foutmelding:


Om dit te elimineren, moet u een waarde instellen voor de parameter "Periode". Om dit te doen, kunt u de “SetParameterValue” -methode van de “Parameters” -verzameling van de dynamische lijst gebruiken. De methode heeft twee parameters nodig:
. "Parameter" - Type: Tekenreeks; GegevensCompositieParameter. De naam van de parameter of gegevenssamenstellingsparameter waarvan u de waarde wilt instellen;
. “Waarde” - Type: Willekeurig. De waarde die moet worden ingesteld.
Kan worden aangeroepen in de “OnCreateOnServer”-handler van het formulier:

Heeft u een vraag of heeft u hulp nodig van een adviseur?


Wij bieden de gebruiker de mogelijkheid om de periode voor het ontvangen van saldi te wijzigen. Om dit te doen, voegt u het attribuut en het daaraan gekoppelde formulierelement “Datum” toe:


In de “OnChange”-handler van het “Date”-formulierelement zullen we de “SetParameterValue”-methode aanroepen, waarbij de waarde van het bijbehorende attribuut als waarde wordt doorgegeven. Laten we op een vergelijkbare manier de procedure ‘Bij aanmaken op server’ van het formulier wijzigen. Omdat de methode beschikbaar is op de client, is het niet nodig om de server aan te roepen:


Wanneer de datum verandert, worden de saldi automatisch bijgewerkt:




Laten we aannemen dat gebruikers de huidige saldi of geplande ontvangsten willen zien. Laten we een van de implementatieopties bekijken. Laten we een vormattribuut van het Booleaanse type en een bijbehorende schakelaar toevoegen:


Wanneer u de waarde van de schakelaar wijzigt, wijzigen wij de tekst van het verzoek. Om dit te doen, gebruiken we de gebeurtenishandler “Bij wijziging” voor het formulierelement “Aantal weergeven bij ontvangst”. We moeten de eigenschap "QueryText" van de dynamische lijst wijzigen, afhankelijk van de waarde van het attribuut. Omdat deze eigenschap niet beschikbaar is op de client, moet een serverprocedure worden aangeroepen:


Resultaat van de aangebrachte wijzigingen: