Řešení problémů
Nejčastější chyby při nasazení a provozu a jak je diagnostikovat.
Ladicí režim a konzole
Ladicí režim vypisuje do konzole prohlížeče (F12, záložka Console), proč se pravidla chovají tak, jak se chovají. Neslouží jen návrhářům: správce z něj pozná, zda se skript spustil, zda pravidlo přeskočila neplatná pole a co změnilo pole na „neuložené“.
Zapnutí
| Způsob | Platnost |
|---|---|
Parametr v adrese stránky ?fcdebug=1 (přijímá také true, yes, on) | Jen pro toto načtení stránky. Nic se neukládá. |
V konzoli localStorage.setItem('fc.debug', '1') a obnovení stránky | Trvale v tomto prohlížeči, dokud klíč neodstraníte. |
Nastavení formuláře, přepínač „Ladicí režim (debug) pravidel a skriptů“ (debugMode) | Pro všechny uživatele formuláře, uloží se do konfigurace. Viz Ladicí režim. |
Režim se vyhodnotí při otevření formuláře. Při vypnutí se nic nevypisuje ani nealokuje. Výpisy mají předponu [FC debug].
Co se loguje
- Průchod pravidel (sbalená skupina
rules …s důvodem, režimem formuláře a počtem splněných pravidel). Uvnitř je pro každé pravidloMATCH/no matchs tabulkou podmínek (pole, operátor, očekávaná a skutečná hodnota, výsledek) a tabulkou provedených akcí. Přeskočená pravidla mají řádekSKIPPEDs důvodem: vypnuté (disabled), neplatné (invalidReason), nesedící spouštěč (trigger) nebo žádné podmínky. - Životní cyklus (
lifecycle onLoadaonSave): změny polí, volané skripty, chyby blokující uložení. - Vynucené hodnoty (
forcedValue): změna pole z pravidla, případněBLOCKED by loop guard, když pravidla pole přepisují ve smyčce (ochrana po 10 aplikacích za sekundu). - Skripty (
script <zdroj> - ok / ERROR, doba běhu, výsledek, zprávy, chyba) ascript skipped: tenant policy disabledpři vypnuté politice skriptů. - Výrazy:
expression parse error(výraz se použil jako textová šablona) aexpression non-finite result(dělení nulou nebo NaN, cílové pole se vymaže). - Změny „dirty“ stavu (
dirtyFields changed): tabulka polí, která se stala neuloženými, a zdroj změny (script:onFormLoad,rule:forcedValue, uživatel/widget…). Hodí se k odhalení formuláře, který hlásí neuložené změny hned po otevření.
Čítač renderů
V ladicím režimu je k dispozici objekt window.__fcRenderCounts: počet vykreslení jednotlivých komponent (podle názvu pole). Zadejte ho do konzole a sledujte, zda jedno pole nepřekresluje celý formulář. Při normálním provozu nic nezabírá.
// po zapnutí režimu a otevření formuláře
console.table(window.__fcRenderCounts)
Formulář se nezobrazí
- Je formulář aktivní? Spusťte
Manage-FormCustomizer.ps1 -Action Statusnebo otevřete dialog „Vlastní formulář“ (pokud je formulář již aktivní, tlačítko na liště nese název „Otevřít editor FormCraft 365“ a stav aktivace najdete v návrháři pod „Aktivace na seznamech“). Viz Aktivace. Stav „JINÁ KOMPONENTA“ znamená, že seznam používá jiný formulář. - Je balíček nasazený a povolený? V App Catalogu zkontrolujte, že je sloupec „Enabled“ a „Deployed“ nastavený a že u tenantového nasazení byla zvolena volba pro všechny weby.
- Aktualizace se neprojevila: po nahrání nové verze obnovte stránku s vyprázdněním cache (Ctrl+F5). Nová verze musí mít vyšší číslo (viz Aktualizace).
- Formulář se otevře s výchozím rozložením: konfigurace se nenačetla. Viz Stavy načtení konfigurace.
- Otevřete konzoli a hledejte chybu s předponou
[CustomFormCustomizer]nebo hlášku „Chyba při inicializaci formuláře“.
Stavy načtení konfigurace
Při otevření formuláře se konfigurace čte ze souborů config.json a backup.json seznamu a vyhodnotí se jedním ze čtyř stavů.
| Stav | Význam | Chování |
|---|---|---|
ok | Platná konfigurace nalezena (případně se zmigrovala ze starší verze schématu). | Formulář běží podle konfigurace. |
notFound | Soubor neexistuje (HTTP 404). Formulář ještě nikdo neuložil. | Použije se výchozí rozložení ze sloupců seznamu. Ukládat lze normálně. |
invalid | Soubor existuje, ale je to rozbitý JSON nebo neodpovídá schématu (a neexistuje novější platná kopie). | Formulář běží s výchozím rozložením, nic se nepřepíše, ukládání je zablokováno. Správce vidí pruh „Opravit konfiguraci“ (viz Raw JSON). |
unreadable | Čtení selhalo z jiného důvodu než 404 (403, 429, 5xx, síť). | Výchozí rozložení, ukládání zablokováno („Uloženou konfiguraci se nepodařilo přečíst“). Běžný uživatel vidí „Formulář se nepodařilo načíst v plném rozsahu. Kontaktujte vlastníka webu.“ Obnovte stránku, ověřte oprávnění ke čtení složky FormCustomizer (viz Oprávnění). |
Stav ok může mít i příznak „novější verze“, viz níže.
Neplatná konfigurace a panel Raw JSON
Je-li uložená konfigurace neplatná, nikdy se tiše nepřepíše výchozím stavem. Správce formuláře dostane upozornění a tlačítko Opravit konfiguraci, které otevře návrháře s panelem Uložená konfigurace je neplatná.
- V panelu si přečtěte Nalezené problémy (cesta a důvod podle schématu, nebo chyba syntaxe JSON).
- Upravte JSON v poli Uložená konfigurace (Raw JSON). Typicky doplníte chybějící povinnou vlastnost nebo opravíte překlep v názvu typu pole.
- Klikněte na Ověřit a použít JSON. Platná konfigurace se načte do návrháře a odemkne se ukládání.
- Změny uložte běžným tlačítkem uložení.
Neznámé klíče z uloženého JSON zůstanou při opravě zachované. Nemůžete-li chybu opravit, použijte soubor z historie nebo „Obnovit ze zálohy“ v menu návrháře (poslední platná záloha backup.json).
Historie konfigurace
Před každým přepsáním se dosavadní konfigurace zkopíruje do složky SiteAssets/FormCustomizer/<listId>/history/ jako soubor <listId>.<časová značka>.json. Uchovává se posledních 10 verzí. Zápis historie má časový limit 5 sekund a jeho selhání uložení neblokuje. Při prvním zamčení úložiště se historie z doby před zámkem smaže (nedůvěryhodný obsah).
Návrhář zatím nemá tlačítko pro obnovu z historie. Postup:
- Otevřete knihovnu Site Assets, složku
FormCustomizer/<listId>/history(ID seznamu zjistíte v adrese nastavení seznamu nebo příkazemGet-PnPList). - Stáhněte požadovanou verzi a otevřete ji v textovém editoru.
- V návrháři otevřete panel Raw JSON, vložte obsah a klikněte na Použít JSON, nebo použijte import konfigurace.
- Uložte formulář.
Poslední záloha (jedna verze) je navíc dostupná v menu návrháře jako Obnovit ze zálohy.
Konfigurace z novější verze produktu
Každá uložená konfigurace nese schemaVersion. Pokud je vyšší než verze, kterou balíček podporuje (například jste nahráli starší .sppkg), formulář se zobrazí „podle nejlepší možnosti“, ale ukládání je zablokováno, aby nedošlo ke ztrátě dat. Návrhář ukáže „Konfigurace pochází z novější verze produktu“ s verzemi schématu. Řešení: aktualizujte balíček na novější verzi (viz Aktualizace). Konfiguraci starší verzí nepřepisujte.
Konfigurace se neukládá nebo se ztrácí
HTTP 403 při ukládání
Hláška „Nemáte oprávnění k provedení této operace v SharePointu (HTTP 403)“ znamená, že uživatel nemá zápis do složky konfigurace. Nejčastější příčiny:
- Úložiště je zamčené a uživatel není vlastník webu ani člen skupiny návrhářů (a podsložka seznamu pro ni existuje). Přidejte ho do skupiny návrhářů a nechte vlastníka formulář znovu uložit (viz Skupina návrhářů).
- Návrhář ukládá do seznamu, jehož složku ještě nikdo nezaložil: „Složka konfigurace tohoto seznamu ještě neexistuje. Vlastník webu musí formulář nejdřív uložit.“
- Ukládáte licenci do zamčené složky jako člen: „Licenci do zamčené složky FormCustomizer mohou uložit jen vlastníci webu.“
- Uložení do tenantové Storage Entity (licence, politika skriptů) vyžaduje správce tenantového App Catalogu.
Úložiště není zamčené
Varování „Úložiště konfigurace není zamčené: kdokoli s oprávněním Správa seznamů ji může přepsat“ se zobrazuje vlastníkovi po uložení, pokud se zámek nepodařil nebo ho nikdo nenastavil. Řešení: uložte formulář (nebo klikněte na Zamknout nyní) jako vlastník webu s oprávněním Správa oprávnění, případně spusťte příkaz z PowerShellu. Varianty hlášek:
- Zamčení úložiště selhalo (…): zkuste to znovu jako vlastník nebo spusťte PowerShell.
- Návrat původních oprávnění se nepodařil: složka může mít omezený přístup, spusťte opravu v PowerShellu.
- Čtení se nepodařilo nastavit pro: …: zámek je platný, ale princip pro organizaci nebo hosty se nepodařilo vyřešit (např. omezení tenantu). Vypněte příslušný přepínač.
- Skupina návrhářů … neexistuje / je skupina Členové nebo Návštěvníci / obsahuje Everyone: opravte název skupiny (viz Odmítnuté skupiny).
Chyba HTTP 400 u cest k souborům
Hláška „Specified value is not supported for the serverRelativePath parameter“ (HTTP 400) znamená, že se do SharePointu poslala cesta relativní k webu. Funkce pro soubory a složky vyžadují cestu od kořene serveru (/sites/<site>/SiteAssets/…). V produktu se cesty skládají správně. Narazíte na to hlavně u vlastních skriptů, dotazů nebo ručních úprav kódu: použijte toServerRelativePath.
Konflikt uložení (412)
Při uložení položky se kontroluje ETag: pokud ji mezitím upravil jiný uživatel, SharePoint vrátí HTTP 412 a formulář zobrazí dialog Položka byla změněna jinde s informací, kdo a kdy ji změnil. Uživatel zvolí:
- Načíst znovu: zahodí své změny a načte aktuální verzi,
- Přesto přepsat: uloží své hodnoty přes cizí změny,
- Zrušit: vrátí se do formuláře.
Není to chyba nasazení. Pokud konfliktů vidíte neobvykle mnoho, hledejte workflow nebo automatizaci, která položku mění krátce po otevření formuláře. Hláška „Položka byla mezitím upravena jiným uživatelem. Obnovte prosím stránku (HTTP 412)“ se objeví u operací, které dialog nenabízejí. Chování popisuje Práce s formulářem. Konfigurace formuláře konflikt 412 nehlásí (ukládá se podle savedAt, ne podle ETagu).
Nenačtená pole
Hodnoty položky se načítají po dávkách ($select / $expand). Pokud některá dávka selže (oprávnění ke zdrojovému seznamu, chyba SharePointu), formulář se přesto otevře a pole z neúspěšné dávky zobrazí jako jen pro čtení s pruhem „Pole se nepodařilo načíst a jsou jen ke čtení (neuloží se): …“. Při uložení se nezapíší, takže nedojde k přepsání dat prázdnou hodnotou. Řešení: formulář načtěte znovu, ověřte uživateli čtení zdrojových seznamů (lookup, taxonomie, uživatelé).
Neindexovaný sloupec
U seznamů s více než 5 000 položkami SharePoint odmítne dotaz filtrující neindexovaný sloupec (limit zobrazení seznamu). Widgety Související položky a Související dokumenty proto takový dotaz nespustí a ukážou „Sloupec „…“ není indexovaný. U seznamů s více než 5 000 položkami musí být indexovaný.“ Řešení:
- Ve zdrojovém seznamu nastavte index na sloupci cizího klíče (Nastavení seznamu, Indexované sloupce), nebo
- v návrháři ve zdroji widgetu klikněte na Zaindexovat sloupec (vyžaduje oprávnění ke správě seznamu).
Vyhledávání v lookup polích nad 500 položek se automaticky přepne na dotaz po zadání alespoň dvou znaků (zobrazí se nápověda „Začněte psát pro vyhledání…“), takže se tam indexace řešit nemusí.
Skripty nefungují
- Jsou skripty povolené? Výchozí stav je vypnuto. Správci formuláře uvidí pruh „Vlastní skripty jsou na tomto tenantu vypnuté…“. Povolení viz Politika skriptů. Změna se projeví do 15 minut.
- V ladicím režimu hledejte
script skipped: tenant policy disabled(politika) neboscript … ERROR(chyba v kódu). - Hláška o CSP /
unsafe-evalznamená, že prostředí dynamické spouštění zakazuje, viz CSP. - Při vypnutých skriptech se neprovádí
onBeforeSavea uložení se neblokuje. Použijte pravidla s akcíblockSave.
Licence nebyla rozpoznána
Návrhář zobrazuje Community Free, přestože máte klíč:
- Otevřete dialog Licence a vložte klíč znovu. Dialog ho ověří a řekne důvod (jiný tenant, jiná site collection, vypršel, neplatný podpis…). Tabulka hlášek je v Licence.
- Ověřte, že je klíč uložený tam, kde se čte: tenantová Storage Entity, nebo
SiteAssets/FormCustomizer/license.txtv kořenovém webu site collection. - Změna provedená mimo návrhář (PowerShell, ruční soubor) se může projevit až za hodinu (cache surového klíče). Okamžitě po vymazání klíčů
_fc_lic_*vlocalStorage. - Klíč pro vybrané site collection neplatí v ostatních. Pošlete dodavateli ID site collection z dialogu.
Na liště seznamu chybí tlačítko „Vlastní formulář“
Postupujte od prvního kroku. Nejčastější příčiny odhalí první kroky:
- Podívejte se do menu … na pravém konci příkazové lišty. Pokud je lišta přeplněná, SharePoint vlastní příkazy přesune právě sem. Rozšíření to ovlivnit nemůže.
- Synchronizace Microsoft Lists. Příznak: první načtení po „Clear site data“ tlačítko zobrazí, další obnovení (F5) už ne; jiné seznamy, které synchronizace nezpracovává, fungují. Příčinou je místní synchronizační klient OneDrivu (Microsoft Nucleus), který při obsluze stránky přes service worker vrací data seznamu lokálně. Jeho odpověď má
"ShouldLoadSPFramework": falsea vlastní akce bez rozšíření SPFx, takže SharePoint balíček rozšíření jen předběžně načte („preloaded but not used“) aonInitpříkazové sady se nikdy nezavolá. Naším kódem to ovlivnit nelze, SPFx se vůbec nespustí. Zjištění: F12, karta Network, požadavekRenderListDataAsStreammíří nalocalhost:42050(případně má hlavičkuserver: MicrosoftNucleus). Doporučené trvalé řešení: v nastavení seznamu (Upřesnit nastavení, Dostupnost offline klienta) zvolte Ne, nebo při aktivaci formuláře ponechte zaškrtnutou volbu Vypnout offline dostupnost seznamu (nastaví vlastnost seznamuExcludeFromOfflineClient; seznam pak nebude dostupný offline). Návrhář na to upozorní v záložce Akce seznamu. Alternativa na úrovni tenantu nebo zařízení: zásadaDisableListSync. Další možnosti: seznam otevřít způsobem, který synchronizace Lists neobsluhuje, případně dočasně vyčistit data webu; trvale může tenant nebo uživatel synchronizaci Microsoft Lists vypnout (možnosti zjistěte v dokumentaci Microsoftu; parametrSet-SPOTenant -DisableListSyncověřte v dokumentaci Microsoftu). - V seznamu Tenant Wide Extensions nesmí mít žádný záznam komponent Form Customizeru Disabled = Yes. Zakázaný záznam SharePoint vůbec nedoručí, takže příslušný příkaz (např.
FormActivatorCommandSet-100pro lištu) se nespustí. - Tlačítko vidí jen uživatelé s oprávněním
ManageWebna seznamu (vlastníci webu, plný přístup). Výsledek kontroly se ukládá dosessionStoragepro každou kartu zvlášť, proto seznam otevřete v nové kartě, případně po změně oprávnění. - Zkuste seznam otevřít v anonymním okně. Pokud se tam tlačítko zobrazí, drží běžné okno zastaralá data webu (typicky po opravě záznamů Tenant Wide Extensions): F12, karta Application, Storage, Clear site data, poté Ctrl+F5.
- Příkaz je dostupný na seznamech se šablonou 100, 120 a 1100. Knihovny dokumentů (šablona 101) příkaz nemají.
- V App Catalogu zkontrolujte seznam Tenant Wide Extensions. Musí obsahovat 6 záznamů pro šablony 100, 120 a 1100: 3 záznamy lišty s Component Id
4a8b7c12-5d3e-4f9a-8b1c-6e2d9f4a3b5ca 3 záznamy kontextového menu s Component Ida9998067-8e06-423f-b8a0-3177988f3a42(od verze 1.28.1). Staré záznamy kontextového menu (FormActivatorCommandSet-ContextMenu-*) smažte, vytvářejí duplicitní registrace. Chybějící doplňte a zastaralé smažte, postup je v instalaci. - Ověřte, že se balíček načetl. V konzoli prohlížeče (F12) spusťte
performance.getEntriesByType("resource").some(e => e.name.includes("form-activator")). Hodnotatrueznamená, že se rozšíření načetlo. Po navigaci mezi seznamy v aplikaci může hodnota patřit předchozímu seznamu, proto kontrolujte v nové kartě s otevřeným seznamem. - Změny se na webech projeví zhruba do 20 minut. Poté obnovte stránku klávesami Ctrl+F5.
- Zapněte diagnostiku rozšíření. V konzoli prohlížeče (F12) na stránce seznamu spusťte
localStorage.setItem("fc.debug","1")a obnovte stránku. Výpis se objeví jako varování konzole (console.warn) s předponou[FormCraft]. SharePoint během načítání konzoli maže, proto v nastavení konzole DevTools zapněte Preserve log. Řádky začínající[FormCraft]uvádějí, která komponenta běží (FormActivatorCommandSet = lišta, FormListActionsContextMenu = kontextové menu), její vlastnosti registrace, ID a šablonu seznamu, vstupy kontroly oprávnění a výslednou viditelnost hlavního příkazu, počet načtených akcí seznamu, rozhodnutí o viditelnosti jednotlivých slotů a každé překreslení lišty. Pokud není vidět žádný řádek[FormCraft], komponenta se nespustila (viz synchronizace Microsoft Lists a kontrola registrací výše). Diagnostiku vypnete příkazemlocalStorage.removeItem("fc.debug").
Šum v konzoli
Některé zprávy v konzoli nejsou chyba:
- Požadavky s HTTP 404 na
config.json,backup.json,license.txt,historynebo na Storage Entity: soubor ještě neexistuje (formulář ještě nikdo neuložil, klíč není nastaven). Je to očekávané a funkčnost to neovlivní. [ConfigService] …varování: pomocné operace, které mohou selhat bez dopadu na uložení (kopie do historie, úklid historie, ověření členů skupiny návrhářů).- Hlášky z vlastního kódu SharePointu a ostatních částí stránky (SPFx host, webparty, telemetrie) nesouvisejí s tímto produktem.
Skutečný problém poznáte podle hlášky v rozhraní (červený nebo žlutý pruh) nebo podle chyby s předponou [CustomFormCustomizer], [FormActivatorCommandSet] či [FC debug] (jen v ladicím režimu).
Co poslat podpoře
Připravte tyto údaje (bez osobních dat):
- Verzi balíčku (
solution.versionz App Catalogu) a verzi dokumentace. - URL webu a ID seznamu, režim formuláře (nový, úprava, zobrazení) a kroky k reprodukci.
- Výstup
Manage-FormCustomizer.ps1 -Action Status. - Konzoli prohlížeče z načtení se zapnutým
?fcdebug=1(uložit jako text; ověřte, že neobsahuje data z formuláře). - Záložku Network s neúspěšnými požadavky (stav, URL, text odpovědi).
- Konfiguraci formuláře: export z návrháře (tlačítko Exportovat), případně
config.jsonze složky seznamu. - Stav úložiště konfigurace (zamčeno, nezamčeno, skupina návrhářů) a zda je zapnutá politika skriptů.
- U licence: ID tenantu a ID site collection z dialogu a přesnou hlášku (klíč samotný nezasílejte nezabezpečeným kanálem).