Verschachtelte Abfragen im Konstruktor. Abfragekonstruktoren 1c Abfragekonstruktorbedingungen

Beginnen wir also mit etwas Einfachem: Erstellen Sie im Konfigurator eine neue Verarbeitung und nennen Sie sie nach Belieben Query Console oder Query Builder.

Wir können in „Daten“ sofort eine Tabelle für zukünftige Parameter hinzufügen, die wir benötigen, sodass wir in unserer Konsole nicht die einfachste Anfrage ausführen, sondern beispielsweise mit Parametern und Links für unsere Arbeit eine Anfrage an periodische Register erstellen , aber hier ohne Parameter-Anweisungen=&Datum nirgendwo.

Um unsere Parametertabelle zu erstellen, fügen wir auf der Registerkarte „Daten“ im „Tabularteil“ eine neue Tabelle hinzu, nennen sie Abfrageparameter. Hier fügen wir die Spalten dieser Tabelle hinzu: 1) ParameterName, Typ string = 25 Zeichen; ParameterValue, hier ist ein zusammengesetzter Datentyp, siehe Abbildung:

Daher wählen wir, wie im Bild gezeigt, einen zusammengesetzten Typ für die Spalte „Parameterwert“ aus: Aktivieren Sie im sich öffnenden Typmenü das Kontrollkästchen „Zusammengesetzter Typ“, wählen Sie Zahl, Zeichenfolge (geben Sie 20 Zeichen an), Datum, Booleschen Wert an und aktivieren Sie das Kontrollkästchen Das untere Kontrollkästchen – AnyLink – bedeutet Folgendes: Wenn wir die Parameter unserer Anfrage angeben, können wir auf jedes Objekt unserer Konfiguration verweisen, zum Beispiel auf Verzeichnisse oder Dokumente.

Jetzt müssen wir das Formular unserer zukünftigen Abfragekonsole erstellen. Gehen wir in der Bearbeitung zur Registerkarte „Formulare“ und fügen ein neues hinzu. Wir geben dieses Formular ein und es gibt bereits ein unbegrenztes Feld für Kreativität – Sie können die beiden soeben erstellten Details und eine Platte mit Parametern nach Ihren Wünschen anordnen! Dazu können Sie Standardformularelemente wie eine Gruppe oder eine Seite mit Seiten verwenden (wenn Sie lieber Seiten umblättern möchten).

Die Hauptsache hier ist eines: Nachdem Sie das Attribut „TextValues“ in das linke Feld zum Bearbeiten des Formulars gezogen haben, stellen Sie sicher, dass in seinen Eigenschaften „View“=Text Document Field eingestellt ist. Siehe Abbildung:

In den Eigenschaften des Attributs „Query Table“ können Sie optional „Display Grid“ und „Display Headers“ angeben.

Gehen Sie als Nächstes im rechten Fenster zum Bearbeiten des Formulars auf die Registerkarte „Befehle“ und fügen Sie eine neue Schaltfläche hinzu. Wenn Sie darauf klicken, führt unsere Konsole eine bestimmte Aktion aus. Lassen Sie uns eine „Abfrage-Designer“-Schaltfläche erstellen. Wenn Sie möchten, können Sie der Schaltfläche ein Symbol hinzufügen. Die Hauptsache ist, die Schaltfläche selbst im linken Formularbearbeitungsfenster zu platzieren – damit wir sie sehen können. Dann im rechten Formular Bearbeitungsfenster, klicken Sie mit der rechten Maustaste auf unseren Button und wählen Sie Eigenschaften – klicken Sie in den Eigenschaften auf den Punkt „Aktion“. Es erscheint ein modales Fenster, in dem Sie gefragt werden, wo genau unser Programmcode ausgeführt wird, den wir dem Button zuweisen werden – wählen Sie „ Auf den Kunden“.

Das Formularmodul wird mit einer vorgefertigten leeren Prozedur „Procedure Query Constructor (Command)“ geöffnet. In diesem Verfahren beschreiben wir den Aufruf des standardmäßigen 1c8 Query Builder. Es ist sehr leicht: Konstruktor = Neuer Anforderungskonstruktor; Aber hier gibt es Fallstricke – der in die Plattform integrierte Abfragekonstruktor funktioniert im Benutzermodus NUR unter einem Thick-Client! Daher werden wir die Bedingung der Präprozessoranweisung einfügen. #Wenn Sie hier jedoch basierend auf Ihrer Plattform selbst entscheiden oder über normale Formulare verfügen, wählen Sie „ FatClientRegularApp” oder Sie haben eine Plattform, die auf verwalteten Formularen basiert, dann „ ThickClientManagedApplication„.siehe Abb.

Jetzt muss diesem Verfahren noch eine Bedingung für die Aufzeichnung des Anfragetextes hinzugefügt werden, die der Abfrage-Generator für uns in den Details unseres Formulars „Anfragetext“ generiert:

Wenn Constructor.OpenModal()=True, dann Object.RequestText=Constructor.Text; endIf;

Aber wir können manuell etwas im Anfragetext ändern (im Benutzermodus – im Attributfenster „Anfragetext“), damit unsere Änderungen bei einem erneuten Aufruf in den Abfragekonstruktor gelangen – wir werden hier eine einfache Bedingung hinzufügen:

Wenn nicht EmptyString(Object.QueryText) Then Constructor.Text = Object.QueryText; endIf;

Das war's, wir haben den in die 1c8-Plattform integrierten Abfragekonstruktor verbunden, schauen wir uns unsere Arbeit an. Starten Sie dazu 1C:Enterprise im Thick-Client-Modus mit einer der folgenden Methoden: 1) Hauptmenü des Konfigurators – Debugging – Debugging starten – Thick Client; 2) oder wenn Sie diese Tasten auf dem Bedienfeld im Konfigurator haben – drücken Sie einfach die Taste mit einem gelben Kreis mit einem dicken Punkt, siehe Abbildung:

Der Benutzermodus von 1cEnterprise8 startet, wir finden unsere Verarbeitung, starten sie, klicken auf unsere Schaltfläche „Query Designer“ und sehen, wie sich der in die Plattform integrierte Designer öffnet. siehe Abb.

Wir haben also den Abfragekonstruktor ausgeführt und können damit beginnen, unsere zukünftige Abfrage darin zusammenzustellen. Wir sind jedoch daran interessiert zu sehen, wie die von uns erstellte Abfrage funktionieren wird! Und dazu müssen wir im Konfigurator beim Bearbeiten des Formulars unserer Konsole eine weitere Schaltfläche erstellen, nennen wir sie „Run Query“. Klicken Sie in den Eigenschaften der Schaltfläche „Abfrage ausführen“ auf „Aktion“. Es erscheint erneut ein Menü, in dem wir gefragt werden, wo unser Programmcode verarbeitet werden soll. In diesem Fall wählen wir „Sowohl auf dem Client als auch auf dem Server“. Wieder befinden wir uns im Formularmodul.

In der Prozedur Execute Query(), die wir auf dem Client haben, schreiben wir eine Bedingung, wenn der Benutzer den Abfragetext nicht eingegeben hat, sondern ihn ausführen möchte:

If EmptyString(Object.QueryText) Then report("Geben Sie den Abfragetext ein!"); endIf;

Das System hat bereits automatisch einen Link zur Execute RequestOnServer()-Prozedur generiert; – Das ist gut, gehen wir zu dieser Prozedur, die auf dem Server ausgeführt wird, und schreiben hier den Code zur Ausführung unserer eingegebenen Anfrage.

Hier gibt es Optionen: Sie können alle Ausdrücke im Zusammenhang mit der Erstellung von Abfragen selbst schreiben, d. h. manuell, aber es gibt eine noch einfachere Option: Klicken Sie innerhalb des Verfahrens mit der rechten Maustaste und wählen Sie im Dropdown-Menü „Abfrage-Generator mit Ergebnisverarbeitung, siehe Abbildung“:

Wenn Sie auf den Punkt „Abfrage-Generator mit Ergebnisverarbeitung“ geklickt haben, erscheint ein modales Fenster „Abfragetext nicht gefunden. Neuen erstellen?“, klicken Sie auf „Ja“. Der integrierte Abfrage-Designer wird geöffnet, in dem auf seiner ersten Registerkarte „Ergebnisverarbeitung“ – Wählen Sie den ersten Punkt „Umgehung des Ergebnisses“. Das war's, wir brauchen nichts anderes von diesem Konstruktor, klicken Sie auf die Schaltfläche „Ok“ – es erscheint ein modales Fenster „In der Anfrage sind keine Felder ausgewählt, klicken Sie auf „Ok“.

Danach erscheint die folgende vorgefertigte Vorlage in unserer ExecuteRequestOnServer()-Prozedur:

Fahren wir mit dem vom Konstruktor erstellten Ausdruck fort:

Request.Text = "";

Request.Text = Object.RequestText;

So einfach ist es, unser „Anfrage ausführen“-Button auf dem Bearbeitungsformular ist bereits praktisch funktionsfähig, bisher kann er nur einfache Anfragen ohne Parameter verarbeiten, aber Hauptsache, es funktioniert! Jetzt müssen wir nur noch die Ergebnisse unserer Anfrage im Attribut „Wertetabelle“ auf dem Verarbeitungsformular visuell darstellen. Ich möchte Sie daran erinnern, dass unser Attribut „Wertetabelle“ vom Typ „Tabellendokument“ ist, da wir sonst unsere Ergebnisse im Benutzermodus nicht sehen. Die Anzeige tabellarischer Daten für den Benutzer erfolgt immer entweder durch ein tabellarisches Dokument oder ein Layout. Ich würde mir wirklich wünschen, dass es möglich wäre, Daten über eine Wertetabelle anzuzeigen – da diese sehr einfach zu verwenden und vertraut ist, aber Leider ist eine Wertetabelle nur ein Werkzeug, das ein Entwickler benötigt, man kann damit keine Daten auf dem Bildschirm anzeigen ...

Schauen wir uns genauer an, was ein Tabellenkalkulationsdokument ist – es ist wie eine Excel-Tabelle – Sie können zu einem Datensatz in einer bestimmten Zelle nur über Tabellenzellen gelangen, hier nennen wir sie einen Bereich, aber wir können den Bereich dieses Bereichs selbst auswählen in eine bestimmte Zelle:

Also haben wir herausgefunden, was ein Tabellenkalkulationsdokument ist, und festgestellt, dass wir die Daten aus unserer Abfrage in einer bestimmten Zelle dieses Tabellenkalkulationsdokuments definieren müssen. Aber denken wir einmal darüber nach: Was ist das „Abfrageergebnis“, das der Designer so schnell für uns generiert hat? Öffnen Sie die Hilfe – Das Ergebnis der Abfrage ist eine Tabelle mit den entsprechenden Eigenschaften! siehe Abb.

Und wenn wir jetzt nach dem Ausdruck Query Result = Query.Execute(); (erstellt vom Konstruktor) schreiben, ist hier so ein einfacher Zyklus für Collections:

Für jeden ColumnName From Query Result.Columns Loop report(ColumnName.Name); EndCycle;

Notieren Sie sich nach diesem Zyklus zunächst alle vom Konstruktor automatisch erstellten Ausdrücke. Und führen Sie 1C:Enterprise8 unter dem Thick Client aus. Erstellen Sie eine beliebige einfache Abfrage (Sie können den Query Builder verwenden – er funktioniert bei uns bereits) und klicken Sie auf die Schaltfläche „Abfrage ausführen“:

Unten im Nachrichtenfenster sehen Sie, dass in der Abfrageergebnistabelle die Namen der Felder gespeichert sind, die wir gerade durch Erstellen einer einfachen Abfrage ausgewählt haben.

Lassen Sie uns nun diese Namen der Bereiche unseres Leidens in einem Tabellendokument anzeigen:

Für jeden ColumnName From Query Result.Columns Loop Cell=Object.QueryTable.Area(1,QueryResult.Columns.Index(ColumnName)+1); Cell.Text=Spaltenname.Name; EndCycle;

Um die Details der Abfragedaten anzuzeigen, analysieren wir die vom Designer automatisch erstellten Ausdrücke und fügen in die Sortierschleife „SelectionDetailedRecords“ der Abfrage selbst genau dieselbe Schleife ein, die wir zum Anzeigen der Spaltennamen verwendet haben, nur dass wir sie jetzt übertragen müssen nicht die Daten aus der Tabelle „Abfrageergebnis“ in den Zellentext. Und die Daten der Auswahl selbst. Sehen wir uns in der Hilfe an, wie Sie auf das Feld „Detaillierte Auswahl“ der Anfrage zugreifen können:

SelectionDetailRecords = QueryResult.Select(); Während SelectionDetailedRecords.Next() Loop //in der ersten Zeile haben wir bereits die Namen der Tabellenspalten aufgeschrieben, also laden wir die Daten unterhalb der ersten ZeileDocRowNumber=Object.QueryTable.TableHeight+1; Für jeden ColumnName From Query Result.Columns Cycle Cell=Object.QueryTable.Area(DocRowNumber,QueryResult.Columns.Index(ColumnName)+1); Cell.Text = SelectionDetailedRecords[ColumnName.Name]; EndCycle; EndCycle;

Das ist alles, wir können überprüfen, das Unternehmen unter einem Thick-Client laden, eine einfache Anfrage ohne Parameter eingeben, auf die Schaltfläche „Abfrage ausführen“ klicken, siehe Abbildung:

Hurra, alles funktioniert!!!

Es ist sehr praktisch, wenn beim Öffnen/Schließen unserer Abfragekonsole unser Abfragetext, mit dem wir vor dem Schließen der Konsole gearbeitet haben, erneut in das Feld „Abfragetext“ geschrieben wird. Dazu müssen Sie lediglich die Formulareigenschaft = Autosave aktivieren, siehe Abb.:

Das war's, unsere Konsole funktioniert. Damit wir komplexere Abfragen mit darin angegebenen Parametern schreiben können, müssen wir eine weitere Schaltfläche „Parameter suchen“ sowie den Code für die Schaltfläche „Abfrage ausführen“ erstellen – der Code für die Schaltfläche „Parameter suchen“ wird ausgeführt auf dem Client und auf dem Server. Als nächstes starten wir in der Serverprozedur die Anfrage auf die gleiche Weise mit dem aus dem Fenster „Request Text“ übergebenen Text. Mithilfe des Ausdrucks „Request.FindParameters()“ finden wir die übergebenen Parameter und geben sie einfach in ein Schleife in den tabellarischen Teil des Formulars „Anforderungsparameter“. Vergessen Sie nicht, diese anschließend aus der fertigen Parametertabelle in die Prozedur „Run Query“ zu übertragen.

Sie können unserer Konsole auch einige Schaltflächen hinzufügen, die das Fenster „Parameter“ und das Fenster „Text anfordern“ im Benutzermodus leeren.

Unsere Abfragekonsole ist einsatzbereit. Ich wünsche Ihnen erfolgreiche kreative Lösungen mit einem so einfachen und leistungsstarken Tool wie der Abfragekonsole!

Diese Verarbeitung ist auf der 1c8.3-Plattform (verwaltete Formulare) geschrieben und läuft unter einem Thick-Client. Es kann auch auf der 1c8.2-Plattform geschrieben werden, sowohl in regulären als auch in verwalteten Formen.

Der Download enthält ein Beispiel der gerade erstellten Abfragekonsole.

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

Upgrade der Abfragekonsole:

1) Jetzt läuft unsere hausgemachte Abfragekonsole mit integriertem Abfrage-Builder unter jedem Client: unter einem Thick-Client aus regulären und verwalteten Formularen und unter einem Thin- und Web-Client.

p.s. Die Form und das Aussehen des integrierten Abfrage-Generators ist unterschiedlich – je nachdem, unter welchem ​​Client wir unsere Konsole gestartet haben. (Ich persönlich bin mit der Form des Abfrage-Generators unter einem dicken Client vertrauter und komfortabler)

&Auf dem Client-Prozedur-Abfragekonstruktor (Befehl) //Der Aufruf des Standard-Abfragekonstruktors ist nur unter einem Thick-Client möglich. #If ThickClientManagedApplication oder ThickClientNormalApplication Then Constructor=New Query Constructor; Wenn nicht EmptyString(Object.QueryText) Then Constructor.Text = Object.QueryText; endIf; Wenn Constructor.OpenModal()=True, dann Object.RequestText=Constructor.Text; endIf; // #Else // Report("Der Aufruf des Query Builders ist nur unter einem Thick Client möglich"); // Zurückkehren; //# EndIf #Else Report("Sie führen Query Builder unter einem Thin Client aus – es unterscheidet sich geringfügig in seiner Form und Leistungsgeschwindigkeit!"); Constructor = New QueryConstructor(); Wenn nicht EmptyString(Object.QueryText) Then Constructor.Text = Object.QueryText; endIf; Constructor Alert = New AlertDescription("RunAfterClosingConstructor", ThisForm); Constructor.Show(Constructor Alert); # EndIf Ende der Prozedur &Auf der Client-Prozedur ExecuteAfterClosingConstructor(Result, ConstructorParameters) Export //Result=Text, wenn Constructor mit der OK-Schaltfläche geschlossen wurde Object.RequestText = AbbreviatedLP(Result); //funktioniert!!! Ende des Verfahrens

2) Wir haben unserer einfachen Abfragekonsole die Möglichkeit hinzugefügt, komplexe Abfragen mit einer temporären Tabelle einzugeben, die an die Parameter übergeben wird!!! Der Mechanismus erwies sich als sehr einfach und elegant – ohne die Verwendung von XML-Code, wie es bei professionellen Konsolen der Fall ist.

Den Code selbst und die Vorgehensweise für den Übertragungsmechanismus zu den Parametern temporärer Tabellen können Sie in der zweiten angehängten Datei sehen. Wie ich mit der Entwicklung meiner eigenen Version temporärer Tabellen in den Parametern begonnen habe, finden Sie unter diesem Link https://forum.infostart.ru/forum9/topic183700/

Nun erfahren Sie, wie Sie die Konsole für eine komplexe Abfrage verwenden, wenn eine temporäre Tabelle an ihre Parameter übergeben wird. Sie können beispielsweise den Code dieser Anfrage übernehmen;

SELECT ExternalData.Product, ExternalData.Quantity PLACE ExternalData FROM &ExternalData AS ExternalData; ///////////////////////////////////////////// // ////////////////////////// SELECT ExternalData.Product, ExternalData.Quantity, ISNULL(RemainingProductRemaining.QuantityRemaining, 0) AS Field1, ISNULL(Remaining ProductsRemainings.QuantityRemaining, 0) - ExternalData.Quantity AS Remaining FROM ExternalData AS ExternalData LEFT JOIN Registrieren Sie Accumulations.Remaining Products.Remainings(&Date, Product IN (SELECT ExternalData.Product FROM ExternalData AS ExternalData)) AS Remaining ProductsRemainings Software ExternalData.Product = RemainingProductRemaining . Produkt

Basierend auf dem Beispiel und der Ähnlichkeit des obigen Abfragecodes können Sie unter Berücksichtigung Ihrer Datenobjekte Ihre eigene komplexe Abfrage erstellen.

Also haben wir im Abfrage-Designer die obige Abfrage erstellt und den Konstruktor geschlossen. Der Abfragetext wird in unser Konsolenfeld „Abfragetext“ verschoben. Klicken Sie auf die Schaltfläche „Parameter suchen“. Wir sehen, dass in der Parametertabelle eine Zeile angezeigt wird = „Externe Daten“, Werttyp = „Wertetabelle“, siehe Abb.

Geben Sie in dieser Parametertabelle den Datumsparameter ein, zum Beispiel das heutige Datum, und klicken Sie dann, um zu versuchen, unseren temporären Tabellenparameter „Externe Daten“ zu bearbeiten. Klicken Sie im Feld mit „Wertetabelle“ auf drei Punkte – eine Auswahl an Typen wird angezeigt erscheinen, klicken Sie auf „Zeile“, unser Mechanismus schaltet uns auf die Seite des Formulars um, wo wir diese sehr temporäre Tabelle manuell eingeben müssen.

Beachten Sie hier, dass in diesem Fall auf der Seite „Stundenpläne“ unten im Feld „Name der temporären Tabelle in Parametern“ der Name unserer temporären Tabelle erscheint (er wird aus der Parametertabelle kopiert).

Bisher sehen wir auf der Seite „Zeittabellen“ nur eine leere Tabelle – dies ist die Tabelle der Typen unserer zukünftigen temporären Tabelle. Mit der Schaltfläche „Hinzufügen“ fügen wir den Namen der Details und den Typ der zukünftigen Tabelle hinzu . Seien Sie vorsichtig – Name und Typ müssen mit dem übereinstimmen, was wir in der Anfrage für &ExternalData angegeben haben:

Jetzt klicken wir auf die Schaltfläche „Temporäre Tabelle aktualisieren“ – und wir haben hier eine zweite Tabelle – diese füllen wir über die Schaltfläche „Hinzufügen“ direkt mit temporären Tabellendaten.

Das war's, wir können noch einmal selbst überprüfen, ob wir die Grunddaten der Abfrageparameter in der Parametertabelle auf der 1. Seite der Verarbeitung eingegeben haben, und auf die Schaltfläche „Abfrage ausführen“ klicken – alles wird berechnet und entsprechend ausgewählt Einschränkung der im Parameter unserer temporären Tabelle übergebenen Daten

p.s. Wenn Sie bei der Eingabe des Namens der Details und ihrer Typen (in der ersten Tabelle) einen Fehler gemacht haben, schließen Sie einfach die Konsole und öffnen Sie sie erneut. Die temporäre Datentabelle wird gelöscht und die Typentabelle kann erneut bearbeitet werden Es kann wieder eine neue Datentabelle erstellt werden.

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

Das ist alles, wir können mit unseren eigenen Händen ein sehr leistungsfähiges Arbeitswerkzeug erstellen, außerdem ist unsere Konsole im Vergleich zu professionellen Konsolen immer noch sehr schnell – und das ist ein sehr großes Plus für Entwickler! Und natürlich funktioniert unsere Konsole jetzt unter jedem Client! Viel Glück bei Ihren kreativen Entwicklungen!!!

Schauen wir uns an, wie wir diese beiden Tabellen feldweise verbinden können Produktcode verwenden
Abfragekonstruktor (Code zum Erstellen temporärer Tabellen wird als Beispiel angegeben).
Ich werde nicht. Sie können es dem obigen Link entnehmen.

Öffnen Sie das Designerfenster und gehen Sie zur Registerkarte „Tabellen und Felder“, zum Abschnitt
„Tische“ Wählen Sie beide unserer Tabellen aus und im Abschnitt „Felder“ -
diejenigen Felder aus beiden Tabellen, die wir als Ergebnis der Abfrage sehen möchten.

Gehen Sie zum Lesezeichen „Verbindungen“. Fügen Sie eine neue Zeile hinzu. Auf dem Feld Tabelle 1
Wählen Sie aus der Dropdown-Liste die Tabelle mit den Produkten und im Feld aus Tabelle 2 Tisch
mit Ländern.

Für Tabellen1 Aktivieren Sie das Kontrollkästchen Alle. Für
Tabellen2 Wir aktivieren dieses Kontrollkästchen nicht. Das bedeutet, dass von Tabellen1
Alle Datensätze werden ausgewählt, und von Tabellen2 nur diejenigen, für die es durchgeführt wird
Verbindungsbedingung, das heißt, mit einer solchen Kombination von Flags erhalten wir
LINKER ANSCHLUSS. Als nächstes müssen Sie ausfüllen Kommunikationszustand.
Hier wählen wir die Tabellenfelder aus den Dropdown-Listen und das Vergleichszeichen ebenfalls aus dem Dropdown aus
Liste.

Als Ergebnis dieser Verbindung erhalten wir folgenden Anfragetext:

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Product AS VT_Product LEFT JOIN VT_Country AS VT_Country BY VT_Product.Product Code = VT_Country.Product Code

Schauen wir uns nun einige Punkte genauer an.
Versuchen wir, das Kontrollkästchen zu vertauschen Alle.


Es scheint, dass es am Ende klappen sollte RICHTIG BEITRETEN, aber wenn wir
Schauen wir uns den vom Konstruktor generierten Abfragetext an. Wir werden sehen, dass die Tabelle
Plätze getauscht, aber die Verbindung blieb bestehen:

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Country AS VT_Country LEFT JOIN VT_Product AS VT_Product BY VT_Product.Product Code = VT_Country.Product Code

Mal sehen, was passiert, wenn wir beide Kontrollkästchen deaktivieren

Dadurch erhalten wir eine interne Verbindung.

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Product AS VT_Product INTERNAL JOIN VT_Country AS VT_Country BY VT_Product.Product Code = VT_Country.Product Code

Schließlich, wenn beide Kontrollkästchen aktiviert sind


Wir bekommen eine vollständige Verbindung

SELECT VT_Product.Product Code, VT_Product.Name, VT_Country.Country FROM VT_Product AS VT_Product FULL CONNECTION VT_Country AS VT_Country BY VT_Product.Product Code = VT_Country.Product Code

Sie können mehrere Zeilen für ein Lesezeichen angeben Verbindungen. In diesem Fall mehrere
Zeilen sind durch Bedingung verbunden UND. Darüber hinaus sind keine Leitungen erforderlich
jedes Mal wieder reinfahren. Sie können mit dem Schlüssel kopiert werden F9.
Und ändern Sie in der neuen Zeile nur die Verbindungsbedingung. Dies beschleunigt die Entwicklung erheblich.
Außerdem ist es in der Linkbedingung nicht notwendig, nur die vordefinierten Felder von zu verwenden
Dropdown-Listen. Sie können einen beliebigen Ausdruck verwenden, der die Anforderungen erfüllt
1C-Abfragesprache. Dazu müssen Sie das Kontrollkästchen aktivieren frei
und geben Sie die Bedingung direkt in das Feld ein oder öffnen Sie ein Hilfsfenster in
Hier können Sie Vorlagen mit Abfragesprachenfunktionen verwenden.


Natürlich gibt es in der Praxis viel komplexere Abfragen
mehrere Tische mit verschiedenen Verbindungen untereinander. Aber im Abfrage-Builder
Zusammenhänge beliebiger Komplexität können reproduziert werden.

Der Abfrage-Designer besteht aus den folgenden Registerkarten:

1. „Tabellen und Felder“ – auf der Registerkarte gibt es drei hierarchische Listen:
A. „Datenbank“ – listet alle verfügbaren Objekte auf, zu denen eine Abfrage erfolgen kann. Auch Knopf „Änderungstabellen anzeigen“, mit dem Sie auf Änderungstabellen von Informationssicherheitsobjekten zugreifen können, wenn diese für einen Austauschplan registriert sind.
B. „Tabellen“ – eine Liste ausgewählter Tabellen, für die die Abfrage ausgeführt wird. Außerdem können Sie in diesem Fenster eine Tabelle löschen, umbenennen oder ersetzen und eine interne Abfrage hinzufügen.

Sie können Parameter für virtuelle Tabellen zuweisen, indem Sie auf die Schaltfläche „Parameter für virtuelle Tabellen“ klicken:

Es wird empfohlen, die Parameter virtueller Tabellen aktiv zur Auswahl nach bestimmten Dimensionen zu nutzen, da dies die Geschwindigkeit der Abfrageausführung erhöht. Sie können in Parametern externe Variablen verwenden, deren Namen das Zeichen „&“ vorangestellt ist.
C. „Felder“ – eine Liste von Feldern, die aus Tabellen ausgewählt werden. Sie können auch berechnete Felder hinzufügen. Klicken Sie dazu auf die Schaltfläche „Hinzufügen“, um den benutzerdefinierten Ausdruckskonstruktor zu öffnen:

Auf der linken Seite befindet sich ein Fenster mit den im Ausdruck verfügbaren Feldern. Rechts finden Sie einen Hinweis auf die verwendeten Funktionen. Unten finden Sie einen konstruierbaren beliebigen Ausdruck. Sie können externe Parameter in Ausdrücken verwenden; sie werden mit dem „&“-Zeichen gekennzeichnet, zum Beispiel: &Period, &StartDate
Sie müssen vorsichtig sein: Wenn im Fenster ein langer und komplexer Ausdruck eingegeben wird, der einen kleinen Syntaxfehler enthält, gibt das System nach dem Klicken auf die Schaltfläche „OK“ eine Warnung aus und schließt das Fenster. Der gesamte eingegebene Code geht verloren. Wenn Sie sich über die Richtigkeit des Ausdrucks nicht sicher sind, empfehle ich daher, den Inhalt immer in der Zwischenablage zu speichern (Strg-C), bevor Sie den Konstruktor schließen.

2. „Beziehungen“ – auf der Registerkarte werden Verbindungen zwischen Tabellen angezeigt.

Die Tabelle gibt die zu verknüpfenden Tabellen, die Beziehung zwischen den zu verknüpfenden Tabellen und die Verbindungsbedingung an. Wenn die Verbindungsbedingung komplex ist, können Sie einen bestimmten berechneten Ausdruck angeben und der benutzerdefinierte Feldkonstruktor wird geöffnet.

3. „Gruppierung“ – die Registerkarte zeigt an, welche Felder gruppiert und welche aggregiert (aufsummiert) werden.

4. Registerkarte „Bedingungen“ – listet die Bedingungen auf, die an die Anfrage gestellt werden.
In Bedingungen können Sie auch komplexe Ausdrücke schreiben, indem Sie den einfachen Ausdruckskonstruktor verwenden und externe Variablen verwenden:

5. „Fortgeschritten“
Zusätzliche Parameter, die der Anfrage auferlegt werden

6. „Assoziationen und Pseudonyme“
Auf dieser Registerkarte können Sie Aliase für Felder zuweisen sowie Abfragen verwalten, die über die Konstrukte „UNITE“ oder „UNITE ALL“ verbunden sind.

7. „Bestellung“
In welcher Reihenfolge werden die Abfrageergebnisse angezeigt?

Aufmerksamkeit! Am unteren Rand des Lesezeichens sehen Sie ein Häkchen „Automatisch bestellen“- In der aktuellen Version von 1C 8.1 im ACS ist es nutzlos; außerdem gibt das ACS bei aktiviertem Kontrollkästchen beim Aufzeichnen einen Fehler aus, sodass Sie es nicht verwenden sollten.

8. „Datenzusammensetzung“
Die Registerkarte, in der Servicefelder für das Zutrittskontrollsystem definiert werden. Es spielt ungefähr die gleiche Rolle wie die Registerkarte „Report Builder“ in einem normalen Berichtsdesigner.

A. Auf der Registerkarte „Tabellen“ werden die in der Abfrage verwendeten Tabellen aufgelistet. Sie können angeben, ob die Tabelle in die Abfrage einbezogen werden muss, indem Sie das Kontrollkästchen „Erforderlich“ aktivieren. Diese. Wenn keine Felder in die Auswahl einbezogen werden, nimmt diese Tabelle überhaupt nicht an der Abfrage teil. Sie können auch Parameter für Tabellen angeben.

Beim Einrichten des Zugriffskontrollsystems geben wir alle Auswahlmöglichkeiten an. Anschließend werden alle Auswahlwerte in die Parameter der virtuellen Tabellen eingesetzt, was uns wiederum dabei hilft, die Abfrage zu optimieren und zu beschleunigen.
B. Auf der Registerkarte „Felder“ werden die Felder und ihre Aliase aufgelistet, die zur Liste der ACS-Felder hinzugefügt werden.
C. „Bedingungen“ – wenn in den ACS-Einstellungen Auswahlen angegeben sind, werden alle Auswahlwerte als zusätzliche Bedingungen hinzugefügt; auch komplexe Ausdrücke können zu den Bedingungen hinzugefügt werden.

9. „Eigenschaften“
Ein Lesezeichen, das im üblichen Ausgabeformularkonstruktor keine Entsprechung hat.

Auf dieser Registerkarte können Sie die Arbeit von Abfragen um Merkmale erweitern. Die Tabelle auf der Registerkarte besteht aus mehreren Feldern:
A. „Werttyp“ – der Typ, für den die Merkmale ausgewählt werden. Wenn Sie beispielsweise „Directory Link.Nomenclature“ angeben, werden alle Merkmale für die Nomenklatur in der Abfrage ausgewählt.
B. „Quelle“ – die Quelle für Eigenschaften von Merkmalstypen, kann eine Abfrage oder eine Tabelle sein. In dieses Feld können wir eine Anfrage schreiben, um nur die Eigenschaften auszuwählen, die wir benötigen.
C. „Merkmalsliste“ – ein Feld, in dem die Quelle für die Eigenschaften der Merkmale angegeben wird. Meistens handelt es sich dabei um einen Plan charakteristischer Typen oder eine Anfrage. Außerdem müssen Sie die Felder angeben, die für „Identifier“, „Name“ und „Type“ der Immobilie verantwortlich sind.
D. „Quelle“ ist das nächste Feld, in dem wir die Quelle der Merkmalswerte angeben, die ebenfalls entweder eine Tabelle oder eine Abfrage sein kann.
e. „Merkmalswert“ ist eine Tabelle oder Abfrage, die Merkmalswerte empfängt. Beispielsweise kann das Informationsregister „ObjectPropertyValues“ als Tabelle mit Merkmalswerten dienen. Wir müssen auch diejenigen Felder aus der Tabelle (oder Abfrage) angeben, die für das „Objekt“, die „Eigenschaft“ und den „Wert“ des Merkmals verantwortlich sind.
Nach der Bearbeitung der Anfrage ist der Anfragetext im Fenster unterhalb der Felderliste zu sehen. Nachfolgend können wir mit der Checkbox „Autofill“ die Vervollständigung zusätzlicher Parameter für die in der Anfrage angegebenen Felder regeln. Bitte beachten Sie, dass die Zusammensetzung der Felder erst in der Anfrage selbst festgelegt wird.

Informationen stammen von der Website

Heute werden wir darüber sprechen, wie es geht verschachtelte Abfragen verwenden Abfrage Ersteller. Kommen wir gleich zu einem Beispiel.

Nehmen wir an, wir haben dieses einfache Informationsregister, in dem Preise nach Waren und Lieferanten gespeichert sind:

Wir möchten den Erhalt aller Produkte anfordern, die mehr als einen Lieferanten haben. Dies kann mit der folgenden Abfrage implementiert werden:

SELECT Anzahl der Lieferanten.Produkt AS Produkt FROM (SELECT Preis.Produkt AS Produkt, QUANTITY(DIFFERENT Preis.Lieferant) AS Lieferanten FROM RegisterInformation.Preis AS Preis GRUPPE NACH Preis.Produkt) AS Anzahl der Lieferanten WHERE Anzahl der Lieferanten.Lieferanten > 1

Bilden einer verschachtelten Abfrage im Konstruktor

Lassen Sie uns die obige Anfrage mit dem Konstruktor erstellen.

Gehen Sie dazu im Befehlsfeld über das Feld Tische Drücken Sie den Knopf Erstellen Sie eine Unterabfrage:


Danach öffnet sich ein Fenster mit einer weiteren Instanz des Abfragekonstruktors:


Und in diesem neuen Fenster erstellen wir eine verschachtelte Abfrage:




Klicken Sie auf die Schaltfläche Anfrage In der unteren linken Ecke sehen wir den Text der Unterabfrage:


Nachdem wir im Hilfskonstruktor auf die Schaltfläche OK geklickt haben, erhalten wir im Hauptfenster folgendes Bild:


Da der Satz Verschachtelte Abfrage nicht sehr bequem für die Wahrnehmung, verwenden wir die rechte Maustaste, um die Tabelle umzubenennen Anzahl der Lieferanten, wählen Sie ein Feld daraus aus Produkt und auf dem Lesezeichen Bedingungen Schreiben wir die notwendige Bedingung auf:




Und nach all diesen Manipulationen erhalten wir die gewünschte Anfrage. Bei Bedarf können Sie Abfragen mit mehreren Verschachtelungsebenen erstellen.

So erstellen Sie im Konstruktor eine verschachtelte Abfrage aus einer regulären Abfrage

Sehr oft kommt es vor, dass man im Konstruktor eine Anfrage stellt und irgendwann erkennt, dass diese verschachtelt werden muss. In unserem Beispiel ist das natürlich kein Problem – Sie können einfach alles löschen und die Anfrage erneut stellen. In der Praxis gibt es jedoch weitaus komplexere Beispiele, beispielsweise mit mehreren Verschachtelungsebenen, bei denen mehrere Stunden für die Anfrage aufgewendet wurden. Und in diesem Fall gibt es einen ziemlich einfachen Ausweg. Sie können den im Designer integrierten Abfragetexteditor verwenden. Es muss eine Schaltfläche verwendet werden Anfrage Holen Sie sich den Anfragetext (siehe Bild oben) und kopieren Sie ihn in die Zwischenablage. Erstellen Sie als Nächstes eine neue verschachtelte Abfrage und klicken Sie erneut auf die Schaltfläche Anfrage, fügen Sie den Text aus dem Puffer ein und klicken Sie auf OK. Dementsprechend klären wir die alte Anfrage auf oberster Ebene. Auf diese Weise können wir bei Bedarf problemlos mehrstufige verschachtelte Abfragen im laufenden Betrieb erstellen.

Die Möglichkeit, Abfragetext „manuell“ zu schreiben, war nie „überflüssig“, bequemer ist es jedoch, einen Abfragedesigner zu verwenden.

Kommentar.

Leider können Sie in einer verwalteten Anwendung den Abfrage-Designer nicht in der Verarbeitung „Kennenlernen der Abfrage“ verwenden. Sie können es in dieser Verarbeitung verwenden, indem Sie in den Normalmodus wechseln, wir werden dies jedoch nicht tun.

Lassen Sie uns die Verarbeitung „Anforderungskonstruktor“ erstellen und im Subsystem „Berichte und Verarbeitung“ definieren.

Erstellen wir ein Verarbeitungsformular und fügen darin das Attribut des Formulars „TabDoc“ vom Typ „Tabular Document“ sowie den Befehl „Abfrage ausführen“ mit der Aktion „Abfrage ausführen“ hinzu. Ziehen Sie sie anschließend auf das Formular.

Damit der Befehl funktioniert, schreiben wir im Formularmodul eine Prozedur:

&OnClient

Prozedur Abfrage ausführen (Befehl)

ExecuteRequestServer();

Ende des Verfahrens

&Auf dem Server

Ende des Verfahrens

Wir begeben uns in die auf dem Server aufgerufene Prozedur und rufen aus dem Kontextmenü „Abfragekonstruktor mit Ergebnisverarbeitung“ auf (Abbildung 2.65).

Abbildung 2.65 Abfragekonstruktor mit Ergebnisverarbeitung

Stellen Sie den Verarbeitungstyp auf „Ausgabe in ein Tabellendokument“ ein und klicken Sie entweder auf die Schaltfläche „Weiter“ oder auf die Registerkarte „Tabellen und Felder“.

Auf der Registerkarte „Tabellen und Felder“ des Designers können Sie die aktuell im System vorhandenen Tabellen einsehen (der linke Teil trägt die Überschrift „Datenbank“) (Abbildung 2.66).

Abbildung 2.67 Abfragekonstruktor

Die Tabellen, aus denen die Abfrage Daten bezieht, werden in den Bereich „Tabellen“ übertragen; die für die Abfrage benötigten Felder werden in den Bereich „Felder“ übertragen. Machen wir es wie in Abbildung 2.68.

Abb. 2.68 Abfragekonstruktor

Hier haben wir das erstellte Standardansichtsfeld entfernt – „PREPRESENTATION (Product ReceiptProducts.Nomenclature)“

Während der Zusammenarbeit mit dem Designer können Sie jederzeit den resultierenden Anfragetext einsehen. Um diese Aufgabe auszuführen, müssen Sie auf die Schaltfläche „Anfrage“ in der unteren linken Ecke des Designer-Formulars klicken (Abbildung 2.69).

Sie können den Anfragetext manuell bearbeiten, indem Sie auf die Schaltfläche „Bearbeiten“ klicken.

Üben. Klicken Sie auf die Schaltfläche „OK“ und überprüfen Sie unsere Verarbeitung im Benutzermodus. Wenn Sie die bei der Ausführung der Anfrage erhaltenen Daten analysieren, können Sie auf „Wiederholungen“ von Artikelpositionen stoßen (wenn dies für Sie nicht funktioniert, können Sie jedes Dokument „Wareneingang“ kopieren und buchen).

Wir kehren zur ExecuteRequestServer()-Prozedur in der „Request Constructor“-Verarbeitung zurück und rufen aus dem Kontextmenü erneut „Query Constructor with result processing“ auf.

Wenn Sie das Ergebnis einer Abfrage „komprimieren“ möchten, können Sie zu diesem Zweck die Registerkarte „Gruppierung“ des Abfragedesigners verwenden.

Beim Definieren von Gruppierungen müssen Sie die folgende Regel einhalten: Alle Abfrageauswahlfelder werden in Felder unterteilt, nach denen die Gruppierung (Faltung) durchgeführt wird, Felder verschachtelter Tabellen (Felder, die relativ zu denen, nach denen die Gruppierung durchgeführt wird, summiert werden) und aggregiert Funktionen. Definieren wir Gruppierungen (Abbildung 2.70).

Abbildung 2.70 Abfrage-Generator

Wenn die durch die Anfrage empfangenen Daten nach einer Bedingung ausgewählt werden müssen, kann es in diesem Fall erforderlich sein, die Registerkarte „Bedingungen“ zu verwenden. Wählen wir Goods ReceiptGoods.Quantity=10 (Abbildung 2.71).

Abbildung 2.71 Bedingung des Abfragekonstruktors.

Bitte beachten Sie, dass die Anfrage nicht ausgeführt wird, wenn die Bedingung auf die gleiche Weise wie in der Abbildung definiert ist.

Es gibt zwei Möglichkeiten, die Situation zu korrigieren:

    Durch Neudefinition der Bedingung durch Aktivieren des „P...“-Flags;

    Indem Sie die Möglichkeit nutzen, den Anfragetext selbst zu ändern (erhalten Sie durch Klicken auf die Schaltfläche „Anfrage bearbeiten“).

Die manuelle Änderung selbst besteht darin, dass das „&“-Symbol vor der Zahl „10“ entfernt werden muss. Dieses Symbol im Anfragetext definiert die Anfrageparameter, in die später (jedoch vor der Ausführung der Anfrage) einige Werte geschrieben werden müssen. Klicken Sie auf die Schaltfläche „Abfrage bearbeiten“ und bearbeiten Sie sie (Abbildung 2.72).

Abbildung 2.73 Bearbeiten einer Abfrage

Auf der Registerkarte „Erweitert“ können Sie eine Reihe von Flags (bezogen auf das Schlüsselwort „Select“ der Abfragesprache) überprüfen und die Zusammensetzung der Tabellen bestimmen, die für die Änderung der Abfrage vorgesehen sind (Abbildung 2.74).

Abbildung 2.74 Zusätzliche Abfragefunktionen

Auf der Registerkarte „Joins/Aliases“ können Sie die Feldnamen ändern, indem Sie „Aliases“ festlegen, wir werden dies jedoch nicht tun.

Auf der Registerkarte „Reihenfolge“ können Sie die Sortierreihenfolge der Datensätze als Ergebnis der Abfrage festlegen (Abbildung 2.75).

Abbildung 2.75 Sortierreihenfolge der Datensätze

Achten Sie auf das Flag „Auto-Order“, mit dem Sie nach Feldern eines Referenztyps sortieren können.

Bei der Definition des Abschnitts „Summen“ sollten Sie damit rechnen, dass als Ergebnis der Abfrage „zusätzliche“ Summensätze erscheinen. Zusammen mit diesen Datensätzen wird das Abfrageergebnis hierarchisch (Abbildung 2.76).

Abbildung 2.76.Ergebnisse des Abfragekonstruktors.

Es können mehrere Arten von Summen angegeben werden:

    Elemente (die Auswahl der Abfrageergebnisse enthält Gruppierungssummen und detaillierte Datensätze);

    Hierarchie (bei der Auswahl der Abfrageergebnisse gibt es im Allgemeinen Zusammenfassungsdatensätze nach Hierarchie, Zusammenfassungsdatensätze nach Gruppierung und detaillierte Datensätze);

    Nur Hierarchie (bei der Auswahl der Abfrageergebnisse gibt es im Allgemeinen Zusammenfassungsdatensätze nach Hierarchie).

Nach einem Klick auf den „Ok“-Button des Konstruktors wird ein „Layout“ generiert und der Code für die ExecuteRequestServer()-Prozedur in das Formularmodul geschrieben:

&Auf dem Server

Prozedur ExecuteRequestServer()

//((QUERY_CONSTRUCTOR_WITH_RESULT_PROCESSING

// Dieses Fragment wird vom Konstruktor erstellt.

// Bei Wiederverwendung des Konstruktors gehen manuell vorgenommene Änderungen verloren!!!

Layout = Processing.QueryConstructor.GetLayout("Layout");

Anfrage = Neue Anfrage;

Request.Text =

| Wareneingang Waren. Nomenklatur AS Nomenklatur,

| SUM (Wareneingang Warenmenge) AS Menge,

| SUM(Receipt of GoodsGoods.Amount) AS Betrag

| Dokument.Wareneingang.Waren

| SO ERHALTEN SIE PRODUKTE

| Wareneingang Waren. Menge > 1

|GRUPPE NACH

| WareneingangWaren.Nomenklatur

|ORDNEN NACH

| Menge,

| Betrag VERRINGERN

| SUMME(Menge),

| SUM(Summe)

| Nomenklatur HIERARCHIE“;

Ergebnis = Query.Run();

HeaderArea = Layout.GetArea("Header");

AreaFooter = Layout.GetArea("Footer");

TableHeadArea = Layout.GetArea("TableHeader");

TableFooterArea = Layout.GetArea("TableFooter");

AreaNomenclatureHierarchy = Layout.GetArea("NomenclatureHierarchy");

AreaNomenclature = Layout.GetArea("Nomenclature");

TabDoc.Clear();

TabDoc.Output(AreaHeader);

TabDoc.Output(TableHeadArea);

TabDoc.StartAutoGroupingRows();

SelectionNomenclature = Result.Select(BypassQueryResult.ByGrouping);

While SelectionNomenclature.Next() Schleife

Wenn SelectionNomenclature.RecordType() = RequestRecordType.TotalByHierarchy, dann

Area = AreaNomenclatureHierarchy;

Region = RegionNomenklatur;

endIf;

Area.Parameters.Fill(SelectionNomenclature);

TabDoc.Output(Area, SelectionNomenclature.Level());

EndCycle;

TabDoc.FinishAutoGroupingRows();

TabDoc.Output(TableFooterArea);

TabDoc.Output(AreaFooter);

//))CONSTRUCTOR_QUERY_WITH_RESULT_PROCESSING