Глава 3.3 Проход по коллекции По всем и для каждого Действие “Для каждого” (For each) – используется для последовательной обработки данных в коллекциях. Коллекции чаще всего получается в результате запроса к списка. Набор значений, хранящихся в коллекци обрабатывается с помощью действия “Для каждого” методом последовательного прохода от первого элемента коллекции и до последнего элемента. Внутри действия “Для каждого” нужно определить набор действий, которые будут выполнятся для каждого прохода. Таким образом вы можете определить каким образом обрабатывается коллекция. С каждым проходом внутри действия “Для каждого” определяется текущее значение Текущий элемент обработки определяется при каждом проходе Другие действия можно перетащить в конструктор как дочерние действия по отношению к действию Для каждого, и эти действия будут выполняться для каждого значения в коллекции. Текущее значение коллекции доступно для каждого дочернего действия через переменную рабочего процесса. Параметры действия “Для каждого” Действие “Для каждого” определяется следующими параметрами: Целевая коллекция - коллекция, для которой выполняется цикл. Коллекция определяется как переменная процесса и заполняется заранее. Сохранять результат в – значение элемента коллекции которая соотвествует текущем проходу Индекс – числовая переменная, в которую будет при каждом проходе устанавливаться номер прохода. Первый проход нумеруется как нулевой. Остановить обработку - Для прерывания цикла можно задать переменную типа «Да/Нет». Как это работает Зачем все таки? Зачем нам может понадобиться действие “Для каждого”? Представьте себе что переда вами стоит на текущем шаге процесса одна из следующих задач: Посчитать сумму скидки по линиям заказа – причем в самих линиях заказа указана только сумма и процент скидки Установить категорию для выборки импортированных компаний исходя из отрасли, количества сотрудников, оборота Отправить электронные сообщения исполнителям, которые не выполнили рекомендации аудита в срок на сегодня В каждом из приведенных случаев нам необходимо провести обработку набора данных или выполнить какие –то действия для определенной выборки. Для того чтобы выполнить проход по определенному набору данных нам и нужны коллекции. Создаем коллекцию Перед тем как начать работать с коллекций вам надо завести как минимум две переменных. Самая главная переменная – это переменная с типом Коллекция - для того чтобы указать действию целевую коллекцию Перед началом работы вы не просто должны создать переменную для целевой коллекции – но и заполнить ее значением. Чаще всего коллекции заполняются в результате запросов к спискам или к базам данных. Рисунок 1 Запрос к списку Переменная для значения Вторая важная переменная-параметре – это переменная которая указывается в поле “Сохранять результат в”. Тут вы можете указывать переменную с типом Строка / Число / Пользователь – для того чтобы определить место хранения для перебираемых значений из целевой коллекции. Надо быть крайне осторожным с типом переменной для хранения перебираемых значений – она должна быть совместима со всеми значениями в коллекции. У вас может быть ситуация когда большинство получаемых значений конвертируются в число – но одно из них нет. Например, из-за неверно используемого символа разделения целой части. При несовпадении типов при их конвертации вы получите ошибку и процесс немеделнно остановится. После того как мы сформировали значения коллекции, подготовили переменную для хранения результатов прохода по коллекции мы можем начинать работу с коллекцией. Какой такой индекс? Кроме двух основных параметров есть еще два не основных. Один из них – Индекс. Если вы зададите переменную в параметре Индекс – то вы сможете вместе с текущим значением прохода по элементам коллекции получать их номер в коллекции. Это может вам помочь, например, в таких случаыях: При отладке – когда вы будете писать детальную информацию об обработке элементов – указывать в журнал номер элемента в коллекции Когда необходимости подсчитать сколько элементов было обработано на каждом этапе. Для использования номера в форматировании вывода – при генерации текста ставить номер для каждого элемента Индекс – это числовая переменная. Особенность нумерации элементов коллекции заключается в том что программисты научились считать с 0 а не с 1 – как все нормальные люди. Поэтому первый элемент в коллекции будет иметь значения переменной в индексе как 0. Второй – 1. Третий – 2. Ужасно, но такова природа программистов! Побежали! С началом работы действия “Для каждого” из коллекции выбирается самый первый элемент из целевой коллекции. Это первое полученное значение из первого прохода по коллекции. Его значение запсывается в переменную, указанную в настройка действия в поле “Сохранять результат в”. Это основная рабочая переменная данного действия. Внутри действия “Для каждого” мы можем определить набор действий для обработки полученной переменной. Это могут быть действия с проверками, расчетами или действия создающие специальный записи в системе. Именно эти действия будут использовать переменную с текущим значением прохода по коллекции. После того как мы обработали первое полученное значение мы можем перейти к следующему значению. Механизм действия для каждого сдвинет свой указатель на следующий элемент, индекс следующего элемента увеличится на единицу. Таким образом мы получим второй элемент коллекции – и так далее – пока элементы коллекции не закончатся. Обратите внимание на то что количество элементов в коллекции может быть разным – 100,30,3,1 и даже 0. В случае если вы стартовали с пустой коллекцией – действие Для каждого выполнится без единого прохода. В случае если в коллекции будет всего один элемент – выполнится один проход. Нажми, кондуктор, на тормоза! У нас остался последний параметр действия “Для каждого” – “Остановить обработку”. С помощью него вы можете прервать ход обработки коллекции. Зачем это нужно: Вы обрабатывали коллекцию с целью найти определенный элемент – и вот вы нашли его! Зачем обрабатывать остальные элементы? Самое время сказать СТОП! Вы обработали нужное количество элементов? Машина устала? СТОП!! При обработке коллекции сумм денег вы обнаружили следующее значение “денег нет” – это явная ошибка в исходных данных! СТОП!!! Для того чтобы вы могли в нужный момент сказать обработчику СТОП! – вам необходимо установить значение переменной указанной в параметре “Остановить обработку” значение Да. Пока значение этой переменной “Нет” обработка будет продолжаться. Практика использования Прохода по коллекции Пример обработки переменных с типом Денежное значение Рассмотрим пример использования действия “Для каждого” для обработки линий заказа. В нашем примере в линиях заказа хранятся детали заказа – какой товар был заказ, в каком количестве и какая сумма к оплате по каждой линии. Поле сумма заказа имеет тип “Денежное значение”. Для того чтобы получить общую сумму заказа мы в процессе выполним “Запрос к списку”. Внимание! При опросе поле с типом “Денежное значение” в коллекцию попадут не число суммы – а строка – сумма и код валюты. Например, для суммы в гривне формат может бысть следующим: 100,00 грн. Это обстоятельство затрудняет обработку данных сумм посредством математических операций а также делает невозможным присвоение напрямую значения из коллекции в переменную с типом Число. Для того чтобы трансформировать данные из формата “Денежное значение” в число необходимо: В настройках действия указать переменную с типом “Однострочный текст” Обработать текст с помощью регулярного выражения – убрать валюту и пересохранить значение в текстовую переменную уже без валюты. Конвертировать текстовое значение в числовое. В итоге часть процесса в которой будет выполнена обработка будет выглядеть следующим образом (изображение процесса разбито на две части для удобства отображения в книге): Рисунок 2 Схема рабочего процесса получения суммы по линиям заказа Настройка действия для каждого в данном случае будет следующим: Рисунок 3 Настройка действия Запрос к списку В настройках действия “Для каждого” мы получаем значение суммы в виде строки текста. Так как поле сумма имеет тип “Денежное значение” преобразование в число невозможно. Если вы вместо текстовой переменной попробуете подставить переменную с типом число – процесс выдаст ошибку и остановится на данном блоке. Рисунок 4 Настройка действия “Для каждого” В регулярном выражении мы обрабатываем переменную “Сумма к оплате по линии (строка)” следующим образом: Рисунок 5 Настройка действия "Регулярное выражение". С помощью регулярного выражения переменная “Сумма к оплате по линии (строка)” была очищена от текста с валютой суммы. После этого обновленное значене переменной можно конвертировать в число и проводить над ним математические операции (суммирование).