«Apply to each» в Power Automate: понять, контролировать и избежать цикла
«Auf alle anwenden» обрабатывает списки поэлементно и часто появляется непреднамеренно. Как работает цикл, почему он замедляет работу и когда его можно убрать.
Лимиты Apply to each и постраничная разбивка в Power Automate: как работает лимит в 100 000 итераций и как его обойти.
Когда поток в Power Automate внезапно завершается с непонятной ошибкой, как только список SharePoint, таблица Dataverse или диапазон Excel превышают определённый размер, почти всегда причина кроется в одном из встроенных ограничений циклов и постраничной разбивки. Самым известным из них является лимит в 100 000 для циклов Apply to each и постраничных элементов. В повседневной работе оно долго остаётся незаметным, потому что большинство списков намного меньше, а затем поражает именно те процессы, которые важнее всего: массовые импорты, закрытие годового периода или миграцию больших объёмов данных.
Эта статья объясняет, какие именно лимиты действуют для циклов и постраничной разбивки в Power Automate, как включить постраничную разбивку для действия и с помощью каких приёмов можно надёжно обрабатывать даже очень большие объёмы данных, не упираясь в лимит 100 000 итераций. Все сведения взяты из официальной документации Microsoft.
Microsoft документирует соответствующие значения в обзоре Лимиты для автоматизированных, запланированных и мгновенных потоков. Самые важные цифры для одного запуска потока:
Какой профиль производительности действует для твоего потока, зависит от лицензии его владельца. «Низкий» затрагивает, среди прочего, бесплатные планы, планы Microsoft 365, план Power Apps 1 и пробные лицензии, тогда как премиум-лицензии, лицензии на процессы и полётные лицензии попадают в профили «Средний» или «Высокий» и поэтому могут использовать полный лимит 100 000.
Когда цикл Apply to each достигает максимального числа итераций, поток завершается с ошибкой WorkflowRunActionRepetitionQuotaExceeded. Согласно справочнику кодов ошибок облачного потока наиболее частые причины таковы:
В качестве решения Microsoft рекомендует ограничивать данные уже в исходном действии с помощью OData-фильтров, таких как $filter и $top, вместо фильтрации только внутри цикла, распределять большие наборы данных по нескольким выполнениям потока с помощью токенов постраничной разбивки или диапазонов дат, а для чистых преобразований или фильтраций использовать действия Select или Filter array вместо полного цикла Apply to each.
Для многих действий с данными, например List rows в Dataverse, постраничную разбивку можно настроить прямо в параметрах действия. Документация по спискам строк в потоках описывает этот путь в новом конструкторе так:
1. Выбери соответствующую карточку действия, например List rows.
2. Открой в левой области вкладку Параметры, а затем Сеть.
3. Переведи переключатель Разбиение на страницы в положение Вкл.
4. Введи в поле Пороговое значение максимальное желаемое количество строк. Наибольшее настраиваемое пороговое значение составляет 100 000.
Внутри Power Automate округляет это значение до целых кратных размера страницы по умолчанию. Если, например, ввести 7000, а размер страницы составляет 5000, фактически будет возвращено 10 000 строк. Без включённой постраничной разбивки автоматически действует стандартный лимит в 5000 строк, и ответ больше не содержит параметр @odata.nextLink, как только пороговое значение превышено.
Для действия SharePoint Get items стандартный лимит составляет и вовсе всего 100 элементов, но его можно увеличить до 5000 с помощью расширенных параметров и параметра Top Count, прежде чем список упрётся в собственный порог представления SharePoint. Если объединить запрос с фильтром и список с более чем 5000 записей, может случиться так, что результаты вообще не вернутся, хотя подходящие записи существуют. И здесь включение постраничной разбивки в параметрах действия с достаточно высоким пороговым значением помогает, потому что Power Automate тогда извлекает данные пакетами согласно Top Count, вместо того чтобы проверять только первые 5000 неотфильтрованных строк.
Помимо самого числа итераций, существует ещё один, часто упускаемый из виду тормоз: лимит всплеска действий. Согласно рекомендациям по пониманию лимитов платформы текущий верхний предел составляет 100 000 действий на поток в пределах скользящего окна в пять минут. Каждое действие внутри цикла Apply to each учитывается отдельно, поэтому цикл с несколькими действиями за проход достигает этого лимита значительно быстрее, чем можно предположить, судя только по числу итераций. Microsoft рекомендует в таком случае распределять нагрузку между несколькими потоками, например с помощью дочерних потоков (Child Flows) или условий триггера, которые заранее предотвращают ненужные запуски.
Для процессов, которые предположительно приблизятся к лимиту 100 000, на практике оправдал себя чёткий подход:
$filter, $top или запроса с фильтром SharePoint, вместо того чтобы загружать весь список в цикл и проверять его только там.Такой подход позволяет тебе сохранять контроль над своим потоком данных, вместо того чтобы быть застигнутым врасплох внезапным сбоем именно в том процессе, который и так заслуживает наибольшего внимания.
Отдельный цифровой сотрудник в Power Automate обычно упирается в лимит 100 000 только тогда, когда компания действительно растёт, например при миграции большой устаревшей базы данных, при ежегодной отчётности по всем клиентским записям или при подключении ERP-системы с несколькими десятками тысяч позиций. Для таких случаев чистая архитектура из отфильтрованных исходных запросов, разумно рассчитанной постраничной разбивки и, при необходимости, нескольких последовательных выполнений потока окупается с самого начала гораздо больше, чем последующее латание отдельных ошибок. Тот, кто хочет с самого начала построить свои процессы Power Automate для больших объёмов данных надёжно, найдёт поддержку в консультациях NordFlux по Power Automate.
Power Automate обрабатывает не более 100 000 элементов за один запуск потока в одном цикле Apply to each или в одном постраничном действии. Для больших объёмов данных Microsoft рекомендует запускать несколько выполнений потока для этих данных, например с помощью токена пропуска, фильтра по дате или запланированного триггера, который разбивает обработку на несколько частей.
Нет. Лимит в 100 000 действует для профилей производительности «Средний» и «Высокий», к которым относятся, среди прочего, премиум-лицензии и лицензии на процессы. В профиле производительности «Низкий», который действует для бесплатных планов, планов Microsoft 365 и пробных лицензий, тот же лимит составляет уже 5000 элементов.
Лимит Apply to each относится к циклу, который проходит по массиву в рамках одного запуска потока. Лимит Split On, напротив, касается триггеров, которые поставляют массив и разбивают его напрямую на несколько отдельных экземпляров рабочего процесса с помощью свойства SplitOn, вместо использования цикла foreach. Если для такого триггера дополнительно включён параллелизм триггера, лимит Split On снижается до 100 элементов.
Поток завершается с ошибкой WorkflowRunActionRepetitionQuotaExceeded, как только цикл Apply to each превышает максимальное число итераций. В истории выполнения потока эту ошибку можно проследить напрямую до затронутого действия цикла, а через Аналитику на странице сведений о потоке ты дополнительно видишь, сколько действий в общей сложности потребил запуск.
Нет. Согласно документации Microsoft, максимальное настраиваемое пороговое значение для постраничной разбивки составляет 100 000, независимо от того, какое значение ты вводишь в поле параметров. Поскольку внутренне значение округляется до целых размеров страниц, фактически возвращённое число может быть немного больше введённого значения, но никогда не превышает верхний предел в 100 000.
Источники: Microsoft Learn — лимиты для автоматизированных, запланированных и мгновенных потоков, Microsoft Learn — понимание лимитов платформы и предотвращение ограничения скорости, Microsoft Learn — использование списков строк в потоках
Основатель NordFlux. Семь лет опыта, от веба и SEO до автоматизации в масштабах концерна, сегодня прагматично для среднего бизнеса и с немецким суверенитетом данных.
Сертификаты
«Auf alle anwenden» обрабатывает списки поэлементно и часто появляется непреднамеренно. Как работает цикл, почему он замедляет работу и когда его можно убрать.
Filter Array и Select заменяют Apply to Each при фильтрации и преобразовании массивов и работают заметно быстрее.
Таблица Excel, «Применить к каждому», Outlook: как Power Automate отправляет персональное письмо на каждую строку твоего списка.
Лимит всплеска действий и лимит в 100 000 итераций особенно сильно и часто неожиданно бьют по процессам с растущими объёмами данных. NordFlux выстраивает ваши массовые процессы с пагинацией и корректной обработкой ошибок так, чтобы они оставались стабильными даже при росте объёма.