{}const=>[]async()letfn</>var
1C開発

1Cの条件:もし、そうでなければ、ビジネスルールのロジック

1Cの条件付き構文の詳細なガイド。If-Then-Else、ElseIf、三項演算子、およびクエリでのSELECT演算子の構文を分析します。在庫管理から文書の自動承認まで、4つの実際のビジネスシナリオを紹介します。初心者がよく犯す間違いを分析し、条件付きのクリーンで読みやすいコードを書く方法を学びます。

К

Kodik

著者

3分で読める

条件付き構文は、1C: Enterpriseのビジネスロジックの基礎です。卸売顧客への割引、マイナス残高での出荷のブロック、品目グループに応じた消費税率の選択など、これらのタスクはすべてコードの分岐を通じて解決されます。この記事では、すべての1C開発者が直面する条件の構文、典型的なパターン、および実際のビジネスシナリオを分析します。

基本構文: If … Then … EndIf

1C言語の最も単純な条件付き構文は、3つの必須要素で構成されています。キーワード Если、論理式、単語 Тогда、コードブロック、およびクローズ КонецЕслиです。条件が真である場合、構造内のブロックが実行されます。偽の場合、それは完全にスキップされます。

// 簡単なチェック:金額がゼロの場合は実施を禁止
Если Объект.СуммаДокумента = 0 Тогда
    Сообщить("The document amount cannot be zero!");
    Отказ = Истина;
КонецЕсли;

注意: 1C には、JavaScript や C# のような中括弧はありません。ブロックの境界はキーワードで設定されます。セミコロンは、КонецЕсли の後、およびブロック内の各演算子の後に配置されます。

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

「それ以外の場合」のブランチ — 代替シナリオの処理

条件が真のときに1つのコードブロックを実行し、条件が偽のときに別のコードブロックを実行する必要がある場合は、Иначеを使用します。これは、大多数のビジネス課題で見られる古典的な「またはまたは」パターンです。

// クライアントの価格タイプを決定する
Если Контрагент.ОптовыйПокупатель Тогда
    ТипЦены = Справочники.ТипыЦен.НайтиПоНаименованию("Wholesale");
Иначе
    ТипЦены = Справочники.ТипыЦен.НайтиПоНаименованию("Retail");
КонецЕсли;

ここでは、プログラムは取引先の詳細をチェックし、その値に応じて、2種類の価格のいずれかを変数に割り当てます。ブロック Иначе は、Если の後の条件が Ложь を返した場合にのみ実行されます。

複数の条件: OtherwiseIf

実際のビジネスロジックは、2つの選択肢にまとめられることはめったにありません。3つ以上のスクリプトをチェックする必要がある場合は、ИначеЕсли構造を使用します。プラットフォームは条件を上から下に順番にチェックし、条件が真である最初のブロックを実行します。他のすべてのブランチはスキップされます。

// 注文金額に応じた割引の計算
Если СуммаЗаказа >= 500000 Тогда
    ПроцентСкидки = 15;
ИначеЕсли СуммаЗаказа >= 100000 Тогда
    ПроцентСкидки = 10;
ИначеЕсли СуммаЗаказа >= 50000 Тогда
    ПроцентСкидки = 5;
Иначе
    ПроцентСкидки = 0;
КонецЕсли;

ИначеЕслиのブランチの順序は非常に重要です。最初に50,000のチェックを入れると、500,000の注文もこのブランチに入ります。500,000 >= 50,000だからです。条件は常に最も厳しいものから最も穏やかなものへと並べ替えてください。

論理演算子: AND、OR、NOT

条件は、3つの論理演算子を使用して組み合わせることができます。これにより、複数の要因を同時に考慮した複雑なチェックを構築できます。

И (論理積) 演算子は、両方の条件が真の場合に Истина を返します。オペレーター ИЛИ (論理和) は、少なくとも 1 つの条件が真の場合に Истина を返します。オペレーター НЕ (否定) は値を反転させます。条件が偽の場合、Истина を返します。

// 商品が在庫があり、顧客がブロックされていない場合、出荷が許可されます
Если ОстатокНаСкладе > 0 И НЕ Контрагент.Заблокирован Тогда
    РазрешитьОтгрузку();
КонецЕсли;

// VIP顧客または従業員向けの特別条件
Если Контрагент.VIP ИЛИ Контрагент.Сотрудник Тогда
    ПрименитьСпециальнуюСкидку();
КонецЕсли;

1C には、論理式の「遅延」計算(短絡評価)はありません。プラットフォームは、最初のオペランドで結果がすでに明らかであっても、常に両方のオペランドを計算します。つまり、2 番目のオペランドがエラーを引き起こす可能性がある場合は、ネストされた Если を介して個別のチェックに移動する必要があります。

比較演算子

1Cでは、条件を作成するための標準的な比較演算子セットが利用可能です。数字、文字列、日付、参照タイプで動作します。=(等しい)、<>(等しくない)、>(より大きい)、<(より小さい)、>=(より大きいまたは等しい)、<=(より小さいまたは等しい)。

// 比較演算子の使用例
Если Статус = "Paid" Тогда
    // 支払い済み注文の処理
КонецЕсли;

Если Остаток <> 0 Тогда
    // 残高がゼロではありません
КонецЕсли;

Если ДатаОтгрузки < ТекущаяДата() Тогда
    // 出荷日が過ぎています
КонецЕсли;

Если Количество >= МинимальнаяПартия Тогда
    // 出荷に十分な数量
КонецЕсли;

ネストされた条件

任意のブロック Если の内部に、他の条件付き構文を配置できます。これはネスティングと呼ばれます。これにより、前の検証レベルの結果に依存するステップバイステップのロジックを実装できます。

// 文書の多段階検査
Если Объект.Контрагент.Пустая() Тогда
    Сообщить("No counterparty specified!");
    Отказ = Истина;
Иначе
    Если Объект.Контрагент.Заблокирован Тогда
        Сообщить("Counterparty is blocked. Please contact your supervisor.");
        Отказ = Истина;
    Иначе
        Если Объект.СуммаДокумента > Объект.Контрагент.КредитныйЛимит Тогда
            Сообщить("Counterparty credit limit exceeded!");
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

ネストのレベルは3つまでにするようにしてください。ロジックがそれ以上のものを必要とする場合は、個別の関数でチェックを行うか、変数 Отказ を設定して手順から戻ることで「早期終了」を使用します。

三項演算子: 構文 ?(…, …, …)

1Cには、2つの値のいずれかを選択する必要がある単純な場合に、If-Else構造のコンパクトな代替手段があります。これは、疑問符を使用して書き込まれる三項演算子です。

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

// 三項演算子を介したコンパクトな形式:
Приветствие = ?(Контрагент.ОптовыйПокупатель, "Dear Partner,", "Dear Customer,");

構文:?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь)。三項演算子は、変数への値の割り当て、文字列の生成、パラメータの設定に便利です。複雑なロジックには使用しないでください。読みにくくなります。

実際のビジネスシナリオ

1C開発者が日常業務で直面する典型的なタスクをいくつか見ていきましょう。

シナリオ1:出荷時の残高管理

「商品の販売」ドキュメントを実行する際には、倉庫に十分な商品があることを確認する必要があります。残高が不足している場合は、実行をブロックし、明確なメッセージを表示します。

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

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

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

КонецЦикла;

シナリオ2:VAT税率の自動計算

商品の品目グループに応じて、必要な付加価値税率が自動的に置き換えられます。これにより、マネージャーは手動で選択する必要がなくなり、エラーの可能性が減少します。

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

シナリオ3:調整時の権利の区別

特定の金額を超える書類は、マネージャーの承認が必要です。一般のマネージャーは承認のために送信することしかできず、リーダーは直接承認することができます。

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

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

シナリオ4:支払い条件の管理

システムは自動的に期限切れの支払いをチェックし、さまざまな重要度の警告を生成します。

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

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

よくあるミスとその回避方法

エラー1:空のリンクとの比較

初心者は、参照の詳細が完全であることを確認するために、Если Контрагент = "" Тогдаを書くことがよくあります。これは間違いです。文字列とリンクは異なるタイプです。リンクが空であることを確認するには、メソッド Пустая() または関数 ЗначениеЗаполнено() を使用します。

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

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

// これも正しいです(汎用バージョン)。
Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда

ミス 2: 忘れられた「その時」

ほとんどのプログラミング言語とは異なり、1C では条件の後に必ずキーワード Тогда が続きます。これがないと、プラットフォームは構文エラーを返します。これは、他の言語からの移行時に最も一般的なエラーの1つです。

エラー 3: 間違った順序の OtherwiseIf

すでに述べたように、条件の順序は非常に重要です。プラットフォームは、条件が真である最初のブランチを実行します。条件を軽いものから厳しいものへと並べ替えると、より具体的な分岐は機能しません。

ミス 4: 過剰なネスト

ネストが深いと、コードの読み取りとデバッグが難しくなります。「早期終了」パターンを使用します。手順の開始時に無効な条件を確認し、すぐに Возврат を介して終了します。

// 深いネスト(悪い):
Если УсловиеА Тогда
    Если УсловиеБ Тогда
        Если УсловиеВ Тогда
            // メインコード
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

// 早期退出(良好):
Если НЕ УсловиеА Тогда
    Возврат;
КонецЕсли;

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

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

// メインコード — 入れ子なし

1Cクエリ言語の条件

組み込み言語に加えて、条件付き構文は 1C クエリ言語で積極的に使用されています。ここでは、SQLのCASEと同様のВЫБОР演算子が使用されます。

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

ВЫБОР演算子は、ВЫБРАТЬГДЕУПОРЯДОЧИТЬ ПОセクション、さらにはテーブル結合の条件でも使用できます。これは、DBMSレベルで計算フィールドを形成し、データをフィルタリングするための強力なツールです。

結論

条件付き構文は、毎日使用するツールです。シンプルな Если-Тогда は、割引、アクセス権、承認ルート、その他の数十のプロセスを管理する複雑なビジネスルールツリーに変わります。重要なのは、条件を明確に書き、ブランチを正しい順序で配置し、複雑なロジックを個別の関数に移すことを恐れないことです。条件付きのクリーンなコードは、同僚が数ヶ月または数年後に読んで維持できるコードです。

開発の道を歩み始める方や、知識を深めたい方に最適なアプリ コディック プログラミングをゼロから学ぶのに役立ちます。Python、JavaScript、HTML、CSS、1Cなどの技術に関する構造化されたコース、実践的なタスク、わかりやすい説明がすべて1つの場所にあります。App StoreとGoogle PlayでKodikアプリをダウンロードし、質問がある場合は参加してください 当社のTelegramチャンネル 2000人以上の開発者がすでにコードについて話し合い、経験を共有し、お互いに助け合っているサポートを受けています。一緒に学ぶ方が簡単です!

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要