Anfragen erstellen und bearbeiten (für Anfänger). Erstellen und Arbeiten mit Abfragen (für Anfänger) Bedingung in einer 1c-Abfragebeispiele

Die Abfragesprache ist einer der grundlegenden Mechanismen von 1C 8.3 für Entwickler. Mithilfe von Abfragen können Sie alle in der Datenbank gespeicherten Daten schnell abrufen. Seine Syntax ist der von SQL sehr ähnlich, es gibt jedoch einige Unterschiede.

Die Hauptvorteile der Abfragesprache 1C 8.3 (8.2) gegenüber SQL:

  • Referenzfelder dereferenzieren (einen oder mehrere Punkte auf Objektdetails verweisen);
  • Das Arbeiten mit Ergebnissen ist sehr praktisch.
  • die Möglichkeit, virtuelle Tabellen zu erstellen;
  • die Anfrage kann sowohl auf Englisch als auch auf Russisch verfasst werden;
  • Möglichkeit, Daten zu blockieren, um Deadlocks zu vermeiden.

Nachteile der Abfragesprache in 1C:

  • im Gegensatz zu SQL erlauben Abfragen in 1C keine Änderung von Daten;
  • Mangel an gespeicherten Prozeduren;
  • Unmöglichkeit, eine Zeichenfolge in eine Zahl umzuwandeln.

Werfen wir einen Blick auf unser Mini-Tutorial zu den grundlegenden Konstrukten der 1C-Abfragesprache.

Da bei Abfragen in 1C nur Daten empfangen werden können, muss jede Abfrage mit dem Wort „SELECT“ beginnen. Nach diesem Befehl werden die Felder angegeben, aus denen Daten abgerufen werden müssen. Wenn Sie „*“ angeben, werden alle verfügbaren Felder ausgewählt. Der Ort, von dem die Daten ausgewählt werden (Dokumente, Register, Verzeichnisse usw.), wird nach dem Wort „VON“ angegeben.

Im unten besprochenen Beispiel werden die Namen der gesamten Nomenklatur aus dem Verzeichnis „Nomenklatur“ ausgewählt. Nach dem Wort „HOW“ werden Aliase (Namen) für Tabellen und Felder angegeben.

WÄHLEN
Nomenklatur. Name AS Name der Nomenklatur
AUS
Verzeichnis.Nomenklatur AS-Nomenklatur

Neben dem „SELECT“-Befehl können Sie Schlüsselwörter angeben:

  • VERSCHIEDEN. Die Abfrage wählt nur Zeilen aus, die sich in mindestens einem Feld unterscheiden (ohne Duplikate).
  • Erst ein, Wo N– die Anzahl der Zeilen vom Anfang des Ergebnisses, die ausgewählt werden müssen. Am häufigsten wird diese Konstruktion in Verbindung mit der Sortierung (ORDER BY) verwendet. Wenn Sie beispielsweise eine bestimmte Anzahl aktueller Dokumente nach Datum auswählen müssen.
  • ERLAUBT. Dieses Design ermöglicht es Ihnen, nur die Datensätze aus der Datenbank auszuwählen, die für den aktuellen Benutzer verfügbar sind. Aufgrund der Verwendung dieses Schlüsselworts erhält der Benutzer eine Fehlermeldung, wenn er versucht, Datensätze abzufragen, auf die er keinen Zugriff hat.

Diese Schlüsselwörter können zusammen oder getrennt verwendet werden.

FÜR DEN WANDEL

Dieser Vorschlag blockiert Daten, um gegenseitige Konflikte zu verhindern. Gesperrte Daten werden erst nach Abschluss der Transaktion von einer anderen Verbindung gelesen. In dieser Klausel können Sie bestimmte Tabellen angeben, die gesperrt werden müssen. Andernfalls werden alle blockiert. Das Design ist nur für den automatischen Verriegelungsmodus relevant.

Am häufigsten wird die „FOR CHANGE“-Klausel beim Erhalt von Guthaben verwendet. Denn wenn mehrere Benutzer gleichzeitig im Programm arbeiten, kann einer, während einer seine Guthaben erhält, von einem anderen geändert werden. In diesem Fall stimmt der resultierende Rest nicht mehr. Wenn Sie die Daten mit diesem Vorschlag sperren, muss der zweite Mitarbeiter warten, bis der erste Mitarbeiter den korrekten Kontostand erhält und alle erforderlichen Manipulationen damit vornimmt.

WÄHLEN
Gegenseitige Abrechnungen. Mitarbeiter,
Gegenseitige Abrechnungen. Höhe der gegenseitigen Abrechnungen. Saldo
AUS
Kumulregister. Gegenseitige Abrechnungen mit Arbeitnehmern. Salden AS Gegenseitige Abrechnungen
FÜR DEN WANDEL

WO

Das Design ist notwendig, um den hochgeladenen Daten eine Art Auswahl aufzuzwingen. In einigen Fällen ist es beim Abrufen von Daten aus Registern sinnvoller, Auswahlbedingungen in den Parametern virtueller Tabellen anzugeben. Bei Verwendung von „WHERE“ werden zuerst alle Datensätze abgerufen und erst dann die Auswahl angewendet, was die Abfrage erheblich verlangsamt.

Nachfolgend finden Sie ein Beispiel für eine Anfrage zur Vermittlung von Ansprechpartnern für eine konkrete Stelle. Der Auswahlparameter hat das Format: &ParameterName (der Parametername ist beliebig).

AUSWAHL (FALL)

Das Design ermöglicht es Ihnen, Bedingungen direkt im Hauptteil der Anfrage anzugeben.

Im folgenden Beispiel enthält das „AdditionalField“ Text, je nachdem, ob das Dokument gebucht wurde oder nicht:

WÄHLEN
ZulassungTiU.Link,
AUSWAHL
WANN ZulassungT&U.Durchgeführt
DANN „Das Dokument wurde verabschiedet!“
ELSE „Das Dokument wurde nicht gebucht...“
END AS AdditionalField
AUS
Dokument. Empfang von Waren und Dienstleistungen. WIE Empfang. AGB

VERBINDEN

Joins verknüpfen zwei Tabellen basierend auf einer bestimmten Beziehungsbedingung.

LINKS/RECHTS-VERBINDUNG

Das Wesen des LEFT-Joins besteht darin, dass die erste angegebene Tabelle vollständig übernommen wird und die zweite entsprechend der Verbindungsbedingung mit ihr verknüpft wird. Wenn in der zweiten Tabelle keine Datensätze vorhanden sind, die der ersten Tabelle entsprechen, werden NULL als Werte eingesetzt. Einfach ausgedrückt ist die Haupttabelle die erste angegebene Tabelle und die Daten der zweiten Tabelle (falls vorhanden) werden bereits durch ihre Daten ersetzt.

Beispielsweise ist es erforderlich, Artikelpositionen aus den Dokumenten „Waren- und Leistungseingang“ und Preise aus dem Informationsregister „Artikelpreise“ zu entnehmen. Wenn in diesem Fall der Preis für eine Position nicht gefunden wird, ersetzen Sie stattdessen NULL. Alle Artikel aus dem Dokument werden ausgewählt, unabhängig davon, ob sie einen Preis haben oder nicht.

WÄHLEN
Empfangsbestätigung und U.Nomenklatur,
Preise.Preis
AUS
Dokument. Empfang von Waren und Dienstleistungen. Wareneingang AGB
INTERNER JOIN RegisterInformation.PricesNomenclature.SliceLast AS Preise
Software Receipt&U.Nomenclature = Preise.Nomenclature

RECHTS ist alles genau das Gegenteil.

VOLLSTÄNDIGE VERBINDUNG

Diese Art der Verbindung unterscheidet sich von den vorherigen darin, dass als Ergebnis alle Datensätze sowohl der ersten als auch der zweiten Tabelle zurückgegeben werden. Wenn basierend auf der angegebenen Verknüpfungsbedingung keine Datensätze in der ersten oder zweiten Tabelle gefunden werden, wird stattdessen NULL zurückgegeben.

Bei Verwendung einer vollständigen Verbindung im vorherigen Beispiel werden alle Artikelpositionen aus dem Dokument „Waren- und Dienstleistungseingang“ und alle aktuellen Preise aus dem Register „Artikelpreise“ ausgewählt. Die Werte nicht gefundener Datensätze in der ersten und zweiten Tabelle sind gleich NULL.

INNER JOIN

Der Unterschied zwischen einem INNER JOIN und einem FULL JOIN besteht darin, dass die Abfrage ihn überhaupt nicht anzeigt, wenn ein Datensatz nicht in mindestens einer der Tabellen gefunden wird. Dadurch werden nur die Artikelpositionen aus dem Beleg „Waren- und Leistungseingang“ ausgewählt, für die im Informationsregister „Artikelpreise“ Einträge vorhanden sind, wenn wir im vorherigen Beispiel „VOLL“ durch „INTERN“ ersetzen.

GRUPPIERE NACH

Durch die Gruppierung in 1C-Abfragen können Sie Tabellenzeilen (Gruppierungsfelder) nach einem bestimmten gemeinsamen Merkmal (Gruppierungsfelder) reduzieren. Gruppierungsfelder können nur über Aggregatfunktionen angezeigt werden.

Das Ergebnis der folgenden Abfrage ist eine Liste von Produkttypen mit Höchstpreisen dafür.

WÄHLEN
,
MAX(Preis.Preis) AS Preis
AUS

GRUPPIERE NACH
Preise.Nomenklatur.Art der Nomenklatur

ERGEBNISSE

Im Gegensatz zur Gruppierung werden bei der Verwendung von Summen alle Datensätze angezeigt und ihnen werden Summenzeilen hinzugefügt. Durch die Gruppierung werden nur verallgemeinerte Datensätze angezeigt.

Ergebnisse können für die gesamte Tabelle (mit dem Schlüsselwort „GENERAL“), für mehrere Felder, für Felder mit hierarchischer Struktur (Schlüsselwörter „HIERARCHY“, „ONLY HIERARCHY“) zusammengefasst werden. Beim Zusammenfassen von Ergebnissen ist es nicht erforderlich, Aggregatfunktionen zu verwenden.

Schauen wir uns ein Beispiel an, das dem obigen Beispiel ähnelt und die Gruppierung verwendet. In diesem Fall liefert das Abfrageergebnis nicht nur gruppierte Felder, sondern auch detaillierte Datensätze.

WÄHLEN
Preise.Nomenklatur.Art der Nomenklatur AS Art der Nomenklatur,
Preise.Preis AS Preis
AUS
Informationsregister. Preise der Nomenklatur. Schnappschuss der neuesten AS-Preise
ERGEBNISSE
MAXIMAL (Preis)
VON
TypNomenklatur

HABEN

Dieser Operator ähnelt dem WHERE-Operator, wird jedoch nur für Aggregatfunktionen verwendet. Die übrigen Felder, mit Ausnahme der von diesem Operator verwendeten, müssen gruppiert werden. Der WHERE-Operator ist nicht auf Aggregatfunktionen anwendbar.

Im folgenden Beispiel werden die Höchstpreise eines Artikels ausgewählt, wenn diese 1000 überschreiten, gruppiert nach Artikeltyp.

WÄHLEN

MAX(Preis.Preis) AS Preis
AUS
Informationsregister. Preise der Nomenklatur. Schnappschuss der neuesten AS-Preise
GRUPPIERE NACH
Preise.Nomenklatur.Art der Nomenklatur
HABEN
MAXIMUM(Preise.Preis) > 1000

SORTIERE NACH

Der ORDER BY-Operator sortiert das Ergebnis einer Abfrage. Um sicherzustellen, dass Datensätze in einer konsistenten Reihenfolge angezeigt werden, wird AUTO ORDER verwendet. Primitive Typen werden nach den üblichen Regeln sortiert. Referenztypen werden nach GUID sortiert.

Ein Beispiel für den Erhalt einer nach Namen sortierten Mitarbeiterliste:

WÄHLEN
Employees.Name AS-Name
AUS
Verzeichnis.Mitarbeiter WIE Mitarbeiter
SORTIERE NACH
Name
AUTOMATISCHE BESTELLUNG

Andere 1C-Abfragesprachenkonstrukte

  • KOMBINIEREN– Ergebnisse von zwei Abfragen in einer.
  • ALLES KOMBINIEREN– ähnlich wie COMBINE, jedoch ohne Gruppierung identischer Zeilen.
  • LEERER TISCH– Wird manchmal beim Zusammenführen von Abfragen verwendet, um eine leere verschachtelte Tabelle anzugeben.
  • ORT– erstellt eine temporäre Tabelle zur Optimierung komplexer 1C-Abfragen. Solche Anfragen werden Batch-Anfragen genannt.

Funktionen der Abfragesprache

  • SUBSTRING kürzt eine Zeichenfolge ab einer angegebenen Position auf eine angegebene Anzahl von Zeichen.
  • JAHR...ZWEITES Ermöglicht Ihnen, den ausgewählten Wert eines numerischen Typs abzurufen. Der Eingabeparameter ist das Datum.
  • BEGINN DES ZEITRAUMS und ENDE DES ZEITRAUMS wird beim Arbeiten mit Datumsangaben verwendet. Als zusätzlicher Parameter wird die Art des Zeitraums (TAG, MONAT, JAHR usw.) angegeben.
  • ADDKDATE ermöglicht es Ihnen, eine bestimmte Zeit eines bestimmten Typs zu einem Datum (SEKUNDE, MINUTE, TAG usw.) zu addieren oder davon zu subtrahieren.
  • DIFFERENZDATUM Bestimmt die Differenz zwischen zwei Datumsangaben und gibt die Art des Ausgabewerts an (TAG, JAHR, MONAT usw.).
  • IST NULL ersetzt den fehlenden Wert durch den angegebenen Ausdruck.
  • VERTRETUNG und VERTRETUNGLINKS Rufen Sie eine Zeichenfolgendarstellung des angegebenen Felds ab. Auf beliebige Werte bzw. nur Referenzwerte anwenden.
  • TYP, TYPWERTE werden verwendet, um den Typ des Eingabeparameters zu bestimmen.
  • VERKNÜPFUNG ist ein logischer Vergleichsoperator für den Attributwerttyp.
  • ÄUSSERN Wird verwendet, um einen Wert in den gewünschten Typ umzuwandeln.
  • TERMINZEIT Ruft einen Wert vom Typ „Datum“ aus numerischen Werten (Jahr, Monat, Tag, Stunde, Minute, Sekunde) ab.
  • BEDEUTUNG In einer 1C-Anfrage wird es verwendet, um vordefinierte Werte anzugeben – Verzeichnisse, Aufzählungen, Pläne für Merkmalstypen. Anwendungsbeispiel: „ Wobei Rechtsperson = Wert (Aufzählung. Rechtsperson. Einzelperson)«.

Abfrage Ersteller

Um Abfragen mit 1C zu erstellen, gibt es einen sehr praktischen integrierten Mechanismus – den Abfrage-Designer. Es enthält die folgenden Hauptregisterkarten:

  • „Tabellen und Felder“ – enthält die auszuwählenden Felder und ihre Quellen.
  • „Verbindungen“ – beschreibt die Bedingungen für die CONNECTION-Struktur.
  • „Gruppierung“ – enthält eine Beschreibung von Gruppierungsstrukturen und darauf basierenden summierten Feldern.
  • „Bedingungen“ – ist für die Auswahl der Daten in der Anfrage verantwortlich.
  • „Erweitert“ – zusätzliche Abfrageparameter, wie Schlüsselwörter für den „SELECT“-Befehl usw.
  • „Joins/Aliases“ – die Möglichkeiten der Tabellenverknüpfung werden angegeben und Aliases angegeben (das „HOW“-Konstrukt).
  • „Order“ ist für die Sortierung der Ergebnisse von Abfragen verantwortlich.
  • „Summen“ – ähnelt der Registerkarte „Gruppierung“, wird jedoch für das Konstrukt „TOTALS“ verwendet.

Der Text der Anfrage selbst kann durch Klicken auf die Schaltfläche „Anfrage“ in der unteren linken Ecke angezeigt werden. In dieser Form kann es manuell korrigiert oder kopiert werden.


Konsole anfordern

Um das Ergebnis einer Abfrage im Unternehmensmodus schnell anzuzeigen oder komplexe Abfragen zu debuggen, verwenden Sie . Es enthält den Text der Anfrage, legt die Parameter fest und zeigt das Ergebnis an.

Sie können die Abfragekonsole auf die ITS-Festplatte oder über herunterladen.

Klyuev V.V.

http://prof1c.kklab.ru

Schöpfung undmit Anfragen arbeiten. Einfachste Operationenfür Anfänger(Regelmäßige Bewerbung)

Guten Tag!

Heute möchte ich Ihnen erzählen, wie Sie mit der Arbeit mit Abfragen beginnen und (natürlich schrittweise) lernen, wie Sie mit Abfragen in 1C arbeiten. Für diejenigen, die mit MS-Abfragen vertraut sind
SQL wird natürlich viel einfacher sein.

Öffnen wir also den Konfigurator und erstellen eine neue externe Verarbeitung.

Anschließend erhalten wir ein Fenster mit unserer Bearbeitung. Fahren wir direkt mit den Experimenten zu Anfragen fort. Dazu erstellen wir in unserer Verarbeitung ein neues Formular. Wählen Sie dazu in der Liste (weißes Feld) Formulare aus, klicken Sie auf (+) Hinzufügen und stimmen Sie allen vorgeschlagenen Standardformularparametern zu , und klicken Sie auf „Fertig“.

Deshalb haben wir für Sie ein leeres Formular mit Schaltflächen und erstellt. Wählen Sie im Fenster mit dem Formular die Registerkarten aus und beginnen Sie direkt mit dem Schreiben des Codes, der ausgeführt wird, wenn Sie auf die Schaltfläche „Ausführen“ klicken. Suchen Sie dazu die Prozedur ButtonExecutePress(Button)

und schreibe den folgenden Code:

Prozedur ButtonExecutePress(Button) Request = New Request() ; Anfrage. Text = " AUSWÄHLEN | * | AUS| Dokumentieren . Rechnung zur Zahlung an den Käufer" ; Ergebnis = Abfrage. Execute (). Unload (); Ende der Prozedur

Lassen Sie uns kommentieren, was wir hier geschrieben haben. Wir haben alle Dokumente „Rechnung zur Zahlung an den Käufer“ mit der Anfrage ausgewählt. Ich möchte sofort darauf hinweisen, dass Sie sich je nach Konfiguration, mit der Sie experimentieren, die Zusammensetzung der Dokumente in Ihrer Konfiguration ansehen und anstelle der von mir angegebenen „Rechnung zur Zahlung an den Käufer“ ein beliebiges Dokumentobjekt aus dem ersetzen Liste der Dokumente in Ihrer Konfiguration, vorzugsweise so, dass Dokumente dieses Typs in der Informationsbasis erstellt werden, um zu vermeiden, dass ein leeres Abfrageergebnis angezeigt wird. Ich möchte auch einen wichtigen Punkt anmerken: Wenn es zu viele solcher Dokumente gibt, kann die Ausführung der Anfrage einige Zeit dauern – da wir die Anfrage nicht auf Bedingungen beschränken und alle Felder auswählen – was das Sternchen ( *) sagt uns.

Mit dem Schlüsselwort „Auswählen“ bestellen wir unsere Aufforderung, alle Felder (*) (Dokumentdetails) aus dem Dokument „Rechnung zur Zahlung an den Käufer“ auszuwählen.

Wichtig:
Ich möchte außerdem darauf hinweisen, dass beim Schreiben einer Abfragesprache Konfigurationsobjekte im Singular und nicht im Plural angesprochen werden sollten. In diesem
In diesem Fall das Documents-Objekt in der Konfiguration (Documents-Zweig) – die Anfrage enthält ein Dokument. Auch zur Zusammensetzung der Dokumente – wir kommen durch den Punkt (.) – und zum Namen des Dokuments.

Wir erhalten das Ergebnis der Anfrage in Form einer Wertetabelle, wie aus der von uns verwendeten Methode (dem Parameter) hervorgeht – Hochladen, d. h. zuerst haben wir sie ausgeführt
Anfrage (Ausführen) und erst dann das Ergebnis der Abfrage in die Wertetabelle hochgeladen und die Wertetabelle befindet sich in der Ergebnisvariable.

Als nächstes speichern wir unsere Verarbeitung in einer Datei. Klicken Sie dazu auf Datei->Speichern unter und schreiben Sie den Dateinamen. Für meine Verarbeitung habe ich den Namen „ExternalProcessing1Demo“ festgelegt, um nicht lange nach der Verarbeitung suchen zu müssen. Sie können es auf dem Desktop speichern, dann müssen wir es öffnen)).

Lassen Sie uns nun ein wenig die Grundlagen des Debuggens erlernen. Klicken Sie dazu nun im Feld neben dem Text Ergebnis = ... mit der linken Maustaste doppelt, so dass ein roter Kreis erscheint, Sie sollten etwa Folgendes erhalten:

So, wir haben nun einen Haltepunkt in der Zeile mit dem Ergebnis gesetzt, nun führen wir die Konfiguration zum Debuggen aus, indem wir die Taste (F 5) oder den Button drücken
in der Symbolleiste:

Öffnen wir nun im von uns gestarteten 1C:Enterprise-Modus unsere gespeicherte Verarbeitungsdatei->Öffnen und suchen wir den Ort, an dem Sie die Verarbeitungsdatei gespeichert haben, wählen Sie sie aus und klicken Sie auf „Öffnen“. Klicken Sie in unserer Verarbeitung auf die Schaltfläche „Ausführen“. Wenn Sie alles richtig gemacht haben, wechseln Sie automatisch in den Konfiguratormodus und sehen an der Stelle, an der unser Haltepunkt installiert wurde, Folgendes:

In unserem Kreis erschien ein Pfeil – wir sind zur schrittweisen Ausführung unseres Codes übergegangen und werden dann das Interessanteste sehen. Wenn Sie alles richtig gemacht haben, können Sie jetzt das Ergebnis der Anfrage erhalten.

Um die Anfrage zu visualisieren, gehen Sie wie folgt vor: Suchen Sie im oberen Menü des Konfigurators das Menü „Debugging“ und wählen Sie den Befehl „Tableau“.

Unten im Konfiguratorfenster öffnet sich ein leeres Fenster -> Tableau. In diesem Fenster befinden sich leere Zeilen. Doppelklicken Sie auf die leere hervorgehobene Zeile und schreiben Sie das Wort Ergebnis. Sie sollten Folgendes erhalten:

In dem von uns angegebenen Fenster sollten wir also das Ergebnis der Ausführung unseres Codes erhalten, und zwar jetzt – die Variable „Ergebnis“, da wir diese Codezeile noch nicht ausgeführt haben – wir haben einen leeren Wert und den Datentyp der Variablen ist nicht definiert".

Machen wir einen Schritt – um die angegebene Codezeile auszuführen. Drücken Sie dazu die Taste oder im Menü Debug->Step through... (F 10).

Und was sehen wir in unserem Tableau:

Wir sehen mit Ihnen – den Wert der Variablen und den Typ der Variablen. Jetzt können wir auch den Inhalt unserer Wertetabelle einsehen, dazu bewegen wir den Mauszeiger auf das Ergebnisfeld, klicken mit der rechten Maustaste und wählen „Wert in einem separaten Fenster anzeigen“

Wir erhalten ein Fenster mit den von uns ausgewählten Dokumenten, die sich in der Variable Result befinden

Zusammenfassen:

Sie haben gelernt, wie man eine einfache Anfrage erstellt, haben auch am Debuggen Ihres Codes mitgewirkt und sich sogar das Ergebnis unserer Anfrage im Konfigurator angesehen.

Eine Abfrage ist ein leistungsstarkes Werkzeug, das dazu dient, (im Vergleich zu allen anderen Methoden) schnell Daten zu erhalten und zu verarbeiten, die in verschiedenen Objekten der 1C-Informationsbasis enthalten sind.

Erstellen Sie eine Anfrage

Die Anfrage wird als separates Objekt erstellt, das über ein erforderliches Attribut verfügt Text, wo die Anfrage selbst tatsächlich platziert wird. Darüber hinaus können der Anfrage verschiedene für ihre Ausführung notwendige Parameter übergeben werden. Nachdem der Text und die Parameter der Anfrage ausgefüllt sind, muss die Anfrage ausgeführt und das Ergebnis der Ausführung in einer Auswahl oder Wertetabelle abgelegt werden. Das Ganze sieht ungefähr so ​​aus:

//Eine Anfrage erstellen
Anfrage = neue Anfrage;

//Geben Sie den Anfragetext ein
Anfrage. Text= „Hier schreiben wir den Text der Anfrage“;

//Parameter an die Anfrage übergeben
Anfrage. SetParameter("ParameterName" , ParameterValue) ;

//Anfrage ausführen
Ergebnis = Abfrage. Laufen() ;

//Laden Sie das Abfrageergebnis in die Auswahl hoch
Probe = Ergebnis. Wählen() ;

//Laden Sie das Abfrageergebnis in die Wertetabelle hoch
Tabelle = Ergebnis. Entladen() ;

//Letzte Aktionen können kombiniert werden
Abrufen = Abfrage. Laufen() . Wählen() ;
//oder
Tabelle = Abfrage. Laufen() . Entladen() ;

Grundlagen der 1C-Abfragesprache

Die einfachsten und am häufigsten verwendeten Abfragen werden verwendet, um Daten aus einer Quelle abzurufen. Die Quelle können fast alle Objekte sein, die beliebige Daten enthalten: Verzeichnisse, Dokumente, Register, Konstanten, Aufzählungen, Pläne für Merkmalstypen usw.

Aus diesen Objekten können Sie mithilfe einer Abfrage die Werte von Details, Tabellenteilen, Details von Tabellenteilen, Änderungen, Ressourcen usw. abrufen.

Um den Anfragetext zu erhalten, ist es oft bequem, ihn zu verwenden Konstruktor anfordern. Es wird aufgerufen, wenn Sie irgendwo im Programmmodul mit der rechten Maustaste klicken.

Wenn Sie beispielsweise die Werte aller Verzeichnisdetails abrufen müssen Gegenparteien, dann sieht die Anfrage so aus:

Anfrage. Text = "WÄHLEN
| *
|VON
| Verzeichnis. Kontrahenten"
;

Wenn Sie nur einzelne Details benötigen, gehen Sie wie folgt vor:

Anfrage. Text = "WÄHLEN
| Code,
| Name,
| Elternteil
|VON
| Verzeichnis. Kontrahenten"
;

Um eine solche Anfrage per SMS zu erhalten Abfragekonstruktor Sie müssen die entsprechenden Felder auf der Registerkarte auswählen Tabellen und Felder.

Sie können den in der Abfrage ausgewählten Elementen und Quellen Aliase zuweisen und diese später sowohl in der Abfrage selbst als auch bei der Arbeit mit dem Ergebnis verwenden. Darüber hinaus kann die Anfrage Felder mit einem vordefinierten spezifischen Wert oder mit einem berechneten Wert enthalten:

Anfrage. Text = "WÄHLEN
| Clients.Code AS-Nummer,

| 1000 AS FieldWithValue
|VON
;

Abrufen = Abfrage. Laufen() . Wählen() ;

Tschüss-Auswahl. Next()-Schleife
ClientNumber = Beispiel. Nummer;
ClientName = Auswahl. Name;
Wert = Probe. FieldWithValue;
EndCycle ;

Verwenden Sie die Registerkarte, um Aliase festzulegen Gewerkschaften/Aliase V Abfrage Ersteller.

Auf der Registerkarte wird manuell ein Feld mit einem festen oder berechneten Wert angelegt Tabellen und Felder, in einer Spalte Felder.

Alle ausgewählten Elemente können entweder in Vorwärts- oder Rückwärtsreihenfolge angeordnet werden. Sie können ein oder mehrere Felder zur Bestellung auswählen. Neben dem Ordnen kann es manchmal hilfreich sein, nur einen oder einige der ersten Artikel auszuwählen.

//Ordnen Sie Kunden nach Namen von A bis Z und wählen Sie die ersten 10 aus
Anfrage. Text = „WÄHLEN SIE DIE ERSTEN 10 AUS
| Clients.Code AS-Nummer,
| Clients.Name AS-Name,
| 1000 AS FieldWithValue
|VON

|ORDNEN NACH
| Name"
;

//Wählen Sie den neuesten alphabetischen Client aus
Anfrage. Text = „TOP 1 AUSWÄHLEN
| Clients.Code AS-Nummer,
| Clients.Name AS-Name,
| 1000 AS FieldWithValue
|VON
| Verzeichnis. Kontrahenten AS Kunden
|ORDNEN NACH
| Name ABNEHMEN"
;

Sie können die Auswahl der Elemente auf diejenigen beschränken, auf die der Benutzer Zugriffsrechte hat. Oder entfernen Sie doppelte Zeilen aus dem Abfrageergebnis.

//Sampling-Daten, die dem Benutzer gestattet sind
Anfrage. Text = „AUSWÄHLEN ERLAUBT
| Clients.Code AS-Nummer,
| Clients.Name AS-Name,
| 1000 AS FieldWithValue
|VON
| Verzeichnis. Kontrahenten AS Kunden“
;

//Auswahl sich nicht wiederholender Elemente
Anfrage. Text = „VERSCHIEDENES AUSWÄHLEN
| Clients.Code AS-Nummer,
| Clients.Name AS-Name,
| 1000 AS FieldWithValue
|VON
| Verzeichnis. Kontrahenten AS Kunden“
;

Die Reihenfolge wird auf der Registerkarte festgelegt Befehl V Abfrage Ersteller Auf der Registerkarte finden Sie die Anzahl der ausgewählten Elemente sowie die Auflösungs- und Wiederholbarkeitsparameter Zusätzlich.

Fortsetzung folgt…

Ich beschloss, meinen Beitrag zu leisten und die Merkmale der Sprache zu beschreiben, die in den obigen Artikeln nicht besprochen wurden. Der Artikel richtet sich an Anfängerentwickler.

1. „IZ“-Design.

Um Daten aus der Datenbank zu erhalten, ist es überhaupt nicht notwendig, die „FROM“-Konstruktion zu verwenden.
Beispiel: Wir müssen alle Informationen über Banken aus dem Bankenverzeichnis auswählen.
Anfrage:

SELECT Verzeichnis.Banken.*

Wählt alle Felder aus dem Bankenverzeichnis aus. Und ähnelt der Anfrage:

SELECT Banks.* FROM Directory.Banks AS Banks

2. Daten nach Referenzfeld bestellen

Wenn wir Abfragedaten nach primitiven Typen organisieren müssen: „String“, „Number“, „Date“ usw., dann wird alles durch die Verwendung des Konstrukts „ORDER BY“ gelöst. Wenn Sie die Daten nach einem Referenzfeld ordnen müssen? Das Referenzfeld ist ein Link, eine eindeutige Kennung, d.h. Grob gesagt kann ein beliebiger Zeichensatz und eine gewöhnliche Reihenfolge zu einem Ergebnis führen, das nicht ganz erwartet wird. Um Referenzfelder zu ordnen, wird die „AUTO ORDER“-Konstruktion verwendet. Dazu müssen Sie die Daten zunächst direkt nach dem Referenztyp mit der „ORDER BY“-Konstruktion und dann mit der „AUTO ORDER“-Konstruktion ordnen.

In diesem Fall erfolgt die Sortierung bei Dokumenten in der Reihenfolge „Datum->Nummer“, bei Fachbüchern in der „Hauptansicht“. Wenn die Sortierung nicht nach Referenzfeldern erfolgt, wird die Verwendung der „AUTO ORDER“-Konstruktion nicht empfohlen.

In manchen Fällen kann das „AUTO ORDER“-Konstrukt den Auswahlprozess verlangsamen. Ebenso können Sie Dokumente ohne automatische Reihenfolge umschreiben:

3.Erhalten einer Textdarstellung eines Referenztyps. Design „PRÄSENTATION“.

Wenn Sie ein Feld eines Referenztyps anzeigen müssen, beispielsweise das Feld „Bank“, das einen Link zu einem Element des Verzeichnisses „Banken“ darstellt, müssen Sie verstehen, dass beim Anzeigen dieses Felds eine Unterabfrage zum „ Das Verzeichnis „Banken“ wird automatisch ausgeführt, um eine Ansicht des Verzeichnisses zu erhalten. Dadurch wird die Datenausgabe verlangsamt. Um dies zu vermeiden, müssen Sie in der Anfrage die Konstruktion „PRÄSENTATION“ verwenden, um sofort eine Darstellung des Objekts zu erhalten und diese dann zur Ansicht anzuzeigen.

Im Datenkompositionssystem wird dieser Mechanismus standardmäßig verwendet, aber beim Erstellen von Layouts in Zellen sollten Sie die Darstellung des Referenzfelds angeben und beispielsweise den Link selbst im Transkript platzieren.

4. Voraussetzung für die Datenerfassung gemäß einer Vorlage.

Beispielsweise benötigen Sie Mobiltelefone von Mitarbeitern des Formulars (8 -123- 456-78-912). Dazu müssen Sie in der Anfrage folgende Bedingung setzen:

SELECT Employee.Name, Employee.Phone AS Phone FROM Directory.Employees AS Employees WHERE Phone LIKE „_-___-___-__-__“

Das Zeichen „_“ ist ein Dienstzeichen und ersetzt jedes beliebige Zeichen.

5. Gleichzeitige Verwendung von Summen und Gruppierungen.


Summen werden häufig in Verbindung mit Gruppierungen verwendet; in diesem Fall dürfen in den Summen keine Aggregatfunktionen angegeben werden.

SELECT Bereitstellung von Diensten.Organisation AS Organisation, Bereitstellung von Diensten.Nomenklatur AS Nomenklatur, SUM(Bereitstellung von Diensten.Menge des Dokuments) AS Summe des Dokuments FROM Dokument.Erbringung von Diensten AS Bereitstellung von Diensten GRUPPE NACH Bereitstellung von Diensten.Organisation, Bereitstellung of Services.Nomenclature ERGEBNISSE NACH ALLGEMEINEM, Organisation, Nomen klatura

In diesem Fall wird die Abfrage fast dasselbe zurückgeben wie die folgende Abfrage:

AUSWÄHLEN Bereitstellung von Dienstleistungen.Organisation AS Organisation, Bereitstellung von Dienstleistungen.Nomenklatur AS Nomenklatur, Bereitstellung von Dienstleistungen.Menge des Dokuments AS Menge des Dokuments VON Dokument.Erbringung von Dienstleistungen AS Erbringung von Dienstleistungen ERGEBNISSE MENGE (Menge des Dokuments) NACH ALLGEMEIN, Organisation, Nomenklatur

Nur bei der ersten Abfrage werden Datensätze mit derselben Nomenklatur ausgeblendet.

6. Felder dereferenzieren.

Das Verweisen auf Felder durch einen Punkt wird als Referenzfeld-Dereferenzierungsvorgang bezeichnet. Zum Beispiel Zahlungsorganisation.Verwaltungseinheit. In diesem Fall wird im Referenzfeld „Organisation“ des Dokuments „Zahlung“ auf eine andere Tabelle „Organisationen“ verwiesen, in der der Wert des Attributs „Verwaltungseinheit“ ermittelt wird. Es ist wichtig zu verstehen, dass die Plattform beim Zugriff auf Felder über einen Punkt implizit eine Unterabfrage erstellt und diese Tabellen verknüpft.

Anfrage:

Kann dargestellt werden als:

WÄHLEN Sie „Payment.Link“, „Payment.Organization“, „Payment.Organization“, „Organisationen“. AdministrativeUnit FROM Document.Payment AS Payment LEFT JOIN Directory.Organizations AS Organizations Software Payment.Organization = Organizations.Link

Beim Dereferenzieren von Referenzfeldern eines zusammengesetzten Typs versucht das Framework, implizite Verknüpfungen zu allen Tabellen zu erstellen, die Teil des Typs dieses Felds sind. In diesem Fall ist die Abfrage nicht optimal. Wenn klar ist, um welche Art von Feld es sich handelt, ist es notwendig, solche Felder mit einem Konstrukt nach Typ einzuschränken ÄUSSERN().

Beispielsweise gibt es ein Sammelregister „Nicht verteilte Zahlungen“, in dem mehrere Dokumente als Registrar fungieren können. In diesem Fall ist es falsch, die Werte der Registrardaten auf diese Weise zu ermitteln:

SELECT UnallocatedPayments.Register.Date, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

Sie sollten den Typ des zusammengesetzten Felds auf Logger beschränken:

SELECT EXPRESS(UnallocatedPayments.Register AS Document.Payment).Date, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

7. Konstruktion „WO“

Wenn Sie bei einer linken Verknüpfung zweier Tabellen eine „WHERE“-Bedingung auf die rechte Tabelle anwenden, erhalten wir ein Ergebnis, das dem Ergebnis einer inneren Verknüpfung von Tabellen ähnelt.

Beispiel. Es ist notwendig, alle Kunden aus dem Kundenverzeichnis auszuwählen und für diejenigen Kunden, die über einen Zahlungsbeleg mit dem Wert des Attributs „Organisation“ = &Organisation verfügen, das Dokument „Zahlung“ anzuzeigen, für diejenigen, die kein Zahlungsdokument haben, wird es nicht angezeigt.

Das Ergebnis der Abfrage gibt nur Datensätze für die Kunden zurück, die im Parameter „Zahlung nach Organisation“ angegeben haben, und andere Kunden werden herausgefiltert. Daher müssen Sie zunächst alle Zahlungen für „so und so“-Organisation in einer temporären Tabelle erhalten und diese dann über einen Left-Join mit dem Verzeichnis „Kunden“ verbinden.

SELECT Payment.Link AS Payment, Payment.Shareholder AS Client PLACE toPayments FROM Document.Payment AS Payment WHERE Payment.Branch = &Branch; ///////////////////////////////////////////// // ////////////////////////// SELECT Clients.Link AS Client, ISNULL(tPayment.Payment, "") AS Payment FROM Directory .Clients AS Clients VERLASSEN VERBINDUNG zu payment AS to payment SOFTWARE Clients.Link = to payments.Client

Sie können diesen Zustand auf andere Weise umgehen. Es ist notwendig, eine „WHERE“-Bedingung direkt auf die Beziehung zwischen den beiden Tabellen anzuwenden. Beispiel:

SELECT Clients.Link, Payment.Link FROM Directory.US_Subscribers AS US_Subscribers LEFT CONNECTION Document.Payment AS Payment Software (Clients.Link = Payment.Client AND Payment.Client.Name LIKE „Sugar Packet“) GROUP BY Clients.Link, Payment. Verknüpfung

8. Verknüpfungen mit verschachtelten und virtuellen Tabellen

Verschachtelte Abfragen Oft ist es erforderlich, Daten basierend auf einer bestimmten Bedingung abzurufen. Wenn Sie sie dann in Verbindung mit anderen Tabellen verwenden, kann dies die Ausführung der Abfrage kritisch verlangsamen.

Beispielsweise benötigen wir für einige Kunden den Restbetrag zum aktuellen Datum.

SELECT UnallocatedPaymentsRemains.Customer, UnallocatedPaymentsRemains.AmountRemaining FROM (SELECT Clients.Link AS Link FROM Directory.Clients AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQuery LEFT JOIN RegisterAccumulations.UnallocatedPayments.Balances AS UnallocatedPayments BY Nested Request.Link = UnallocatedPaymentsBalances. Kunde

Beim Ausführen einer solchen Abfrage kann es sein, dass der DBMS-Optimierer bei der Auswahl eines Plans Fehler macht, was zu einer suboptimalen Ausführung der Abfrage führt. Beim Verbinden zweier Tabellen wählt der DBMS-Optimierer einen Tabellenverknüpfungsalgorithmus basierend auf der Anzahl der Datensätze in beiden Tabellen aus. Bei einer verschachtelten Abfrage ist es äußerst schwierig, die Anzahl der Datensätze zu bestimmen, die die verschachtelte Abfrage zurückgibt. Daher sollten Sie immer temporäre Tabellen anstelle von verschachtelten Abfragen verwenden. Schreiben wir also die Anfrage neu.

SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients WHERE
Clients.Link B (&Clients) ; ///////////////////////////////////////////// // ////////////////////////////////// SELECT tClients.Link, UnallocatedPaymentsRemains.AmountRemaining, FROM tClients AS tClients LEFT JOIN RegisterAccumulations.UnallocatedPayments.Balances (, Client IN (SELECT tClients.Link FROM tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

In diesem Fall kann der Optimierer bestimmen, wie viele Datensätze die temporäre Tabelle tClients verwendet, und den optimalen Algorithmus zum Zusammenführen von Tabellen auswählen.

Virtuelle Tische ermöglichen es Ihnen, praktisch vorgefertigte Daten für die meisten Anwendungsaufgaben zu erhalten. (Slice of the First, Slice of the Last, Remains, Turnovers, Remains und Turnovers) Das Schlüsselwort hier ist virtuell. Diese Tabellen sind nicht physisch, sondern werden vom System im laufenden Betrieb zusammengestellt, d. h. Beim Empfang von Daten aus virtuellen Tabellen sammelt das System Daten aus den Endregistertabellen, stellt sie zusammen, gruppiert sie und gibt sie an den Benutzer aus.

Diese. Beim Herstellen einer Verbindung zu einer virtuellen Tabelle wird eine Verbindung zu einer Unterabfrage hergestellt. In diesem Fall wählt der DBMS-Optimierer möglicherweise auch einen nicht optimalen Verbindungsplan. Wenn die Abfrage nicht schnell genug generiert wird und die Abfrage Verknüpfungen in virtuellen Tabellen verwendet, empfiehlt es sich, den Zugriff auf die virtuellen Tabellen auf eine temporäre Tabelle zu verlagern und dann eine Verknüpfung zwischen zwei temporären Tabellen durchzuführen. Schreiben wir die vorherige Anfrage neu.

SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients INDEX BY Link WHERE
Clients.Link B (&Clients) ; ///////////////////////////////////////////// // ////////////////////////////////// SELECT UnallocatedPayments.AmountBalance, UnallocatedPayments.Client AS Client PLACE salden FROM RegisterAccumulations.UnallocatedPayments.Balances(, Client B ( SELECT tClients. Link FROM tClients)) AS UnallocatedPaymentsBalances; ///////////////////////////////////////////// // ////////////////////////////////// SELECT tClients.Link, toRemainders.AmountRemaining AS AmountRemaining FROM tClients AS tClients LEFT JOIN toRemainders AS Remainders BY tClients.Link = tRemainings.Client

9.Überprüfung des Ergebnisses der Anfrage.

Das Ergebnis der Abfrage kann leer sein. Um nach leeren Werten zu suchen, verwenden Sie das folgende Konstrukt:

ResRequest = Request.Execute(); If resQuery.Empty() Then Return; endIf;

Methode Leer() sollte vor Methoden verwendet werden Wählen() oder Entladen(), da das Abrufen der Sammlung einige Zeit in Anspruch nimmt.

Es ist für niemanden eine Offenbarung, dass es äußerst unerwünscht ist, Abfragen in einer Schleife zu verwenden. Dies kann die Betriebszeit einer bestimmten Funktion entscheidend beeinflussen. Es ist äußerst wünschenswert, alle Daten in der Anfrage zu empfangen und sie dann in einer Schleife zu verarbeiten. Aber manchmal gibt es Fälle, in denen es unmöglich wird, die Anfrage aus der Schleife zu verschieben. In diesem Fall können Sie zur Optimierung die Erstellung der Abfrage außerhalb der Schleife verschieben und in der Schleife die erforderlichen Parameter ersetzen und die Abfrage ausführen.

Anfrage = Neue Anfrage; Query.Text = "SELECT | Clients.Link, | Clients.Birthdate |FROM | Directory.Clients AS Clients |WHERE | Clients.Link = &Client"; Für jede Zeile FROM TableClients Loop Query.SetParameter("Client", Client); QueryResult = Query.Execute().Select(); EndCycle;

Dies erspart dem System die Syntaxprüfung der Anfrage in einer Schleife.

11. Konstruktion „HABEN“.

Ein Design, das bei Anfragen eher selten vorkommt. Ermöglicht das Auferlegen von Bedingungen für die Werte von Aggregatfunktionen (SUMME, MINIMUM, MITTELWERT usw.). Beispielsweise müssen Sie nur die Kunden auswählen, deren Zahlungsbetrag im September mehr als 13.000 Rubel betrug. Wenn Sie die Bedingung „WHERE“ verwenden, müssen Sie zunächst eine temporäre Tabelle oder eine verschachtelte Abfrage erstellen, dort Datensätze nach Zahlungsbetrag gruppieren und dann die Bedingung anwenden. Die „HAVING“-Konstruktion hilft dabei, dies zu vermeiden.

SELECT Payment.Customer, AMOUNT(Payment.Amount) AS Amount FROM Document.Payment AS Payment WHERE MONTH(Payment.Date) = 9 GROUP BY Payment.Customer HAVING AMOUNT(Payment.Amount) > 13000

Gehen Sie dazu im Konstruktor einfach auf die Registerkarte „Bedingungen“, fügen Sie eine neue Bedingung hinzu und aktivieren Sie das Kontrollkästchen „Benutzerdefiniert“. Dann schreib einfach Betrag(Zahlungsbetrag) > 13000


12. NULL-Wert

Ich werde hier nicht die Prinzipien der dreiwertigen Logik in der Datenbank beschreiben; es gibt viele Artikel zu diesem Thema. Nur kurz zum Wie NULL kann sich auf das Ergebnis der Abfrage auswirken. Der Wert NULL ist eigentlich kein Wert und die Tatsache, dass der Wert undefiniert ist, ist unbekannt. Daher gibt jede Operation mit NULL NULL zurück, sei es Addition, Subtraktion, Division oder Vergleich. Ein NULL-Wert kann nicht mit einem NULL-Wert verglichen werden, da wir nicht wissen, was wir vergleichen sollen. Diese. Beide Vergleiche lauten: NULL = NULL, NULL<>NULL ist nicht wahr oder falsch, es ist unbekannt.

Schauen wir uns ein Beispiel an.

Für Kunden, die keine Zahlungen haben, müssen wir das Feld „Signieren“ mit dem Wert „Keine Zahlungen“ anzeigen. Darüber hinaus wissen wir mit Sicherheit, dass wir solche Kunden haben. Und um die Essenz dessen wiederzugeben, was ich oben geschrieben habe, machen wir es so.

SELECT „Keine Zahlungen“ als Attribut, NULL als Dokument PLATZ für Zahlungen; ///////////////////////////////////////////// // ///////////////////////// SELECT Clients.Link AS Client, Payment.Link HOW Payment PUT tClientPayment FROM Directory.Clients AS Clients LEFT CONNECTION Document. Payment AS Zahlungssoftware Clients.Link = Payment.Shareholder; ///////////////////////////////////////////// // /////////////////////////// SELECT tClientPayment.Client FROM tClientPayment AS tClientPayment INTERNAL JOIN tPayment AS tTopay BY tClientPayment.Payment = tPayment. Document

Achten Sie auf die zweite temporäre Tabelle tClientPayment. Mit der linken Verknüpfung wähle ich alle Kunden und alle Zahlungen für diese Kunden aus. Für Kunden, die keine Zahlungen haben, ist das Feld „Zahlung“ NULL. Der Logik folgend habe ich in der ersten temporären Tabelle „tPayments“ zwei Felder festgelegt, eines davon NULL, die zweite Zeile „Hat keine Zahlungen“. In der dritten Tabelle verbinde ich die Tabellen „tClientPayment“ und „tPayment“ über die Felder „Payment“ und „Document“ mit einem internen Join. Wir wissen, dass in der ersten Tabelle das Feld „Dokument“ NULL ist und in der zweiten Tabelle diejenigen, die keine Zahlungen im Feld „Zahlung“ haben, ebenfalls NULL sind. Was wird uns eine solche Verbindung bringen? Aber es wird nichts zurückgegeben. Weil der Vergleich NULL = NULL nicht zu True führt.

Damit die Anfrage das erwartete Ergebnis zurückgibt, schreiben wir sie um:

SELECT „Keine Zahlungen“ AS Attribute, VALUE(Document.Payment.EmptyLink) AS Document PLACE toPayments; ///////////////////////////////////////////// // ////////////////////////// SELECT Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink)) WIE Payment PUT tClientPayment FROM Directory.Clients AS Clients LEFT CONNECTION Document.Payment AS Payment BY Clients.Link = Payment.Shareholder; ///////////////////////////////////////////// // /////////////////////////// SELECT tClientPayment.Client FROM tClientPayment AS tClientPayment INTERNAL JOIN tPayment AS tTopay BY tClientPayment.Payment = tPayment. Document

Nun haben wir in der zweiten temporären Tabelle angegeben, dass, wenn das Feld „Zahlung“ NULL ist, dieses Feld = ein leerer Link zum Zahlungsbeleg. In der ersten Tabelle haben wir NULL auch durch eine leere Referenz ersetzt. Jetzt umfasst die Verbindung Nicht-NULL-Felder und die Anfrage gibt das erwartete Ergebnis zurück.

Alle im Artikel enthaltenen Anfragen spiegeln die Situationen wider, die ich berücksichtigen möchte, und nicht mehr. UM Sie dürfen nicht wahnhaft oder suboptimal sein, Hauptsache sie spiegeln die Essenz des Beispiels wider.

13. Eine undokumentierte Funktion des „WAHL WHEN...DANN...ENDE“-Designs.

Für den Fall, dass es notwendig ist, die Konstruktion „Bedingungen“ in der Anfrage zu beschreiben, verwenden wir die Standardsyntax:

SELECT SELECTION WHEN Users.Name = „Vasya Pupkin“ THEN „Unser Lieblingsmitarbeiter“ ELSE „Wir wissen das nicht“ END AS Field1 FROM Directory.Users AS Users

Was aber, wenn wir beispielsweise in einer Anfrage den Namen des Monats erhalten müssen? Eine umfangreiche Konstruktion in einer Anfrage zu schreiben ist hässlich und zeitaufwändig, daher kann uns diese Form des Schreibens oben helfen:

SELECT MONTH(US_CalculationConsumption_ScheduleTurnover.CalculationPeriod) WANN 1, DANN „Januar“, WANN 2, DANN „Februar“, WANN 3, DANN „März“, WANN 4, DANN „April“, WANN 5, DANN „Mai“, WANN 6, DANN „Juni“, WANN 7, DANN „Juli“ K WANN 8, DANN „August“, WANN 9, DANN „September“, WANN 10, DANN „Oktober“, WANN 11, DANN „November“, WANN 12, DANN „Dezember“, ENDE ALS MONAT

Jetzt sieht das Design weniger umständlich aus und ist leicht verständlich.

14. Ausführung der Batch-Abfrage.


Um Anfragen nicht zu vervielfachen, können Sie eine große Anfrage erstellen, diese in Pakete aufteilen und damit arbeiten.
Beispielsweise muss ich die folgenden Felder aus dem Verzeichnis „Benutzer“ abrufen: „Geburtsdatum“ und die verfügbaren Rollen für jeden Benutzer. Laden Sie dies in verschiedene tabellarische Teile des Formulars hoch. Natürlich können Sie dies in einer einzigen Anfrage tun, dann müssen Sie die Datensätze durchlaufen oder sie reduzieren, oder Sie können Folgendes tun:

SELECT Users.Link AS Vollständiger Name, Users.Geburtsdatum, Users.Role PUT vtUsers FROM Directory.Users AS Users; ////////////////////////////////////////////////// ////////////////////////////// ВЫБРАТЬ втПользователи.ФИО, втПользователи.ДатаРождения ИЗ втПользователи КАК втПользователи СГРУППИРОВАТЬ ПО втПользователи.ФИО, втПользователи. Geburtsdatum; ////////////////////////////////////////////////// ////////////////////////////// ВЫБРАТЬ втПользователи.ФИО, втПользователи.Роль ИЗ втПользователи КАК втПользователи СГРУППИРОВАТЬ ПО втПользователи.ФИО, втПользователи. Geburtsdatum

tPackage = Request.ExecutePackage();

TP_BirthDate = tPackage.Upload();
TP_Roles = tPackage.Unload();

Wie wir sehen, kann die Abfrage im Stapel ausgeführt und das Ergebnis als Array verarbeitet werden. In manchen Fällen ist es sehr praktisch.

15. Bedingungen in einer Batch-Anfrage

Zum Beispiel haben wir eine Batch-Anfrage, bei der wir zunächst die Felder „Name, Geburtsdatum, Code“ aus dem Verzeichnis „Benutzer“ abrufen und Datensätze mit Bedingungen für diese Felder aus dem Verzeichnis „Einzelpersonen“ abrufen möchten.

SELECT Users.Individual.Name AS Name, Users.Individual.Date of Birth AS Geburtsdatum, Users.Individual.Code AS Code PLACE vtUsers FROM Directory.Users AS Users; ///////////////////////////////////////////// // ////////////////////////// Einzelpersonen auswählen. Als Einzelperson aus dem Verzeichnis verknüpfen. Einzelpersonen als Einzelpersonen

Sie können Bedingungen wie diese auferlegen:

WHERE Individuals.Code IN (SELECT vtUsers.Code FROM vtUsers) AND Individuals.Name IN (SELECT vtUsers.Code FROM vtUsers) AND Individuals.BirthDate IN (SELECT vtUsers.DateBirth FROM tvUsers)

Und Sie können es so machen:

WHERE (Individuals.Code, Individuals.Name, Individuals.Geburtsdatum) IN (SELECT tueUsers.Code, tueUsers.Name, tueUsers.Geburtsdatum FROM tueUsers)

Darüber hinaus ist es notwendig, die Ordnung aufrechtzuerhalten.

16. Aufrufen des Abfrage-Generators für „Bedingung“ in einer Batch-Anfrage

Wenn es notwendig ist, eine Bedingung festzulegen, wie im obigen Beispiel, können Sie vergessen, wie dieses oder jenes Feld in der virtuellen Tabelle aufgerufen wird.
Sie müssen beispielsweise eine Bedingung für das Feld „Geburtsdatum“ festlegen, und in der virtuellen Tabelle heißt dieses Feld „Geburtsdatum des Schuldners“. Wenn Sie den Namen vergessen, müssen Sie die Bearbeitung der Bedingung ohne verlassen Speichern Sie und sehen Sie sich den Namen des Feldes an. Um dies zu vermeiden, können Sie die folgende Technik verwenden.

Es ist notwendig, nach der Konstruktion „B“ Klammern einzufügen und zwischen den Klammern ein Leerzeichen (Leerzeichen) zu lassen, dieses Leerzeichen auszuwählen und den Abfragekonstruktor aufzurufen. Der Designer hat Zugriff auf alle Tabellen der Batch-Abfrage. Die Technik funktioniert sowohl auf virtuellen Registertabellen als auch auf der Registerkarte „Bedingungen“. Im letzteren Fall müssen Sie das Kontrollkästchen „P (willkürliche Bedingung)“ aktivieren und in den Bearbeitungsmodus „F4“ wechseln.

Die Fragen wurden oft spontan gestellt und dienen lediglich dazu, die „Techniken“ zu veranschaulichen, die ich in Betracht gezogen habe.

Ich wollte mir die Verwendung von Indizes in Abfragen ansehen, aber das ist ein sehr weit gefasstes Thema. Ich werde es in einen separaten Artikel einfügen oder es später hier hinzufügen.

upd1. Punkte 11,12
upd2. Punkte 13,14,15,16

Gebrauchte Bücher:
Abfragesprache „1C:Enterprise 8“ – E.Yu. Chrustalewa
Berufliche Weiterentwicklung im 1C:Enterprise 8-System.“

Hat Ihnen der Artikel gefallen? Teile mit deinen Freunden!