Widziałeś to ogromne ostrzeżenie, gdy próbujesz dodać nowo utworzony przepływ Power Automate jako child flow, o treści: „The workflow with id <ID>, name <NAME> cannot be used as a child workflow because child workflows only support embedded connections.”? Wygląda strasznie! Co to znaczy? Jak to naprawić? Zaraz pokażę!

Child flows

Przepływy potomne (child flows) zostały wprowadzone do Power Automate na koniec października 2019 r. (https://docs.microsoft.com/en-us/power-platform-release-plan/2019wave2/power-automate/call-child-flows). Szybko zyskały pozytywne opinie, ponieważ umożliwiają łatwe budowanie wielu wzorców w Power Automate, takich jak maszyny stanu lub trwające ponad 30 dni approvale.

Innym, wysoce pożądanym scenariuszem, który można stworzyć za pomocą child flows, jest podniesienie uprawnień, jak to opisałem tutaj: https://poszytek.eu/microsoft/office-365/powerautomate/podwyzszone-uprawnienia-w-microsoft-flow/.

Aby stworzyć taki flow, wystarczy zbudować przepływ uruchamiany przez ręczne działanie, a następnie zakończyć akcją „Respond to a PowerApp or flow”:

Ważne! By móc dodać flow jako Child Flow, zarówno przepływ nadrzędny, jak i potomny muszą znajdować się w Solucji.

Błąd

Kiedy tworzysz przepływ, który chcesz wykorzystać jako przepływ podrzędny i użyjesz w nim akcji korzystających z połączeń (np. SharePoint lub Outlook), to przy próbie dodania tego przepływu zobaczysz następujący, długi i bardzo straszny błąd:

Request to XRM API failed with error: 'Message: Flow client error returned with status code "BadRequest" and details "{"error":{"code":"ChildFlowUnsupportedForInvokerConnections","message":"The workflow with id '<ID>', name <FLOW NAME> cannot be used as a child workflow because child workflows only support embedded connections."}}". Code: 0x80060467 InnerError: Type: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] Message: Flow client error returned with status code "BadRequest" and details "{"error":{"code":"ChildFlowUnsupportedForInvokerConnections","message":"The workflow with id '<ID>', name <FLOW NAME> cannot be used as a child workflow because child workflows only support embedded connections."}}". StackTrace: at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Update(Entity entity, InvocationContext invocationContext, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode, Boolean checkForOptimisticConcurrency, Dictionary`2 optionalParameters) at Microsoft.Crm.Extensibility.OData.CrmODataExecutionContext.Update(Entity entity, UpdateOption updateOption) at Microsoft.Crm.Extensibility.OData.CrmODataServiceDataProvider.UpdateEdmEntity(CrmODataExecutionContext context, String edmEntityName, String entityKeyValue, EdmEntityObject entityObject) at Microsoft.Crm.Extensibility.OData.EntityController.PatchEntityImplementation(String& entityName, String key, EdmEntityObject entityDelta) at Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute[TResult](ILogger logger, EventId eventId, ActivityType activityType, Func`1 func, IEnumerable`1 additionalCustomProperties) at Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute[TResult](ILogger logger, XrmTelemetryActivityType activityType, Func`1 func) at lambda_method(Closure , Object , Object[] ) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext() InternalException: '.

Powód? Prosty – połączenia, których używasz i które są zdefiniowane w przepływie potomnym, są osadzone (embedded). Co to znaczy? Oznacza to, że podczas wywoływania tego przepływu nadal będzie próbował uzyskać kontekst użytkownika do wykonania połączeń, a nie korzystać z połączeń zdefiniowanych przez autora przepływu. Toteż przepływu nie można dodać jako przepływu potomnego, ponieważ w takim scenariuszu kontekst użytkownika zostaje utracony, a przepływ oczekuje, że ten będzie istnieć. Połączenia osadzone domyślnie mogą być wykonywane tylko przez właścicieli przepływów. Musisz więc określić, kto może z nich korzystać.

Rozwiązanie

Przejdź do ekranu szczegółów przepływu, któych chcesz użyć jako przepływ potomny. Klknij link „Edit” w obszarze „Run only users”:

Każde połączenie zdefiniowane w przepływie jest domyślnie ustawione na uruchamianie przez bieżącego użytkownika (1). Aby rozwiązać problem, zmień to, aby używane było jedno ze zdefiniowanych połączeń. Dzięki temu kontekst użytkownika nie będzie wymagany (2):

Gdy to zrobisz, wróć do przepływu nadrzędnego i spróbuj zapisać go ponownie. Problem został rozwiązany!

Mam nadzieję, że ten krótki post Ci pomoże. W razie jakichkolwiek pytań zostaw komentarz lub skontaktuj się ze mną za pomocą formularza.