Dokončete úlohu na pozadí 1s 8.3. Univerzální regulační úkol. Harmonogram rutinního úkolu

Při práci v 1C existuje mnoho rutinních operací, které je třeba spustit nebo vytvořit podle plánu, aby bylo možné provést jednu nebo druhou akci, například: odesílání dokumentů nebo načítání dat do 1C z webu.

Nedávno jsem zveřejnil článek: Je čas to automatizovat:

Rutinní úkoly a úkoly na pozadí

Modul úloh je navržen tak, aby vykonával jakoukoli aplikaci nebo funkci podle plánu nebo asynchronně.

Mechanismus úloh řeší následující problémy:

  • Schopnost definovat regulační postupy ve fázi konfigurace systému;
  • Provádění určených akcí podle harmonogramu;
  • Volání dané procedury nebo funkce asynchronně, tzn. bez čekání na jeho dokončení;
  • Sledování průběhu konkrétního úkolu a získávání stavu jeho dokončení (hodnota udávající, zda byl úspěšný či nikoli);
  • Získání seznamu aktuálních úkolů;
  • Schopnost čekat na dokončení jednoho nebo více úkolů;
  • Vedení zakázky (možnost zrušení, blokace exekuce atd.).

Mechanismus práce se skládá z následujících součástí:

  • Metadata rutinních úkolů;
  • Pravidelné úkoly;
  • Pracovní místa na pozadí;
  • Plánovač úkolů.

Úlohy na pozadí a jsou navrženy tak, aby prováděly aplikační úlohy asynchronně. Úlohy na pozadí jsou implementovány pomocí vestavěného jazyka.

Naplánované úlohy a jsou navrženy k provádění úloh aplikace podle plánu. Rutinní úlohy jsou uloženy v informační bázi a jsou vytvářeny na základě metadat definovaných v konfiguraci. Metadata regulačního úkolu obsahují informace, jako je název, metoda, použití atd.

Rutinní úloha má plán, který určuje, ve kterých časech musí být metoda spojená s rutinní úlohou provedena. Plán je zpravidla specifikován v informační bázi, ale může být také specifikován ve fázi konfigurace (například pro předdefinované rutinní úlohy).

Plánovač úloh se používá k plánování provádění rutinních úloh. U každé naplánované úlohy plánovač pravidelně kontroluje, zda aktuální datum a čas odpovídá plánu naplánované úlohy. Pokud se shoduje, plánovač přiřadí tuto úlohu ke spuštění. Chcete-li to provést, plánovač pro tuto naplánovanou úlohu vytvoří úlohu na pozadí, která provede skutečné zpracování.

Myslím, že to s popisem stačí - pojďme k implementaci:

Vytvoření rutinního úkolu

Název metody– cesta k proceduře, která bude provedena v úloze na pozadí podle daného plánu. Postup musí být ve společném modulu. Doporučuje se nepoužívat standardní společné moduly, ale vytvořit si vlastní. Nezapomeňte, že úlohy na pozadí běží na serveru!

Používání– známka použití rutinního úkolu.

Předurčeno– označuje, zda je rutinní úkol předem určen.

Pokud chcete, aby rutinní úloha fungovala ihned po umístění do databáze, zadejte atribut Předurčeno. V opačném případě budete muset použít zpracování „Konzola úloh“ nebo spustit úlohu programově.

Počet opakování, když se úloha ukončí abnormálně– kolikrát byla úloha na pozadí restartována, pokud byla provedena s chybou.

Interval opakování při abnormálním ukončení úlohy– jak často bude úloha na pozadí restartována, pokud byla dokončena s chybou.

Nastavení rozvrhu

Plán dokončení úkolu:

Každou hodinu, jen jeden denObdobí RepeatDays = 0, RepeatDays Period = 3600
Každý den jednou denněObdobí RepeatDays = 1, RepeatDays Period = 0
Jeden den, jednouPeriodRepeatDays = 0
Každý druhý den jednou denněPeriodRepeatDays = 2
Každou hodinu od 01:00 do 07:00 každý denPeriodRepeatDays = 1RepeatPeriodDuringDay = 3600StartTime = 01:00

Konec = 07:00

Každou sobotu a neděli v 09:00Období RepeatDays = 1 WeekDays = 6, 7 StartTime = 09:00
Každý den po dobu jednoho týdne, týden přeskočtePeriodRepeatDays = 1 PeriodWeeks = 2
Jednou v 01:00Čas začátku = 01:00
Poslední den každého měsíce v 9:00.PeriodRepeatDays = 1DayInMonth = -1StartTime = 09:00
Pátý den každého měsíce v 9:00PeriodRepeatDays = 1DayInMonth = 5StartTime = 09:00
Druhou středu v měsíci v 9:00PeriodRepeatDays = 1DayWeekMonth = 2DaysWeek = 3

Čas začátku = 09:00

Funkce spouštění úloh na pozadí ve variantách soubor a klient-server

Mechanismy pro provádění úloh na pozadí ve verzi souboru a klient-server se liší.

Ve verzi souboru musíte vytvořit vyhrazený klientský proces, který bude provádět úlohy na pozadí. K tomu musí klientský proces pravidelně volat funkci globálního kontextu ExecuteJobProcessing. Úlohy na pozadí by měl zpracovávat pouze jeden klientský proces na infobázi (a podle toho volat tuto funkci). Pokud nebyl vytvořen klientský proces pro zpracování úloh na pozadí, pak se při programovém přístupu k enginu úloh zobrazí chyba „Správce úloh není aktivní“. Nedoporučuje se používat klientský proces, který zpracovává úlohy na pozadí pro jiné funkce.

Jakmile jsou spuštěny úlohy zpracování klientského procesu na pozadí, ostatní klientské procesy jsou schopny programově přistupovat k enginu úloh na pozadí, tzn. může spouštět a spravovat úlohy na pozadí.

Ve verzi klient-server K provádění úloh na pozadí se používá plánovač úloh, který je fyzicky umístěn ve správci clusteru. Pro všechny úlohy na pozadí ve frontě získá plánovač nejméně zatížený pracovní proces a použije jej ke spuštění odpovídající úlohy na pozadí. Pracovní proces provede úlohu a oznámí plánovači výsledky provedení.

Ve verzi klient-server je možné blokovat provádění rutinních úloh. Provádění rutinních úloh je blokováno v následujících případech:

  • Na informační základnu bylo nainstalováno explicitní blokování rutinních úkolů. Zámek lze nastavit pomocí konzoly clusteru;
  • Na infobázi je blok připojení. Zámek lze nastavit pomocí konzoly clusteru;
  • Metoda SetExclusiveMode() s parametrem True byla volána z vestavěného jazyka;
  • V některých jiných případech (například při aktualizaci konfigurace databáze).

Zpracování spouštění a prohlížení naplánovaných úloh můžete stáhnout zde.

Pravděpodobně každý programátor 1C 8.3 musel dříve nebo později nastavit provádění určitých úkolů podle plánu. Níže uvedu podrobný popis těchto mechanismů, doufám, že to budou užitečné informace pro začínající programátory 1C. To je velmi výhodné, protože to nevyžaduje lidský zásah, rutinní úloha se nakonfiguruje jednou a funguje podle vašeho plánu.

Níže naleznete podrobné pokyny na příkladu.

Co jsou rutinní úkoly a úkoly na pozadí v 1C

  • Naplánované úkoly je speciální mechanismus 1C Enterprise 8.3 určený k provádění konkrétní akce podle daného plánu.
  • Práce na pozadí- objekty generované rutinní úlohou, které přímo provádějí zamýšlenou akci bez účasti uživatele nebo programátora 1C 8.2.

Mechanismus naplánovaných úloh a úloh na pozadí funguje v režimu klient-server (SQL), díky funkcionalitě DBMS. Pokud máte databázi souborů, pak lze úlohu také nakonfigurovat, ale podle trochu jiného principu.

Nastavení úloh na pozadí v režimu klient-server 1C

Nejprve vytvořte nový objekt metadat – rutinní úkol. Svůj úkol nazvu „Načítání kurzů měn“. Podívejme se na paletu vlastností tohoto konfiguračního objektu:

Získejte 267 videolekcí na 1C zdarma:

  • Název metody— cesta k proceduře, která bude provedena v úloze na pozadí podle daného plánu. Postup musí být ve společném modulu. Doporučuje se nepoužívat standardní, ale vytvořit si vlastní. Nezapomeňte, že úlohy na pozadí běží na serveru!
  • Používání— známka používání rutinního úkolu.
  • Předurčeno— označuje, zda je rutinní úkol předem určen. Pokud chcete, aby rutinní úloha fungovala ihned po umístění do databáze, zadejte tento příznak. V opačném případě budete muset použít zpracování Job Console nebo nechat úlohu spustit programově.
  • Počet opakování, když se úloha ukončí abnormálně— kolikrát byla úloha na pozadí restartována, pokud byla provedena s chybou.
  • Interval opakování při abnormálním ukončení úlohy— jak často bude úloha na pozadí restartována, pokud byla dokončena s chybou.

A nejzajímavější je nastavení Plán:

Zde nakonfigurujete interval spouštění procedury zadaný v poli „Název metody“. Řekněme, že jsem nakonfiguroval

Pozornost! Nezapomeňte zakázat blokování provádění rutinních úloh a úloh na pozadí na úrovni DBMS!

To lze provést v obslužném programu pro správu verze klient-server nebo při vytváření nové databáze:

Nastavení rutinních úloh v režimu souborů 1C

V režimu souborů je nastavení takových úloh poněkud obtížnější. Pro takový úkol musí být spuštěna samostatná relace programu 1C. To se často řeší vytvořením „technického“ uživatele, jehož relace je vždy spuštěna.

V režimu souborů se rutinní úloha inicializuje při spuštění metody „RunTaskProcessing()“.

Pro konkrétního uživatele můžete nakonfigurovat tuto metodu tak, aby se spouštěla ​​pomocí jiné metody −

ConnectWaitHandler( <ИмяПроцедуры>, <Интервал>, <Однократно>).

  • Název procedury— název postupu připojeného jako obsluha čekání. Název exportované procedury spravovaného aplikačního modulu (běžného aplikačního modulu) nebo globálního sdíleného modulu. Postup musí být umístěn na klientovi.
  • Interval— doba mezi provedeními operací v sekundách.
  • Jednou- jak dokončit úkol, jednou nebo ne.

ConnectWaitHandler, 3600 );

Dvouminutové video, které ukazuje, jak nastavit rutinní úlohu v konfigurátoru 1C:

Naplánované úlohy v 1C jsou navrženy tak, aby prováděly určité postupy podle plánu s určitou frekvencí.

Rutinní úlohy jsou uloženy v informační základně a mají plán spouštění. Samotné spuštění je plně automatické, pokud informační základna pracuje v režimu klient-server. Pokud je databáze založená na souborech, musíte provést následující kroky:

  • přidělit speciálního uživatele k provádění rutinních úkolů;
  • pod tímto uživatelem musí být otevřena databáze, ve které musí být funkce periodicky spouštěna ExecuteTaskProcessing().

Vytvoření rutinního úkolu

Naplánované úlohy jsou objektem metadat konfigurace 1C. Nachází se ve skupině General. Uvažujme parametry a vlastnosti rutinních úloh.

Název metody— cesta k exportní proceduře v obecném modulu, která bude provedena podle daného plánu. Postup musí být proveden na serveru. V tomto ohledu jsou rutinní úkoly poněkud podobné objektu Přihlaste se k odběru události.

Klíč— umožňuje vytvořit několik rutinních úloh stejného typu. Například synchronizaci dat mezi několika informačními bázemi lze implementovat pomocí jediného objektu metadat Rutinní úkol, přičemž bude vytvořeno několik samotných rutinních úloh (podle počtu databází k výměně). Tyto rutinní úkoly budou rozlišeny pomocí vlastnosti Klíč. Najednou lze provést pouze jednu úlohu se stejným klíčem.

Používání— příznak označující, zda je naplánovaná úloha povolena.

Předurčeno— zde můžeme nakreslit analogii s předdefinovanými adresářovými prvky. Předdefinované prvky se vytvářejí v konfigurátoru a používají je uživatelé při své práci. Běžné prvky si uživatel vytváří sám. Stejné je to s rutinními úlohami: pokud jsou předdefinované, pak existují a lze je provádět podle plánu ihned po vytvoření v konfigurátoru. Pokud vlajka Předurčeno není nainstalován, musí uživatel vytvořit jednu nebo více rutinních úloh tohoto typu (např Pracovní konzole).

Počet opakování, když se úloha ukončí abnormálně— určuje, kolikrát bude úloha na pozadí restartována, pokud byla dokončena s chybou.

Interval opakování při abnormálním ukončení úlohy— určuje, jak často bude úloha na pozadí restartována, pokud byla dokončena s chybou.

Programová práce s rutinními úkoly

V těchto příkladech budeme uvažovat o práci s běžnými, nepředdefinovanými, rutinními úkoly.

Programové vytvoření rutinního úkolu

//Vytvořte úkol
"RegularTaskName") ;

//Nastavit klíč pro naplánovanou úlohu (volitelné)
Cvičení. Key = "TaskKey" ;

//Povolit rutinní úlohu
Cvičení. Použití = Pravda ;

//Napište rutinní úkol
Cvičení. Napsat() ;

Programový příjem naplánované úlohy pro změnu parametrů

V tomto příkladu předpokládejme, že existuje pouze jedna rutinní úloha daného typu. Pokud existuje několik úkolů, pak není obtížné provést příslušné změny v kódu.


"RutineTaskName"] ) ) ;


Pokud Úkoly. Quantity() > 0 Pak
Job= Jobs[ 0 ] ;


v opačném případě
Úkol = RegularTasks. Vytvořit rutinní úkol( "RutineTaskName") ;

EndIf;

//Rutinní úloha je v proměnné Task. Můžete změnit jeho parametry.

Vyvolání dialogu pro změnu plánu rutinní úlohy

Pro práci s harmonogramem rutinního úkolu existuje speciální typ dialogu. Stále předpokládáme, že máme pouze jeden rutinní úkol tohoto typu.

//Získejte pole s rutinními úkoly požadovaného typu
Úkoly = Pravidelné úkoly. Získat RoutineTasks(new Structure("Metadata" , Metadata. RutineTasks[ "RutineTaskName"] ) ) ;

//Pokud úloha existuje, pak podle podmínky je jedna
Pokud Úkoly. Quantity() > 0 Pak
Job= Jobs[ 0 ] ;

//Pokud neexistuje žádná úloha, vytvořte ji
v opačném případě
Úkol = RegularTasks. Vytvořit rutinní úkol( "RutineTaskName") ;

EndIf;

Plán=Úkol. Plán;

//Vytvoří dialogové okno pro změnu plánu rutinní úlohy
Dialog pro úpravy = New ScheduleDialog of RoutineTask (Schedule) ;

//Zobrazit dialog uživateli a zpracovat změny plánu
IfEditDialog. OpenModal() Potom
Cvičení. Plán = EditDialog. Plán;
Cvičení. Napsat() ;
EndIf;

Úlohy na pozadí v 1C mohou být spouštěny automaticky podle plánu (tj. jsou to instance rutinních úloh), nebo může vývojář sám iniciovat spuštění úlohy na pozadí pro provedení libovolného algoritmu (výrazným příkladem je generování zpráv v pozadí).
DŮLEŽITÉ!!! U databází souborů počínaje verzí platformy 8.3.3.641 není nutné spouštět samostatnou relaci, ve které se budou provádět úlohy na pozadí. Tito. Dříve bylo v databázích souborů ke spouštění úloh na pozadí nutné spustit metodu globálního kontextu "RunTaskProcessing()". Podrobnosti na tomto odkazu.

Postup pro spuštění libovolného algoritmu v úloze na pozadí

Pro spuštění našeho algoritmu v samostatné úloze na pozadí použijeme metodu "Běh()" vedoucí pracovní pozice: Syntax: Vykonat(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>)
  • <ИмяМетода>(Požadované); Typ: Řetězec
    Název exportované procedury nebo funkce neglobálního společného modulu, který může být spuštěn na serveru, ve tvaru ModuleName.MethodName.
  • <Параметры>(volitelný); Typ: Array
    Pole parametrů předávaných metodě. Počet a typy parametrů musí odpovídat parametrům metody. (další podrobnosti v Syntax Assistant)
  • <Ключ>(volitelný); Typ: Řetězec
    Pokud je zadán klíč, musí být jedinečný mezi klíči aktivních úloh na pozadí, které mají stejný název metody jako úloha na pozadí.
  • <Наименование>(volitelný); Typ: Řetězec.
    Popis ulohy.

Postup pro spuštění úlohy na pozadí

V našem případě použijeme exportní proceduru umístěnou v obecném modulu "GeneralModuleServer"(Myslím, že je zbytečné vysvětlovat, že modul musí být na straně serveru) Postup Zápis informací O produktech na pozadí (Parametr úlohy na pozadí) Požadavek na export dat = Nový požadavek ("SELECT | Products. Link AS Nomenclature | FROM | Directory. Nomenclature AS produkty"); Fetch = DataRequest.Execute().Select(); While Selection.Next() Cyklus MH = Information Registers.Product Data.CreateRecordManager(); MZ.Period = AktuálníDatum(); MZ.Nomenklatura = Sampling.Nomenclature; MH.Information = BackgroundTaskParameter; MZ.Write(); EndCycle; Konec procedury Abychom demonstrovali fungování úlohy na pozadí, vytvoříme pro každou položku záznamy v našem registru informací a parametr bude předán z formuláře, ve kterém je úloha na pozadí spuštěna.

Příkaz spuštění úlohy na pozadí

Parametr, který předáme prováděcí proceduře, bude převzat z atributu spravovaného formuláře (atribut s typem „String“):

Kód modulu spravovaného formuláře bude vypadat takto: &Na klientské proceduře StartBackgroundJob(Command) StartBackgroundJobOnServer(); Konec procedury &Na serveru Procedura Spustit úlohu na pozadí na serveru () // Vytvořit pole s parametry Parametry úlohy = Nové pole; JobParameters.Add(TaskParameter); // Spustíme na pozadí provádění algoritmu BackgroundTasks.Execute(// Naše metoda exportu v obecném modulu "GeneralModuleServer.WriteInformationOnProductsInBackground", // Předáme pole s parametryTaskParameters, // Určete klíč úlohy New UniqueIdentifier, // Určete název úlohy na pozadí „Naše práce na pozadí“); Konec procedury

Výsledek provedení

V důsledku provedení úlohy na pozadí se vygenerují záznamy v registru informací (což jsme potřebovali).

Koncept asynchronního programování

Koncept asynchronního programování spočívá v tom, že výsledek funkce není k dispozici okamžitě, ale po nějaké době ve formě nějakého asynchronního (porušujícího normální pořadí provádění) volání.

Tito. Hlavní myšlenkou asynchronního programování je vydávat jednotlivá volání metod a pokračovat v další práci paralelně bez čekání na dokončení volání.

Některé metody, které minimalizují pravděpodobnost výjimek, nevyžadují asynchronní přístup, jiné jej však vyžadují hned na začátku vývoje.

Jak je patrné z grafů, u synchronního programovacího modelu neexistuje žádný koeficient užitečných interaktivních uživatelských akcí, protože systém blokuje uživatelské rozhraní, zatímco u asynchronního modelu uživatel pokračuje v aktivní práci v systému.

Při synchronním běhu má aplikace pouze jedno vlákno. S asynchronním programovacím modelem můžete paralelně spouštět více vláken a reagovat na nové akce uživatelů, když běží. Po provedení n-vlákna zobrazíte výsledek na obrazovce.

Úlohy na pozadí v 1C:Enterprise 8

V 1C:Enterprise 8 jsou úlohy na pozadí navrženy tak, aby prováděly aplikační úlohy asynchronně. Mohou generovat podřízené úlohy na pozadí, například pro paralelizaci složitých výpočtů na různých pracovních serverech klastru v režimu provozu klient-server.

Je možné omezit provádění úloh na pozadí, které mají stejné metody na základě konkrétního aplikačního kritéria. Programové vytváření a správa úloh na pozadí je možná z libovolného uživatelského připojení k systémové informační bázi. Úloha na pozadí běží jménem uživatele, který ji vytvořil.

Mechanismus úloh funguje v režimu klient-server i v souborovém režimu, ale možnosti správy a provádění úloh se v obou verzích poněkud liší.

Možnost klient-server

Ve verzi klient-server provádí plánování úloh plánovač úloh, který je fyzicky umístěn ve správci clusteru.

Plánovač pravidelně kontroluje, zda byly přijaty nějaké požadavky na spuštění úloh na pozadí. Pokud existují úlohy, které je třeba provést, plánovač určí nejméně zatížené pracovní procesy v clusteru a postupně každému z nich přiřadí jeho úkol ke spuštění. Stejný pracovní proces tedy může potenciálně provádět více úloh paralelně. Poté, co pracovní proces přijme úlohu, pracovní proces naváže připojení k informační databázi a provede úlohu v rámci tohoto připojení. Po dokončení úlohy pracovní proces oznámí plánovači, zda byla úloha dokončena úspěšně nebo neúspěšně.

Možnost souboru

Počínaje verzí platformy 8.3.3.641 vývojáři výrazně zjednodušili práci s úlohami na pozadí ve verzi souboru.

Dříve bylo pro automatické spouštění úloh nutné spustit samostatnou další relaci 1C:Enterprise, která se používala jako plánovač úloh. A v této relaci bylo nutné periodicky provádět vestavěnou jazykovou metodu ExecuteTaskProcessing(). Tento přístup byl značně těžkopádný, nepohodlný a značně omezoval použití pozadí a rutinních úloh v souborové verzi práce.

Nyní je vše mnohem jednodušší. Pokud se spustí tenký nebo tlustý klient a také pokud má webový server klientská připojení, pak se v každé z těchto aplikací automaticky spustí další vlákno s připojením k databázi. Tato vlákna se zabývají prováděním na pozadí a rutinními úkoly.

Každá z uvedených aplikací provádí své vlastní úlohy na pozadí. Pokud aplikace spustila několik úloh na pozadí, jsou prováděny postupně v pořadí, v jakém byly přijaty.

Zjevná nevýhoda úloh na pozadí 1C: jelikož jsou spouštěny na straně serveru, není zde možnost interaktivní práce s uživatelem (např. nelze zobrazit zprávu nebo jiné informace; všechna tato data je nutné ukládat v informační základně a dále zpracovávat v nějakým způsobem).

Je třeba poznamenat, že úlohy na pozadí jsou čistě softwarové objekty a nelze je ukládat do databáze. To znamená, že můžeme pouze vytvořit instanci třídy, inicializovat její vlastnosti a spustit ji ke spuštění.

Příklad asynchronního spouštění kódu v 1C:Enterprise 8

„Psaní programů, ve kterých výsledek volání funkce přichází neznámo kdy, je mnohem obtížnější než běžné. Vnořené hovory, zpracování chyb, kontrola nad tím, co se děje – všechno se stává komplikovanějším,“ řeknou to jen ti, kteří nevědí, jak správně využívat možnosti platformy, my ne!

Pojďme si ukázat jednoduchost a eleganci asynchronního spouštění kódu v 1C:Enterprise 8!

Krok 1. Pojďme vytvořit nový systém informační bezpečnosti pro vývoj konfigurace

Krok 2. V konfiguraci přidáme obecný modul „Asynchronous Handlers“

Proč jsme přidali sdílený modul? Všechno je zde jednoduché: k provádění asynchronních operací v 1C:Enterprise 8 se používají úlohy na pozadí, které mají svého vlastního správce - „BackgroundTask Manager“. Tento objekt má metodu „Spustit“, pomocí které se spouští úloha na pozadí.

Pojďme k asistentovi syntaxe.

Budeme tedy potřebovat společný modul.

Krok 3 Do obecného modulu „Asyncronous Handlers“ přidáme exportní proceduru OurLongOperation()

Postup OurLongOperation(Duration) Export // Simulace dlouhodobé akce (Duration sec.). OperationStartDate = CurrentDate(); While CurrentDate() - Datum zahájení operace< Длительность Цикл КонецЦикла; КонецПроцедуры

Krok 4. Přidejte do konfigurace zpracování „Asynchronous Programming Concept“ (můžete vytvořit externí zpracování)

Přidejte do formuláře jeden atribut:

Délka (číslo)

a dva týmy

Proveďte LongOperation;

Proveďte dlouho-dlouhou operaci asynchronně.

Krok 5. Podle asistenta syntaxe vyplňte modul formuláře

&Na klientské proceduře Proveďte Long-RunningOperation(Command) ExecuteLong-RunningOperationOnServer(); EndProcedure &OnServer Procedure ExecuteLongOperationOnServer() AsynchronousHandlers.OurLongOperation(Duration); Konec procedury &Na klientovi Procedura Provést dlouhodobou operaci asynchronně (příkaz) Provést dlouhodobou operaci asynchronně na serveru (); Konec procedury &Na serveru Procedura Provést dlouhotrvající operaci asynchronně Na serveru Server() Parametry = New Array; Parameters.Add(Duration); BackgroundTasks.Execute("AsynchronousHandlers.OurLongOperation", Parametry, New UniqueIdentifier, "Příklad konceptu asynchronního programování"); Konec procedury

Krok 6. Pojďme spustit a zkontrolovat!

Výsledek:

Pokud klikneme na tlačítko „Provést dlouhou operaci“, pak se uživatelské rozhraní zablokuje na „Doba trvání“ sekund;

Pokud klikneme na tlačítko „Provést dlouhotrvající operaci asynchronně“, uživatelské rozhraní se nezablokuje a programový kód se spustí paralelně.

To, že je programový kód prováděn asynchronně, můžeme ověřit pohledem do protokolu.

Můžeme ladit programový kód, který běží na „pozadí“, pokud v parametrech ladění nastavíme příslušnou vlastnost.

Příklad asynchronního spouštění kódu v 1C:Enterprise 8 pomocí BSP

Podívejme se na příklad implementace konceptu asynchronního programování v 1C:Enterprise 8 v BSP na příkladu zpracování „Current Affairs“.

Logika je následující: při spuštění programu se inicializuje pracovní oblast úvodní stránky, kde lze zobrazit formulář pro zpracování „Aktuální záležitosti“. Tento formulář vyplňují aktuální záležitosti uživatele a jeho vyplnění nějakou dobu trvá. Pokud by vývojáři neměli možnost spouštět kód asynchronně, uživatelské rozhraní by bylo během vyplňování formuláře pro zpracování zablokováno!

Pojďme analyzovat programový kód formuláře.

Událost formuláře „When CreatedOnServer“ volá proceduru „RunBackgroundTask“ – to je to, co potřebujeme.

Aniž bychom se nechali rozptylovat nuancemi, pojďme analyzovat tento postup

A zde vidíme, že se používá správce úloh na pozadí a jeho metoda „Spustit“. Všimněte si, že vývojáři ukládají jedinečné ID pro úlohu na pozadí.

K tomu vývojáři používají metodu ConnectWaitHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>).



V hákovém postupu Connectable_CheckTaskComplete() vývojáři funkci volají JobCompleted (TaskID)


Tato funkce kontroluje provedení úlohy na pozadí podle identifikátoru.

Je třeba poznamenat, že BSP vyvinul obecné moduly pro podporu dlouhodobých serverových operací.

Koncept asynchronního programování v 1C:Enterprise 8 tedy mírně zvyšuje složitost řešení problémů pro vývojáře, ale výrazně zlepšuje funkčnost programu z pohledu uživatele.