1c finden Sie in der Tabelle. Welche Methoden gibt es und wie kann man nach mehreren Werten gleichzeitig suchen?

Suchen Sie in der Tabelle der 1C-Werte

Welche Methoden gibt es und wie kann man nach mehreren Werten gleichzeitig suchen?

Es gibt zwei spezielle Methoden zum Durchsuchen einer Wertetabelle:

1. Finden

TVHorizon = Directories.Nomenclature.FindByName("TVHorizon");
FoundString = TZNomenclature.Find(TVHorizon);
//Wir können auch angeben, in welchen Spalten gesucht werden soll, um die Suche zu beschleunigen
FoundString = TZNomenclature.Find(TVHorizon, "Nomenclature");

Diese Methode gibt die erste gefundene Zeile mit dem gewünschten Wert zurück oder Undefiniert, wenn sie diesen nicht findet. Daher ist es praktisch, damit nach eindeutigen Werten zu suchen, weil Andernfalls müssen Sie einen gefundenen Wert aus der Tabelle entfernen, um den nächsten zu finden.

Um diesen Aufwand zu vermeiden, gibt es die folgende Methode, mit der Sie ein Array passender Zeichenfolgen finden können:

2. Strings suchen


Auswahlstruktur.Insert("Nomenklatur", TVHorizon); // Geben Sie zuerst die Spalte an, in der gesucht werden soll, und dann, wonach gesucht werden soll.

Diese Methode gibt immer ein Array zurück, es kann jedoch leer sein, wenn nichts gefunden wird. Und diese Methode gibt wie die vorherige die Zeilen der Wertetabelle selbst zurück und nicht die Werte selbst in einem separaten Array. Daher ändern Sie durch Ändern der Werte im Array-String oder, wie in der vorherigen Methode, für den gefundenen String den Wert in der verarbeiteten Wertetabelle.

Ein weiterer Vorteil dieser Methode ist, dass sie mehrere Spalten der Wertetabelle gleichzeitig durchsuchen kann:


SelectionStructure = Neue Struktur;
Auswahlstruktur.Insert("Nomenklatur", TVHorizon);
Auswahlstruktur.Insert("Menge", 10);
FoundArray of Rows = TZNomenclature.FindLines(SelectionStructure);

Das einzig Negative ist, wie Sie sehen, dass Sie keine anderen Vergleichsarten als „gleich“ verwenden können.

Zur Abrechnung von Geld und Gütern werden in der Wirtschaft häufig verschiedene Tabellen verwendet. Fast jedes Dokument ist eine Tabelle.

Eine Tabelle listet die Waren auf, die aus dem Lager versendet werden sollen. Eine weitere Tabelle zeigt die Zahlungsverpflichtungen für diese Güter.

Daher nimmt in 1C die Arbeit mit Tabellen einen herausragenden Platz ein.

Tabellen in 1C werden auch „tabellarische Teile“ genannt. Verzeichnisse, Dokumente und andere haben sie.

Wenn die Abfrage ausgeführt wird, gibt sie eine Tabelle zurück, auf die auf zwei verschiedene Arten zugegriffen werden kann.

Die erste - schnellere - Auswahl, das Erhalten von Zeilen daraus ist nur der Reihe nach möglich. Die zweite besteht darin, das Abfrageergebnis in eine Wertetabelle hochzuladen und dann wahlfrei darauf zuzugreifen.

//Option 1 – sequenzieller Zugriff auf Abfrageergebnisse

//Hol dir den Tisch
Select = Query.Run().Select();
// Wir gehen alle Zeilen des Abfrageergebnisses der Reihe nach durch
While Select.Next()-Schleife
Bericht(Auswahl.Name);
EndCycle;

//Option 2 – Hochladen in eine Wertetabelle
Request = New Request("SELECT Name FROM Directory.Nomenclature");
//Hol dir den Tisch
Tabelle = Query.Run().Unload().
//weiterhin können wir auch alle Zeilen durchlaufen
Für jede Zeile aus dem Tabellenzyklus
Report(String.Name);
EndCycle;
//oder willkürlich auf Strings zugreifen
Row = Table.Find("Shovel", "Name");

Ein wichtiges Merkmal besteht darin, dass in der Tabelle, die aus dem Abfrageergebnis gewonnen wird, alle Spalten streng typisiert sind. Dies bedeutet, dass Sie durch die Anforderung des Felds „Name“ aus dem Nomenklaturverzeichnis eine Spalte vom Typ „String“ mit einer zulässigen Länge von nicht mehr als N Zeichen erhalten.

Tabelle auf dem Formular (Thick Client)

Der Benutzer arbeitet mit der Tabelle, wenn sie auf dem Formular platziert wird.

Die Grundprinzipien der Arbeit mit Formularen haben wir in der Lektion zu und in der Lektion zu besprochen

Platzieren wir also die Tabelle auf dem Formular. Dazu können Sie die Tabelle aus dem Steuerfeld ziehen. Ebenso können Sie im Menü die Option „Formular/Steuerelement einfügen“ auswählen.

Die Daten können in der Konfiguration gespeichert werden – dann müssen Sie den vorhandenen (zuvor hinzugefügten) tabellarischen Teil des Konfigurationsobjekts auswählen, dessen Formular Sie bearbeiten.

Klicken Sie in der Eigenschaft „Daten“ auf die Schaltfläche „…“. Um die Liste der tabellarischen Teile anzuzeigen, müssen Sie den Objektzweig erweitern.

Wenn Sie den tabellarischen Teil auswählen, fügt 1C selbst Spalten zur Tabelle im Formular hinzu. Vom Benutzer in eine solche Tabelle eingegebene Zeilen werden automatisch zusammen mit dem Nachschlagewerk/Dokument gespeichert.

In derselben Dateneigenschaft können Sie einen beliebigen Namen eingeben und den Typ Wertetabelle auswählen.

Dies bedeutet, dass eine beliebige Wertetabelle ausgewählt wurde. Es werden weder automatisch Spalten hinzugefügt noch automatisch gespeichert, aber Sie können damit machen, was Sie wollen.

Durch einen Rechtsklick auf die Tabelle können Sie eine Spalte hinzufügen. In den Eigenschaften einer Spalte können Sie ihren Namen (zur Referenz im 1C-Code), die Spaltenüberschrift im Formular, die Verbindung mit dem Attribut des tabellarischen Teils (letzteres – wenn keine beliebige Tabelle ausgewählt wird, sondern a tabellarischer Teil).

In den Tabelleneigenschaften des Formulars können Sie angeben, ob der Benutzer Zeilen hinzufügen/löschen kann. Eine erweiterte Form ist das Kontrollkästchen „Nur anzeigen“. Diese Eigenschaften eignen sich zum Organisieren von Tabellen, die zum Anzeigen von Informationen, aber nicht zum Bearbeiten vorgesehen sind.

Um die Tabelle zu verwalten, müssen Sie im Formular ein Befehlsfeld anzeigen. Wählen Sie den Menüpunkt Formular/Steuerelement einfügen/Befehlsleiste.

Aktivieren Sie in den Eigenschaften der Befehlsleiste das Kontrollkästchen „Autofill“, damit die Schaltflächen im Bedienfeld automatisch angezeigt werden.

Tabelle auf Formular (Thin/Managed Client)

Auf einem verwalteten Formular sehen diese Aktionen etwas anders aus. Wenn Sie einen tabellarischen Teil auf dem Formular platzieren müssen, erweitern Sie den Zweig „Objekt“ und ziehen Sie einen der tabellarischen Teile nach links. Und alle!

Wenn Sie eine Wertetabelle platzieren müssen, fügen Sie ein neues Formularattribut hinzu und geben Sie in seinen Eigenschaften den Typ an – Wertetabelle.

Um Spalten hinzuzufügen, verwenden Sie das Kontextmenü für dieses Formularattribut und wählen Sie Attributspalte hinzufügen aus.

Ziehen Sie dann auch die Tabelle nach links.

Damit eine Tabelle über eine Befehlsleiste verfügt, wählen Sie in den Tabelleneigenschaften die Werte im Abschnitt Verwendung – Position der Befehlsleiste aus.

Hochladen einer Tabelle nach Excel

Jede auf dem Formular befindliche 1C-Tabelle kann ausgedruckt oder in Excel hochgeladen werden.

Klicken Sie dazu mit der rechten Maustaste auf eine leere Stelle in der Tabelle und wählen Sie Liste.

In einem verwalteten (Thin) Client können ähnliche Aktionen über den Menüpunkt Alle Aktionen/Liste anzeigen durchgeführt werden.

Hier ein kleiner Fakt für den Anfang – einfache Beispiele für die Arbeit mit einer Wertetabelle:

1. Erstellen Sie eine Wertetabelle

ValueTable = Neue ValueTable;


2. Erstellen Sie Spalten für die Wertetabelle:

ValueTable.Columns.Add("Name");
Wert Table.Columns.Add("Nachname");


3. Fügen Sie neue Zeilen mit Spaltennamen hinzu:


NewLine.Name = "Vasily";
NewLine.LastName = "Pupkin";


4. So suchen Sie einen Wert in der Wertetabelle:
Es muss eine Tabellenzeile gefunden werden, die den gewünschten Wert enthält.

FoundRow = ValueTable.Find(SearchValue);


5. Finden Sie das erste Vorkommen in bestimmten Spalten der Wertetabelle

FoundRow = ValueTable.Find(SearchValue, "Supplier, Buyer");


6. Wenn Sie alle Vorkommen in der Wertetabelle finden müssen:
Wir nutzen die Suchstruktur.

SearchStructure = Structure("Employee", SearchValue);
Array of FoundRows = ValueTable.FindRows(SearchStructure);


Erstellen wir eine Suchstruktur, deren jedes Element den Namen der Spalte als Schlüssel und den gewünschten Wert in dieser Spalte als Wert enthält. Wir übergeben die Suchstruktur als Parameter an die Methode FindLines(). Als Ergebnis erhalten wir Tabellenzeilen.
Wenn Sie der Suchstruktur beispielsweise auch in der Spalte „Verantwortlicher“ eine Suche nach dem gewünschten Wert hinzufügen, erhalten wir durch die Anwendung der Methode „FindLines()“ alle Zeilen, in denen sowohl „Mitarbeiter“ als auch „Verantwortlicher“ gleich sind gesuchter Wert.

7. So durchlaufen Sie eine Wertetabelle in zufälliger Reihenfolge

Für jede aktuelle Zeile aus der Wertetabellenschleife
Report(CurrentRow.Name);
EndCycle;

Das Gleiche gilt für Indizes:

SeniorIndex = ValueTable.Quantity() - 1;
Für Konto = 0 bis SeniorIndex-Zyklus
Report(TableValues[Konto].Name);
EndCycle;


8. Löschen einer vorhandenen Wertetabellenzeile

ValueTable.Delete(Zu löschende Zeile);

nach Index

ValueTable.Delete(0);


9. Löschen einer vorhandenen Spalte der Wertetabelle

ValueTable.Columns.Delete(ColumnToDelete);


nach Index

ValueTable.Columns.Delete(0);

Es ist zu berücksichtigen, dass das Löschen einer Zeile (oder Spalte) „aus der Mitte“ der Wertetabelle zu einer Verringerung der Indizes der Zeilen, die sich „nach“ der gelöschten Zeile befinden, um eins führt

10. Wie fülle ich eine Wertetabelle, wenn die Spaltennamen in Variablen enthalten sind?

NewRow = ValueTable.Add();
NewRow[ColumnName] = Wert;


11. Wie fülle ich die gesamte Spalte der Wertetabelle mit dem gewünschten Wert?
Die Spalte Fiskalbuchhaltungskennzeichen in der Wertetabelle muss mit dem Wert Falsch ausgefüllt werden

Wertetabelle. Werte ausfüllen (Falsch, „Fiscal Accounting Flag“);


Für die Wertetabelle verwenden wir die Methode FillValues(). Der erste Parameter ist der zu füllende Wert. Der zweite Parameter ist der Name der Spalte, die gefüllt werden soll.

12. Wie fülle ich die Wertetabelle „Receiver Table“ mit Daten aus der Wertetabelle „SourceTable“?

Wenn die Empfängertabelle zum Zeitpunkt des Vorgangs noch nicht existiert oder ihre vorherigen Spalten nicht gespeichert werden müssen, können Sie sie als vollständige Kopie des Originals erstellen

Empfängertabelle = Quelltabelle.Copy();


Option zwei: Die ReceiverTable-Tabelle existiert, und es wäre schade, ihre Spalten und Einschränkungen für die Spaltendatentypen zu verlieren. Sie müssen jedoch die Daten für die Spalten eingeben, deren Namen mit den Namen der Quelltabelle übereinstimmen.

Teilweise Datenübertragung für Spalten mit übereinstimmenden Namen:

Für jede Zeile der SourceTable aus dem SourceTable-Zyklus
FillPropertyValues(NewRow, SourceTableRow);
Ende des Zyklus


Für jede Zeile der Quelltabelle wird der empfangenden Tabelle eine neue Zeile hinzugefügt und die Werte werden in die Spalten der neuen Tabelle gefüllt, deren Namen mit den Namen der Spalten in der Quelltabelle übereinstimmen

Wenn die Tabellen keine Spalten mit denselben Namen haben, enthält die Zieltabelle am Ende so viele Zeilen mit Nullwerten, wie Zeilen in der Quelltabelle vorhanden waren.
Wenn für einige Spalten mit demselben Namen der Datenwerttyp aus der Quelltabelle nicht in das Array der zulässigen Spaltentypen in der Zieltabelle fällt, erhalten wir in solchen Feldern leere Werte.
Betrachten wir den dritten Fall. Bei gleichnamigen Spalten muss die Spalte der Zieltabelle vollständig mit der Spalte der Quelltabelle in Übereinstimmung gebracht werden.

Vollständiges Kopieren der Daten für Spalten mit übereinstimmenden Namen

Gleiche Spalten = New Array();

Für jede Spalte aus dem SourceTable.Columns-Zyklus
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

Wenn passende Spalte<>Dann undefiniert

// Spalteneigenschaften abrufen.
Name = Column.Name;
ValueType = Column.ValueType;
Header = Column.Header;
Breite = Column.Width;

// Spalten in der Zieltabelle ersetzen.
Index = TableReceiver.Columns.Index(MatchingColumn);

TableReceiver.Columns.Delete(Index);
ReceiverTable.Columns.Insert(Index, Name, ValueType, Header, Breite);

// Den nächsten Namen übereinstimmender Spalten zum Array hinzufügen.
Gleiche Columns.Add(Column.Name);

endIf;

EndCycle;

// Durch die Zeilen der Quelltabelle blättern.
Für jede Zeile der SourceTable aus dem SourceTable-Zyklus

// Eine neue Zeile zur Zieltabelle hinzufügen.
NewRow = TableReceiver.Add();

// Geben Sie die Werte in die passenden Zellen ein.
Für jede Namensspalte aus Spalten mit demselben Namenszyklus
NewRow[ColumnName] = SourceTableRow[ColumnName];

EndCycle;

EndCycle;


Wir müssen die Spalte in der Zieltabelle durch eine neue ersetzen, deren Eigenschaften vollständig der Spalte der Quelltabelle entsprechen.
Wenn daher in der Empfängertabelle eine Spalte mit demselben Namen gefunden wird, sammeln wir alle Eigenschaften für die neue Spalte in Variablen. Als nächstes löschen Sie die alte und erstellen eine neue Spalte. Dann durchlaufen wir die Zeilen der Quelltabelle.
In der Schleife fügen wir der empfangenden Tabelle eine neue Zeile hinzu und öffnen eine Schleife über die Spaltennamen im Array übereinstimmender Spalten.
Innerhalb dieser verschachtelten Schleife füllen wir die Zellen der Zieltabelle mit den Daten der Quelltabellenzelle.

13. Wie füge ich Spalten mit Typbeschränkungen zur Wertetabelle „ValueTable“ hinzu?

Beim Hinzufügen einer Spalte können Sie einfach deren Namen angeben und den zweiten Parameter der Add()-Methode unverändert lassen. In diesem Fall ist der Spaltendatentyp beliebig.

Hinzufügen einer Spalte ohne Angabe eines Datentyps

// Eine Spalte ohne Typbeschränkungen hinzufügen.
ValueTable.Columns.Add("Object");


Sie können den Wert des zweiten Parameters eingeben. Dort müssen Sie eine Beschreibung des für die Spalte zulässigen Typs übergeben. Die Beschreibung selbst kann mit dem Konstruktor abgerufen werden, indem der String-Name des Typs (bei vielen Typen durch Kommas getrennt) oder ein Array gültiger Typen als Parameter übergeben wird.

Hinzufügen einer Spalte, die den Datentyp angibt

// Einschränkungen für Spaltendatentypen:
// Nur Elemente des Verzeichnisses „Counterparties“.
Table of Values.Columns.Add("Account", neue Beschreibung der Typen("DirectoryLink.Accounts"));


Wenn es sich bei den zum Füllen von Spaltendaten zulässigen Typen um eine Zeichenfolge handelt, können Sie deren Bittiefe (Länge) begrenzen und die Verwendung einer Variablen oder einer festen Länge festlegen. All dies wird erreicht, indem ein Objekt mit dem String Qualifiers-Konstruktor erstellt wird. Als nächstes wird dieses Objekt als einer der Parameter des TypeDescription-Konstruktors verwendet.

Verwenden von Qualifizierern, um den Datentyp einer Wertetabellenspalte anzugeben

// Einschränkungen für Daten vom Typ String vorbereiten und festlegen.
String Qualifiers = New String Qualifiers(20, AllowedLength.Variable);
ValidTypes = NewTypeDescription("String", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Ähnliche Aktionen können in Bezug auf Zahlen- und Datumsqualifizierer durchgeführt werden.
Bitte beachten Sie: Typbeschreibungen können vom Konstruktor entweder „von Grund auf“ erstellt werden oder eine vorhandene Typbeschreibung als Grundlage verwendet werden.

Verwenden vorhandener Typdeklarationen, um den Datentyp einer Wertetabellenspalte anzugeben

// Erweiterung der bisher verwendeten Typbeschreibung.
QualifiersNumbers = New QualifiersNumbers(10, 2, ValidSign.Non-negative);
DateQualifiers = NewDateQualifiers(DateParts.Date);
Extended ValidTypes = New TypeDescription(ValidTypes, „Number, Date“, Number Qualifiers, Date Qualifiers);

ValueTable.Columns.Add("Note", ExtendedAcceptableTypes);



 

Es könnte nützlich sein zu lesen: