{"id":9689,"date":"2025-09-02T15:43:20","date_gmt":"2025-09-02T13:43:20","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/?post_type=ht_kb&#038;p=9689"},"modified":"2025-09-02T15:43:20","modified_gmt":"2025-09-02T13:43:20","slug":"podrecznik-referencyjny-aplikacje-w-tle","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/","title":{"rendered":"Podr\u0119cznik referencyjny: Aplikacje w tle"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Spis tre\u015bci<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Prze\u0142\u0105cznik Spisu Tre\u015bci\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Grupa_docelowa\" >Grupa docelowa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Definicje_terminow\" >Definicje termin\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Wymagania\" >Wymagania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Rozwoj\" >Rozw\u00f3j<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Proste_aplikacje_dzialajace_w_tle\" >Proste aplikacje dzia\u0142aj\u0105ce w tle<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Obiekt_deweloperski_Aplikacja\" >Obiekt deweloperski Aplikacja<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Typ_aplikacji\" >Typ aplikacji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Szczegolne_zastosowanie\" >Szczeg\u00f3lne zastosowanie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Ustawienia_prezentacji_i_utrzymania\" >Ustawienia prezentacji i utrzymania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Tryb_uprawnien\" >Tryb uprawnie\u0144<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Obszar\" >Obszar<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Glowna_jednostka_biznesowa\" >G\u0142\u00f3wna jednostka biznesowa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Funkcja\" >Funkcja<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Wymagane_aktywne_bazy_danych\" >Wymagane aktywne bazy danych<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Obiekt_deweloperski_Klasa_Java\" >Obiekt deweloperski Klasa Java<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Komunikaty_w_aplikacjach_dzialajacych_w_tle\" >Komunikaty w aplikacjach dzia\u0142aj\u0105cych w tle<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Wartosci_zwracane_przez_aplikacje_dzialajaca_w_tle\" >Warto\u015bci zwracane przez aplikacj\u0119 dzia\u0142aj\u0105c\u0105 w tle<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Uruchamianie_aplikacji_dzialajacej_w_tle\" >Uruchamianie aplikacji dzia\u0142aj\u0105cej w tle<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Aplikacja_Zlecenia_przetwarzania\" >Aplikacja Zlecenia przetwarzania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#JobSubmitDialog\" >JobSubmitDialog<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#CisBatchService\" >CisBatchService<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Parametryzacja_aplikacji_dzialajacych_w_tle\" >Parametryzacja aplikacji dzia\u0142aj\u0105cych w tle<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Aplikacje_dzialajace_w_tle_z_automatycznym_edytorem\" >Aplikacje dzia\u0142aj\u0105ce w tle z automatycznym edytorem<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Aplikacje_dzialajace_w_tle_z_edytorem\" >Aplikacje dzia\u0142aj\u0105ce w tle z edytorem<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Edytor_przetwarzania_w_tle\" >Edytor przetwarzania w tle<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Aplikacje_z_kodem_aktywacyjnym\" >Aplikacje z kodem aktywacyjnym<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Aplikacje_z_mozliwoscia_ponownego_uruchomienia\" >Aplikacje z mo\u017cliwo\u015bci\u0105 ponownego uruchomienia<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Dane_statusowe\" >Dane statusowe<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Zlecenia_podrzedne_SubJobs\" >Zlecenia podrz\u0119dne (SubJobs)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/podrecznik-referencyjny-aplikacje-w-tle\/#Pseudozlecenia_przetwarzania\" >Pseudozlecenia przetwarzania<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<p>W systemie Comarch ERP Enterprise wiele zada\u0144 nie jest przetwarzanych interaktywnie, lecz w kolejkach przetwarzania w tle. Pozwala to u\u017cytkownikowi na kontynuowanie pracy w trybie dialogowym, podczas gdy d\u0142ugotrwa\u0142e kroki przetwarzania s\u0105 kontynuowane w tle. Ponadto, umo\u017cliwia to automatyczne wykonywanie stale powtarzaj\u0105cych si\u0119 lub wyzwalanych przez aktywno\u015b\u0107 krok\u00f3w przetwarzania.<\/p>\n<p>Niniejszy artyku\u0142 opisuje spos\u00f3b tworzenia aplikacji dzia\u0142aj\u0105cej w tle oraz jej wywo\u0142ywanie w r\u00f3\u017cnych kontekstach.<\/p>\n<h3 id=\"grupa-docelowa\" ><span class=\"ez-toc-section\" id=\"Grupa_docelowa\"><\/span>Grupa docelowa<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Programi\u015bci<\/li>\n<li>Konsultanci techniczni<\/li>\n<\/ul>\n<h3 id=\"definicje-terminow\" ><span class=\"ez-toc-section\" id=\"Definicje_terminow\"><\/span>Definicje termin\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><strong>Aplikacja dzia\u0142aj\u0105ca w tle<\/strong> &#8212; aplikacja, kt\u00f3ra jest wykonywana w ramach zlecenia przetwarzania w kolejce przetwarzania<\/li>\n<li><strong>Zlecenie przetwarzania<\/strong> &#8212; zlecenia przetwarzania s\u0105 wprowadzane przez u\u017cytkownika lub generowane programowo. Obejmuj\u0105 one zestaw parametr\u00f3w, kt\u00f3re okre\u015blaj\u0105, kiedy, jak cz\u0119sto i w kt\u00f3rej kolejce przetwarzania dana aplikacja dzia\u0142aj\u0105ca w tle ma zosta\u0107 wykonana i z jakimi parametrami startowymi. Przechodz\u0105 one przez sekwencj\u0119 stan\u00f3w (status\u00f3w), kt\u00f3re obejmuj\u0105 w szczeg\u00f3lno\u015bci <em>W opracowaniu, Zwolnione, Zako\u0144czone<\/em> lub <em>Przerwane<\/em>. Opr\u00f3cz statusu, do zlece\u0144 przetwarzania mog\u0105 by\u0107 przypisane komunikaty.<\/li>\n<li><strong>Kolejka przetwarzania<\/strong> &#8212; kolejki przetwarzania s\u0105 wprowadzane w panelu systemowym. Opisuj\u0105 one zasoby (liczb\u0119 po\u0142\u0105cze\u0144, w\u0105tk\u00f3w, kt\u00f3re serwery aplikacyjne itp.), kt\u00f3re s\u0105 udost\u0119pniane do realizacji zlece\u0144 przetwarzania.<\/li>\n<li><strong>Aplikacja reorganizacyjne<\/strong> &#8212; aplikacje reorganizacyjne to aplikacje dzia\u0142aj\u0105ce w tle, kt\u00f3re przeprowadzaj\u0105 powtarzaj\u0105ce si\u0119 operacje utrzymania danych. Przyk\u0142adami s\u0105 usuwanie przestarza\u0142ych komunikat\u00f3w lub fizyczne usuwanie rekord\u00f3w danych oznaczonych do usuni\u0119cia, kt\u00f3re nie s\u0105 ju\u017c referencjonowane.<\/li>\n<li><strong>Pseudozlecenie przetwarzania<\/strong> &#8212; pseudozlecenia przetwarzania to zlecenia, kt\u00f3re s\u0105 uruchamiane w specjalnym trybie. Nie s\u0105 one wykonywane ani w kolejce przetwarzania, ani w \u017caden inny spos\u00f3b. Posiadaj\u0105 jedynie status, a tak\u017ce mo\u017cna im przypisa\u0107 komunikaty. S\u0105 one generowane programistycznie, a ich cykl \u017cycia podlega w pe\u0142ni jawnej, programistycznej kontroli. Z punktu widzenia u\u017cytkownika wydaj\u0105 si\u0119 one by\u0107 podrz\u0119dnymi zleceniami przetwarzania (<em>SubJobs<\/em>).<\/li>\n<\/ul>\n<h3 id=\"wymagania\" ><span class=\"ez-toc-section\" id=\"Wymagania\"><\/span>Wymagania<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Zlecenia przetwarzania mog\u0105 by\u0107 wprowadzane interaktywnie lub programistycznie.<\/p>\n<p>Po zatwierdzeniu zlecenia przetwarzania, zostaje ono umieszczone w przypisanej kolejce przetwarzania.<\/p>\n<p>W zale\u017cno\u015bci od obci\u0105\u017cenia kolejki, w pewnym momencie zlecenie przetwarzania jest wykonywane poprzez uruchomienie przypisanej aplikacji dzia\u0142aj\u0105cej w tle. Dzieje si\u0119 to niezale\u017cnie od sesji u\u017cytkownika, w oddzielnej sesji, kt\u00f3ra mo\u017ce by\u0107 r\u00f3wnie\u017c przypisana do innego u\u017cytkownika.<\/p>\n<p>Gdy aplikacja dzia\u0142aj\u0105ca w tle zako\u0144czy dzia\u0142anie, informuje kolejk\u0119 za pomoc\u0105 warto\u015bci zwracanej return value, czy zlecenie przetwarzania zosta\u0142o uznane za zako\u0144czone, czy przerwane. Je\u015bli w aplikacji dzia\u0142aj\u0105cej w tle wyst\u0105pi nieobs\u0142ugiwany wyj\u0105tek, zlecenie przetwarzania zostaje uznane za przerwane.<\/p>\n<h3 id=\"rozwoj\" ><span class=\"ez-toc-section\" id=\"Rozwoj\"><\/span>Rozw\u00f3j<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Dla aplikacji dzia\u0142aj\u0105cej w tle wymagane s\u0105 co najmniej dwa obiekty deweloperskie: obiekt deweloperski typu<em> Aplikacja<\/em> oraz <em>klasa Java<\/em>. W zale\u017cno\u015bci od z\u0142o\u017cono\u015bci i przypadku u\u017cycia, mo\u017cna doda\u0107 szereg innych obiekt\u00f3w deweloperskich. W tym dokumencie najpierw przedstawiono przypadek bardzo prostej aplikacji dzia\u0142aj\u0105cej w tle, a nast\u0119pnie om\u00f3wiono bardziej szczeg\u00f3\u0142owe i z\u0142o\u017cone przypadki u\u017cycia.<\/p>\n<h4 id=\"proste-aplikacje-dzialajace-w-tle\" ><span class=\"ez-toc-section\" id=\"Proste_aplikacje_dzialajace_w_tle\"><\/span>Proste aplikacje dzia\u0142aj\u0105ce w tle<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Dla prostej aplikacji dzia\u0142aj\u0105cej w tle nale\u017cy utworzy\u0107 obiekt deweloperski typu <em>Aplikacja<\/em> oraz <em>klas\u0119 Java<\/em>. Te dwa obiekty zosta\u0142y opisane w tej sekcji.<\/p>\n<h5 id=\"obiekt-deweloperski-aplikacja\" ><span class=\"ez-toc-section\" id=\"Obiekt_deweloperski_Aplikacja\"><\/span>Obiekt deweloperski Aplikacja<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Dla aplikacji dzia\u0142aj\u0105cej w tle nale\u017cy utworzy\u0107 obiekt deweloperski typu <em>Aplikacja<\/em>.<\/p>\n<h6 id=\"typ-aplikacji\" ><span class=\"ez-toc-section\" id=\"Typ_aplikacji\"><\/span>Typ aplikacji<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Aplikacja musi mie\u0107 zdefiniowane ustawienie <em>W tle<\/em> w polu <em>Typ<\/em>. Oznaczenie aplikacji nale\u017cy dobra\u0107 w taki spos\u00f3b, aby jak najlepiej odzwierciedla\u0142a jej przeznaczenie.<\/p>\n<h6 id=\"szczegolne-zastosowanie\" ><span class=\"ez-toc-section\" id=\"Szczegolne_zastosowanie\"><\/span>Szczeg\u00f3lne zastosowanie<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Dla szczeg\u00f3lnego zastosowania aplikacji dost\u0119pne s\u0105 nast\u0119puj\u0105ce warto\u015bci:<\/p>\n<ul>\n<li><strong>(brak)<\/strong> &#8212; aplikacja dzia\u0142aj\u0105ca w tle jest standardow\u0105 aplikacj\u0105 i nie podlega \u017cadnym specjalnych regu\u0142om<\/li>\n<li><strong>Aktualizacja danych<\/strong> &#8212; aplikacja jest aktualizacj\u0105 danych i uruchamia si\u0119 automatycznie po instalacji aktualizacji oprogramowania, kt\u00f3ra zawiera jej now\u0105 wersj\u0119. Nale\u017cy upewni\u0107 si\u0119, \u017ce w momencie uruchomienia tej aplikacji wszystkie wymagane aktualizacje oprogramowania s\u0105 ju\u017c aktywne.<\/li>\n<li><strong>Aktualizacja danych w tle<\/strong> &#8212; jest to aktualizacja danych, kt\u00f3ra stanowi aplikacj\u0119 dzia\u0142aj\u0105c\u0105 w tle i mo\u017ce by\u0107 uruchomiona przez u\u017cytkownika z poziomu aplikacji <em>Zlecenia przetwarzania<\/em><\/li>\n<li><strong>Reorganizacja<\/strong> &#8212; aplikacja z tym szczeg\u00f3lnym zastosowaniem mo\u017ce by\u0107 u\u017cywana w aplikacji <em>Zlecenia reorganizacji<\/em>. Nazwa aplikacji reorganizacyjnej musi ko\u0144czy\u0107 si\u0119 na <em>Reorganization<\/em>. Wi\u0119cej informacji na temat aplikacji reorganizacyjnych mo\u017cna znale\u017a\u0107 w artykule <em>Podr\u0119cznik referencyjny: Reorganizacja<\/em>.<\/li>\n<li><strong>Aplikacja z mo\u017cliwo\u015bci\u0105 restartu<\/strong> &#8212; aplikacja dzia\u0142aj\u0105ca w tle, kt\u00f3ra uleg\u0142a przerwaniu z przyczyn niezale\u017cnych od niej, jest wznawiana po ponownym uruchomieniu serwera aplikacji<\/li>\n<\/ul>\n<h6 id=\"ustawienia-prezentacji-i-utrzymania\" ><span class=\"ez-toc-section\" id=\"Ustawienia_prezentacji_i_utrzymania\"><\/span>Ustawienia prezentacji i utrzymania<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Dla ustawie\u0144 prezentacji i utrzymania nale\u017cy wzi\u0105\u0107 pod uwag\u0119 zale\u017cno\u015bci od ustawie\u0144 szczeg\u00f3lnego zastosowania:<\/p>\n<ul>\n<li><strong>Prezentacja, utrzymanie<\/strong>\n<ul>\n<li><em>Bez szczeg\u00f3lnego zastosowania<\/em> &#8212; aplikacja dzia\u0142aj\u0105ca w tle pojawia si\u0119 w menu nawigacyjnym w podfolderze <em><span style=\"font-size: revert; color: initial;\">Przetwarzanie w tle<\/span><\/em><span style=\"font-size: revert; color: initial;\"> odpowiedniego obszaru. Mo\u017ce by\u0107 u\u017cywana w menu u\u017cytkownika.<\/span><\/li>\n<li><em>Aktualizacja danych<\/em> &#8212; ustawienia widoczno\u015bci i utrzymania s\u0105 bez znaczenia dla aktualizacji danych<\/li>\n<li><em>Aktualizacja danych w tle<\/em> &#8212; aplikacje dzia\u0142aj\u0105ce w tle s\u0105 uruchamiane za pomoc\u0105 aplikacji <em>Zlecenia przetwarzania<\/em><\/li>\n<li><em>Reorganizacja<\/em> &#8212; wi\u0119cej informacji na ten temat mo\u017cna znale\u017a\u0107 w artykule <em>Zlecenia reorganizacji<\/em><\/li>\n<\/ul>\n<\/li>\n<li><strong>Brak prezentacji, utrzymanie<\/strong> &#8212; to ustawienie jest zazwyczaj u\u017cywane, aby umo\u017cliwi\u0107 uruchamianie aplikacji wy\u0142\u0105cznie w okre\u015blonym kontek\u015bcie za pomoc\u0105 opcji uruchamiania przetwarzania nast\u0119puj\u0105cego, czyli w spos\u00f3b programistyczny, a nie przez aplikacj\u0119 <em>Zlecenia przetwarzania<\/em><\/li>\n<li><strong>Brak prezentacji, brak utrzymania<\/strong> &#8212; to ustawienie nie ma \u017cadnych konsekwencji technicznych. S\u0142u\u017cy jedynie jako wskaz\u00f3wka, \u017ce utrzymanie aplikacji nie jest prowadzone ani planowane.<\/li>\n<li><strong>Brak prezentacji, brak utrzymania, z kodem aktywacyjnym<\/strong> &#8212; to ustawienie jest to\u017csame z warto\u015bci\u0105 <em>Brak prezentacji, brak utrzymania<\/em> i dodatkowo okre\u015bla, \u017ce aplikacja mo\u017ce by\u0107 u\u017cywana tylko po podaniu kodu aktywacyjnego. W przypadku narz\u0119dzi, kod aktywacyjny mo\u017ce by\u0107 wymagany tylko dla okre\u015blonych parametr\u00f3w. Kody aktywacyjne s\u0105 przyznawane przez Centrum Wsparcia Comarch ERP Enterprise.<\/li>\n<\/ul>\n<h6 id=\"tryb-uprawnien\" ><span class=\"ez-toc-section\" id=\"Tryb_uprawnien\"><\/span>Tryb uprawnie\u0144<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>W polu <em>Tryb uprawnie\u0144<\/em>\u00a0mo\u017cna okre\u015bli\u0107, czy indywidualne uprawnienia u\u017cytkownika maj\u0105 by\u0107 sprawdzane podczas wykonywania aplikacji. W niekt\u00f3rych przypadkach rezygnacja z takiej weryfikacji mo\u017ce by\u0107 celowa lub konieczna.<\/p>\n<h6 id=\"obszar\" ><span class=\"ez-toc-section\" id=\"Obszar\"><\/span>Obszar<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Aplikacja dzia\u0142aj\u0105ca w tle musi by\u0107 przypisana do obszaru. W\u00f3wczas mo\u017ce si\u0119 ona pojawi\u0107 w odpowiednim menu nawigacyjnym.<\/p>\n<h6 id=\"glowna-jednostka-biznesowa\" ><span class=\"ez-toc-section\" id=\"Glowna_jednostka_biznesowa\"><\/span>G\u0142\u00f3wna jednostka biznesowa<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Wskazanie g\u0142\u00f3wnej jednostki biznesowej decyduje o tym, dla jakich baz danych aplikacja dzia\u0142aj\u0105ca w tle jest mo\u017cliwa do uruchomienia lub b\u0119dzie uruchamiana.<\/p>\n<h6 id=\"funkcja\" ><span class=\"ez-toc-section\" id=\"Funkcja\"><\/span>Funkcja<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Aplikacja dzia\u0142aj\u0105ca w tle mo\u017ce by\u0107 sterowana przez funkcj\u0119.<\/p>\n<h6 id=\"wymagane-aktywne-bazy-danych\" ><span class=\"ez-toc-section\" id=\"Wymagane_aktywne_bazy_danych\"><\/span>Wymagane aktywne bazy danych<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>W tym miejscu nale\u017cy wskaza\u0107 bazy danych, kt\u00f3re musz\u0105 by\u0107 dost\u0119pne w momencie wykonywania aplikacji.<\/p>\n<h5 id=\"obiekt-deweloperski-klasa-java\" ><span class=\"ez-toc-section\" id=\"Obiekt_deweloperski_Klasa_Java\"><\/span>Obiekt deweloperski Klasa Java<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W najprostszym przypadku, ta klasa musi dziedziczy\u0107 po klasie <em>com.cisag.pgm.base.CisApplication<\/em>. Konieczne jest zaimplementowanie metody <em>run(\u2026)<\/em>.<\/p>\n<p><em>public class SimpleBatchApplication extends CisApplication {<\/em><br \/>\n<em>public CisParameterList run(int action, CisParameterList parms) {<\/em><br \/>\n<em>}<\/em><br \/>\n<em>}<\/em><\/p>\n<h5 id=\"komunikaty-w-aplikacjach-dzialajacych-w-tle\" ><span class=\"ez-toc-section\" id=\"Komunikaty_w_aplikacjach_dzialajacych_w_tle\"><\/span>Komunikaty w aplikacjach dzia\u0142aj\u0105cych w tle<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Je\u015bli w aplikacji dzia\u0142aj\u0105cej w tle generowane s\u0105 komunikaty, musz\u0105 one zosta\u0107 przeniesione do kolejki komunikat\u00f3w (<em>MessageQueue<\/em>) aplikacji wywo\u0142uj\u0105cej. W przeciwnym razie nie pojawi\u0105 si\u0119 w logach komunikat\u00f3w. Z tego powodu, jedna z ostatnich instrukcji w metodzie <em>run<\/em> powinna brzmie\u0107:<\/p>\n<p><em>mm.sendProgramMessages(CisMessageManager.PREVIOUS); <\/em><\/p>\n<h5 id=\"wartosci-zwracane-przez-aplikacje-dzialajaca-w-tle\" ><span class=\"ez-toc-section\" id=\"Wartosci_zwracane_przez_aplikacje_dzialajaca_w_tle\"><\/span>Warto\u015bci zwracane przez aplikacj\u0119 dzia\u0142aj\u0105c\u0105 w tle<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Aplikacja dzia\u0142aj\u0105ca w tle musi zwr\u00f3ci\u0107 sw\u00f3j status do systemu poprzez warto\u015b\u0107 zwracan\u0105 przez metod\u0119 <em>run<\/em>. Aby to u\u0142atwi\u0107, dost\u0119pna jest klasa pomocnicza <em>com.cisag.pgm.base.CisApplicationCallResult<\/em>. Obiekt tej klasy jest tworzony za pomoc\u0105 metody <em>createInstance<\/em>, a odpowiedni status ustawiany jest metod\u0105 <em>setResult(short result)<\/em>. Nast\u0119pnie warto\u015b\u0107 zwracana przez metod\u0119 <em>run<\/em> jest generowana za pomoc\u0105 metody <em>serialize()<\/em>.<\/p>\n<p>Poni\u017cej przedstawiono mo\u017cliwe warto\u015bci zwracane przez aplikacj\u0119 dzia\u0142aj\u0105c\u0105 w tle:<\/p>\n<ul>\n<li><strong>COMPLETED<\/strong> &#8212; aplikacja dzia\u0142aj\u0105ca w tle zako\u0144czy\u0142a si\u0119 pomy\u015blnie. Zaleca si\u0119 umieszczenie komunikatu informacyjnego w kolejce komunikat\u00f3w (<em>Messagequeue<\/em>).<\/li>\n<li><strong>ABORTED<\/strong> &#8212; aplikacja dzia\u0142aj\u0105ca w tle zosta\u0142a przerwana. Odpowiednie komunikaty o b\u0142\u0119dach powinny zosta\u0107 umieszczone w kolejce komunikat\u00f3w.<\/li>\n<\/ul>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p><em>public class SimpleBatchApplication extends CisApplication {<\/em><br \/>\n<em>public CisParameterList run(int action, <\/em><br \/>\n<em>CisParameterList parms) {<\/em><br \/>\n<em>CisApplicationCallResult result =<\/em><br \/>\n<em>CisApplicationCallResult.createInstance(parms);<\/em><br \/>\n<em>CisMessageManager mm =<\/em><br \/>\n<em>CisEnvironment.getInstance().getMessageManager();<\/em><br \/>\n<em>\/\/ Do something useful \u2026<\/em><br \/>\n<em>result.setResult(CisApplicationCallResult.COMPLETED);<\/em><br \/>\n<em>mm.sendProgramMessages(CisMessageManager.PREVIOUS);<\/em><br \/>\n<em>return result.serialize();<\/em><br \/>\n<em>}<\/em><br \/>\n<em>}<\/em> <\/div><\/section>\n<h4 id=\"uruchamianie-aplikacji-dzialajacej-w-tle\" ><span class=\"ez-toc-section\" id=\"Uruchamianie_aplikacji_dzialajacej_w_tle\"><\/span>Uruchamianie aplikacji dzia\u0142aj\u0105cej w tle<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Aplikacje dzia\u0142aj\u0105ce w tle mo\u017cna uruchamia\u0107 na r\u00f3\u017cne sposoby. Zale\u017cy to zar\u00f3wno od ustawie\u0144 w powi\u0105zanym obiekcie deweloperskim <em>Aplikacja<\/em>, jak i od zamierzonego zastosowania.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\"> Aplikacja dzia\u0142aj\u0105ca w tle nie zawsze jest uruchamiana natychmiast po wykonaniu opisanych tu krok\u00f3w. Zazwyczaj jest tylko umieszczana w odpowiedniej kolejce. Dok\u0142adny moment rozpocz\u0119cia wykonania aplikacji zale\u017cy od szeregu innych parametr\u00f3w, takich jak liczba po\u0142\u0105cze\u0144 dla danej kolejki oraz jej bie\u017c\u0105ce obci\u0105\u017cenie. Aplikacja zostanie uruchomiona natychmiast tylko wtedy, gdy na dialogu startowym przetwarzania w tle zostanie wybrany przycisk <strong>[Natychmiast]<\/strong>. W takim przypadku nie tworzy si\u0119 zlecenie przetwarzania. Nale\u017cy dok\u0142adnie rozwa\u017cy\u0107, czy taka opcja uruchamiania powinna by\u0107 w og\u00f3le dost\u0119pna dla u\u017cytkownika. Wykorzystanie tej opcji blokuje w\u0105tek na serwerze SAS, kt\u00f3ry jest przeznaczony do obs\u0142ugi dialog\u00f3w. Zazwyczaj jest to akceptowalne tylko w przypadku aplikacji dzia\u0142aj\u0105cych w tle, kt\u00f3re trwaj\u0105 kr\u00f3tko.<\/div><\/section>\n<h5 id=\"aplikacja-zlecenia-przetwarzania\" ><span class=\"ez-toc-section\" id=\"Aplikacja_Zlecenia_przetwarzania\"><\/span>Aplikacja Zlecenia przetwarzania<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Je\u015bli aplikacja dzia\u0142aj\u0105ca w tle jest zdefiniowana jako <em>Prezentacja, utrzymanie<\/em> i nie ma szczeg\u00f3lnego zastosowania, mo\u017cna j\u0105 uruchomi\u0107 za pomoc\u0105 aplikacji <em>Zlecenia przetwarzania<\/em>.<\/p>\n<h5 id=\"jobsubmitdialog\" ><span class=\"ez-toc-section\" id=\"JobSubmitDialog\"><\/span>JobSubmitDialog<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Klasa <em>com.cisag.pgm.services.batch.JobSubmitDialog<\/em> umo\u017cliwia programistyczne uruchomienie aplikacji dzia\u0142aj\u0105cej w tle, kt\u00f3ra wymaga dodatkowej interakcji z u\u017cytkownikiem. W tym celu nale\u017cy utworzy\u0107 instancj\u0119 <em>JobSubmitDialog<\/em> za pomoc\u0105 wywo\u0142ania <em>createInstance<\/em>.<\/p>\n<p>Na utworzonej instancji <em>JobSubmitDialog <\/em>nale\u017cy ustawi\u0107 jej w\u0142a\u015bciciela, kt\u00f3rym mo\u017ce by\u0107 albo <em>CisUiApplication<\/em>, albo <em>VisualElement<\/em>.<\/p>\n<p>Ponadto, za pomoc\u0105 wywo\u0142ania <em>setTitleFrom<\/em>() mo\u017cna ustawi\u0107 tytu\u0142 okna dialogowego na podstawie ci\u0105gu znak\u00f3w. Pierwszym parametrem jest \u015bcie\u017cka do tej tabeli, a drugim &#8211; ewentualne parametry zast\u0119pcze dla wyst\u0119puj\u0105cych w ci\u0105gu znak\u00f3w placeholder\u00f3w.<\/p>\n<p>Wywo\u0142anie <em>setBatchJob(CisBatchJob)<\/em> pozwala na ustawienie kolejnych parametr\u00f3w dla przetwarzania w tle. Bezpo\u015brednie tworzenie obiektu <em>CisBatchJob<\/em> nie jest zalecane. Zamiast tego, dost\u0119pna jest klasa serwisowa <em>CisBatchService<\/em>, kt\u00f3ra wspiera to zadanie. U\u017cycie klasy <em>CisBatchService <\/em>zostanie opisane w kolejnym rozdziale.<\/p>\n<p>Na koniec, okno dialogowe <em>JobSubmitDialog <\/em>zostaje wy\u015bwietlone poprzez wywo\u0142anie <em>show()<\/em>. U\u017cytkownik mo\u017ce wprowadzi\u0107 lub zmieni\u0107 odpowiednie dane, a nast\u0119pnie uruchomi\u0107 aplikacj\u0119 dzia\u0142aj\u0105c\u0105 w tle lub przerwa\u0107 proces uruchamiania.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p><em>import com.cisag.pgm.services.batch.JobSubmitDialog;<\/em><br \/>\n<em>JobSubmitDialog jsd = JobSubmitDialog createInstance():<\/em><br \/>\n<em>\/\/ Entweder setOwner(CisUiApplication) oder setOwner(VisualElement)<\/em><br \/>\n<em>jsd.setOwner(this);<\/em><br \/>\n<em>jsd.setTitleFrom(String,String[]);<\/em><br \/>\n<em>jsd.setBatchJob(cisBatchJob);<\/em> <\/div><\/section>\n<h5 id=\"cisbatchservice\" ><span class=\"ez-toc-section\" id=\"CisBatchService\"><\/span>CisBatchService<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Klasa <em>com.cisag.pgm.services.batch.CisBatchService<\/em> mo\u017ce by\u0107 u\u017cywana do tworzenia obiektu <em>CisBatchJob<\/em>, a tak\u017ce do bezpo\u015bredniego uruchamiania aplikacji dzia\u0142aj\u0105cej w tle bez interakcji z u\u017cytkownikiem.<\/p>\n<p>Podczas tworzenia obiektu <em>CisBatchJob<\/em>, r\u00f3\u017cne parametry dla zadania s\u0105 ustawiane na warto\u015bci domy\u015blne. U\u0142atwia to tworzenie poprawnych obiekt\u00f3w <em>CisBatchJob<\/em>. Nast\u0119pnie mo\u017cna wprowadzi\u0107 dodatkowe warto\u015bci lub nadpisa\u0107 niepo\u017c\u0105dane ustawienia.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p><em>CisBatchService cbs = CisBatchService.getInstance(); <\/em><\/p>\n<p><em>CisBatchJob job = cbs.createJob(<span class=\"hljs-keyword\">false<\/span>); <\/em><\/p>\n<p><em>job.setName(<span class=\"hljs-string\">&#8222;Moje przetwarzanie w tle&#8221;<\/span>); <\/em><\/p>\n<p><em><span class=\"hljs-comment\">\/\/ uruchom bezpo\u015brednio<\/span> cbs.submitJob(job); <\/em><\/p>\n<p><em><span class=\"hljs-comment\">\/\/ alternatywnie, uruchom z JobSubmitDialog<\/span> <\/em><\/p>\n<p><em><span class=\"hljs-comment\">\/\/ <\/span><\/em><\/p>\n<p><em> <span class=\"hljs-comment\">\/\/ JobSubmitDialog dialog = JobSubmitDialog createInstance();<\/span> <\/em><\/p>\n<p><em><span class=\"hljs-comment\">\/\/ <\/span><\/em><\/p>\n<p><em> <span class=\"hljs-comment\">\/\/ &#8230; ustaw w\u0142a\u015bciciela i tytu\u0142 &#8230; <\/span><\/em><\/p>\n<p><em> <span class=\"hljs-comment\">\/\/ <\/span><\/em><\/p>\n<p><em> <span class=\"hljs-comment\">\/\/ dialog.setBatchJob(cbs);<\/span> <\/em><\/p>\n<p><em><span class=\"hljs-comment\">\/\/ <\/span><\/em><\/p>\n<p><em> <span class=\"hljs-comment\">\/\/ dialog.show();<\/span><\/em> <\/div><\/section>\n<h4 id=\"parametryzacja-aplikacji-dzialajacych-w-tle\" ><span class=\"ez-toc-section\" id=\"Parametryzacja_aplikacji_dzialajacych_w_tle\"><\/span>Parametryzacja aplikacji dzia\u0142aj\u0105cych w tle<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Aplikacje dzia\u0142aj\u0105ce w tle mo\u017cna parametryzowa\u0107 na dwa sposoby: poprzez podanie parametru <em>action<\/em> oraz poprzez list\u0119 warto\u015bci. Parametr <em>action<\/em> s\u0142u\u017cy do wyboru r\u00f3\u017cnych \u015bcie\u017cek przetwarzania i jest zazwyczaj interpretowany w metodzie <em>run<\/em> za pomoc\u0105 instrukcji <em>switch-case<\/em>. Lista warto\u015bci, w formie <em>CisParameterList<\/em>, sk\u0142ada si\u0119 z tr\u00f3jek nazwa-typ-warto\u015b\u0107, kt\u00f3re mog\u0105 by\u0107 wykorzystane w procesie przetwarzania. Dozwolone dla danej aplikacji akcje (<em>actions<\/em>) oraz ich parametry warto\u015bci musz\u0105 by\u0107 zdefiniowane w obiekcie deweloperskim <em>Aplikacja<\/em>.<\/p>\n<h5 id=\"aplikacje-dzialajace-w-tle-z-automatycznym-edytorem\" ><span class=\"ez-toc-section\" id=\"Aplikacje_dzialajace_w_tle_z_automatycznym_edytorem\"><\/span>Aplikacje dzia\u0142aj\u0105ce w tle z automatycznym edytorem<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Gdy aplikacja dzia\u0142aj\u0105ca w tle, kt\u00f3rej klasa Java dziedziczy po <em>CisApplication<\/em> i dla kt\u00f3rej w obiekcie deweloperskim<em> Aplikacja<\/em> zdefiniowano jedn\u0105 lub wi\u0119cej akcji z parametrami, jest uruchamiana za pomoc\u0105 uruchamiania aplikacji dzia\u0142aj\u0105cych w tle, u\u017cytkownikowi wy\u015bwietla si\u0119 wyb\u00f3r zdefiniowanych akcji. W zale\u017cno\u015bci od wybranej akcji, pojawiaj\u0105 si\u0119 pola wej\u015bciowe zgodne ze zdefiniowanymi parametrami. Wybrana akcja oraz wprowadzone warto\u015bci s\u0105 przekazywane do metody <em>run<\/em> aplikacji w formie <em>CisParameterList<\/em> w momencie jej uruchamiania. W metodzie <em>run <\/em>warto\u015bci te mo\u017cna pobra\u0107 za pomoc\u0105 odpowiednich metod <em>get<\/em> z obiektu <em>CisParameterList. <\/em>Jako parametr s\u0142u\u017cy nazwa parametru zdefiniowana w obiekcie deweloperskim <em>Aplikacja<\/em>.<\/p>\n<h5 id=\"aplikacje-dzialajace-w-tle-z-edytorem\" ><span class=\"ez-toc-section\" id=\"Aplikacje_dzialajace_w_tle_z_edytorem\"><\/span>Aplikacje dzia\u0142aj\u0105ce w tle z edytorem<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Je\u015bli aplikacja jest uruchamiana za pomoc\u0105 <em>JobSubmitDialog<\/em>, u\u017cytkownik mo\u017ce wprowadzi\u0107 warto\u015bci dla parametr\u00f3w zadeklarowanych w zdefiniowanej akcji.<\/p>\n<p>Ten mechanizm nie jest zbyt elastyczny. Istnieje jednak mo\u017cliwo\u015b\u0107 zaimplementowania w\u0142asnego edytora, aby m\u00f3c programistycznie sterowa\u0107 przep\u0142ywem danych mi\u0119dzy polami wej\u015bciowymi.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\"> Mo\u017cliwo\u015b\u0107 implementacji w\u0142asnego edytora dla <em>JobSubmitDialog <\/em>nie jest ju\u017c zalecana. W tej procedurze aplikacja wywo\u0142uj\u0105ca musi korzysta\u0107 ze szczeg\u00f3\u0142\u00f3w implementacyjnych, przyk\u0142adowo z nazwy widoku edytora aplikacji dzia\u0142aj\u0105cej w tle. Korzystanie z tej opcji jest szczeg\u00f3lnie trudne w przypadku menu kontekstowego, poniewa\u017c nie ma ono wiedzy o istnieniu odpowiedniego widoku. Zalecane jest og\u00f3lne zastosowanie edytora wsadowego. Wi\u0119cej informacji na ten temat znajduje si\u0119 w kolejnym rozdziale.<\/div><\/section>\n<p>W <em>JobSubmitDialog <\/em>za pomoc\u0105 wywo\u0142ania metody <em>setCustomTabView(Action, View)<\/em> mo\u017cna przypisa\u0107 widok, kt\u00f3ry implementuje wymagany edytor. Ten widok edytora jest nast\u0119pnie wy\u015bwietlany w osobnej zak\u0142adce w <em>JobSubmitDialog<\/em>. Wykorzystuj\u0105c <em>Action<\/em> mo\u017cna sterowa\u0107 wygl\u0105dem zak\u0142adki (etykieta, podpowied\u017a, itp.). <em>Action <\/em>jest wywo\u0142ywana przez <em>JobSubmitDialog,<\/em> a zadaniem zarejestrowanego s\u0142uchacza (<em>listener<\/em>) jest walidacja danych i udost\u0119pnienie ich aplikacji dzia\u0142aj\u0105cej w tle. W tym procesie komunikaty mog\u0105 by\u0107 generowane za pomoc\u0105 <em>Messagemanager<\/em>. Zazwyczaj sam widok jest rejestrowany jako s\u0142uchacz, a warto\u015bci odczytane z widoku s\u0105 wstawiane do <em>CisParameterList<\/em> obiektu <em>BatchJob<\/em>.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p><em>public class CustomView extends View implements ActionListener{<\/em><br \/>\n<em>ShortField field;<\/em><br \/>\n<em>CisParameterList pl;<\/em><\/p>\n<p><em>public void init(CisParameterList pl){<\/em><\/p>\n<p><em>this.pl = pl;<\/em><\/p>\n<p><em>setLayout(new StandardLayout());<\/em><br \/>\n<em>field =<\/em><br \/>\n<em>new ShortField(Guid.AUTOGUID, <\/em><br \/>\n<em>&#8222;com.cisag.app.financials.batch:StartTransferBatchesDuration.lt&#8221;);<\/em><br \/>\n<em>add(field);<\/em><\/p>\n<p><em>field.setValue(pl.getShort(&#8222;StartTransferBatchesDuration&#8221;));<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>public void performAction(Action action) {<\/em><\/p>\n<p><em>\/\/ validate field &#8230; if not ok, send some error-message<\/em><\/p>\n<p><em>mm.sendMessage(&#8222;APP&#8221;,333);<\/em><br \/>\n<em>pl.setShort(&#8222;StartTransferBatchesDuration&#8221;, <\/em><br \/>\n<em>field.getValue());<\/em><\/p>\n<p><em> }<\/em><br \/>\n<em>}<\/em> <\/div><\/section>\n<p>Zastosowanie:<\/p>\n<p><em>com.cisag.pgm.services.batch.JobSubmitDialog dialog = <\/em><br \/>\n<em>obSubmitDialog createInstance()<\/em><br \/>\n<em>setOwner(\u2026)<\/em><br \/>\n<em>setTitleFrom(\u2026,\u2026);<\/em><br \/>\n<em>dialog.setBatchJob(CisBatchJob)<\/em><br \/>\n<em>CustomView customView = new CustomView();<\/em><br \/>\n<em>Action customViewAction = new Action(\u201c\u2026\u201c);<\/em><br \/>\n<em>customViewAction.register(customView);<\/em><br \/>\n<em>dialog.setCustomTabView(customViewAction, customView)<\/em><br \/>\n<em>dialog.show();<\/em><\/p>\n<h5 id=\"edytor-przetwarzania-w-tle\" ><span class=\"ez-toc-section\" id=\"Edytor_przetwarzania_w_tle\"><\/span>Edytor przetwarzania w tle<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metod\u0119 implementowania w\u0142asnego edytora, opisan\u0105 w poprzednim rozdziale, mo\u017cna jeszcze upro\u015bci\u0107.<\/p>\n<p>W tym celu aplikacja dzia\u0142aj\u0105ca w tle musi dziedziczy\u0107 po <em>CisBatchApplication<\/em> i dodatkowo implementowa\u0107 metod\u0119 <em>createEditor()<\/em>. Metoda ta musi zwraca\u0107 obiekt, kt\u00f3ry jest instancj\u0105 klasy dziedzicz\u0105cej po <em>CisBatchApplicationEditor<\/em>.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Przyk\u0142ad implementacji <em>CisBatchEditors<\/em> (fragment):<\/p>\n<p><em>public class BatchApplicationTest extends CisBatchApplication {<\/em><br \/>\n<em>@Override<\/em><br \/>\n<em>public CisBatchApplicationEditor createEditor() {<\/em><br \/>\n<em>\/\/ TODO Auto-generated method stub<\/em><br \/>\n<em>return new BatchApplicationTestEditor();<\/em><br \/>\n<em>}<\/em><br \/>\n<em>@Override<\/em><br \/>\n<em>public CisParameterList run(int action, CisParameterList parms) <\/em><br \/>\n<em>{<\/em><\/p>\n<p><em>CisApplicationCallResult result = <\/em><br \/>\n<em>CisApplicationCallResult.createInstance(parms);;<\/em><br \/>\n<em>return result.serialize();<\/em><br \/>\n<em>}<\/em><br \/>\n<em>}<\/em><br \/>\n<em>class BatchApplicationTestEditor extends CisBatchApplicationEditor <\/em><br \/>\n<em>{<\/em><\/p>\n<p><em>private static final int MSG = 42;<\/em><br \/>\n<em>private View contentPane;<\/em><br \/>\n<em>private ShortField field;<\/em><br \/>\n<em>private short actionId;<\/em><br \/>\n<em>public boolean isOnlineSubmitEnabled() {<\/em><br \/>\n<em>\/\/ online execution is not allowed, otherwise return true<\/em><br \/>\n<em>return false;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>public void init(int visualizationType) {<\/em><br \/>\n<em>contentPane = new View(new StandardLayout());<\/em><br \/>\n<em>field =<\/em><br \/>\n<em>new ShortField(Guid.AUTOGUID,<\/em><\/p>\n<p><em>&#8222;com.cisag.app.financials.batch:StartTransferBatchesDuration.lt&#8221;);<\/em><br \/>\n<em>contentPane.add(field);<\/em><br \/>\n<em>field.registerMessage(MSG);<\/em><br \/>\n<em>}<\/em><br \/>\n<em>public VisualElement getVisualElement() {<\/em><br \/>\n<em>return contentPane;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>public short getActionId() {<\/em><br \/>\n<em>return actionId;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>public void applyDefaults() {<\/em><br \/>\n<em>\/\/ set defaults to fields<\/em><br \/>\n<em>}<\/em><br \/>\n<em>public void dataToUi() {<\/em><br \/>\n<em>\/\/ copy data from parameterlist to fields<\/em><br \/>\n<em>}<\/em><br \/>\n<em>public void dataFromUi() {<\/em><br \/>\n<em>\/\/ copy data from fields to parameterlist<\/em><br \/>\n<em>}<\/em><br \/>\n<em>public void validate() {<\/em><br \/>\n<em>\/\/ validate values and send messages if necessary<\/em><br \/>\n<em>}<\/em><br \/>\n<em>} <\/em><\/div><\/section>\n<h4 id=\"aplikacje-z-kodem-aktywacyjnym\" ><span class=\"ez-toc-section\" id=\"Aplikacje_z_kodem_aktywacyjnym\"><\/span>Aplikacje z kodem aktywacyjnym<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Je\u015bli dla aplikacji dzia\u0142aj\u0105cej w tle ustawiono warto\u015b\u0107 <em>Brak prezentacji, brak utrzymania, z kodem aktywacyjnym<\/em>, to do jej wykonania wymagane jest podanie kodu aktywacyjnego. Kod aktywacyjny jest wa\u017cny tylko w okre\u015blonym czasie. Kody aktywacyjne s\u0105 przyznawane przez Centrum Wsparcia Comarch ERP Enterprise.<\/p>\n<p>Je\u015bli aplikacja ma by\u0107 uruchomiona interaktywnie za pomoc\u0105 <em>JobSubmitDialog<\/em>, w oknie dialogowym dost\u0119pne jest pole <em>Kod aktywacyjny<\/em>, w kt\u00f3re nale\u017cy wpisa\u0107 wa\u017cny kod, zanim aplikacja zostanie otwarta.<\/p>\n<p>Je\u015bli aplikacja ma by\u0107 uruchomiona programistycznie, zazwyczaj za pomoc\u0105 metod <em>CisBatchService.callJob(CisBatchJob)<\/em> lub <em>CisApplicationManager.callApplication(CisApplicationCall)<\/em>,\u00a0lista parametr\u00f3w przekazywanego obiektu musi zawiera\u0107 specjalny parametr typu <em>String<\/em> o nazwie <em>UNLOCK_CODE<\/em>\u00a0z wa\u017cnym kodem aktywacyjnym jako warto\u015bci\u0105.<\/p>\n<h4 id=\"aplikacje-z-mozliwoscia-ponownego-uruchomienia\" ><span class=\"ez-toc-section\" id=\"Aplikacje_z_mozliwoscia_ponownego_uruchomienia\"><\/span>Aplikacje z mo\u017cliwo\u015bci\u0105 ponownego uruchomienia<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Aplikacja dzia\u0142aj\u0105ca w tle mo\u017ce zosta\u0107 przerwana z przyczyn le\u017c\u0105cych po jej stronie, np. z powodu wyj\u0105tku, lub z przyczyn niezale\u017cnych od niej, np. ponowne uruchomienie serwera aplikacji. Aplikacje z mo\u017cliwo\u015bci\u0105 ponownego uruchomienia s\u0105 automatycznie wznawiane po takim przerwaniu (niezale\u017cnym od aplikacji) po ponownym uruchomieniu serwera aplikacji. Aby oznaczy\u0107 aplikacj\u0119 jako tak\u0105, w jej obiekcie deweloperskim nale\u017cy wybra\u0107 warto\u015b\u0107<em> Aplikacja z mo\u017cliwo\u015bci\u0105 restartu<\/em> lub <em>Us\u0142uga<\/em>.<\/p>\n<p>Zazwyczaj, po ponownym uruchomieniu aplikacja nie powinna rozpoczyna\u0107 pracy od pocz\u0105tku, lecz kontynuowa\u0107 j\u0105 od punktu przerwania lub ostatniego udanego zatwierdzenia transakcji. Aby wspiera\u0107 takie zachowanie, klasa <em>CisBatchApplication<\/em> oferuje interfejs, za pomoc\u0105 kt\u00f3rego mo\u017cna w spos\u00f3b transakcyjny zapisa\u0107 bie\u017c\u0105cy stan aplikacji.<\/p>\n<h4 id=\"dane-statusowe\" ><span class=\"ez-toc-section\" id=\"Dane_statusowe\"><\/span>Dane statusowe<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Klasa <em>CisBatchApplication<\/em> udost\u0119pnia interfejs, kt\u00f3ry umo\u017cliwia zapis danych o bie\u017c\u0105cym stanie przetwarzania. Mo\u017cna w tym celu wywo\u0142a\u0107 nast\u0119puj\u0105ce metody:<\/p>\n<p><em>protected final void putStatusData(CisParameterList statusData)<\/em><br \/>\n<em>protected final CisParameterList getStatusData() <\/em><\/p>\n<p>Poprzez wywo\u0142anie <em>putStatusData <\/em>informacje o ju\u017c wykonanych krokach roboczych mog\u0105 zosta\u0107 zapisane w bazie danych jako <em>CisParameterList. <\/em>Dane te staj\u0105 si\u0119 trwa\u0142e dopiero po zatwierdzeniu powi\u0105zanej transakcji nadrz\u0119dnej. Zatem, rozs\u0105dnie jest wywo\u0142ywa\u0107 t\u0119 metod\u0119 w tej samej transakcji, kt\u00f3ra obejmuje w\u0142a\u015bciwe kroki przetwarzania. Dane statusowe mo\u017cna odczyta\u0107 ponownie, wywo\u0142uj\u0105c <em>getStatusData.<\/em><\/p>\n<p>Ten mechanizm dzia\u0142a w opisany spos\u00f3b tylko wtedy, gdy aplikacja dzia\u0142aj\u0105ca w tle jest wykonywana w kolejce. Gdy aplikacja jest wykonywana w sesji dialogowej, np. po wybraniu przycisku <strong>[Natychmiast]<\/strong>\u00a0w aplikacji przetwarzania w tle, <em>getStatusData <\/em>zawsze zwraca pust\u0105 <em>CisParameterList.<\/em><\/p>\n<h4 id=\"zlecenia-podrzedne-subjobs\" ><span class=\"ez-toc-section\" id=\"Zlecenia_podrzedne_SubJobs\"><\/span>Zlecenia podrz\u0119dne (SubJobs)<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Aplikacja dzia\u0142aj\u0105ca w tle mo\u017ce samodzielnie uruchamia\u0107 kolejne aplikacje dzia\u0142aj\u0105ce w tle. Zazwyczaj aplikacja startuj\u0105ca b\u0119dzie czeka\u0107 na wyniki swoich zlece\u0144 podrz\u0119dnych, na przyk\u0142ad dlatego, \u017ce s\u0105 one potrzebne do dalszego przetwarzania.<\/p>\n<p>Uruchamianie wielu zlece\u0144 podrz\u0119dnych umo\u017cliwia zasadniczo r\u00f3wnoleg\u0142e wykonywanie krok\u00f3w roboczych. Jednak\u017ce, u\u017cycie zlece\u0144 podrz\u0119dnych jedynie stwarza mo\u017cliwo\u015b\u0107 paralelizacji. Aby m\u00f3c z niej korzysta\u0107 w trakcie dzia\u0142ania, kolejka przetwarzania musi by\u0107 odpowiednio skonfigurowana.<\/p>\n<p>Je\u015bli do kolejki zostanie przypisane jest wiele po\u0142\u0105cze\u0144, wiele zlece\u0144 podrz\u0119dnych mo\u017ce by\u0107 przetwarzanych na jednym serwerze SAS. Je\u015bli kolejka jest skonfigurowana jako kolejka rozproszona, zlecenia podrz\u0119dne mog\u0105 by\u0107 przetwarzane na wielu serwerach SAS.<\/p>\n<p>Gdy zlecenia podrz\u0119dne s\u0105 uruchamiane przez aplikacj\u0119 dzia\u0142aj\u0105c\u0105 w tle, ta aplikacja zostaje tymczasowo zatrzymana. W razie potrzeby mo\u017cna ustawi\u0107, aby aplikacja startuj\u0105ca zosta\u0142a ponownie uruchomiona po zako\u0144czeniu wszystkich zlece\u0144 podrz\u0119dnych.<\/p>\n<p>Je\u015bli aplikacja nie ma by\u0107 ponownie uruchamiana, jej status zostanie ustawiony na <em>Zako\u0144czone<\/em> dopiero po pomy\u015blnym zako\u0144czeniu wszystkich zlece\u0144 podrz\u0119dnych. Je\u015bli ma by\u0107 ponownie uruchomiona, jej status zostanie ustawiony na <em>Zako\u0144czone<\/em> tylko wtedy, gdy zostanie on odpowiednio ustawiony za pomoc\u0105 warto\u015bci zwracanej przez metod\u0119 <em>run<\/em>.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p><em>public class SubJobTest extends CisApplication {<\/em><\/p>\n<p><em>private final static int RESTART = 999; <\/em><br \/>\n<em>public CisParameterList run(int action, CisParameterList parms) <\/em><br \/>\n<em>{<\/em><br \/>\n<em>CisApplicationCallResult result = <\/em><br \/>\n<em>CisApplicationCallResult.createInstance(parms);<\/em><br \/>\n<em>CisBatchService cbs = CisBatchService.getInstance();<\/em><br \/>\n<em>switch(action) {<\/em><br \/>\n<em>case RESTART:<\/em><\/p>\n<p><em>\/\/ do something with the results of the subjob &#8230;.<\/em><\/p>\n<p><em>result.setResult(CisApplicationCallResult.COMPLETED);<\/em><br \/>\n<em>break;<\/em><\/p>\n<p><em>default:<\/em><\/p>\n<p><em>CisBatchJob subJob = cbs.createSubJob(parms);<\/em><\/p>\n<p><em>\/\/ make other settings for subJob &#8230;<\/em><\/p>\n<p><em>short state = cbs.submitJob(subJob);<\/em><br \/>\n<em>byte[] subJobGuid = subJob.getGuid();<\/em><br \/>\n<em>CisList batchJobGuids = new CisArrayList();<\/em><br \/>\n<em>CisList failed = new CisArrayList();<\/em><br \/>\n<em>if(state == CisBatchService.SUCCESS) {<\/em><br \/>\n<em>batchJobGuids.add(subJobGuid);<\/em><br \/>\n<em>} else {<\/em><br \/>\n<em>failed.add(subJobGuid);<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>result.setWaitForBatchJobs(batchJobGuids, RESTART, <\/em><br \/>\n<em>parms);<\/em><br \/>\n<em>result.setResult(CisApplicationCallResult.COMPLETED);<\/em><br \/>\n<em>}<\/em><br \/>\n<em>return result.serialize();<\/em><br \/>\n<em>}<\/em><br \/>\n<em>}<\/em> <\/div><\/section>\n<h4 id=\"pseudozlecenia-przetwarzania\" ><span class=\"ez-toc-section\" id=\"Pseudozlecenia_przetwarzania\"><\/span>Pseudozlecenia przetwarzania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Po\u0142\u0105czenie zlece\u0144 przetwarzania z komunikatami jest wbudowanym w system mechanizmem do protoko\u0142owania krok\u00f3w przetwarzania. U\u017cytkownik mo\u017ce w ten spos\u00f3b przegl\u0105da\u0107 wszystkie komunikaty wygenerowane dla danego zlecenia. Czasami jednak liczba komunikat\u00f3w nie jest odpowiednio ustrukturyzowana. Mo\u017cna by to lepiej zorganizowa\u0107, tworz\u0105c zlecenia podrz\u0119dne dla mniejszych jednostek przetwarzania. Wi\u0105\u017ce si\u0119 to jednak z drastycznym wzrostem technicznego nak\u0142adu administracyjnego i zu\u017cycia zasob\u00f3w.<\/p>\n<p>Dla tego przypadku u\u017cycia aplikacje dzia\u0142aj\u0105ce w tle mo\u017cna uruchamia\u0107 w specjalnym trybie. Aplikacja jest wtedy ignorowana przez standardowe kolejki przetwarzania. Zamiast tego, musi istnie\u0107 aplikacja serwisowa, kt\u00f3ra zar\u00f3wno implementuje w\u0142a\u015bciw\u0105 funkcjonalno\u015b\u0107, jak i steruje statusem aplikacji dzia\u0142aj\u0105cej w tle.<\/p>\n<p>Aplikacja startuj\u0105ca musi pocz\u0105tkowo ustawi\u0107 status aplikacji na <em>Udost\u0119pniona<\/em> poprzez wywo\u0142anie metody <em>setRelease(java.lang.Boolean)<\/em> na obiekcie <em>CisBatchJob<\/em>. Aplikacja serwisowa przetwarzaj\u0105ca zlecenie musi ustawi\u0107 status na aktywny\u00a0podczas przetwarzania, a po zako\u0144czeniu \u2013 na <em>Zako\u0144czone<\/em>. Dopiero wtedy przetwarzanie w tle mo\u017ce zosta\u0107 usuni\u0119te z kolejki.<\/p>\n<p>Aplikacja tego typu mo\u017ce generowa\u0107 komunikaty o b\u0142\u0119dach, ale musi wtedy zmieni\u0107 sw\u00f3j status na <em>Przerwane<\/em>. Aplikacja startuj\u0105ca jest informowana o finalnym statusie aplikacji dzia\u0142aj\u0105cej w tle. Spos\u00f3b powiadamiania mo\u017cna okre\u015bli\u0107 za pomoc\u0105 metody <em>CisBatchJob#setNotificationMode(short)<\/em>. Mo\u017cna powiadomi\u0107 u\u017cytkownika za pomoc\u0105 okna dialogowego lub wywo\u0142a\u0107 zdarzenie w workflow. Obie opcje mog\u0105 dotyczy\u0107 wszystkich komunikat\u00f3w lub tylko komunikat\u00f3w o b\u0142\u0119dach.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p><em>CisBatchService cbs = CisBatchService.getInstance();<\/em><br \/>\n<em>CisBatchJob cbj = cbs.createJob(params);<\/em><br \/>\n<em>cbj.setStartMode(com.cisag.pgm.services.batch.BatchJobStartMode.APP<\/em><br \/>\n<em>LICATION);<\/em><br \/>\n<em>\/\/ set other values for the job, <\/em><br \/>\n<em>\/\/ especially set an user readable name<\/em><br \/>\n<em>cbs.changeJobState(JobStateAction. RELEASE_JOB);<\/em><br \/>\n<em>cbs.callJob(cbj);<\/em><br \/>\n<em>cbs.changeJobState(JobStateAction. ACTIVATE_JOB);<\/em><br \/>\n<em>\/\/ do something useful<\/em><br \/>\n<em>\/\/ if error, or anything other to report \u2026<\/em><br \/>\n<em>cbs.sendMessage(CisMessageManager.PROGRAM, cbj.getGuid());<\/em><br \/>\n<em>cbs.changeJobState(JobStateAction. COMPLETE_JOB);<\/em> <\/div><\/section>\n<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\"> W przeciwie\u0144stwie do standardowych zlece\u0144 przetwarzania, lista parametr\u00f3w zawiera tylko te warto\u015bci, kt\u00f3re zosta\u0142y dodane podczas tworzenia obiektu <em>CisBatchJob<\/em>. W zwi\u0105zku z tym, na interfejsie u\u017cytkownika wy\u015bwietlane s\u0105 wy\u0142\u0105cznie te warto\u015bci. W szczeg\u00f3lno\u015bci w celu u\u0142atwienia debugowania, okaza\u0142o si\u0119, \u017ce korzystne jest umieszczanie dodatkowych informacji w li\u015bcie parametr\u00f3w. Informacje te powinny by\u0107, w miar\u0119 mo\u017cliwo\u015bci, w formie czytelnej dla u\u017cytkownika.<\/div><\/section>\n","protected":false},"author":28,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-9689","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-podreczniki-referencji"],"_links":{"self":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/comments?post=9689"}],"version-history":[{"count":35,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9689\/revisions"}],"predecessor-version":[{"id":37363,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9689\/revisions\/37363"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/media?parent=9689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}