{}const=>[]async()letfn</>var
1CEntwicklung

Bedingungen in 1C: Wenn, sonst und Logik von Geschäftsregeln

Detaillierte Anleitung zu bedingten Konstruktionen in 1C. Wir analysieren die Syntax von Wenn-Dann-Sonst, SonstWenn, den ternären Operator und den SELECT-Operator in Abfragen. Wir zeigen Ihnen vier reale Geschäftsszenarien – von der Bestandskontrolle im Lager bis zur automatischen Dokumentenabstimmung. Wir analysieren typische Anfängerfehler und lernen, sauberen, lesbaren Code mit Bedingungen zu schreiben.

К

Kodik

Autor

8 Min. Lesezeit

Bedingte Konstruktionen sind die Grundlage jeder Geschäftslogik in 1C: Enterprise. Rabatt für Großhandelskunden, Sperrung des Versands bei negativem Saldo, Auswahl des Mehrwertsteuersatzes je nach Warengruppe - all diese Aufgaben werden durch Codeverzweigung gelöst. In diesem Artikel analysieren wir die Syntax von Bedingungen, typische Muster und reale Geschäftsszenarien, mit denen jeder 1C-Entwickler konfrontiert ist.

Grundsyntax: Wenn … Dann … EndeWenn

Die einfachste bedingte Konstruktion in der Sprache 1C besteht aus drei obligatorischen Elementen: dem Schlüsselwort Если, gefolgt von einem logischen Ausdruck, dann dem Wort Тогда, einem Codeblock und dem schließenden КонецЕсли. Wenn die Bedingung wahr ist, wird der Block innerhalb der Struktur ausgeführt. Wenn falsch, wird es vollständig übersprungen.

// Einfache Prüfung: Verbot der Durchführung bei Nullbetrag
Если Объект.СуммаДокумента = 0 Тогда
    Сообщить("The document amount cannot be zero!");
    Отказ = Истина;
КонецЕсли;

Bitte beachten Sie: 1C hat keine geschweiften Klammern wie in JavaScript oder C#. Blockgrenzen werden durch Schlüsselwörter definiert. Ein Semikolon wird nach КонецЕсли und nach jedem Operator innerhalb des Blocks platziert.

🔥 100.000+ Schüler sind bereits bei uns

Genug Theorie gelesen?
Zeit zu coden!

Kodik — eine App, in der du durch Praxis programmieren lernst. KI-Mentor, interaktive Lektionen, echte Projekte.

🤖 KI 24/7
🎓 Zertifikate
💰 Kostenlos
🚀 Jetzt starten
Heute beigetreten

Zweig "Anders" - Bearbeitung eines alternativen Szenarios

Wenn Sie einen Codeblock ausführen müssen, wenn die Bedingung wahr ist, und einen anderen, wenn sie falsch ist, verwenden Sie die Konstruktion mit Иначе. Dies ist ein klassisches „oder-oder“-Muster, das in der überwiegenden Mehrheit der Geschäftsprobleme zu finden ist.

// Wir bestimmen die Preisart für den Kunden
Если Контрагент.ОптовыйПокупатель Тогда
    ТипЦены = Справочники.ТипыЦен.НайтиПоНаименованию("Wholesale");
Иначе
    ТипЦены = Справочники.ТипыЦен.НайтиПоНаименованию("Retail");
КонецЕсли;

Hier prüft das Programm die Requisiten der Gegenpartei und weist der Variable je nach Wert eine von zwei Preisarten zu. Der Block Иначе wird nur ausgeführt, wenn die Bedingung nach Если Ложь zurückgegeben hat.

Mehrere Bedingungen: SonstWenn

Echte Geschäftslogik reduziert sich selten auf zwei Optionen. Wenn drei oder mehr Szenarien getestet werden müssen, wird die Konstruktion ИначеЕсли verwendet. Die Plattform prüft die Bedingungen nacheinander von oben nach unten und führt den ersten Block aus, dessen Bedingung sich als wahr herausgestellt hat. Alle anderen Zweige werden übersprungen.

// Berechnung des Rabatts in Abhängigkeit von der Bestellmenge
Если СуммаЗаказа >= 500000 Тогда
    ПроцентСкидки = 15;
ИначеЕсли СуммаЗаказа >= 100000 Тогда
    ПроцентСкидки = 10;
ИначеЕсли СуммаЗаказа >= 50000 Тогда
    ПроцентСкидки = 5;
Иначе
    ПроцентСкидки = 0;
КонецЕсли;

Die Reihenfolge der Zweige in ИначеЕсли ist von entscheidender Bedeutung. Wenn Sie zuerst eine Prüfung auf 50.000 setzen, fällt auch eine Bestellung von 500.000 in diesen Zweig, da 500.000 >= 50.000. Ordnen Sie die Bedingungen immer von den strengsten zu den mildesten.

Logische Operatoren: UND, ODER, NICHT

Bedingungen können mit drei logischen Operatoren kombiniert werden. Auf diese Weise können Sie komplexe Prüfungen erstellen, die mehrere Faktoren gleichzeitig berücksichtigen.

Der Operator И (Konjunktion) gibt Истина zurück, wenn beide Bedingungen wahr sind. Der Operator ИЛИ (Disjunktion) gibt Истина zurück, wenn mindestens eine Bedingung wahr ist. Der Operator НЕ (Negation) invertiert den Wert — gibt Истина zurück, wenn die Bedingung falsch ist.

// Der Versand ist erlaubt, wenn die Ware auf Lager ist UND der Kunde nicht gesperrt ist
Если ОстатокНаСкладе > 0 И НЕ Контрагент.Заблокирован Тогда
    РазрешитьОтгрузку();
КонецЕсли;

// Sonderkonditionen für VIP-Kunden oder Mitarbeiter
Если Контрагент.VIP ИЛИ Контрагент.Сотрудник Тогда
    ПрименитьСпециальнуюСкидку();
КонецЕсли;

In 1C gibt es keine "faulen" Berechnungen von logischen Ausdrücken (Kurzschlussauswertung). Die Plattform berechnet immer beide Operanden, auch wenn das Ergebnis beim ersten bereits offensichtlich ist. Dies bedeutet, dass, wenn der zweite Operand einen Fehler verursachen kann, er durch den eingebetteten Если in eine separate Prüfung verschoben werden muss.

Vergleichsoperatoren

Für die Erstellung von Bedingungen in 1C steht ein Standardsatz von Vergleichsoperatoren zur Verfügung. Sie arbeiten mit Zahlen, Zeichenfolgen, Datums- und Referenztypen: = (gleich), <> (ungleich), > (größer), < (kleiner), >= (größer oder gleich), <= (kleiner oder gleich).

// Beispiele für die Verwendung von Vergleichsoperatoren
Если Статус = "Paid" Тогда
    // Bearbeitung der bezahlten Bestellung
КонецЕсли;

Если Остаток <> 0 Тогда
    // Rest ist nicht Null
КонецЕсли;

Если ДатаОтгрузки < ТекущаяДата() Тогда
    // Versanddatum ist abgelaufen
КонецЕсли;

Если Количество >= МинимальнаяПартия Тогда
    // Menge ausreichend für den Versand
КонецЕсли;

Eingebettete Bedingungen

Innerhalb eines beliebigen Blocks Если können andere bedingte Konstruktionen platziert werden. Dies wird als Verschachtelung bezeichnet. Es ermöglicht die Implementierung einer Schritt-für-Schritt-Logik, bei der jede nächste Ebene der Überprüfung vom Ergebnis der vorherigen abhängt.

// Mehrstufige Überprüfung bei der Dokumentenausstellung
Если Объект.Контрагент.Пустая() Тогда
    Сообщить("No counterparty specified!");
    Отказ = Истина;
Иначе
    Если Объект.Контрагент.Заблокирован Тогда
        Сообщить("Counterparty is blocked. Please contact your supervisor.");
        Отказ = Истина;
    Иначе
        Если Объект.СуммаДокумента > Объект.Контрагент.КредитныйЛимит Тогда
            Сообщить("Counterparty credit limit exceeded!");
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Versuchen Sie, nicht tiefer als drei Verschachtelungsebenen zu gehen. Wenn die Logik mehr erfordert, nehmen Sie die Prüfungen in separate Funktionen auf oder verwenden Sie den "frühen Ausgang", indem Sie die Variable Отказ setzen und aus der Prozedur zurückkehren.

Ternärer Operator: Konstruktion ?(…, …, …)

1C bietet eine kompakte Alternative zum Wenn-Sonst-Konstrukt für einfache Fälle, in denen Sie einen von zwei Werten auswählen müssen. Dies ist ein ternärer Operator, der mit einem Fragezeichen geschrieben wird.

// Vollständige Form:
Если Контрагент.ОптовыйПокупатель Тогда
    Приветствие = "Dear Partner,";
Иначе
    Приветствие = "Dear Customer,";
КонецЕсли;

// Kompakte Form durch ternären Operator:
Приветствие = ?(Контрагент.ОптовыйПокупатель, "Dear Partner,", "Dear Customer,");

Syntax: ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь). Der ternäre Operator ist nützlich, um Variablen Werte zuzuweisen, Zeichenfolgen zu erstellen und Parameter festzulegen. Verwenden Sie ihn nicht für komplexe Logik - dies beeinträchtigt die Lesbarkeit.

Reale Geschäftsszenarien

Betrachten wir einige typische Aufgaben, mit denen ein 1C-Entwickler in seiner täglichen Arbeit konfrontiert ist.

Szenario 1: Kontrolle der Restbestände bei der Auslieferung

Bei der Durchführung des Dokuments „Warenverkauf“ muss sichergestellt werden, dass genügend Waren auf Lager sind. Wenn der Saldo nicht ausreicht, blockieren Sie die Buchung und zeigen Sie eine deutliche Nachricht an.

Для Каждого СтрокаТЧ Из Объект.Товары Цикл

    Остаток = ПолучитьОстатокНаСкладе(СтрокаТЧ.Номенклатура, Объект.Склад);

    Если СтрокаТЧ.Количество > Остаток Тогда
        Сообщить("Not enough goods: "
            + СтрокаТЧ.Номенклатура
            + ". In stock: " + Остаток
            + ", required: " + СтрокаТЧ.Количество);
        Отказ = Истина;
    КонецЕсли;

КонецЦикла;

Szenario 2: Automatische Berechnung des Mehrwertsteuersatzes

Je nach Warengruppe wird automatisch der gewünschte Mehrwertsteuersatz eingesetzt. Dies erspart dem Manager die manuelle Auswahl und verringert die Fehlerwahrscheinlichkeit.

Если Номенклатура.НоменклатурнаяГруппа = Группы.ДетскиеТовары
    ИЛИ Номенклатура.НоменклатурнаяГруппа = Группы.Продовольствие Тогда
    СтавкаНДС = Перечисления.СтавкиНДС.НДС10;
ИначеЕсли Номенклатура.НоменклатурнаяГруппа = Группы.Экспорт Тогда
    СтавкаНДС = Перечисления.СтавкиНДС.НДС0;
ИначеЕсли Номенклатура.НоменклатурнаяГруппа = Группы.МедицинскиеИзделия Тогда
    СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
Иначе
    СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
КонецЕсли;

Szenario 3: Zugriffsrechte bei der Abstimmung

Dokumente, die einen bestimmten Betrag überschreiten, müssen vom Vorgesetzten genehmigt werden. Einfache Manager können nur zur Genehmigung einreichen, während Führungskräfte direkt genehmigen können.

ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
ЭтоРуководитель = ТекущийПользователь.Роль = Перечисления.Роли.Руководитель;

Если Объект.СуммаДокумента > 1000000 Тогда
    Если ЭтоРуководитель Тогда
        Объект.Статус = Перечисления.СтатусыДокументов.Утверждён;
        Сообщить("The document is approved.");
    Иначе
        Объект.Статус = Перечисления.СтатусыДокументов.НаСогласовании;
        Сообщить("The document has been sent to the manager for approval.");
    КонецЕсли;
Иначе
    Объект.Статус = Перечисления.СтатусыДокументов.Утверждён;
КонецЕсли;

Szenario 4: Zahlungsfristen kontrollieren

Das System prüft automatisch überfällige Zahlungen und generiert Warnungen unterschiedlicher Dringlichkeit.

ДнейПросрочки = (ТекущаяДата() - Объект.ДатаОплаты) / 86400;

Если ДнейПросрочки <= 0 Тогда
    Статус = "On time";
ИначеЕсли ДнейПросрочки <= 7 Тогда
    Статус = "A small delay";
    ОтправитьНапоминание(Объект.Контрагент);
ИначеЕсли ДнейПросрочки <= 30 Тогда
    Статус = "Critical overdue";
    ОтправитьПретензию(Объект.Контрагент);
    ЗаблокироватьОтгрузки(Объект.Контрагент);
Иначе
    Статус = "Submitted to lawyers";
    СоздатьЗадачуЮристу(Объект.Контрагент, ДнейПросрочки);
КонецЕсли;

Typische Fehler und wie man sie vermeidet

Fehler 1: Vergleich mit einem leeren Link

Anfänger schreiben oft Если Контрагент = "" Тогда und versuchen, die Vollständigkeit der Referenzdetails zu überprüfen. Das ist falsch — die Zeichenfolge und der Link haben unterschiedliche Typen. Verwenden Sie die Methode Пустая() oder die Funktion ЗначениеЗаполнено(), um zu überprüfen, ob der Link leer ist.

// Falsch:
Если Объект.Контрагент = "" Тогда

// Richtig:
Если Объект.Контрагент.Пустая() Тогда

// Auch richtig (universelle Variante):
Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда

Fehler 2: Vergessene „Dann“

Im Gegensatz zu den meisten Programmiersprachen folgt in 1C nach der Bedingung immer das Schlüsselwort Тогда. Ohne es gibt die Plattform einen Syntaxfehler aus. Dies ist einer der häufigsten Fehler beim Wechsel von anderen Sprachen.

Fehler 3: Falsche Reihenfolge in SonstWenn

Wie bereits erwähnt, ist die Reihenfolge der Bedingungen von entscheidender Bedeutung. Die Plattform führt den ersten Zweig aus, dessen Bedingung wahr ist. Wenn Sie die Bedingungen von mild bis streng anordnen, funktionieren spezifischere Zweige nie.

Fehler 4: Übermäßige Verschachtelung

Tiefe Verschachtelung erschwert das Lesen und Debuggen von Code. Verwenden Sie das Muster "früher Ausgang": Überprüfen Sie ungültige Bedingungen zu Beginn der Prozedur und beenden Sie sofort über Возврат.

// Tiefe Verschachtelung (schlecht):
Если УсловиеА Тогда
    Если УсловиеБ Тогда
        Если УсловиеВ Тогда
            // Hauptcode
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

// Früher Ausgang (gut):
Если НЕ УсловиеА Тогда
    Возврат;
КонецЕсли;

Если НЕ УсловиеБ Тогда
    Возврат;
КонецЕсли;

Если НЕ УсловиеВ Тогда
    Возврат;
КонецЕсли;

// Hauptcode - ohne Verschachtelung

Bedingungen in der 1C-Abfragesprache

Neben der integrierten Sprache werden in der 1C-Abfragesprache aktiv bedingte Konstruktionen verwendet. Hier wird der Operator ВЫБОР verwendet, ähnlich wie CASE in SQL.

ВЫБОР
    КОГДА Продажи.Сумма >= 500000
        ТОГДА "Large order"
    КОГДА Продажи.Сумма >= 100000
        ТОГДА "Average order"
    ИНАЧЕ "Small order"
КОНЕЦ КАК КатегорияЗаказа

Der Operator ВЫБОР kann in den Abschnitten ВЫБРАТЬ, ГДЕ, УПОРЯДОЧИТЬ ПО und sogar in Tabellenverbindungen verwendet werden. Dies ist ein leistungsstarkes Tool zum Erstellen berechneter Felder und zum Filtern von Daten auf Datenbankebene.

Befund

Bedingte Konstruktionen sind ein Werkzeug, mit dem Sie jeden Tag arbeiten werden. Ein einfaches Если-Тогда verwandelt sich in komplexe Geschäftsregelbäume, die Rabatte, Zugriffsrechte, Genehmigungswege und Dutzende anderer Prozesse verwalten. Die Hauptsache ist, die Bedingungen klar zu schreiben, die Zweige in der richtigen Reihenfolge anzuordnen und keine Angst zu haben, komplexe Logik in separate Funktionen zu übertragen. Reiner Code mit Bedingungen ist Code, den Ihre Kollegen auch nach Monaten und Jahren lesen und pflegen können.

Wenn Sie Ihre Reise in die Entwicklung beginnen oder Ihr Wissen vertiefen möchten, ist die App Kodik wird Ihnen helfen, die Programmierung von Grund auf zu erlernen. Strukturierte Kurse in Python, JavaScript, HTML, CSS, 1C und anderen Technologien, praktische Aufgaben und verständliche Erklärungen – alles an einem Ort. Laden Sie die Kodik-App im App Store und bei Google Play herunter. Wenn Sie Fragen haben, treten Sie uns bei unseren Telegram-Kanal mit Unterstützung, wo mehr als 2000 Entwickler bereits Code diskutieren, Erfahrungen teilen und sich gegenseitig helfen. Gemeinsam lernt man leichter!

🎯Hör auf zu zögern

Artikel gefallen?
Zeit zum Üben!

Bei Kodik liest du nicht nur — du schreibst sofort Code. Theorie + Praxis = echte Skills.

Sofortige Praxis
🧠KI erklärt Code
🏆Zertifikat

Keine Registrierung • Keine Karte