Filter Array и Select вместо Apply to Each в Power Automate
Filter Array и Select заменяют Apply to Each при фильтрации и преобразовании массивов и работают заметно быстрее.
Когда облачному потоку нужно пройти по массиву, многие автоматически берут действие Apply to Each. Для простых случаев это вполне нормально, но как только речь идёт лишь о фильтрации массива или изменении формы его объектов, стоит присмотреться к двум альтернативам из категории «Операции с данными»: Filter Array и Select. Обе выполняют именно эту задачу за один шаг, без того, чтобы поток проходил по каждому элементу по отдельности.
В этой статье показано, как работают эти два действия, где они разумно заменяют Apply to Each и где цикл всё же остаётся правильным выбором. Об ограничениях самого Apply to Each, например при очень больших массивах, и о лимитах действий Power Automate подробнее рассказано в статье про лимиты действий Power Automate.
Почему Apply to Each часто оказывается лишним шагом при фильтрации и преобразовании
Apply to Each выполняет входящие в него действия для каждого отдельного элемента массива. При 200 заказах и двух действиях внутри тела цикла это 400 отдельных выполнений, каждое из которых учитывается в лимите действий потока и отдельно фиксируется в истории потока. Если речь идёт только о том, чтобы отфильтровать определённые элементы или переименовать поля, эта нагрузка возникает без реальной причины, ведь именно для этого существуют Операции с данными. Microsoft описывает это в собственном руководстве так: рассмотрите возможность использования операции фильтрации или выбора вместо условия внутри цикла, чтобы найти элементы таблицы, соответствующие определённым критериям — такой подход может упростить облачный поток и повысить производительность, как указано в официальном обзоре Операций с данными в Power Automate. Filter Array и Select при этом каждое выполняются как единое действие, независимо от того, содержит массив пять или пять тысяч записей.
Действие Filter Array: формирование подмножества без обхода массива
Действие Filter Array сокращает массив до объектов, соответствующих заданным критериям, согласно официальной документации по Операциям с данными. В разделе «Запрос фильтра» вы указываете, какое поле нужно сравнить с каким значением, например «Статус равен Открыт», и получаете в результате новый массив ровно с подходящими записями. Об этом стоит знать две вещи:
- Действие может уменьшить количество объектов, но не может изменить форму отдельных объектов. Для преобразования формы дополнительно нужен Select.
- Текст сравнения чувствителен к регистру, поэтому фильтр по значению открыт не найдёт объект со значением Открыт.
Для простых сравнений достаточно базового представления; для комбинированных условий с логикой И/ИЛИ переключитесь в расширенный режим и напишите выражение напрямую.
Действие Select: изменение структуры данных без цикла
В то время как Filter Array меняет количество объектов, Select меняет их форму. С помощью этого действия можно переименовывать поля, создавать новые поля из существующих или опускать ненужные поля — при этом количество объектов в массиве не меняется. Пример из документации Microsoft: из объектов с полями first и last с помощью Select получается массив с полями FirstName, FamilyName и дополнительным полем FullName, объединяющим оба значения. Результат снова представляет собой массив, который можно передать напрямую следующим действиям, например действию Create CSV table или действию SharePoint. По данным Microsoft, это снижает не только сложность потока, но и размер полезной нагрузки, когда данные впоследствии передаются в другую систему.
Практический пример: комбинирование Filter Array и Select
На практике эти два действия почти всегда идут одно за другим. Типичный процесс, который можно реализовать без единого действия Apply to Each:
1. Действие вроде Get Items или HTTP-запрос возвращает массив со всеми заказами.
2. Filter Array сокращает массив до заказов со статусом, равным Открыт.
3. Select преобразует оставшиеся объекты: сохраняются только номер заказа, имя клиента и сумма, с понятными именами полей для целевой системы.
4. Результат передаётся напрямую действию, которое обрабатывает сразу несколько записей, например Create CSV table или пакетному действию целевого коннектора.
Четыре действия вместо цикла с потенциально сотнями выполнений, плюс поток, который остаётся понятным с первого взгляда. Вы сохраняете контроль над каждым шагом обработки, потому что каждое действие отвечает только за одну чётко определённую задачу.
Где Apply to Each всё же остаётся правильным выбором
Filter Array и Select не заменяют цикл, если для каждого элемента нужен собственный побочный эффект, например если для каждого заказа отдельно нужно отправить письмо, создать запись в системе без пакетной конечной точки или вызвать вложенный поток. Даже если обработка одного элемента зависит от результата предыдущего, цикл часто остаётся более простым решением. Если вы работаете напрямую с Dataverse, есть даже третий вариант: вместо использования Filter Array и Select в потоке, по данным Microsoft, лучше сразу фильтровать и выбирать данные в источнике с помощью опций «Выбрать столбцы» и «Фильтровать строки» соответствующего действия, что с самого начала уменьшает объём передаваемых данных. Где именно проходит граница для вашей конкретной настройки, лучше всего оценивать по конкретному потоку, например в рамках консультации по Power Automate.
Часто задаваемые вопросы
Можно ли использовать Filter Array и Select в произвольном порядке?
Как правило, сначала фильтруют с помощью Filter Array, а затем преобразуют результат с помощью Select, потому что тогда Select обрабатывает меньше объектов. Технически порядок можно и поменять, но обычно вариант с фильтрацией в начале более наглядный и немного экономнее.
Учитываются ли Filter Array и Select в лимите действий Power Automate?
Да, каждое из этих двух действий учитывается один раз в лимите потока, как и любое другое действие. Отличие от Apply to Each в том, что они всегда выполняются как единое действие независимо от размера массива, тогда как цикл создаёт отдельные выполнения действия для каждого элемента.
Может ли Filter Array также изменить форму объектов в массиве?
Нет. Filter Array меняет только количество объектов в результирующем массиве, но не их структуру. Если поля нужно переименовать, добавить или удалить, за это отвечает действие Select.
Что происходит, если Filter Array не находит подходящего элемента?
В этом случае действие возвращает пустой массив, и поток продолжает работу без ошибки. Если вы хотите проверить, есть ли вообще результаты, объедините результат с функцией length() в последующем условии.
Стоит ли переходить с Apply to Each на Filter Array и Select даже для небольших массивов?
Для очень маленьких, стабильных массивов с небольшим количеством записей выигрыш в производительности невелик. В этом случае преимущество заключается скорее в наглядности и удобстве сопровождения потока, чем во времени выполнения, что, однако, окупается, как только массив в эксплуатации становится больше, чем изначально планировалось.
NordFlux UG (haftungsbeschränkt)
NordFlux создаёт цифровых сотрудников для организаций: автоматизации и КИ-агентов, которые берут на себя повторяющуюся работу. Вы сохраняете контроль.
Конкретные вопросы по автоматизации или КИ?
В рамках бесплатного первичного анализа мы напрямую обсудим Ваш случай. Без обязательств.