Die Arbeit mit Daten in 1C ist im Wesentlichen eine ständige Arbeit mit Sammlungen. Nachschlagewerke, Dokumente, Register - all dies sind Datenarrays, die sortiert, gefiltert und konvertiert werden müssen. Ohne die Schleifen zu verstehen, werden Sie keine einzige ernsthafte Verarbeitung schreiben. In diesem Artikel werden wir alle Arten von Schleifen in 1C analysieren, reale Beispiele zeigen und über die Fallstricke sprechen, über die die Dokumentation schweigt.

Drei Säulen: Arten von Zyklen in 1C
In der Plattform 1C: Enterprise gibt es drei Konstruktionen für die Organisation von Zyklen. Jede ist auf ihr eigenes Szenario zugeschnitten.
Der „For“-Zyklus — wenn wir die Anzahl der Iterationen kennen
Klassische Schleife. Wird verwendet, wenn im Voraus bekannt ist, wie oft eine Aktion ausgeführt werden muss.
Для Счетчик = 1 По 10 Цикл
Сообщить("Iteration No." + Счетчик);
КонецЦикла;Wichtiger Hinweis: Die Zählvariable wird nach jeder Iteration automatisch um 1 erhöht. In 1C können Sie keinen beliebigen Schritt festlegen, wie in einigen anderen Sprachen. Wenn Sie einen anderen Schritt als eins benötigen, müssen Sie tricksen:
Для Индекс = 0 По 9 Цикл
РеальныйШаг = Индекс * 3;
Сообщить("Value: " + РеальныйШаг);
КонецЦикла;Ein typisches Szenario ist das Durchlaufen eines Arrays nach Index:
МассивТоваров = Новый Массив;
МассивТоваров.Добавить("Laptop");
МассивТоваров.Добавить("Monitor");
МассивТоваров.Добавить("Keyboard");
Для Инд = 0 По МассивТоваров.ВГраница() Цикл
Сообщить(МассивТоваров[Инд]);
КонецЦикла;Der Zyklus „Für alle“ — ein universeller Soldat
Die beliebteste Schleife in 1C. Funktioniert mit jeder Sammlung: Arrays, Wertelisten, Tabellenteile, Abfrageergebnisse, Strukturen und Übereinstimmungen.
Для Каждого Элемент Из МассивТоваров Цикл
Сообщить(Элемент);
КонецЦикла;Der Hauptvorteil ist, dass Sie nicht über Indizes, Grenzen und die Anzahl der Elemente nachdenken müssen. Sie arbeiten einfach mit jedem Element der Sammlung.
Der "While" -Zyklus - wenn die Austrittsbedingung nicht im Voraus bekannt ist
Wird ausgeführt, solange die Bedingung wahr ist. Ideal für Situationen, in denen die Anzahl der Iterationen im Voraus nicht bekannt ist.
Остаток = 1000;
Месяц = 0;
Пока Остаток > 0 Цикл
Остаток = Остаток - 150;
Месяц = Месяц + 1;
КонецЦикла;
Сообщить("Funds will run out in " + Месяц + " months");Seien Sie vorsichtig: Wenn die Bedingung niemals falsch wird, erhalten Sie eine Endlosschleife und die Plattform hängt sich auf. Sorgen Sie immer für einen Notausgang:
Счетчик = 0;
Пока НеВыполненоУсловие И Счетчик < 10000 Цикл
// Verarbeitungslogik
Счетчик = Счетчик + 1;
КонецЦикла;
Verarbeitung von Tabellenteilen von Dokumenten
Tabellenteile sind eine der häufigsten Datenstrukturen, mit denen ein 1C-Entwickler arbeitet. Lassen Sie uns einige praktische Aufgaben analysieren.
Berechnung des Betrags nach dem Tabellenteil
ИтогоСумма = 0;
Для Каждого СтрокаТЧ Из Документ.Товары Цикл
ИтогоСумма = ИтогоСумма + СтрокаТЧ.Количество * СтрокаТЧ.Цена;
КонецЦикла;
Сообщить("Total amount: " + ИтогоСумма);Zeilen aus dem Tabellenteil löschen
Hier beginnt der interessanteste Teil. Ein klassischer Anfängerfehler besteht darin, Zeilen in einer direkten Schleife zu löschen:
// ❌ SO NICHT - Zeilen überspringen!
Для Каждого СтрокаТЧ Из Документ.Товары Цикл
Если СтрокаТЧ.Количество = 0 Тогда
Документ.Товары.Удалить(СтрокаТЧ);
КонецЕсли;
КонецЦикла;Wenn eine Zeile gelöscht wird, verschiebt sich die Sammlung und das nächste Element "rutscht" vorbei. Der richtige Ansatz besteht darin, den Tabellenteil in umgekehrter Reihenfolge zu durchlaufen. Aber der Standardzyklus "Für" in 1C unterstützt keinen Countdown, also verwenden wir "Bis":
// ✅ Korrekte Rückverfolgung
Инд = Документ.Товары.Количество() - 1;
Пока Инд >= 0 Цикл
СтрокаТЧ = Документ.Товары[Инд];
Если СтрокаТЧ.Количество = 0 Тогда
Документ.Товары.Удалить(Инд);
КонецЕсли;
Инд = Инд - 1;
КонецЦикла;Suche nach Duplikaten im Tabellenteil
Eine Aufgabe, die sich immer wieder stellt: identische Produkte finden und zusammenführen.
Инд = 0;
Пока Инд < Документ.Товары.Количество() Цикл
ТекСтрока = Документ.Товары[Инд];
Инд2 = Инд + 1;
Пока Инд2 < Документ.Товары.Количество() Цикл
СравнСтрока = Документ.Товары[Инд2];
Если ТекСтрока.Номенклатура = СравнСтрока.Номенклатура Тогда
ТекСтрока.Количество = ТекСтрока.Количество + СравнСтрока.Количество;
Документ.Товары.Удалить(Инд2);
Иначе
Инд2 = Инд2 + 1;
КонецЕсли;
КонецЦикла;
Инд = Инд + 1;
КонецЦикла;Bitte beachten Sie: Beim Löschen eines Duplikats erhöhen wir Ind2 nicht, da das nächste Element an seine Stelle rückt.

Arbeiten mit Stichproben aus Anfragen
Das Ergebnis der Anfrage in 1C ist kein Array, sondern ein spezielles Objekt, das auf besondere Weise behandelt wird.
Grundlegende Stichprobenuntersuchung
Запрос = Новый Запрос;
Запрос.Текст =
"SELECT
| Nomenclature.Name AS Name,
| Nomenclature.Price AS Price
| FROM | Reference Book.Nomenclature AS Nomenclature
|WHERE
| Nomenclature.Price > 0";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование + ": " + Выборка.Цена + " RUB");
КонецЦикла;Die Methode Следующий() verschiebt den Zeiger auf den nächsten Datensatz und gibt Истина zurück, wenn der Datensatz existiert. Wenn die Datensätze enden, wird Ложь zurückgegeben und die Schleife endet.
Umgehung der hierarchischen Auswahl
Für Verzeichnisse mit Hierarchie ist es praktisch, eine Auswahl mit Gruppierungen zu verwenden:
Результат = Запрос.Выполнить();
ВыборкаГруппы = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаГруппы.Следующий() Цикл
Сообщить("== Group: " + ВыборкаГруппы.Категория + " ==");
ВыборкаДетали = ВыборкаГруппы.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
Сообщить(" " + ВыборкаДетали.Наименование);
КонецЦикла;
КонецЦикла;Batch-Anfragen mit mehreren Ergebnissen
Wenn die Abfrage mehrere Tabellen zurückgibt, verarbeiten wir jede:
МассивРезультатов = Запрос.ВыполнитьПакет();
Для Каждого РезультатЗапроса Из МассивРезультатов Цикл
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Zeilenverarbeitung
КонецЦикла;
КонецЦикла;Durchsuchung von Strukturen und Übereinstimmungen
Strukturen und Zuordnungen sind Schlüssel-Wert-Paare. Sie werden durch Для Каждого umgangen:
Параметры = Новый Структура;
Параметры.Вставить("Organization", "Romashka LLC");
Параметры.Вставить("Period", ТекущаяДата());
Параметры.Вставить("Warehouse", "Primary");
Для Каждого КлючЗначение Из Параметры Цикл
Сообщить(КлючЗначение.Ключ + " = " + КлючЗначение.Значение);
КонецЦикла;Für Übereinstimmungen ist die Syntax ähnlich, aber die Übereinstimmung erlaubt Schlüssel jeglicher Art - nicht nur Zeichenfolgen.
Zyklussteuerung: Abbrechen und Fortsetzen
Zwei Bediener ermöglichen eine flexible Steuerung des Zyklusverlaufs.
Прервать — verlässt sofort die Schleife:
Для Каждого Товар Из Каталог Цикл
Если Товар.Наименование = "Searched product" Тогда
НайденныйТовар = Товар;
Прервать;
КонецЕсли;
КонецЦикла;Продолжить - überspringt den verbleibenden Iterationscode und geht zum nächsten über:
Для Каждого Контрагент Из СписокКонтрагентов Цикл
Если Контрагент.ЭтоГруппа Тогда
Продолжить; // Gruppen überspringen
КонецЕсли;
// nur Elemente verarbeiten
ОбработатьКонтрагента(Контрагент);
КонецЦикла;Praktische Tipps zur Produktivität
Es gibt mehrere Regeln, die Ihnen helfen, schnelle und zuverlässige Schleifen in 1C zu schreiben.
Greifen Sie nicht innerhalb der Schleife auf die Datenbank zu. Jeder Datenbankaufruf ist eine Netzwerkanfrage. Wenn Sie 10.000 Zeilen haben, werden Sie 10.000 Serveraufrufe tätigen. Erhalten Sie stattdessen alle benötigten Daten mit einer einzigen Abfrage vor der Schleife:
// ❌ Langsam: Anfrage innerhalb der Schleife
Для Каждого СтрокаТЧ Из Документ.Товары Цикл
Остаток = РегистрыНакопления.ОстаткиТоваров
.ПолучитьПоследнийСрез(, "Nomenclature = &Nom");
КонецЦикла;
// ✅ Schnell: eine Anfrage, dann ein Zyklus
Запрос = Новый Запрос;
Запрос.Текст = "SELECT Nomenclature, Remainder FROM ...";
ТаблицаОстатков = Запрос.Выполнить().Выгрузить();
Для Каждого СтрокаТЧ Из Документ.Товары Цикл
НайденнаяСтрока = ТаблицаОстатков.Найти(
СтрокаТЧ.Номенклатура, "Nomenclature");
Если НайденнаяСтрока <> Неопределено Тогда
Остаток = НайденнаяСтрока.Остаток;
КонецЕсли;
КонецЦикла;Verwenden Sie TabelleWerte.ZeilenFinden() anstelle von verschachtelten Schleifen. Anstatt mit einer verschachtelten Schleife zu durchsuchen, verwenden Sie die integrierten Suchmethoden - sie arbeiten viel schneller:
// ❌ Eingebettete Schleife O(n²)
Для Каждого Строка1 Из Таблица1 Цикл
Для Каждого Строка2 Из Таблица2 Цикл
Если Строка1.Ключ = Строка2.Ключ Тогда
// ...
КонецЕсли;
КонецЦикла;
КонецЦикла;
// ✅ Suche über FindStrings O(n)
Для Каждого Строка1 Из Таблица1 Цикл
Отбор = Новый Структура("Key", Строка1.Ключ);
НайденныеСтроки = Таблица2.НайтиСтроки(Отбор);
Для Каждого НайдСтрока Из НайденныеСтроки Цикл
// ...
КонецЦикла;
КонецЦикла;Verwenden Sie für große Datenmengen die Indizierung über Übereinstimmung:
Индекс = Новый Соответствие;
Для Каждого Строка Из Таблица2 Цикл
Индекс.Вставить(Строка.Ключ, Строка);
КонецЦикла;
Для Каждого Строка1 Из Таблица1 Цикл
НайденнаяСтрока = Индекс.Получить(Строка1.Ключ);
Если НайденнаяСтрока <> Неопределено Тогда
// arbeiten mit der gefundenen Zeile
КонецЕсли;
КонецЦикла;Diese Technik verwandelt O(n²) in O(n) und ist bei der Verarbeitung von Tausenden von Zeilen von entscheidender Bedeutung.
Spickzettel: Welchen Zyklus wählen?
Aufgabe | Zyklus | Warum |
|---|---|---|
Durchlaufen eines Arrays mit Index | Für ... Nach | Zugang per Postleitzahl erforderlich |
Tabellenteil überspringen | Für jeden | Die am meisten gelesene Version |
Zeilen aus der Sammlung löschen | Bis (Rückwärtsdurchlauf) | Wir vermeiden das Auslassen von Elementen |
Auswahl des Abfrageergebnisses | Aktuelle Auswahl. Nächste() | Der einzige Weg, um |
Wiederholung bis zur Bedingung | Bis | Anzahl der Iterationen unbekannt |
Struktur-/Konformitätsumgehung | Für jeden | Wir erhalten Schlüssel-Wert-Paare |
Befund
Schleifen in 1C sind ein Werkzeug, das Sie in jeder Verarbeitung, jedem Bericht und jedem Modul verwenden werden. Beachten Sie die drei Hauptregeln: Greifen Sie nicht in die Datenbank innerhalb einer Schleife, entfernen Sie Elemente in umgekehrter Reihenfolge und verwenden Sie Übereinstimmung für eine schnelle Suche. Diese drei Techniken unterscheiden einen unerfahrenen 1C-Entwickler von einem erfahrenen.
Wenn Sie gerade erst mit dem Programmieren beginnen oder neue Technologien erlernen möchten, schauen Sie sich die App an Kodik. Dort finden Sie strukturierte Kurse in Python, JavaScript, HTML, CSS und anderen Sprachen, die Ihnen helfen, die Grundlagen zu verstehen und zu echten Aufgaben überzugehen. Und in unserem Telegram-Kanal Sie können jederzeit eine Frage stellen, Unterstützung von einer Community von mehr als 2000 Entwicklern erhalten und über neue Materialien auf dem Laufenden bleiben. Programmieren ist einfacher als es scheint, wenn es Leute gibt, die bereit sind zu helfen.
