» Notizbuch des Programmierers. Mit der „Allowed“-Direktive 1c wählen Sie „allowed“ aus

Notizbuch des Programmierers. Mit der „Allowed“-Direktive 1c wählen Sie „allowed“ aus
   

17 Regeln zum Erstellen einer optimalen ABFRAGE für 1C-Datenbankdaten

Um Abfragen an Datenbanktabellen in der 1C-Plattform zu generieren und auszuführen, wird ein spezielles Programmiersprachenobjekt verwendet Anfrage. Dieses Objekt wird durch den Aufruf des Konstrukts erstellt Neue Anfrage. Die Abfrage ist praktisch, wenn Sie eine komplexe Datenstichprobe benötigen, die nach Bedarf gruppiert und sortiert werden muss. Ein klassisches Beispiel für die Verwendung einer Abfrage besteht darin, eine Zusammenfassung des Status des Akkumulationsregisters zu einem bestimmten Zeitpunkt zu erhalten. Darüber hinaus erleichtert der Abfragemechanismus das Abrufen von Informationen in verschiedenen Zeiträumen.

Der Anfragetext ist die Anweisung, nach der die Anfrage ausgeführt werden muss. Der Anfragetext beschreibt:

  • Infobase-Tabellen, die als Abfragedatenquellen verwendet werden;
  • Tabellenfelder, die in der Abfrage verarbeitet werden müssen;
  • Gruppierungsregeln;
  • Ergebnisse sortieren;
  • usw.

Die Anweisung ist in einer speziellen Sprache – der Abfragesprache – verfasst und besteht aus einzelnen Teilen – Abschnitten, Sätzen, Schlüsselwörtern, Funktionen, arithmetischen und logischen Operatoren, Kommentaren, Konstanten und Parametern.

Die Abfragesprache der 1C-Plattform ist der Syntax anderer SQL-Sprachen sehr ähnlich, es gibt jedoch Unterschiede. Die Hauptvorteile der integrierten Abfragesprache sind: Dereferenzierung von Feldern, Vorhandensein virtueller Tabellen, bequemes Arbeiten mit Ergebnissen, untypisierte Felder in Abfragen.

Empfehlungen zum Schreiben von Datenbankabfragen in der Abfragesprache der 1C-Plattform:

1) Der Anfragetext kann vordefinierte Konfigurationsdaten enthalten, wie zum Beispiel:

  • Aufzählungswerte;
  • Vordefinierte Daten:
  • Nachschlagewerke;
  • Pläne für Merkmalstypen;
  • Kontenpläne;
  • Pläne für Berechnungsarten;
  • leere Links;
  • Werte der Geschäftsprozess-Routenpunkte.

Außerdem kann der Anforderungstext die Werte von Systemaufzählungen enthalten, die Feldern in den Datenbanktabellen zugeordnet werden können: Akkumulationsbewegungsart, Kontoart und Buchhaltungsbewegungsart. In Abfragen wird über ein Literal vom Funktionstyp VALUE auf vordefinierte Konfigurationsdaten und Systemaufzählungswerte zugegriffen. Mit diesem Literal können Sie die Lesbarkeit der Abfrage verbessern und die Anzahl der Abfrageparameter reduzieren.

Beispiel für die Verwendung eines Literals BEDEUTUNG:

  • WHERE City = VALUE(Directory.Cities.Moscow)
  • WHERE City = VALUE(Directory.Cities.EmptyLink)
  • WHEREProductType = VALUE(Enumeration.ProductTypes.Service)
  • WHEREMovementType = VALUE(MovementTypeAccumulation.Incoming)
  • WHERE RoutePoint = VALUE(BusinessProcess.BusinessProcess1.RoutePoint.Action1

2) Verwendung der Anweisungen AUTOMATISCHE BESTELLUNG Die Ausführung der Abfrage kann lange dauern. Wenn also keine Sortierung erforderlich ist, ist es besser, sie überhaupt nicht zu verwenden. In den meisten Fällen ist es am besten, die Befehlssortierung zu verwenden SORTIERE NACH.

Die automatische Bestellung funktioniert nach folgenden Prinzipien:

  • Wenn in der Anfrage die ORDER BY-Klausel angegeben wurde, wird jeder in dieser Klausel gefundene Link zur Tabelle durch die Felder ersetzt, nach denen die Tabelle standardmäßig sortiert ist (bei Nachschlagewerken ist dies der Code oder Name, bei Dokumenten das Datum des Dokuments). Bezieht sich das zu sortierende Feld auf ein hierarchisches Verzeichnis, so wird die hierarchische Sortierung nach diesem Verzeichnis angewendet.
  • Wenn die Anfrage keine ORDER BY-Klausel, aber eine TOTAL-Klausel enthält, wird das Abfrageergebnis nach den Feldern sortiert, die in der TOTAL-Klausel nach dem Schlüsselwort BY vorhanden sind, und zwar in derselben Reihenfolge und, sofern die Gesamtsummen nach berechnet wurden Referenzfeldern, dann standardmäßig nach den Sortierfeldern der referenzierten Tabellen.
  • Wenn die Abfrage die Klauseln ORDER BY und TOTAL nicht enthält, aber eine Klausel GROUP BY vorhanden ist, wird das Abfrageergebnis nach den in der Klausel vorhandenen Feldern in derselben Reihenfolge und, sofern die Gruppierung nach Referenzfeldern durchgeführt wurde, sortiert , dann werden standardmäßig die referenzierten Feldtabellen sortiert.
  • Wenn die Abfrage keine ORDER BY-, TOTAL- oder GROUP BY-Klauseln enthält, wird das Ergebnis nach den Standardsortierfeldern für die Tabellen, aus denen die Daten ausgewählt werden, in der Reihenfolge sortiert, in der sie in der Abfrage erscheinen.
  • Wenn die Abfrage eine TOTAL-Klausel enthält, wird jede Gesamtebene separat bestellt.

3) Um zu vermeiden, dass eine Abfrage an die Datenbank wiederholt wird, wenn dem Benutzer das Abfrageergebnis angezeigt wird (z. B. beim Erstellen einer Abfrage oder beim Anzeigen des Abfrageergebnisses mithilfe eines Tabellenkalkulationsdokuments), ist es sinnvoll, die Anweisung zu verwenden EINFÜHRUNGSLINKS, wodurch Sie eine Darstellung eines Referenzwerts erhalten können. Beispiel:

Es ist auch möglich, Anweisungen zu verwenden LEISTUNG– Entwickelt, um eine Zeichenfolgendarstellung eines Werts eines beliebigen Typs zu erhalten. Der Unterschied zwischen diesen Anweisungen besteht darin, dass im ersten Fall, wenn die Anweisungen einen Link übergeben, das Ergebnis eine Zeichenfolge ist. In anderen Fällen ist das Ergebnis der Wert des übergebenen Parameters. Im zweiten Fall ist das Ergebnis der Anweisung immer ein String!

4) Wenn die Anfrage ein Feld mit einem zusammengesetzten Typ enthält, ist es für solche Felder erforderlich, die Feldwerte mithilfe einer Anweisung in einen bestimmten Typ umzuwandeln ÄUSSERN, wodurch Sie unnötige Tabellen aus dem Left-Join mit einem Feld eines komplexen Datentyps entfernen und die Abfrageausführung beschleunigen können. Beispiel:

Es gibt ein Register für die Anhäufung von Restwaren, in dem das Feld „Registrar“ einen zusammengesetzten Typ hat. In der Anfrage werden das Datum und die Dokumentnummer des Wareneingangs ausgewählt, während beim Zugriff auf die Dokumentdetails über das Feld Registrar viele linke Verbindungen der Akkumulationsregistertabelle mit den Tabellen der Registrardokumente nicht auftreten.

Code 1C v 8.x SELECT
EXPRESS(Restwaren.Registrar AS Dokument.Wareneingang).Nummer AS Empfangsnummer,
EXPRESS(Restwaren.Registrar AS Dokument.Wareneingang).Datum AS Empfangsdatum
AUS
Sammelregister. Restware AS Restware

Wenn eine Typumwandlung als nicht machbar erachtet wird, ist das Ergebnis der Typumwandlung der Wert NULL.

5) Vergessen Sie nicht die Anweisungen ERLAUBT, was bedeutet, dass die Abfrage nur Datensätze auswählt, für die der aktuelle Benutzer Rechte hat. Wenn dieses Wort nicht angegeben wird und die Anfrage Datensätze auswählt, für die der Benutzer keine Rechte hat, schlägt die Anfrage fehl.

6) Wenn die Abfrage einen Join verwendet und einige Teile des Joins verschachtelte Tabellen enthalten (ein Dokument mit einem tabellarischen Teil) und andere nicht, muss die Auswahlliste durch Felder ergänzt werden – leere verschachtelte Tabellen. Dies geschieht über ein Schlüsselwort LEERTABELLE, danach werden die Aliase der Felder, aus denen die verschachtelte Tabelle besteht, in Klammern angegeben. Beispiel:

Code 1C v 8.x // Felder Nummer und Zusammensetzung auswählen
// aus der virtuellen Tabelle Document.Expenditure
Wählen Sie Linknummer, leere Tabelle (Nr., Artikel, Menge) als Zusammensetzung aus
VON Dokument.Spesenrechnung
ALLES KOMBINIEREN
SELECT Link.Number, Contents.(LineNumber, Product, Quantity)
FROM Dokument.Rechnung Dokument.Rechnung.Zusammensetzung.*

7) Um zu verhindern, dass doppelte Zeilen im Abfrageergebnis erscheinen, sollten Sie die Anweisung verwenden VERSCHIEDEN, weil es anschaulicher und verständlicher ist, und die Anweisungen GRUPPIERE NACH Wird zur Gruppierung mithilfe von Aggregatfunktionen verwendet. Ksati, bei der Verwendung von Aggregatfunktionen ein Vorschlag GRUPPIERE NACH darf überhaupt nicht angegeben werden, aber alle Abfrageergebnisse werden in einer einzigen Zeile gruppiert. Beispiel:

Code 1C v 8.x // Es ist notwendig herauszufinden, welche Gegenparteien
// Waren wurden für den Zeitraum versandt.
Wählen Sie Verschiedene aus
Dokument.Rechnung.Gegenpartei

8) Anweisungen GRUPPIERE NACH ermöglicht Ihnen den Zugriff auf Felder der obersten Ebene, ohne die Ergebnisse nach diesen Feldern zu gruppieren, wenn Aggregatfunktionen auf die Felder einer verschachtelten Tabelle angewendet werden. Obwohl in der 1C-Hilfe angegeben ist, dass beim Gruppieren von Abfrageergebnissen Aggregatfunktionen in der Liste der Auswahlfelder angegeben werden müssen und zusätzlich zu Aggregatfunktionen in der Liste der Auswahlfelder nur die Felder angegeben werden dürfen, nach denen die Gruppierung durchgeführt wird . Beispiel:

Code 1C v 8.x SELECT
Empfang von Waren und Dienstleistungen. Waren. (SUMME (Menge), Nomenklatur),
Empfang von Waren und Dienstleistungen. Link,
Empfang von Waren und Dienstleistungen. Gegenpartei
AUS
Dokument. Empfang von Waren und Dienstleistungen. WIE Empfang von Waren und Dienstleistungen
GRUPPIERE NACH
Empfang von Waren und Dienstleistungen. Waren. (Nomenklatur)

9) Anweisungen IST NULL soll den Wert ersetzen NULL in einen anderen Wert umwandeln, aber vergessen Sie nicht, dass der zweite Parameter in den Typ des ersten konvertiert wird, wenn der Typ des ersten Parameters eine Zeichenfolge oder eine Zahl ist.

10) Beim Zugriff auf die Haupttabelle können Sie bedingt auf die Daten in der untergeordneten Tabelle zugreifen. Diese Funktion wird als Dereferenzierung von Feldern einer untergeordneten Tabelle bezeichnet.

Beispiel (Suche nach Dokumenten, die ein bestimmtes Produkt im tabellarischen Bereich enthalten):

Der Vorteil dieser Abfrage gegenüber einer Abfrage der untergeordneten Tabelle Receipt.Goods besteht darin, dass bei Duplikaten in Dokumenten das Abfrageergebnis nur eindeutige Dokumente zurückgibt, ohne das Schlüsselwort DIFFERENT zu verwenden.

11) Eine interessante Variante von Operator B ist die Prüfung, ob eine geordnete Menge in der Menge solcher Mengen (Feld1, Feld2, ..., FeldN) B (Feld1, Feld2, ..., FeldN) enthalten ist.

Code 1C v 8.x SELECT
Gegenparteien.Link
WO
(Kontrahenten.Link, Produkte.Link) B
(SELECT Sales.Customer, Sales.Product
VON RegisterAccumulation.Sales AS Sales)
AUS
Verzeichnis. Gegenparteien,
Verzeichnis.Produkte

12) Verwenden Sie nach Möglichkeit virtuelle Abfragetabellen. Beim Erstellen einer Abfrage stellt das System eine Reihe virtueller Tabellen als Datenquellen zur Verfügung – dabei handelt es sich um Tabellen, die ebenfalls das Ergebnis einer Abfrage sind, die das System zum Zeitpunkt der Ausführung des entsprechenden Codeabschnitts generiert.

Der Entwickler kann selbstständig dieselben Daten abrufen, die ihm das System als virtuelle Tabellen zur Verfügung stellt, der Algorithmus zum Abrufen dieser Daten wird jedoch nicht optimiert, weil:

Alle virtuellen Tabellen sind parametrisiert, d. h. der Entwickler hat die Möglichkeit, einige Parameter festzulegen, die das System beim Generieren einer Anfrage zum Erstellen einer virtuellen Tabelle verwenden wird. Abhängig davon, welche Parameter der virtuellen Tabelle vom Entwickler angegeben werden, kann das System generieren VERSCHIEDEN Abfragen, um dieselbe virtuelle Tabelle zu erhalten, und sie werden im Hinblick auf die übergebenen Parameter optimiert.

Es ist für einen Entwickler nicht immer möglich, auf die Daten zuzugreifen, auf die das System Zugriff hat.

13) Im Client-Server-Betriebsmodus ist die Funktion SUBSTRING() wird mithilfe der SUBSTRING()-Funktion der entsprechenden SQL-Anweisung implementiert, die an den SQL Server-Datenbankserver übergeben wird, der den Typ des Ergebnisses der SUBSTRING()-Funktion anhand komplexer Regeln in Abhängigkeit vom Typ und den Werten seiner Parameter berechnet, wie z sowie abhängig vom Kontext, in dem es verwendet wird. In den meisten Fällen haben diese Regeln keine Auswirkung auf die Abfrageausführung, es gibt jedoch Zeiten, in denen die von SQL Server berechnete maximale Ergebniszeilenlänge für die Abfrageausführung wichtig ist. Es ist wichtig zu bedenken, dass in einigen Kontexten bei Verwendung der Funktion SUBSTRING() die maximale Länge ihres Ergebnisses der maximalen Länge einer Zeichenfolge mit begrenzter Länge entsprechen kann, die in SQL Server 4000 Zeichen beträgt. Dies kann dazu führen, dass die Abfrage unerwartet abstürzt:

Microsoft OLE DB-Anbieter für SQL Server: Warnung: Der Abfrageprozessor konnte vom Optimierer keinen Abfrageplan erstellen, da die Gesamtlänge aller Spalten in der GROUP BY- oder ORDER BY-Klausel 8000 Byte überschreitet.

HRESULT=80040E14, SQLSTATE=42000, native=8618

14) Mit Vorsicht verwenden ODER im Design WO, da die Verwendung einer ODER-Bedingung die Abfrage erheblich erschweren kann. Das Problem kann durch Design gelöst werden ALLES KOMBINIEREN. Beispiel:

Code 1C v 8.x SELECT

AUS

WO
_Demo Contractors.Link =Link1
ALLES KOMBINIEREN
WÄHLEN
_Demo Contractors.NameFull
AUS
Verzeichnis._Demo-Kontrahenten WIE MAN _Demo-Kontrahenten
WO
_Demo Contractors.Link = Link2

15) Zustand NICHT IN im Design WO erhöht die Ausführungszeit der Abfrage, da dies eine Art ist NICHT (OR1 ODER2 ... ORn), also versuchen Sie es für große Tische zu verwenden LEFT JOIN mit der Bedingung IS NULL. Beispiel:

Code 1C v 8.x SELECT
_Demo Contractors.Link
AUS
Verzeichnis._Demo-Kontrahenten WIE MAN _Demo-Kontrahenten
LEFT CONNECTION Document._Demo-Bestellung des Käufers HOW TO _Demo-Bestellung des Käufers
Software _Demo Gegenparteien. Link = _Demo Bestellung des Käufers. Gegenpartei
WO
_Demo-Auftrag des Käufers. Gegenpartei ist NULL

16) Bei der Verwendung Temporäre Tabellen Sie müssen die Bedingungs- und Join-Felder in diesen Tabellen indizieren, ABER bei Verwendung von Indizes kann die Abfrage sogar noch langsamer sein. Daher ist es notwendig, jede Abfrage mit und ohne Index zu analysieren, die Geschwindigkeit der Abfrageausführung zu messen und eine endgültige Entscheidung zu treffen.

Wenn Sie Daten in einer temporären Tabelle platzieren, die zunächst durch einige Felder indiziert wird, verfügt die temporäre Tabelle nicht mehr über einen Index für diese Felder.

17) Wenn Sie es nicht verwenden Temporärer Tabellenmanager Dann ist es nicht erforderlich, die temporäre Tabelle explizit zu löschen. Sie wird gelöscht, nachdem die Stapelabfrage abgeschlossen ist. Andernfalls sollten Sie die temporäre Tabelle mit einer der folgenden Methoden löschen: Befehl ZERSTÖREN Rufen Sie in der Anfrage die Methode auf TemporaryTableManager.Close().

Und zusätzlich zum Video von Evgeny Gilev: Typische Fehler beim Schreiben von Abfragen in 1C:

Die 1C 8-Abfragesprache ist ein unverzichtbares Werkzeug für einen 1C-Programmierer; sie ermöglicht es Ihnen, prägnanteren, einfacheren und verständlicheren Code zu schreiben und bei der Arbeit mit Daten weniger Systemressourcen zu verbrauchen. Dieser Artikel eröffnet eine Reihe von Lektionen, die der Abfragesprache 1C 8 gewidmet sind. In der ersten Lektion werden wir uns die Struktur des Hauptoperators dieser Sprache ansehen – WÄHLEN. Mit diesem Operator können Sie Selektionen aus Datenbanktabellen erstellen. Ausgewählte Tabellendaten können sortiert, mit Bedingungen versehen, mit Daten aus anderen Tabellen verknüpft und kombiniert, nach verschiedenen Feldern gruppiert werden und vieles mehr.

Abfragesprache 1C Enterprise 8 – Operatorstruktur SELECT

Schauen wir uns die Struktur des SELECT-Operators an (optionale Teile des Operators sind in eckigen Klammern angegeben). Die 1C-Abfragesprache bietet eine breite Palette von Tools zum Erstellen von Datenbeispielen.

SELECT [ALLOWED] [DIFFERENT] [FIRST A] [Field1] [AS Alias1], [Field2] [AS Alias2], ... [FieldM] [AS AliasB] [PUT TemporaryTableName] [FROM Table1 AS AliasTableTable1 [[INNER JOIN ][LEFT JOIN][FULL JOIN] Table2 AS Alias ​​​​Table2 [[INNER JOIN][LEFT JOIN][FULL JOIN] TableC AS Alias ​​​​TablesC BY Expression1 [And Expression2]...[And ExpressionD]] .. . ... BY Expression1 [And Expression2]...[And ExpressionE]] ... [TableF AS TableF Alias] ... ] [GROUP BY GroupingField1[,] ... [GroupingFieldG]] [WHERE Expression1 [AND Ausdruck2] ... [AND AusdruckH]] [UNITE ALL...] [; ...] [INDEX BY Alias1 ... AliasB] [TOTALS [AggregationFunction(Field1)][,] [AggregationFunction(Field2)][,] ... [AggregationFunction(FieldI)] BY [GENERAL][,] [ GroupingField1][,] ... [GroupingFieldj]]

Schlüsselwörter und Blöcke für die Arbeit mit Feldern

  • WÄHLEN— ein Schlüsselwort, das den Anfang des Operators angibt;
  • ERLAUBT gibt an, dass die Auswahl Tabellendatensätze umfassen soll, die Lesezugriff für den angegebenen Benutzer haben;
  • VERSCHIEDEN gibt an, dass die Stichprobe nur unterschiedliche (feldübergreifende) Flüsse umfassen sollte. Mit anderen Worten: Doppelte Zeilen werden aus der Stichprobe ausgeschlossen;
  • ZUERST EIN Wenn Sie dieses Schlüsselwort angeben, wird nur das erste A der von der Abfrage ausgewählten Zeilen in die Auswahl einbezogen, wobei A eine natürliche Zahl ist.
  • Feldblock— Dieser Block gibt die Felder an, die in die Auswahl einbezogen werden müssen. Diese Felder werden zu ausgewählten Spalten. Im einfachsten Fall sieht das Feld so aus: Table Alias.TableFieldName AS Field Alias

    Auf diese Weise geben wir an, aus welcher Tabelle wir dieses Feld übernehmen. Mit der 1C-Abfragesprache können Sie beliebige Aliase angeben, diese sollten jedoch nicht in derselben SELECT-Anweisung wiederholt werden. Ein Feld kann komplexer sein und aus verschiedenen Kombinationen von Tabellenfeldern, Abfragesprachenfunktionen und Aggregatfunktionen bestehen. Diese Fälle werden in diesem Tutorial jedoch nicht behandelt.

Schlüsselwörter und Blöcke für die Arbeit mit Tabellen

  • PUT TemporaryTableName- Stichwort ORT soll eine temporäre Tabelle mit einem bestimmten Namen erstellen, die in einer bestimmten 1C 8-Sitzung im RAM gespeichert wird, bis sie endet oder bis die temporäre Tabelle zerstört wird. Es ist zu beachten, dass die Namen temporärer Tabellen in einer 1C 8-Sitzung nicht wiederholt werden sollten;
  • Block von Tabellen und Beziehungen– Der Block zeigt alle in dieser Abfrage verwendeten Tabellen sowie die Beziehungen zwischen ihnen an. Der Block beginnt mit einem Schlüsselwort AUS, gefolgt vom Namen und Alias ​​der ersten Tabelle. Wenn diese Tabelle mit anderen Tabellen verknüpft ist, werden die Beziehungen angezeigt. Die 1C-Abfragesprache enthält die folgenden Verbindungstypen:
    • INNER JOIN— Ein Datensatz aus der linken Tabelle wird nur dann in die Auswahl aufgenommen, wenn die Verbindungsbedingung erfüllt ist. Ein Datensatz aus der rechten Tabelle wird nur dann in die Auswahl aufgenommen, wenn die Verbindungsbedingung erfüllt ist.
    • LINKER ANSCHLUSS— Ein Datensatz aus der linken Tabelle wird in jedem Fall in die Auswahl einbezogen, ein Datensatz aus der rechten Tabelle wird nur dann in die Auswahl einbezogen, wenn die Verbindungsbedingung erfüllt ist;
    • VOLLSTÄNDIGE VERBINDUNG— Ein Datensatz aus der linken Tabelle wird in jedem Fall zuerst in die Auswahl aufgenommen, dann nur, wenn die Verbindungsbedingung erfüllt ist. Ein Datensatz aus der rechten Tabelle wird in jedem Fall zuerst in die Auswahl aufgenommen, dann nur, wenn die Verbindungsbedingung erfüllt ist erfüllt ist. In diesem Fall werden die resultierenden doppelten Zeilen aus der Stichprobe ausgeschlossen.

    Nach dem Verbindungstyp werden Name und Alias ​​der zweiten Tabelle angezeigt. Als nächstes kommt das Schlüsselwort VON, gefolgt von Kommunikationsbedingungen, die durch logische Operatoren miteinander verbunden sind UND, ODER. Jeder Ausdruck in der Bedingung muss einen booleschen Wert (True, False) zurückgeben. Wenn die erste Tabelle mit anderen Tabellen als der zweiten verbunden ist, wird erneut der Verbindungstyp angezeigt und so weiter. Jede der an der Verbindung beteiligten Tabellen kann wiederum mit anderen Tabellen verbunden werden, dies wird im Abfragestrukturdiagramm dargestellt. Wenn die Tabelle nicht mit der ersten zusammenhängt, wird sie ohne Verbindungstyp angezeigt, dann können ihre Verbindungen folgen und so weiter;

Schlüsselwörter und Datenkonvertierungsblöcke

  • Gruppenblock— Dieser Block wird zum Gruppieren von Tabellenzeilen verwendet. Zeilen werden zu einer zusammengefasst, wenn die Werte der nach dem Schlüsselwort angegebenen Felder vorhanden sind GRUPPIERE NACH Es stellt sich heraus, dass es das Gleiche ist. In diesem Fall werden alle anderen Felder mithilfe von Aggregatfunktionen summiert, gemittelt, maximiert oder minimiert. Aggregatfunktionen werden in einem Feldblock verwendet. Beispiel: Maximum(TableAlias.TableFieldName) AS FieldAlias
  • Bedingungsblock- in diesem Block nach dem Schlüsselwort WO Durch logische Operatoren getrennte bedingte Ausdrücke werden angezeigt UND, ODER Damit eine der ausgewählten Zeilen in die Stichprobe aufgenommen werden kann, müssen alle Bedingungen im Aggregat einen Wert haben WAHR.
  • ALLES KOMBINIEREN— Dieses Schlüsselwort wird zum Kombinieren von Abfragen (Operatoren) verwendet WÄHLEN). Mit der 1C-Abfragesprache können Sie mehrere Abfragen zu einer kombinieren. Damit Abfragen zusammengeführt werden können, müssen sie über denselben Satz von Feldern verfügen.
  • «;» - Semikolons werden verwendet, um voneinander unabhängige Anweisungen zu trennen WÄHLEN;
  • INDEX NACH— Das Schlüsselwort wird verwendet, um die danach angegebenen Felder zu indizieren.
  • Zusammenfassungsblock– wird zum Aufbau baumartiger Proben verwendet. Für jedes der nach dem Schlüsselwort angegebenen Gruppierungsfelder VON, In der Auswahl wird eine separate Zeile erstellt. In dieser Zeile werden mithilfe von Aggregatfunktionen die Gesamtwerte der nach dem Schlüsselwort angegebenen Felder berechnet ERGEBNISSE.

Möchten Sie die Abfragesprache 1C 8 weiter lernen? Dann lesen Sie den nächsten Artikel.

Das Konfigurationsobjekt „Rolle“ gewährt eine Reihe von Rechten für Vorgänge (Aktionen) über Konfigurationsobjekten.

Rolle „Volle Rechte“.

Hierbei handelt es sich lediglich um eine Rolle (nicht vordefiniert), in der alle Arten von Rechten auf alle Konfigurationsobjekte überprüft werden.

Was ihn von anderen Rollen unterscheidet, ist das Vorhandensein des Rechts „Verwaltung“.

Wenn mindestens ein Benutzer angelegt ist, beginnt das System mit der Prüfung, ob das Recht „Administration“ vorhanden ist – mindestens ein Benutzer muss darüber verfügen.

Zugriffsbeschränkungen auf Datensatzebene

Row Level Security (RLS) – Einschränkung auf Datensatzebene.

Mit dem Datenzugriffsbeschränkungsmechanismus können Sie Zugriffsrechte nicht nur auf der Ebene von Metadatenobjekten, sondern auch auf der Ebene von Datenbankobjekten verwalten. Die folgenden Objekte können verwendet werden, um den Zugriff auf Daten einzuschränken:

  • Rollen,
  • Sitzungsparameter,
  • funktionale Optionen,
  • privilegierte gemeinsam genutzte Module,
  • Schlüsselwort ALLOWED in der Abfragesprache.

Der Mechanismus soll den Zugriff auf Metadatenobjekttabellendatensätze basierend auf willkürlichen Bedingungen einschränken, die den Werten der Zeilenfelder dieser Tabellen auferlegt werden. Um beispielsweise nur Datensätze für „Ihre“ Gegenparteien, Organisationen usw. anzuzeigen.

Technische Umsetzung von Zugangsbeschränkungen in 1C

1C generiert eine Anfrage an das DBMS. Der Servercluster fügt der Anfrage einen Abschnitt WHERE hinzu, der den Text der Bedingung für die Zugriffsbeschränkung über RLS enthält, dann wird diese Anfrage an das DBMS gesendet, die extrahierten Daten werden an den 1C-Client zurückgegeben.


Dieser Mechanismus funktioniert für jede Anfrage des Clients:

  • in Berichten,
  • in dynamischen Listen und in regulären Listenformen
  • in benutzerdefinierten Abfragen.

Eine solche Implementierung des Mechanismus wirkt sich stark auf die Leistung aus.

Möglichkeiten zur Umgehung von Zugangsbeschränkungen.

Bei großen ressourcenintensiven Vorgängen (z. B. Verarbeitung der Neubuchung von Dokumenten) kann ein Teil des Codes in privilegierte Module verschoben werden.

A) Privilegiertes Modul ist ein gemeinsames Modul mit dem Flag „Privilegiert“ in den Eigenschaften.

Seine Besonderheit besteht darin, dass der darin enthaltene Code ohne jegliche Zugriffsrechtskontrolle, einschließlich RLS, ausgeführt wird.


B) Auch privilegiert Der Modus kann eingeschaltet werden für Dokumentobjektmodule. Dies erfolgt in den Dokumenteigenschaften, Flag

  • Privilegierte Behandlung beim Dirigieren
  • Privilegierter Modus beim Abbrechen einer Transaktion


B) Methode SetPrivilegedMode()

Mit dem Systembefehl können Sie einen Teil des Codes eines beliebigen Moduls privilegieren.

Ab der nächsten Codezeile wird der privilegierte Ausführungsmodus aktiviert.

Der Betrieb erfolgt bis zur Zeile zum Deaktivieren dieses Modus oder bis zum Ende des Vorgangs/der Funktion

(WAHR);

// Jeder Code hier wird ohne Rechtekontrolle und RLS ausgeführt

SetPrivilegedMode(Lüge ); // oder Ende der Prozedur/Funktion

Die Häufigkeit, mit der der privilegierte Modus aktiviert wird, muss mit der Häufigkeit, mit der er deaktiviert wird, übereinstimmen. Wenn jedoch innerhalb einer Prozedur oder Funktion der privilegierte Modus (einmal oder mehrmals) aktiviert, aber nicht ausgeschaltet wurde, wird das System automatisch so oft heruntergefahren, wie es unvollständige Aktivierungen in der verbleibenden Prozedur oder Funktion gab

Wenn in einer Prozedur oder Funktion eine Methode aufgerufen wird SetPrivilegedMode(Falsch) hat mehr als nur Methodenaufrufe durchgeführt SetPrivilegedMode(True), dann wird eine Ausnahme ausgelöst

Funktion PrivilegedMode() gibt True zurück, wenn der privilegierte Modus noch aktiviert ist, und False, wenn er vollständig deaktiviert ist. Dabei wird nicht die Anzahl der privilegierten Moduseinstellungen in einer bestimmten Funktion analysiert.

Alle aufgerufenen Prozeduren und Funktionen werden ebenfalls im privilegierten Modus ausgeführt.


Es ist auch möglich, eine privilegierte Sitzung zu starten. Dies ist eine Sitzung, in der der privilegierte Modus von Anfang an im System eingerichtet wird. Darüber hinaus ist das Verfahren im Betrieb PrivilegedMode() gibt immer True zurück und die Möglichkeit, den privilegierten Modus zu deaktivieren, wird nicht unterstützt. Nur ein Benutzer, der über Administratorrechte (Administrationsrecht) verfügt, kann eine privilegierte Sitzung starten. Die Sitzung kann mit dem Befehlszeilenschalter UsePrivilegedMode zum Starten der Clientanwendung oder dem Infobase-Vprmod gestartet werden.


Es stellt sich natürlich die Frage: Warum überhaupt Zugangsbeschränkungen einrichten, wenn diese so einfach umgangen werden können?

Sicherheitsmodus.

Ja, Sie können externe Verarbeitung mit einem privilegierten Ausführungsmodus schreiben und Daten entladen/beschädigen. Um dies zu verhindern, verfügt das System über eine globale Kontextmethode

SetSafeMode().

Der abgesicherte Modus ignoriert unter anderem den privilegierten Modus.

Es muss installiert werden, bevor externe Prozessoren programmgesteuert aufgerufen oder Prozeduren und Funktionen aus ihren Modulen exportiert werden.

Beim Ausführen verbotener Vorgänge wird zur Laufzeit eine Ausnahme ausgelöst.

Darüber hinaus können Sie auf der Ebene der Rolleneinstellungen die Möglichkeit für Benutzer deaktivieren, externe Berichte und Verarbeitungen interaktiv zu starten.

Zugriffsbeschränkungen einrichten

RLS kann nur für Rechte konfiguriert werden:

  • lesen (auswählen)
  • hinzufügen (einfügen)
  • ändern (aktualisieren)
  • löschen

Für Lesevorgänge Beim Löschen und Löschen muss ein in der Datenbank befindliches Objekt den Datenzugriffsbeschränkungen entsprechen.

Für den Add-Vorgang Die Datenzugriffsbeschränkung muss dem Objekt entsprechen, das in die Datenbank geschrieben werden soll.

Für Wechselbetrieb Die Datenzugriffsbeschränkung muss sowohl vor der Änderung (damit das Objekt gelesen wird) als auch nach der Änderung (damit das Objekt geschrieben wird) am Objekt eingehalten werden.

Für alle anderen Rechte besteht diese Möglichkeit nicht.

Fügen wir eine neue Einschränkung für das „Lesen“-Recht des „Nomenklatur“-Verzeichnisses hinzu. Es öffnet sich eine Liste mit Feldern, für die Sie die hinzugefügte Einschränkung konfigurieren können.

Dies bedeutet, dass die Einschränkung ausgelöst wird, wenn Sie versuchen, auf aktivierte Felder zuzugreifen. Wenn Sie jedoch versuchen, auf nicht aktivierte Felder zuzugreifen, funktioniert die Einschränkung nicht.

Wenn Sie die Flagge auswählen „ Andere Felder"wird die Einschränkung für alle Tabellenfelder konfiguriert, mit Ausnahme der Felder, für die explizit Einschränkungen festgelegt sind.


*Feature: für Rechte zum Hinzufügen, Ändern, Löschen:

  • Die Einschränkung kann nur für alle Felder konfiguriert werden.
  • Es kann nur eine Einschränkung geben.

Für das Recht „Lesen“ können Sie mehrere Bedingungen konfigurieren, die mit dem logischen Operator „AND“ verknüpft werden.

Nicht alle Felder des Haupteinschränkungsdatenobjekts können in Einschränkungen für die folgenden Arten von Datenbankobjekten verwendet werden:

  • in Akkumulationsregistern dürfen Zugangsbeschränkungen nur Messungen zum Hauptgegenstand der Beschränkung enthalten;
  • In Buchhaltungsregistern können Beschränkungen nur Bilanzmessungen des Hauptgegenstands der Beschränkung verwenden

Wenn unter Bedingungen eines eingeschränkten Zugriffs auf die Daten des Umlaufakkumulationsregisters Messungen verwendet werden, die nicht in den Summen enthalten sind, werden beim Zugriff auf die virtuelle Umdrehungstabelle die gespeicherten Summen nicht verwendet und die Abfrage wird vollständig entsprechend durchgeführt die Bewegungstabelle.

Mechanismus zur Auferlegung von Zugangsbeschränkungen.

Jeder Vorgang an Daten, die in einer Datenbank in 1C:Enterprise gespeichert sind, führt letztendlich zu einem Aufruf der Datenbank mit einer Aufforderung, die Daten zu lesen oder zu ändern. Bei der Ausführung von Abfragen an die Datenbank erlegen die internen Mechanismen von 1C:Enterprise Zugriffsbeschränkungen auf. Dabei:

  • Es wird eine Rechteliste erstellt(Lesen, Hinzufügen, Ändern, Löschen), eine Liste von Datenbanktabellen und eine Liste von Feldern, die von dieser Abfrage verwendet werden.
  • Aus allen Rollen des aktuellen Benutzers Zugriffsbeschränkungen ausgewählt sind auf Daten zu allen an der Anfrage beteiligten Rechten, Tabellen und Feldern. Wenn eine Rolle außerdem keine Einschränkungen für den Zugriff auf die Daten einer Tabelle oder eines Feldes enthält, bedeutet dies, dass die Werte der erforderlichen Felder aus jedem Datensatz in dieser Tabelle verfügbar sind. Mit anderen Worten bedeutet das Fehlen einer Beschränkung des Zugriffs auf Daten, dass eine Beschränkung vorliegt. WO IST DAS WAHR?
  • Ruft die aktuellen Werte aller Sitzungsparameter und Funktionsoptionen ab Teilnahme an den ausgewählten Einschränkungen.

Um den Wert eines Sitzungsparameters oder einer Funktionsoption abzurufen, muss der aktuelle Benutzer keine Berechtigung zum Abrufen dieses Werts haben. Wenn jedoch der Wert eines Sitzungsparameters nicht festgelegt wurde, tritt ein Fehler auf und die Datenbankabfrage wird nicht ausgeführt.

Von einer Rolle abgeleitete Einschränkungen werden mithilfe der UND-Operation kombiniert.

Von verschiedenen Rollen abgeleitete Einschränkungen werden mithilfe der OR-Operation kombiniert.

Die konstruierten Bedingungen werden den SQL-Abfragen hinzugefügt, mit denen 1C: Enterprise auf das DBMS zugreift. Beim Zugriff auf Daten aus Zugriffsbeschränkungsbedingungen wird keine Rechteprüfung durchgeführt (weder für Metadatenobjekte noch für Datenbankobjekte). Darüber hinaus hängt der Mechanismus zum Hinzufügen von Bedingungen von der gewählten Funktionsweise der Einschränkungen „alle“ oder „erlaubt“ ab.


*Funktion: Wenn ein Benutzer Zugriff auf mehrere Rollen mit konfigurierten Einschränkungen auf Datensatzebene für ein Objekt hat, werden in diesem Fall die Bedingungen der Einschränkungen durch die logische Verknüpfung „ODER“ hinzugefügt. Mit anderen Worten: Die Befugnisse des Benutzers sind kumulativ.

Dies führt zu folgender Schlussfolgerung: Lassen Sie nicht zu, dass sich die Bedingungen für die Beschränkung des Zugriffs auf ein Objekt in verschiedenen Rollen überschneiden, da in diesem Fall der Text der Anfrage sehr kompliziert wird und dies Auswirkungen auf die Leistung hat.

„Alles“-Methode.

Beim Auferlegen von Einschränkungen mit der Methode „Alle“ werden den SQL-Abfragen Bedingungen und Felder hinzugefügt, sodass 1C:Enterprise Informationen darüber erhalten kann, ob bei der Ausführung einer Datenbankabfrage Daten verwendet wurden, die für einen bestimmten Benutzer verboten waren oder nicht. Wenn unzulässige Daten verwendet wurden, stürzt die Anfrage aufgrund einer Zugriffsverletzung ab.

Die Verhängung von Zugriffsbeschränkungen mit der „Alle“-Methode ist in der Abbildung schematisch dargestellt:


„Erlaubte“ Methode.

Beim Anwenden von Einschränkungen mit der Methode „erlaubt“ werden Bedingungen zu SQL-Abfragen hinzugefügt, sodass Datensätze, die für den aktuellen Benutzer verboten sind, das Ergebnis der Abfrage nicht beeinflussen. Mit anderen Worten: Wenn Beschränkungen im „erlaubten“ Modus auferlegt werden, gelten die für einen bestimmten Benutzer verbotenen Datensätze als fehlend und haben keinen Einfluss auf das Ergebnis der Operation, das in der Abbildung schematisch dargestellt ist:


Datenzugriffsbeschränkungen werden auf Datenbankobjekte angewendet, sobald 1C:Enterprise auf die Datenbank zugreift.

In der Client-Server-Version von 1C:Enterprise gelten Einschränkungen für den 1C:Enterprise-Server.

Diese Option (ALLOWED) funktioniert jedoch nicht, wenn wir in einer Abfrage auf eine Tabelle verweisen, für die keine Zugriffsbeschränkungen konfiguriert sind, die aber Verweise auf Tabellenzeilen mit konfigurierten Einschränkungen enthält. In diesem Fall wird als Ergebnis der Abfrage „<Объект не найден>..." anstelle des Wertes des Referenzfeldes.


Wenn Sie einen Bericht entwickeln oder ihn mithilfe von Standard- oder benutzerdefinierten Konfigurationsabfragen verarbeiten, Überprüfen Sie immer das Flag „Erlaubt“. damit der Bericht funktioniert unter jedem Benutzer mit beliebigen Rechten.

Beim Objektlesen von Daten aus der Datenbank ist das Setzen des „Erlaubt“-Flags nicht möglich. Deshalb ist es notwendig Konfigurieren Sie Auswahlmöglichkeiten für das Lesen von Objekten und berücksichtigen Sie dabei mögliche Einschränkungen der Zugriffsrechte für den Benutzer. Es gibt keine Möglichkeit, in der Objekttechnik nur zulässige Daten zu erhalten.

Wenn eine Abfrage das Schlüsselwort ALLOWED nicht angibt, ist es wichtig, dass alle in dieser Abfrage angegebenen Auswahlen nicht mit den Lesebeschränkungen für die in der Abfrage verwendeten Datenbankobjekte in Konflikt stehen dürfen. Wenn die Abfrage außerdem virtuelle Tabellen verwendet, müssen die entsprechenden Auswahlen auf die virtuellen Tabellen selbst angewendet werden.

Übung 1. Abfrage-Generator in den RLS-Einstellungen.

Lassen Sie uns den Text des Abschnitts „WHERE“ in der Abfrage an das Verzeichnis verfassen. Sie können den Abfrage-Builder verwenden.
Der Designer hat ein reduziertes Erscheinungsbild.


Registerkarte „Tabellen“.

Die Haupttabelle ist die Tabelle des Objekts, für das die Einschränkung konfiguriert wird.

Auf der Registerkarte „Beziehungen“ können Sie auch andere Tabellen auswählen und verschiedene Verbindungen zwischen ihnen einrichten.

Reiter „Konditionen“

Hier können Sie die tatsächlichen Zugriffsbeschränkungsbedingungen konfigurieren

Fügen wir dem Attribut „Preis“ des Nomenklaturverzeichnisses Bedingungen für das Recht zum „Lesen“ aller Felder der Tabelle hinzu.

„Nomenklatur WHERE Nomenklatur.Preis > 500“

Mal sehen, wie diese einfache Regel funktioniert. Die Verzeichnistabelle enthält die folgenden Elemente:


Nach dem Einrichten einer Zugriffsbeschränkung werden in der Tabelle nur Elemente angezeigt, die die Bedingung erfüllen:


Auch Gruppen verschwanden. Lassen Sie uns den Text der Einschränkung ändern

„Nomenklatur WHERE Nomenklatur.Preis > 500

ODER-Nomenklatur. Dies ist eine Gruppe.

Nun, das ist es, was Sie brauchen.


Wenn Sie in den Listeneinstellungen die Anzeige des Feldes „Code“ entfernen, werden alle Elemente des Verzeichnisses angezeigt, d. h. Die Einschränkung hat nicht funktioniert. Wenn Sie das Feld „Code“ auf Anzeige einstellen, funktioniert die Einschränkung.


In diesem Fall kann das Verzeichniselement trotz der Tatsache, dass es im Listenfeld sichtbar ist, nicht geöffnet werden, da eine Einschränkung für das Attribut konfiguriert ist. Das Gleiche passiert bei einer willkürlichen Anfrage: Wenn Sie versuchen, eine „eingeschränkte“ Eigenschaft abzurufen, tritt ein Zugriffsfehler auf.


Wenn Sie versuchen, die „eingeschränkten“ Anmeldeinformationen programmgesteuert abzurufen, wird ebenfalls ein Zugriffsfehler ausgegeben.


Darüber hinaus ist es nicht möglich, über einen Link auf Felder eines Objekts zuzugreifen, da das System beim Empfang eines Links das gesamte Objekt liest. Wenn es „eingeschränkte“ Details enthält, wird das Objekt nicht gelesen.

Wenn Sie programmgesteuert mit Datenbankobjekten arbeiten, müssen Sie daher mögliche Einschränkungen auf Datensatzebene berücksichtigen und alle erforderlichen Objektdaten auf Anfrage abrufen und diese dann in einer Struktur platzieren oder einen Teil des Codes in einem privilegierten Modul ausführen.

Nach dem Einrichten der Zugriffsbeschränkung änderte sich die Anzeige der Zeile in der Rechteliste – sie wurde grau und es erschien ein Symbol.

Einschränkungen beim Einrichten des Zugangs (RLS).

  • Es gibt keinen Abschnitt „Zusammenfassung“.
  • Auf virtuelle Registertabellen kann nicht zugegriffen werden;
  • Sie können Parameter nicht explizit verwenden;
  • Kann in verschachtelten Abfragen verwendet werden alle>/span> Abfragesprachentools außer:
    • Operator IN HIERARCHIE;
    • ERGEBNISSE-Vorschläge;
    • verschachtelte Abfrageergebnisse darf keine Tabellenteile enthalten>/span>;
    • virtuelle Tische, insbesondere Salden und Umsätze

Übung 2. Nomenklatur mit aktuellem Preis.

Nehmen Sie eine Zugriffsbeschränkung vor, wenn Sie Artikel anzeigen müssen, deren aktueller Preis einen bestimmten Wert übersteigt, beispielsweise 100.

Lösung:

Wir fügen eine neue Zugriffsbeschränkungsregel für das Verzeichnis „Nomenklatur“ mit dem Recht „Lesen“ hinzu.
Wählen Sie „Andere Felder“.
Im Konstruktor fügen wir eine verschachtelte Abfrage hinzu. Wählen Sie darin die Informationsregistertabelle „Artikelpreise“ aus.
Es gibt keine Registerkarte „Bestellung“ – dies ist eine Funktion des Abfragedesigners zum Erstellen einer Zugriffsbeschränkungsanforderung.
Stellen Sie auf der Registerkarte „Erweitert“ „zuerst 999999999“ ein, die Registerkarte „Bestellung“ erscheint.
Wir richten die Reihenfolge nach dem Feld „Zeitraum“ in absteigender Reihenfolge ein.
Dann richten wir per Referenz eine Verbindung zwischen der Haupttabelle und der Unterabfrage ein.


Vorlagen für Zugriffsbeschränkungen.

Übung 3. Beschränkung von „Gegenparteien“ nach Wert in einer Konstante.

Lassen Sie uns eine Zugriffsbeschränkung für das Verzeichnis „Kontrahenten“ basierend auf dem in der Konstante gespeicherten Wert einrichten.

Darüber hinaus müssen Sie in den Details eine Einschränkung für alle Objekte einrichten, die das Verzeichnis „Kontrahenten“ verwenden.

Lösung

Für das Verzeichnis „Gegenparteien“ richten wir eine Einschränkung für das „Lesen“-Recht ein, indem wir der Konstante im Abschnitt „Bedingungen“ eine verschachtelte Abfrage hinzufügen. Vergessen Sie nicht, dass dies eine Gruppe ist.

Wir sehen ein Problem, das Verzeichnis „Kontrahenten“ wird korrekt gefiltert und alle Dokumente mit dem Attribut „Kontrahent“ werden angezeigt, einige mit „kaputten“ Links im Attribut „Kontrahenten“.

Jetzt müssen Sie Zugriffsbeschränkungen für alle Objekte konfigurieren, die den Link zu „Konten“ verwenden. Lassen Sie uns sie mithilfe des Dienstes „Nach Links zu einem Objekt suchen“ finden.

Lassen Sie uns den Text der RLS-Bedingung aus dem Verzeichnis „Kontrahenten“ kopieren und leicht ändern. Dies muss so oft durchgeführt werden, wie Objekte gefunden werden.

Oder verwenden Sie ein Zugriffsbeschränkungsmuster, um Probleme mit der Codeduplizierung zu vermeiden.

Zugriffsbeschränkungsvorlagen werden auf Rollenebene konfiguriert und können für jedes Objekt innerhalb der bearbeiteten Rolle verwendet werden.

Sie können der Vorlage einen beliebigen Zugriffsbeschränkungstext hinzufügen. Der Aufruf der Vorlage erfolgt über das „#“-Symbol. Beispiel: #TemplateCounterparty.

Durch # in 1C werden Anweisungen an den Präprozessor geschrieben. Im Zusammenhang mit der Ausführung von Zugriffsbeschränkungseinstellungen ersetzt die Plattform den Vorlagenaufruftext durch den Vorlagentext.

Fügen wir den Text nach dem Wort WHERE zur Vorlage „Contractor Template“ hinzu, mit Ausnahme des Textes über EtoGroup.

Parameter in Zugriffsbeschränkungsvorlagen.

Fahren wir mit der Lösung von Problem 2 fort.

Das Problem besteht nun darin, dass die Haupttabelle im Verzeichnis „Kontrahent“ heißt, im Dokument „Eingangsrechnung“. Das geprüfte Feld im Verzeichnis heißt „Link“, im Dokument heißt es „Gegenpartei“.

Lassen Sie uns den Namen der Haupttabelle im Vorlagentext in „#CurrentTable“ ändern.

„#CurrentTable“ ist ein vordefinierter Parameter.

Und durch einen Punkt geben wir die Nummer des Eingabeparameters an – „.#Parameter(1)“

„#Parameter“ ist ebenfalls ein vordefinierter Wert. Kann eine beliebige Anzahl von Eingabeparametern enthalten. Die Adressierung erfolgt über die Seriennummer.

Im Text der Zugriffsbeschränkungen für das Verzeichnis weisen wir auf Folgendes hin:

Für das Dokument Folgendes:

„Verkäufe von Waren WHERE #TemplateCounterparty („Gegenpartei“)“

Beim Aufruf einer Zugriffsbeschränkungsvorlage dürfen Parameter nur als String, also in Anführungszeichen, an diese übergeben werden.

Haupttabelle - Nomenklatur

Der Vorlagentext lautet:

#CurrentTable WHERE #CurrentTable.#Parameter(1) = #Parameter(2)

Der Vorlagentext enthält einen Teil des Textes in der Sprache zur Datenzugriffsbeschränkung und kann Parameter enthalten, die mit dem „#“-Symbol hervorgehoben sind.

Dem „#“-Symbol kann Folgendes folgen:

  • Eines der Schlüsselwörter:
    • Ein Parameter, gefolgt von der Nummer des Parameters in der Vorlage in Klammern;
    • CurrentTable – gibt an, dass der vollständige Name der Tabelle, für die die Einschränkung erstellt wird, in den Text eingefügt wird;
    • Aktueller Tabellenname– bezeichnet das Einfügen des vollständigen Namens der Tabelle in den Text (als Zeichenfolgewert, in Anführungszeichen), auf den die Anweisung angewendet wird, in der aktuellen Version der integrierten Sprache;
    • NameCurrentAccessRight– enthält den Namen des Rechts, für das die aktuelle Einschränkung ausgeführt wird: READ, ADD, INSERT, CHANGE, UPDATE, DELETE;
  • Name des Vorlagenparameters – bedeutet das Einfügen der entsprechenden Vorlagenparameterbeschränkung in den Text;
  • Symbol „#“ – zeigt das Einfügen eines Zeichens „#“ in den Text an.

Ein Zugriffsbeschränkungsausdruck kann Folgendes enthalten:

  • Zugriffsbeschränkungsvorlage, die im Format angegeben ist #TemplateName("Vorlagenparameterwert 1", "Vorlagenparameterwert 2",...). Jeder Vorlagenparameter wird in doppelte Anführungszeichen gesetzt. Wenn Sie im Parametertext ein doppeltes Anführungszeichen angeben müssen, müssen Sie zwei doppelte Anführungszeichen verwenden.
  • Funktion StrContains(WhereWeLook, WhatWeLook). Die Funktion soll nach einem Vorkommen der WhatWeLook-Zeichenfolge in der WhereWeLook-Zeichenfolge suchen. Gibt True zurück, wenn das Vorkommen gefunden wird, andernfalls False.
  • Der +-Operator dient der String-Verkettung.

Um die Bearbeitung des Vorlagentextes zu erleichtern, klicken Sie im Rollenformular auf der Registerkarte „Einschränkungsvorlagen“ auf die Schaltfläche „Vorlagentext festlegen“. Geben Sie im sich öffnenden Dialog den Vorlagentext ein und klicken Sie auf OK.

Sie können nicht mit installiert werden SetParameter() oder etwas ähnliches.

Die Parameter sind in diesem Fall:

  • Sitzungsoptionen
  • Funktionale Optionen

Das Lesen von Sitzungsparametern in einer Zugriffsbeschränkungsanforderung erfolgt im privilegierten Modus, d. h. ohne Kontrolle der Rechte, mit ihnen zu arbeiten.

Übung 4. Zugang zu „Ihren“ Gegenparteien

Es ist notwendig, die Einschränkung des Zugriffs des aktuellen Benutzers auf „seine“ Gegenparteien zu konfigurieren.

Es gibt ein Verzeichnis „Benutzer“, ein Verzeichnis „Gegenparteien“, Dokumente mit den Angaben „Gegenpartei“.

Der aktuelle Benutzer soll nur Daten der Gegenparteien sehen, zu denen eine Verbindung zu ihm besteht.

Auch die Kommunikation muss konfiguriert werden.

Möglichkeiten:

Herstellung von Verbindungen zwischen Benutzer und Gegenpartei

  • Details im Kontrahentenverzeichnis
  • Informationsregister

Mögliche Lösungen für das Problem:

  • Einen Benutzer in einer Konstante zu speichern ist eine schlechte Option; die Konstante steht allen Benutzern zur Verfügung.
  • Das Speichern eines festen Arrays der Kontrahenten des aktuellen Benutzers in den Sitzungsparametern ist keine sehr gute Option; es kann viele Kontrahenten geben
  • Das Speichern in den Sitzungsparametern des aktuellen Benutzers und das anschließende Anfordern einer Liste „seiner“ Gegenparteien ist eine akzeptable Option.
  • Andere Optionen.

Lösung.

Erstellen wir einen neuen Sitzungsparameter „CurrentUser“ und füllen ihn im Sitzungsmodul aus.

Lassen Sie uns ein Informationsregister „Compliance von Managern und Auftragnehmern“ erstellen.

Erstellen wir eine neue Rolle und darin eine neue Zugriffsbeschränkung für das Dokument „Rechnung“.

Im Text der Anfrage verbinden wir die Haupttabelle mit dem Informationsregister für Account = Account und Manager = &CurrentUser. Verbindungstyp Intern.

Wenn möglich, ist es besser, verschachtelte Abfragen in Zugriffsbeschränkungstexten zu vermeiden, da sie jedes Mal ausgeführt werden, wenn Daten von diesem Objekt aus der Datenbank gelesen werden.

Überprüfung – die Einschränkungen funktionieren

*Funktion: Wenn Sie die Liste der Benutzerkontrahenten im Register ändern, werden die Zugriffsbeschränkungen sofort wirksam, ohne dass die Benutzersitzung neu gestartet werden muss.

Praxis 5. Datum des Änderungsverbots.

Es ist notwendig, vor dem festgelegten Datum für das Verbot von Änderungen eine Beschränkung der Datenbearbeitung einzuführen.
Sie müssen es für Benutzer einschränken.

Erstellen wir ein Informationsregister „Daten des Änderungsverbots“ mit der Dimension Benutzer, Ressource Datum des Verbots.

Lassen Sie uns die Logik der Lösung folgendermaßen aufbauen:

  • Wenn kein Benutzer angegeben ist, gilt die Sperre für alle Benutzer
  • Wenn es eine Einschränkung für alle Benutzer und eine Einschränkung für einen bestimmten Benutzer gibt, gilt die Einschränkung für einen bestimmten Benutzer und für andere nach dem allgemeinen Prinzip.

Offensichtlich kann eine solche Einschränkung für Datenbankobjekte konfiguriert werden, die eine bestimmte Position auf der Zeitachse haben. Es kann sein

  • Dokumentation
  • Periodische Informationsregister

Erstellen wir eine neue Rolle „Einschränkungen nach Datum des Verbots von Änderungen“.

Darin werden wir für das Dokument „Rechnung“ für das Recht „Änderung“ eine neue Zugriffsbeschränkung hinzufügen.

Wir legen die Einstellung für alle Felder fest.

Der Wortlaut der Einschränkung lautet:

ReceiptInvoice FROM Document.ReceiptInvoice AS ReceiptInvoice

Sperrdaten ändern. Sperrdatum AS Sperrdatum
AUS

INNER JOIN (SELECT
MAX(Verbotene Daten ändern.Benutzer) AS-Benutzer
AUS
Informationsregister. Daten des Änderungsverbots AS Daten des Änderungsverbots
WO
(Verbotene Daten ändern.User = &CurrentUser
ODER Daten verbotener Änderungen.User = VALUE(Directory.users.EmptyLink))) AS VZ_User
BY Datum des Verbots von Änderungen.User = VZ_User.User) AS NestedQuery
Software Receipt Invoice.Date > Verschachtelte Abfrage.Ban Date

Schauen wir mal nach – die Einschränkung funktioniert.

Verwenden von Präprozessoranweisungen

#Wenn Bedingung1 #Dann

Fordern Sie Fragment 1 an

#ElseIf Bedingung2 #Then

Fordern Sie Fragment 2 an

#Ansonsten

Fordern Sie Fragment 3 an

#EndIf

In Bedingungen können Sie logische Operationen (und, oder, nicht usw.) verwenden und auf Sitzungsparameter zugreifen.

Diese Vorgehensweise im Rahmen der Gestaltung von Zugangsbeschränkungen hat den Vorteil, dass je nach Bedingungen ein kürzerer Anforderungstext erstellt wird. Eine einfachere Abfrage belastet das System weniger.

Der Nachteil besteht darin, dass der Abfragekonstruktor mit solchem ​​Text nicht funktioniert.

*Besonderheit:

Im Gegensatz zu den Anweisungen an den Präprozessor der integrierten Sprache in den Zugriffsbeschränkungstexten müssen Sie vor dem Operator Then einen Hash setzen – #Then

Übung 6. Wechseln Sie zu „RLS verwenden“

Ergänzen wir unser System der Beschränkungen um einen Schalter, der die Verwendung von Beschränkungen auf Datensatzebene ein-/ausschaltet.

Dazu fügen wir eine Konstante und einen Sitzungsparameter namens „UseRLS“ hinzu.

Schreiben wir in das Sitzungsmodul, um den Wert des Sitzungsparameters aus dem Wert der Konstante festzulegen.

Fügen wir allen Zugriffsbeschränkungstexten den folgenden Code hinzu:

„#If &UseRLS #Then….. #EndIf“

Wir prüfen – alles funktioniert.

Nach dem Aktivieren der Markierung „Radar verwenden“ werden die Änderungen jedoch nicht sofort wirksam. Warum?

Weil der Sitzungsparameter beim Starten der Sitzung festgelegt wird.

Es ist möglich, den Wert des Sitzungsparameters so festzulegen, dass er zurückgesetzt wird, wenn ein neuer konstanter Wert geschrieben wird. Dies funktioniert jedoch nur für die aktuelle Benutzersitzung. Andere Benutzer sollten aufgefordert werden, das System neu zu starten.


Ende des ersten Teils.

). Durch die Verwendung dieses Schlüsselworts können Sie Fehler beim Abrufen von Datensätzen vermeiden, für die der Benutzer keine Rechte hat.

Problem: In einigen Fällen kann das Ergebnis von Datenzugriffsbeschränkungen in 1C 8.3 vom DBMS-Abfrageplan abhängen. Dieser Artikel untersucht mögliche Situationen und gibt Empfehlungen, wie diese vermieden werden können.

Bei der Ausführung einer Datenbankabfrage ohne Schlüsselwort kann das Problem einer möglichen Abhängigkeit des Ergebnisses von Datenzugriffsbeschränkungen vom DBMS-Abfrageplan auftreten ERLAUBT, wenn der aktuelle Benutzer Datenzugriffsbeschränkungen hat und die Anfrage einen oder mehrere Vergleiche der Form enthält:

  • <Выражение над полями>(IN|NICHT IN) (<Вложенный запрос>)
  • (<Выражение над полями 1>, …, <Выражение над полями N>) (IN|NICHT IN) (<Вложенный запрос>)

Wenn in diesem Fall < > (eine Abfrage innerhalb einer Abfrage) Datenbanktabellen verwendet, für die Zugriffsbeschränkungen gelten, ist es möglich, dass auf einigen DBMS die Abfrage erfolgreich ausgeführt wird, während auf anderen eine Meldung ausgegeben wird, sofern die Daten in den Informationsdatenbanken völlig identisch sind .

Holen Sie sich 267 Video-Lektionen zu 1C kostenlos:

Grund für Unterschiede

Der mögliche Verhaltensunterschied ist auf die Implementierung von Datenzugriffsbeschränkungen ohne Schlüsselwort zurückzuführen ERLAUBT in 1C Enterprise 8.3.

Abfrage ohne Schlüsselwort ERLAUBT wird nur dann erfolgreich ausgeführt, wenn während der Ausführung kein Zugriff auf verbotene Daten erfolgt. Dazu wird ein spezielles Signalfeld hinzugefügt, das den Wert annimmt WAHR für diejenigen Datensätze, an deren Bildung nur zulässige Daten beteiligt waren, und den Wert Lüge für alle anderen Einträge. Wenn mindestens ein Beispieldatensatz den Wert enthält Lüge Im Signalfeld endet die Anforderungsausführung abnormal.

Den Ergebnissen der im Vergleich verschachtelten Abfragen wird das gleiche Signalfeld hinzugefügt IN/NICHT IN. Darüber hinaus erfolgt die Überprüfung des Werts der Signalspalte in diesem Fall mithilfe von DBMS-Tools. Wenn also während der Ausführung einer verschachtelten Abfrage auf verbotene Daten zugegriffen wurde, sollte die Abfrage mit einem Fehler fehlschlagen Der Benutzer verfügt nicht über ausreichende Rechte, um einen Vorgang in der Datenbank auszuführen.

Beim Erstellen eines Abfrageplans erhält das DBMS jedoch möglicherweise nicht die vollständige Stichprobe <Вложенным запросом> und erhalten nur die Datensätze, die zur Prüfung des Zustandes tatsächlich notwendig sind IN/NICHT IN. In diesem Fall kann die Anfrage erfolgreich sein, selbst wenn die <Вложенного запроса> Als eigenständige Anfrage könnte ein Zugriff auf verbotene Daten erfolgen.

Schauen wir uns ein einfaches Beispiel an. Auf den Tisch legen Verzeichnis.Einzelpersonen Es werden Beschränkungen des Zugriffs auf Daten auferlegt. In diesem Fall die Anfrage:

Table.Individual AS Individual

wird aufgrund eines Versuchs, auf verbotene Daten zuzugreifen, mit einem Fehler ausgeführt. Wenn diese Abfrage am Vergleich beteiligt ist, zum Beispiel:

Table.Individual AS Individual

(Directory.Individuals AS-Tabelle)

Anschließend kann die Abfrage je nach ausgewähltem DBMS-Abfrageplan entweder erfolgreich oder mit einem Fehler ausgeführt werden. Dieses Anforderungsverhalten stellt keinen Fehler dar, da während der Ausführung der Anforderung möglicherweise auf verbotene Daten zugegriffen wird oder nicht. Um ein besser vorhersagbares Ergebnis zu erhalten, ist es notwendig, eine Abfrage so zu konstruieren, dass die verschachtelte Abfrage garantiert nicht auf offensichtlich unnötige Daten zugreift. Insbesondere, wenn die vorherige Abfrage wie folgt umgeschrieben wird:

Vereinbarung über die Ausführung von Arbeiten mit einer Einzelperson.Mitarbeiter.Einzelperson

Dokument. Vereinbarung über die Ausführung von Arbeiten mit einer natürlichen Person als Vereinbarung über die Ausführung von Arbeiten mit einer natürlichen Person

Arbeitsleistungsvereinbarung mit Einzelperson.Mitarbeiter.Einzelperson B (

Table.Individual AS Individual

Directory.Individuals AS-Tabelle

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…