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

Prozeduren und Funktionen in 1C: Wie man Code schreibt, den man ohne Scham pflegen kann

Wir verstehen, wie man Prozeduren und Funktionen in 1C richtig schreibt: Benennung, Parameter, Fehlerbehandlung, Single-Responsibility-Prinzip. Praktische Beispiele für Code, der einfach zu lesen und zu pflegen ist.

К

Kodik

Autor

6 Min. Lesezeit

Jeder, der mit dem Code eines anderen in 1C gearbeitet hat, hat mindestens einmal das gleiche Gefühl erlebt: Sie öffnen ein Modul und es gibt ein 800-Zeilen-Verfahren mit dem Namen "Daten verarbeiten". Kein Kommentar. Mit den Variablen "a", "b" und "Zeit". Und du verstehst - in sechs Monaten kann dein eigener Code bei jemandem genau die gleichen Emotionen hervorrufen.

Lassen Sie uns herausfinden, wie man Prozeduren und Funktionen in 1C so schreibt, dass der Code auch nach Jahren lesbar, vorhersehbar und einfach zu warten bleibt.

Verfahren vs. Funktion: Was ist der grundlegende Unterschied?

Auf den ersten Blick ist alles einfach: Die Funktion gibt einen Wert zurück, die Prozedur nicht. Aber hinter dieser Einfachheit verbirgt sich ein wichtiges Designprinzip.

Funktion - das ist eine Frage. Sie fragen das System nach etwas und erhalten eine Antwort. Sie sollte den Zustand der Datenbank nicht ändern, sie sollte keine Nachrichten an den Benutzer ausgeben. Es zählt einfach und gibt das Ergebnis zurück.

Функция РассчитатьСуммуСоСкидкой(Сумма, ПроцентСкидки)
    Возврат Сумма - Сумма * ПроцентСкидки / 100;
КонецФункции

Verfahren — ist ein Befehl. Sie bitten das System, etwas zu tun: ein Dokument zu schreiben, einen Brief zu senden, den Tabellenteil auszufüllen. Es führt die Aktion aus und gibt kein Ergebnis zurück.

Процедура ЗаполнитьЦеныВТабличнойЧасти(ТабличнаяЧасть, ТипЦен)
    Для Каждого Строка Из ТабличнаяЧасть Цикл
        Строка.Цена = ПолучитьЦенуНоменклатуры(Строка.Номенклатура, ТипЦен);
        Строка.Сумма = Строка.Количество * Строка.Цена;
    КонецЦикла;
КонецПроцедуры

Wenn Sie sich dabei ertappen, dass die Funktion Daten schreibt und das Ergebnis zurückgibt, ist dies ein Signal, dass es sich lohnt, die Logik in zwei Teile zu unterteilen.

🔥 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

Benennung: Ihr Code wird von Menschen gelesen, nicht vom Compiler

Der Name einer Prozedur oder Funktion ist ein Vertrag mit der Person, die den Code nach Ihnen liest. Ein guter Name macht einen Kommentar unnötig.

Schlechte Namen - das sind Namen, die nichts über den Zweck aussagen:

// Was verarbeitet es? Welche Daten? Warum?
Процедура ОбработатьДанные()

// Was genau wird geprüft? Welches Dokument?
Функция Проверка(Док)

// „Ausführen“ ist das nutzloseste Wort im Titelроцедура ВыполнитьОперацию()

Gute Namen enthalten ein Verb und beschreiben eine bestimmte Handlung:

Процедура РассчитатьСебестоимостьПоПартиям(ДокументОбъект)

Функция ПолучитьОстатокНоменклатурыНаСкладе(Номенклатура, Склад, Дата)

Функция ЕстьПравоНаСкидку(Контрагент, СуммаЗаказа)

Einige Regeln, die wirklich funktionieren:

  • Beginnen Sie Fragenfunktionen mit den Wörtern „Erhalten“, „Berechnen“, „Finden“, „Vorhanden“ (für boolesche Werte).

  • Befehlsprozeduren beginnen mit den Wörtern "Ausfüllen", "Speichern", "Senden", "Löschen", "Installieren".

  • Haben Sie keine Angst vor langen Namen. "BetragFürDenZeitraumFürDenAuftragnehmerErhalten" ist verständlicher als "BetragErhalten".

Parameter: weniger ist besser

Wenn Ihre Prozedur mehr als fünf Parameter hat, ist etwas schief gelaufen. Es ist nicht nur eine Frage der Ästhetik: Eine große Anzahl von Parametern bedeutet, dass die Prozedur zu viel tut oder dass die Daten schlecht strukturiert sind.

Problem:

Процедура СоздатьЗаказ(Контрагент, Склад, Менеджер, ДатаОтгрузки, 
    ТипЦен, ВалютаДокумента, Организация, Комментарий, Приоритет)
    // ...40 Zeilen Dokumenterstellung
КонецПроцедуры

Die Lösung - die Struktur:

Функция НовыеПараметрыЗаказа()
    Параметры = Новый Структура;
    Параметры.Вставить("Counterparty");
    Параметры.Вставить("Warehouse");
    Параметры.Вставить("Manager");
    Параметры.Вставить("Date of shipment", ТекущаяДата());
    Параметры.Вставить("PriceType");
    Параметры.Вставить("Currency");
    Параметры.Вставить("Organization");
    Параметры.Вставить("Comment", "");
    Параметры.Вставить("Priority", 0);
    Возврат Параметры;
КонецФункции

Процедура СоздатьЗаказ(ПараметрыЗаказа)
    // Sauber, klar, erweiterbar
КонецПроцедуры

Das Muster "Parameter-Konstruktor-Funktion" ist eine der nützlichsten Techniken in 1C. Es ermöglicht das Hinzufügen neuer Parameter, ohne bestehende Aufrufe zu unterbrechen.

Prinzip der alleinigen Verantwortung

Dies ist vielleicht das wichtigste Prinzip, das im 1C-Code am häufigsten verletzt wird. Ein Verfahren sollte eine Sache tun.

Antimuster — „Kombinationsverfahren“:

Процедура ОбработатьДокумент(ДокументОбъект)
    // Überprüfung der Ausfüllung — 50 Zeilen
    // Berechnung der Beträge — 30 Zeilen
    // Bewegungsbildung — 100 Zeilen
    // Benachrichtigung senden — 20 Zeilen
    // Aktualisierung des Status der Gegenpartei — 25 Zeilen
    // Protokollierung — 15 Zeilen
КонецПроцедуры

Dieses Verfahren kann nicht getestet werden, es ist schwierig zu debuggen, und wenn etwas kaputt geht - und es wird kaputt gehen - werden Sie alle 240 Zeilen erneut lesen.

Der richtige Ansatz:

Процедура ОбработатьДокумент(ДокументОбъект)

    ОшибкиЗаполнения = ПроверитьЗаполнениеДокумента(ДокументОбъект);
    Если ОшибкиЗаполнения.Количество() > 0 Тогда
        ВывестиОшибкиЗаполнения(ОшибкиЗаполнения);
        Возврат;
    КонецЕсли;

    РассчитатьСуммыДокумента(ДокументОбъект);
    СформироватьДвижения(ДокументОбъект);
    ОтправитьУведомление(ДокументОбъект);
    ОбновитьСтатусКонтрагента(ДокументОбъект.Контрагент);

КонецПроцедуры

Jetzt ist jede Operation isoliert. Wenn Sie die Logik der Berechnung von Beträgen ändern müssen, wissen Sie genau, wo Sie suchen müssen. Wenn der Versand von Benachrichtigungen nicht mehr funktioniert, müssen Sie den Berechnungscode nicht erneut lesen.

Fehlerbehandlung: Verbergen Sie Probleme nicht

Einer der häufigsten Fehler ist das stille Verschlucken von Ausnahmen.

Was man nicht tun sollte:

Процедура ОтправитьДанныеВоВнешнююСистему(Данные)
    Попытка
        // ... wird gesendet
    Исключение
        // Leer. Nun, es ist nicht gegangen und das ist in Ordnung.
    КонецПопытки;
КонецПроцедуры

Drei Monate später kommt der Buchhalter und sagt: „Die Daten gehen seit letztem Sommer nicht mehr.“ Und in den Protokollen herrscht Stille.

Wie richtig:

Процедура ОтправитьДанныеВоВнешнююСистему(Данные)
    Попытка
        // ... wird gesendet
    Исключение
        ТекстОшибки = ОписаниеОшибки();
        ЗаписьЖурналаРегистрации("IntegrationExternalSystem",
            УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
        ВызватьИсключение "Failed to send data: " + ТекстОшибки;
    КонецПопытки;
КонецПроцедуры

Goldene Regel: Fangen Sie nur die Fehler ab, die Sie behandeln können. Die übrigen protokollieren und weiterleiten.

Export: Nicht alles öffentlich machen

In 1C besteht die Versuchung, jede Funktion als "Export" zu kennzeichnen - vielleicht ist es ja nützlich. Dies führt dazu, dass das Modul zu einer Müllhalde wird, bei der es unmöglich ist zu verstehen, was eine öffentliche API und was eine interne Küche ist.

Die Regel ist einfach: Eine Prozedur oder Funktion erhält den Modifikator "Export" nur, wenn sie von anderen Modulen wirklich benötigt wird. Alles andere ist eine private Implementierung, die Sie beliebig ändern können.

// Dies ist eine öffentliche API des Moduls - gut dokumentiert, stabiler Vertrag
Функция РассчитатьСтоимостьДоставки(Параметры) Экспорт
    // ...
КонецФункции

// Dies ist ein internes Implementierungsdetail — ohne Export
Функция ПолучитьТарифнуюЗону(АдресДоставки)
    // ...
КонецФункции

Rückgabewerte: Seien Sie vorhersehbar

Die Funktion sollte immer einen Wert eines Typs zurückgeben. Wenn eine Funktion je nach Situation eine Zeichenfolge, eine Zahl oder Undefiniert zurückgeben kann, wird jeder aufrufende Code zu einem Detektiv.

Schlecht:

Функция НайтиКонтрагента(ИНН)
    Запрос = Новый Запрос("...");
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        Возврат Ложь;  // Manchmal boolesch
    КонецЕсли;
    Возврат Результат.Выгрузить()[0].Контрагент;  // Manchmal ein Link
КонецФункции

Gut:

// Gibt IMMER einen Link zurück. Leerer Link = nicht gefunden.
Функция НайтиКонтрагентаПоИНН(ИНН)
    Запрос = Новый Запрос("...");
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        Возврат Справочники.Контрагенты.ПустаяСсылка();
    КонецЕсли;
    Возврат Результат.Выгрузить()[0].Контрагент;
КонецФункции

Kommentare: Erklären Sie das „Warum“ und nicht das „Was“

Guter Code braucht kaum Kommentare - er erklärt sich selbst durch verständliche Namen. Aber manchmal sind Kommentare notwendig: wenn es darum geht, eine nicht offensichtliche Geschäftsregel oder den Grund für eine nicht standardmäßige Lösung zu erklären.

Nutzloser Kommentar:

// Wir erhalten das Datum
Дата = ТекущаяДата();

Nützlicher Kommentar:

// Wir verwenden das Startdatum des nächsten Monats, da die Tarife
// werden am ersten Tag aktualisiert und die Abrechnung muss nach den neuen Preisen berechnet werden
ДатаРасчёта = НачалоМесяца(ДобавитьМесяц(ТекущаяДата(), 1));

Für Exportfunktionen müssen Sie unbedingt eine Beschreibung der Parameter und des Rückgabewerts hinzufügen. Dies ist keine Formsache, sondern die Dokumentation Ihrer API:

// Berechnet die Versandkosten basierend auf Zone und Gewicht.
// // Parameter:
// Lieferadresse - Zeile - vollständige Adresse im FIAS-Format
// GewichtGram - Anzahl - Versandgewicht in Gramm
// // Rückgabewert:
// Anzahl - Versandkosten in Rubel, 0 wenn der Versand kostenlos ist
// Funktion VersandkostenBerechnen (Lieferadresse, GewichtGramm) Export

Wenn Sie Ihre Programmierkenntnisse vertiefen und moderne Technologien erlernen möchten, werfen Sie einen Blick in die App Kodik. Dies ist eine Bildungsplattform mit Kursen in Python, JavaScript, HTML, CSS und anderen Sprachen, in denen komplexe Dinge in einfacher Sprache erklärt werden und die Theorie sofort durch die Praxis untermauert wird.

Und in unserem Telegram-Kanal Sie werden von einer freundlichen Gemeinschaft von mehr als 2000 Entwicklern erwartet, in der Sie jederzeit Fragen stellen, Unterstützung erhalten und Gleichgesinnte finden können. Schließen Sie sich uns an — gemeinsam wächst man im Beruf viel 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