Цикл

Рабочий процесс: узел циклаCommunity Edition+

Введение

Цикл эквивалентен синтаксическим конструкциям for/while/forEach в языках программирования. Когда нужно повторить операции определенное число раз или пройти по коллекции данных (массиву), используйте узел loop.

Установка

Это встроенный плагин, установка не требуется.

Создание узла

В интерфейсе настройки рабочего процесса нажмите кнопку плюса ("+") в потоке, чтобы добавить узел «Цикл»:

Создание узла цикла

После создания узла «Цикл» будет сгенерирована внутренняя ветвь цикла. В эту ветвь можно добавить любое количество узлов. Эти узлы могут использовать не только переменные контекста рабочего процесса, но и локальные переменные контекста цикла, например текущий объект данных из коллекции цикла или индекс итерации (индекс начинается с 0). Область видимости локальных переменных ограничена циклом. При вложенных циклах можно использовать локальные переменные конкретного цикла на каждом уровне.

Настройка узла

20241016135326

Объект цикла

Цикл по-разному обрабатывает разные типы данных объекта цикла:

  1. Массив: самый распространенный случай. Обычно можно выбрать переменную из контекста рабочего процесса, например множественный результат узла «Выбрать записи» или предзагруженные данные связи «один-ко-многим». Если выбран массив, узел «Цикл» пройдет по каждому элементу массива и на каждой итерации присвоит текущий элемент локальной переменной в контексте цикла.

  2. Число: если выбранная переменная — число, оно будет использовано как количество итераций. Значение должно быть положительным целым; отрицательные числа не войдут в цикл, дробная часть будет отброшена. Индекс итерации в локальной переменной также является значением объекта цикла. Значение начинается с 0. Например, если число объекта цикла равно 5, объект и индекс на каждой итерации будут: 0, 1, 2, 3, 4.

  3. Строка: если выбранная переменная — строка, ее длина используется как число итераций, а обработка идет по каждому символу строки по индексу.

  4. Другое: остальные типы значений (включая объекты) рассматриваются как объект цикла из одного элемента и выполняются только один раз. Обычно в такой ситуации цикл не нужен.

Помимо выбора переменной, можно напрямую вводить константы типов «число» и «строка». Например, ввод 5 (число) заставит узел «Цикл» выполнить 5 итераций. Ввод абв (строка) даст 3 итерации с обработкой символов а, б, в. В инструменте выбора переменной выберите нужный тип константы.

Условие цикла

Начиная с версии v1.4.0-beta, добавлены опции, связанные с условиями цикла. Условия цикла можно включить в конфигурации узла.

Условие

Как и в настройке узла «Условие», можно комбинировать условия и использовать переменные текущего цикла, например объект цикла, индекс цикла и т.д.

Момент проверки

Аналогично конструкциям циклов с проверкой до и после итерации в программировании, можно выбрать проверку условия до начала каждой итерации или после завершения каждой итерации. Проверка после итерации позволяет узлам внутри тела цикла выполниться один раз до проверки условия.

Когда условие не выполнено

Аналогично операторам прерывания и продолжения цикла в программировании, можно выбрать выход из цикла или переход к следующей итерации.

Обработка ошибок в узлах цикла

Начиная с версии v1.4.0-beta, если узел внутри цикла завершается ошибкой (невыполненные условия, исключения и т.д.), можно настроить последующий поток. Поддерживаются три способа обработки:

  • Выйти из рабочего процесса (как выброс исключения в программировании)
  • Выйти из цикла и продолжить рабочий процесс (как прерывание цикла в программировании)
  • Перейти к следующему объекту цикла (как продолжение цикла в программировании)

По умолчанию используется «Выйти из рабочего процесса»; при необходимости это можно изменить.

Пример

Например, при размещении заказа нужно проверить остаток по каждому товару в заказе. Если остаток достаточный, списать его; иначе пометить товар в деталях заказа как невалидный.

  1. Создайте три коллекции: «Товары» <-(1:m)-- «Детали заказа» --(m:1)-> «Заказы». Модель данных выглядит так:

    Коллекция «Заказы»

    Название поляТип поля
    Детали заказаОдин-ко-многим (детали заказа)
    Общая сумма заказаЧисло

    Коллекция «Детали заказа»

    Название поляТип поля
    ТоварМногие-к-одному (товар)
    КоличествоЧисло

    Коллекция «Товары»

    Название поляТип поля
    Название товараОднострочный текст
    ЦенаЧисло
    ОстатокЦелое число
  2. Создайте рабочий процесс. Для триггера выберите «События коллекции» и укажите коллекцию «Заказы» с моментом «После добавления записи». Также нужно настроить предварительную загрузку данных связей коллекции «Детали заказа» и коллекции «Товары» внутри деталей:

    Пример настройки триггера

  3. Создайте узел «Цикл» и выберите объект цикла «Данные триггера / Детали заказа», это означает, что будет обработана каждая запись в коллекции «Детали заказа»:

    Пример настройки узла цикла

  4. Внутри узла «Цикл» создайте узел «Условие», чтобы проверить, достаточно ли остатка товара:

    Пример настройки узла условия

  5. Если остатка достаточно, в ветви «Да» создайте узел «Вычисление» и узел «Обновить запись», чтобы обновить соответствующую запись товара рассчитанным остатком после списания:

    Пример настройки узла вычисления

    Пример настройки узла обновления остатка

  6. Иначе, в ветви «Нет», создайте узел «Обновить запись», чтобы обновить статус детали заказа на «невалидно»:

    Пример настройки узла обновления детали заказа

Общая структура рабочего процесса:

Структура рабочего процесса

После настройки и активации этого рабочего процесса при создании нового заказа автоматически проверяется остаток товаров в деталях заказа. Если остаток достаточный, он списывается; иначе товар в деталях заказа помечается как невалидный (чтобы можно было корректно посчитать итоговую сумму заказа).