Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Fier
  • 1c crearea unei sarcini de fundal. Pornirea unui job de fundal în mod programatic

1c crearea unei sarcini de fundal. Pornirea unui job de fundal în mod programatic

Ștergerea periodică a registrelor (de exemplu, registrul de informații „Versiuni obiect” în configurația SCP), efectuarea de calcule conform unui program, completarea documentelor la un anumit moment - aceasta nu este o listă completă de acțiuni care pot fi implementate folosind sarcini de rutină 1C.

Creați o sarcină

Scopul nostru nu este să descriem codul modulului executabil; vom arăta principiile generale de funcționare și crearea unei sarcini de rutină.

Sarcina de rutină este de neînlocuit:

  1. Dacă sarcina la îndemână include, ca una dintre condiții, necesitatea executării periodice a unui anumit algoritm;
  2. Dacă codul trebuie executat indiferent de acțiunile operatorilor și utilizatorilor bazei de date;
  3. Dacă lansarea unei proceduri executabile nu depinde de evenimentele externe care au loc cu obiectele infobase.

Pentru ao crea, trebuie să mergeți la baza de informații în modul „Configurator”. Apoi, găsiți ramura „Activități de rutină” în arborele de configurare, acestea se află în fila „General” și faceți clic pe butonul „Adăugați” (Fig. 1).

Să aruncăm o privire mai atentă la fereastra de proprietăți (Fig. 2):
Fig.2

  1. Nume, sinonim și comentariu - regulile și principiile pentru completarea acestor câmpuri sunt similare pentru toate obiectele de configurare și nu este nevoie să le descrieți din nou;
  2. Numele metodei – o procedură a modulului general care descrie cât mai exact algoritmul necesar (făcând clic pe butonul de selectare se deschide procedurile disponibile, a căror reprezentare constă în numele modulului general și numele procedurii în diferite coloane a tabelului);
  3. Cheie – determină nu atât unicitatea sarcinii programate, cât mai degrabă unicitatea procesului de fundal lansat pe baza sarcinii; are o limită de lungime;
  4. Program – vom dedica un paragraf separat al articolului nostru descrierii acestui element;
  5. Utilizare – bifarea acestei casete determină activitatea sarcinii, TRUE înseamnă că sarcina va fi lansată și executată conform programului;
  6. Predefinite – dacă un element are această casetă de selectare, aceste sarcini nu pot fi șterse; sunt create automat când configurația este salvată în baza de date;
  7. Număr de repetări - dacă apare o excepție în timpul execuției, aceasta va fi repornită, astfel încât să nu se producă o buclă nesfârșită, programul limitează numărul de reporniri;
  8. Interval de reîncercare – timp în secunde între repornirile sarcinilor finalizate anormal.

Să aruncăm o privire mai atentă asupra programului.

Programul sarcinilor de rutină

Fig.3

În primul rând, ar trebui să acordați atenție părții inferioare a ferestrei, aici sunt afișate informații detaliate cu o defalcare a cât de des și la ce oră va fi efectuată sarcina.

"Filă generală:

  • Data începerii sarcinii;
  • Data de încheiere a procesării;
  • Frecvența repetării sarcinilor.

Dacă nu sunt specificate date în această filă, atunci nu va fi setat niciun termen limită pentru sarcină.

Fila „Zilnic” (Fig. 4)
Fig.4

Pe lângă câmpurile de intrare pentru ora de începere și de sfârșit a sarcinii și frecvența lansării acesteia în timpul zilei, conține o secțiune tabelară pentru configurarea detaliată a frecvenței de execuție.

Filele „Zilnic” și „Săptămânal” conțin informații pentru perioadele corespunzătoare.

Caracteristici de funcționare

În versiunea de lucru client-server, execuția sarcinilor de rutină este determinată de instrumentele serverului. Din consola de administrare, puteți activa sau dezactiva capacitatea de a rula sarcini pentru o anumită bază de date.

Situația este mult mai complicată cu versiunea fișierului de lucru. Înainte de o anumită lansare a platformei, procedurile de fundal și de rutină erau executate numai dacă metoda ExecuteTaskProcessing() a fost activată când sistemul a pornit sub un anumit utilizator. În acest caz, algoritmii erau lansați periodic atâta timp cât utilizatorul care a inițiat metoda se afla în program.

În prezent, munca joburilor de fundal în versiunea fișierului de lucru este distribuită uniform între utilizatorii autorizați în baza de date; dacă programul a fost lansat cu parametrul suplimentar AllowExecuteSheduledJobs, acest proces va fi responsabil pentru întreținerea de rutină.

Puteți dezactiva complet munca de fundal și de rutină într-o bază de date care rulează în modul fișier, ștergând sau redenumind fișierul DoNotCopy.txt din folderul cu baza de date. Prezența acestui fișier spune platformei că munca se desfășoară în original și nu într-o copie a bazei de date.

În plus, în livrările standard 1C, a devenit posibilă gestionarea lucrărilor programate direct din program, fără a intra în „Configurator”. În configurația „ZUP”, versiunea 3.1.3.223, puteți deschide formularul de management din meniul Administrare->Întreținere->Operațiuni de rutină->Taricuri de rutină și de fundal (Fig. 5)
Fig.5

Formularul care se deschide are o interfață intuitivă și vă permite să:


De asemenea, puteți începe o sarcină direct din formular.

Când lucrați în 1C, există multe operațiuni de rutină care trebuie lansate sau programate pentru a efectua una sau alta acțiune, de exemplu: postarea documentelor sau încărcarea datelor în 1C de pe un site web.

Am postat recent un articol: E timpul să automatizăm acest lucru:

Sarcini de rutină și de fundal

Motorul de job este proiectat pentru a executa orice aplicație sau funcționalitate conform unui program sau asincron.

Mecanismul sarcinii rezolvă următoarele sarcini:

  • Capacitatea de a defini proceduri de reglementare în etapa de configurare a sistemului;
  • Executarea actiunilor specificate conform programului;
  • Efectuarea unui apel la o anumită procedură sau funcție în mod asincron, de ex. fără a aștepta finalizarea acestuia;
  • Urmărirea progresului unei sarcini specifice și obținerea stării de finalizare a acesteia (o valoare care indică dacă a avut succes sau nu);
  • Obținerea unei liste de sarcini curente;
  • Abilitatea de a aștepta finalizarea uneia sau mai multor sarcini;
  • Managementul jobului (posibilitate de anulare, blocare a executiei etc.).

Mecanismul de lucru este format din următoarele componente:

  • Metadatele sarcinilor de rutină;
  • Sarcini regulate;
  • Locuri de muncă de fundal;
  • Planificator de sarcini.

Lucrările de fundal și sunt concepute pentru a îndeplini sarcinile aplicației în mod asincron. Sarcinile de fundal sunt implementate folosind limbajul încorporat.

Sarcini programate și sunt concepute pentru a îndeplini sarcinile aplicației conform unui program. Sarcinile de rutină sunt stocate în baza de informații și sunt create pe baza metadatelor definite în configurație. Metadatele unei sarcini de reglementare conțin informații precum numele, metoda, utilizarea etc.

O sarcină de rutină are un program care determină la ce momente trebuie executată metoda asociată sarcinii de rutină. Programul, de regulă, este specificat în baza de informații, dar poate fi specificat și în etapa de configurare (de exemplu, pentru sarcini de rutină predefinite).

Programatorul de sarcini este utilizat pentru a programa execuția sarcinilor de rutină. Pentru fiecare job programat, planificatorul verifică periodic dacă data și ora curente se potrivesc cu programarea jobului programat. Dacă se potrivește, planificatorul atribuie acea sarcină execuției. Pentru a face acest lucru, pentru această sarcină programată, planificatorul creează o sarcină de fundal, care realizează procesarea efectivă.

Cred că este suficient cu descrierea - să trecem la implementare:

Crearea unei sarcini de rutină

Numele metodei– calea către procedura care va fi executată într-un job de fundal conform unui program dat. Procedura trebuie să fie într-un modul comun. Se recomandă să nu utilizați module comune standard, ci să vă creați propriile module. Nu uitați că joburile de fundal rulează pe server!

Utilizare– semn de utilizare a unei sarcini de rutină.

Predeterminat– indică dacă sarcina de rutină este predeterminată.

Dacă doriți ca sarcina de rutină să funcționeze imediat după ce a fost plasată în baza de date, specificați atributul Predeterminat. În caz contrar, va trebui să utilizați procesarea „Job Console” sau să declanșați ca sarcina să ruleze în mod programatic.

Numărul de reîncercări atunci când un job se încheie anormal– de câte ori a fost repornit jobul de fundal dacă a fost executat cu o eroare.

Interval de reîncercare când jobul se termină anormal– cât de des va fi repornită lucrarea de fundal dacă a fost finalizată cu o eroare.

Stabilirea unui program

Programa finalizarea sarcinii:

În fiecare oră, doar o ziPerioada RepeatDays = 0, Perioada RepeatDays = 3600
În fiecare zi, o dată pe ziPerioada RepeatDays = 1, Perioada RepeatDays = 0
O zi, o datăPeriodRepeatDays = 0
Din două în două zile, o dată pe ziPeriodRepeatDays = 2
În fiecare oră de la 01.00 la 07.00 în fiecare ziPeriodRepeatDays = 1RepeatPeriodDuringDay = 3600StartTime = 01.00

Ora de încheiere = 07.00

În fiecare sâmbătă și duminică la ora 09.00Perioada RepeatDays = 1WeekDays = 6, 7StartTime = 09.00
În fiecare zi timp de o săptămână, săriți peste o săptămânăPeriodRepeatDays = 1PeriodWeeks = 2
La ora 01.00 o datăOra de începere = 01.00
Ultima zi a fiecărei luni la ora 9:00.PeriodRepeatDays = 1DayInMonth = -1StartTime = 09.00
A cincea zi a fiecărei luni la ora 9:00PeriodRepeatDays = 1DayInMonth = 5StartTime = 09.00
A doua zi de miercuri a fiecărei luni la ora 9:00PeriodRepeatDays = 1DayWeekMonth = 2DaysWeek = 3

Ora de începere = 09.00

Caracteristici de execuție a joburilor de fundal în variante de fișier și client-server

Mecanismele de executare a joburilor de fundal în versiunile fișier și client-server sunt diferite.

În versiune de fișier trebuie să creați un proces dedicat clientului care va efectua lucrări de fundal. Pentru a face acest lucru, procesul client trebuie să apeleze periodic funcția context global ExecuteJobProcessing. Doar un proces client pe bază de informații ar trebui să proceseze joburi de fundal (și, în consecință, să apeleze această funcție). Dacă nu a fost creat un proces client pentru a procesa joburi de fundal, atunci când accesați programatic motorul de job, va fi afișată eroarea „Job Manager is not active”. Nu este recomandat să utilizați un proces client care procesează joburi de fundal pentru alte funcții.

Odată ce procesul client care procesează joburile de fundal este pornit, alte procese client pot accesa programatic motorul jobului de fundal, de exemplu. poate rula și gestiona joburi de fundal.

În versiunea client-server Pentru a executa joburi de fundal, se folosește un planificator de activități, care se află fizic în managerul de cluster. Pentru toate joburile de fundal aflate în coadă, planificatorul primește procesul de lucru cel mai puțin încărcat și îl folosește pentru a rula jobul de fundal corespunzător. Procesul de lucru execută jobul și notifică planificatorul despre rezultatele execuției.

În versiunea client-server, este posibilă blocarea execuției sarcinilor de rutină. Executarea sarcinilor de rutină este blocată în următoarele cazuri:

  • Pe baza de informații a fost instalată o blocare explicită a sarcinilor de rutină. Blocarea poate fi setata prin consola cluster;
  • Există un bloc de conexiune în baza de informații. Blocarea poate fi setata prin consola cluster;
  • Metoda SetExclusiveMode() cu parametrul True a fost apelată din limbajul încorporat;
  • În alte cazuri (de exemplu, la actualizarea configurației bazei de date).

Procesarea lansării și vizualizarea sarcinilor programate poti descarca aici.

De obicei locuri de muncă de fundalîn 1C: Întreprinderile sunt lansate de sub reglementări.

Adică, la pornire, o sarcină de rutină generează o sarcină de fundal. Dar dacă este necesar
putem rula un job de fundal și în mod programatic.
În același timp, poate folosi orice metode și proprietăți disponibile pe server, deoarece si ruleaza pe server.
De fapt, munca de fundal în sine nu efectuează nicio acțiune. Tocmai se lansează
pentru a executa o procedură dintr-un modul comun. Dacă procedura utilizează parametri,
pot fi trimise și atunci când este începută o lucrare de fundal.

Să ne uităm la un exemplu simplu. Să creăm o procesare care va rula fundalul
sarcină, care la rândul său va face o înregistrare în jurnalul de bord.

Deoarece
pentru un job de fundal avem nevoie de o procedură comună de modul, haideți să creăm acest modul comun
cu capacitatea de a-și executa procedurile pe server.

Să creăm o procedură în acest modul general care va înregistra în jurnal
înregistrare

Procedura RecordInRegistrationLog(par_EventName, par_Comment) ExportRecordLog(par_EventName, , , , par_Comment) ; Sfârșitul procedurii

După cum puteți vedea, procedura are parametri. Aceasta înseamnă că sarcina de fundal va trebui să facă ceva de genul acesta
modalitate de transfer la procedură.

Acum vom crea o procesare cu care vom lansa o sarcină de fundal.

O vom face pe o formă controlată, dar pentru formele obișnuite nu va exista nicio diferență fundamentală,
se folosesc aceleasi metode. Să creăm un formular simplu cu o singură comandă:


În modulul formular scriem următorul cod:

&OnServer Procedura Scrieți JROnServer() Matrice de parametri = Matrice nouă; Matrice de parametri. Adăuga( „Eveniment. Lucrarea de fundal a fost finalizată cu succes”); Matrice de parametri. Adăuga( „Comentează. Se verifică lucrarea de fundal”); Sarcini de fundal. Alerga ( „site_RoutineTasks.RecordInRegistrationJournal”, Matrice de parametri) ; Sfârșitul procedurii &Pe client Procedura Scrieți JR (comandă) Scrieți JR pe server () ; Sfârșitul procedurii

Începeți o lucrare de fundal folosind metoda Alerga()
manager de post de fundal.

Primul parametru al acestei metode este
numele modulului comun și numele procedurii care va fi executată, tip - șir.
Al doilea parametru este o matrice cu valorile parametrilor pentru procedura apelată.
Ordinea elementelor din matrice trebuie să se potrivească cu ordinea parametrilor din
procedură.
Poate fi indicat și CheieȘi Nume job de fundal.

Acum să testăm procesarea. Să-l deschidem în 1C:mod Enterprise și
Să începem execuția. Apoi, deschideți jurnalul de înregistrare și vedeți că sarcina
a funcționat cu succes și a făcut o înregistrare corespunzătoare în jurnal.

Concept de programare asincronă

Conceptul de programare asincronă este că rezultatul unei funcții nu este disponibil imediat, ci după un timp sub forma unui apel asincron (încălcând ordinea normală de execuție).

Acestea. Ideea principală a programării asincrone este de a emite apeluri individuale de metodă și de a continua să facă alte lucrări în paralel fără a aștepta ca apelurile să se termine.

Unele metode care minimizează probabilitatea excepțiilor nu necesită o abordare asincronă, dar altele o necesită chiar la începutul dezvoltării.

După cum se poate observa din grafice, nu există un coeficient de acțiuni interactive utile ale utilizatorului cu un model de programare sincronă, deoarece sistemul blochează interfața cu utilizatorul, în timp ce cu un model asincron, utilizatorul continuă să lucreze activ în sistem.

Când rulează sincron, aplicația are un singur fir. Cu modelul de programare asincronă, puteți rula mai multe fire de execuție în paralel și puteți reacționa la noile acțiuni ale utilizatorului pe măsură ce rulează. Odată ce n-thread-ul este executat, afișați rezultatul pe ecran.

Sarcini de fundal în 1C: Enterprise 8

În 1C:Enterprise 8, joburile de fundal sunt concepute pentru a îndeplini sarcinile aplicației în mod asincron. Ele pot genera joburi de fundal copii, de exemplu, pentru a paraleliza calcule complexe pe diferite servere de lucru ale clusterului într-un mod de operare client-server.

Este posibil să se restricționeze execuția joburilor de fundal care au aceleași metode pe baza unui criteriu de aplicare specific. Crearea și gestionarea programatică a joburilor de fundal este posibilă de la orice conexiune de utilizator la baza de informații de sistem. Lucrarea de fundal rulează în numele utilizatorului care a creat-o.

Mecanismul sarcinilor funcționează atât în ​​modul de operare client-server, cât și în modul fișier, dar capacitățile de administrare și executare a sarcinilor în ambele versiuni sunt oarecum diferite.

Opțiune client-server

În versiunea client-server, programarea sarcinilor este efectuată de planificatorul de sarcini, care este localizat fizic în managerul de cluster.

Programatorul verifică periodic pentru a vedea dacă au fost primite solicitări pentru a rula joburi în fundal. Dacă există joburi care trebuie executate, planificatorul determină procesele de lucru cel mai puțin încărcate din cluster și atribuie succesiv fiecăruia sarcina de executat. Astfel, același proces de lucru poate executa mai multe joburi în paralel. După ce un job este primit de un proces de lucru, procesul de lucru stabilește o conexiune la baza de informații și execută jobul în cadrul acelei conexiuni. După finalizarea lucrării, procesul de lucru notifică planificatorul dacă lucrarea a fost finalizată cu succes sau fără succes.

Opțiunea fișier

Începând cu versiunea 8.3.3.641 a platformei, dezvoltatorii au simplificat semnificativ munca cu joburi de fundal în versiunea de fișier.

Anterior, pentru a executa automat sarcini, era necesar să se lanseze o sesiune suplimentară separată 1C:Enterprise, folosită ca planificator de sarcini. Și în această sesiune a fost necesar să se execute periodic metoda limbajului încorporat ExecuteTaskProcessing(). Această abordare a fost destul de greoaie, incomodă și a limitat foarte mult utilizarea sarcinilor de bază și de rutină în versiunea fișierului de lucru.

Acum totul a devenit mult mai ușor. Dacă pornește un client subțire sau gros și, de asemenea, dacă serverul web are conexiuni client, atunci în fiecare dintre aceste aplicații este lansat automat un alt fir cu o conexiune la baza de date. Aceste fire sunt angajate în îndeplinirea sarcinilor de bază și de rutină.

Fiecare dintre aplicațiile enumerate își realizează propriile sarcini de fundal. Dacă o aplicație a inițiat mai multe joburi de fundal, acestea sunt executate secvenţial, în ordinea în care au fost primite.

Dezavantajul evident al joburilor de fundal 1C: deoarece sunt executate pe partea serverului, nu există posibilitatea de a lucra interactiv cu utilizatorul (de exemplu, este imposibil să se afișeze un mesaj sau alte informații; toate aceste date trebuie stocate în baza de informații și prelucrate în continuare în într-un fel).

Trebuie remarcat faptul că joburile de fundal sunt obiecte pur software și nu pot fi stocate în baza de date. Adică, putem doar să creăm o instanță a unei clase, să-i inițializam proprietățile și să o lansăm pentru execuție.

Un exemplu de execuție a codului asincron în 1C:Enterprise 8

„Scrierea de programe în care rezultatul unui apel de funcție ajunge necunoscut când este mult mai dificilă decât cele obișnuite. Apeluri imbricate, gestionarea erorilor, control asupra a ceea ce se întâmplă - totul devine mai complicat”, doar cei care nu știu să folosească în mod corespunzător capacitățile platformei vor spune asta, dar nu noi!

Să demonstrăm simplitatea și eleganța execuției codului asincron în 1C:Enterprise 8!

Pasul 1. Să creăm un nou sistem de securitate a informațiilor pentru dezvoltarea configurației

Pasul 2.În configurare vom adăuga modulul general „Manetari asincroni”

De ce am adăugat un modul partajat? Totul este simplu aici: pentru a efectua operațiuni asincrone în 1C:Enterprise 8, se folosesc joburi de fundal, care au propriul manager - „BackgroundTask Manager”. Acest obiect are o metodă „Run”, cu ajutorul căreia este lansată sarcina de fundal.

Să trecem la asistentul de sintaxă.

Deci vom avea nevoie de un modul comun.

Pasul 3.În modulul general „Manetari asincroni” vom adăuga procedura de export OurLongOperation()

Procedura OurLongOperation(Duration) Export // Simularea unei acțiuni pe termen lung (Durata sec.). OperationStartDate = CurrentDate(); While CurrentDate() - Data de începere a operațiunii< Длительность Цикл КонецЦикла; КонецПроцедуры

Pasul 4. Adăugați procesarea „Concept de programare asincronă” la configurație (puteți crea procesare externă)

Adăugați un atribut la formular:

Durată (număr)

si doua echipe

Efectuați LongOperation;

Efectuați o operațiune lungă și lungă în mod asincron.

Pasul 5. Conform asistentului de sintaxă, completați modulul formular

&Pe Procedura Client Efectuați Operațiune de funcționare lungă (comandă) Execute Operațiune de funcționare lungă pe server(); EndProcedure &OnServer Procedure ExecuteLongOperationOnServer() AsynchronousHandlers.OurLongOperation(Duration); Sfârșitul procedurii &Pe procedura client Efectuați operațiune de lungă durată asincron (comandă) Efectuați operațiune de funcționare lungă asincron pe server (); Sfârșitul procedurii &Pe server Procedura Efectuați o operație de lungă durată asincron pe Server() Parametri = New Array; Parametri.Adăugați(Durata); BackgroundTasks.Execute("AsynchronousHandlers.OurLongOperation", Parametri, New UniqueIdentifier, "Exemplu de concept de programare asincronă"); Sfârșitul procedurii

Pasul 6. Hai să lansăm și să verificăm!

Rezultat:

Dacă facem clic pe butonul „Efectuați operație lungă”, atunci interfața cu utilizatorul este blocată pentru „Durata” secunde;

Dacă facem clic pe butonul „Perform long-running operation asynchronously”, interfața cu utilizatorul nu este blocată și codul programului este executat în paralel.

Putem verifica dacă codul programului este executat asincron, analizând jurnalul.

Putem depana codul de program care rulează în „background” dacă setăm proprietatea corespunzătoare în parametrii de depanare.

Un exemplu de execuție a codului asincron în 1C:Enterprise 8 folosind BSP

Să luăm în considerare un exemplu de implementare a conceptului de programare asincronă în 1C:Enterprise 8 în BSP folosind exemplul de procesare „Afaceri curente”.

Logica este următoarea: la lansarea programului, se inițializează zona de lucru a paginii de start, unde poate fi afișat formularul de procesare „Afaceri curente”. Acest formular este completat de afacerile curente ale utilizatorului și este nevoie de timp pentru a-l completa. Dacă dezvoltatorii nu ar avea capacitatea de a executa codul asincron, atunci interfața cu utilizatorul ar fi blocată în timp ce formularul de procesare era completat!

Să analizăm codul de program al formularului.

Evenimentul formular „When CreatedOnServer” apelează procedura „RunBackgroundTask” - de asta avem nevoie.

Fără a fi distras de nuanțe, să analizăm această procedură

Și aici vedem că sunt utilizate managerul de job de fundal și metoda sa „Run”. Rețineți că dezvoltatorii stochează un ID unic pentru jobul de fundal.

Pentru a face acest lucru, dezvoltatorii folosesc metoda ConnectWaitHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>).



În procedura agățată Connectable_CheckTaskComplete() dezvoltatorii apelează funcția JobCompleted(TaskID)


Această funcție verifică execuția unui job de fundal prin identificator.

Trebuie remarcat faptul că BSP a dezvoltat module generale pentru a sprijini operațiunile pe termen lung pe server.

Astfel, conceptul de programare asincronă din 1C:Enterprise 8 crește ușor complexitatea rezolvării problemelor pentru dezvoltator, dar îmbunătățește semnificativ funcționalitatea programului din punctul de vedere al utilizatorului.

Cele mai bune articole pe această temă