Contacte

Procesul de lucru de fundal s-a încheiat anormal. Procesul de lucru în fundal sa încheiat anormal. Obținerea unui obiect de muncă

Întrebare: Procesul de lucru în fundal s-a blocat...


Bună ziua tuturor și o săptămână bună!)
Contabilitatea întreprinderii, ediția 3.0 (3.0.46.11).
Platforma 8.3.9.2033.
La postarea documentelor în grupuri, apare eroarea „Procesul de lucru în fundal sa încheiat anormal”. Nu sunt date motive...
Repornirea serverului SQL, serverul 1C (nu se știe niciodată) nu ajută... Poate cineva a întâlnit o problemă similară??? Este chiar greu de spus când a apărut această eroare, deoarece nu am folosit execuția de grup (închiderea lunii) de mult timp...

Răspuns:() () Bună ziua din nou) Am pornit revista de tehnologie și am găsit aceste lucruri interesante (poate știi care este problema?):
S-a încercat să se efectueze o operație pe un obiect care nu este o priză...
Procesul se încheie. Apel de ieșire refuzat...
Nu au fost găsite servere care găzduiesc serviciul...

Întrebare: Lucrări de fundal


Platforma 1C:Enterprise 8.3 (8.3.9.2170), conf BP 3.0.
Configurația configurează integrarea prin surse de date externe (tip DBMS - OracleDatabase). Au fost adăugate un număr de tabele din care sunt încărcate datele de bază și tranzacțiile. Deoarece Erau o mulțime de date, așa că s-a decis să se facă o descărcare în lot prin joburi de fundal. Dimensiunea porțiunii este de 100.000, dimensiunea lotului este de 10.000, numărul de tranzacții din document este de 1000, numărul de lucrări în fundal care rulează simultan este de 8.
Lansez, incarc, totul este ok. Dar dacă îl pun noaptea, mi se pare că 1c intră în modul de repaus, adică. după ceva timp, după cum arată jurnalul, lucrările de fundal sunt pornite, dar nu sunt finalizate. Ca urmare, s-a dovedit că sarcinile începeau la 12 noaptea, și se terminau la 8 dimineața (când am mutat mouse-ul) și după aceea au continuat să fie executate în modul normal. L-am rulat atât la clienți subțiri, cât și la cei gros. Există o setare în parametri - timpul de a adormi într-o sesiune pasivă este 1200, dar acest lucru nu se aplică doar clientului subțire și ar putea fi aceasta o problemă? Nu vreau să dezactivez acest lucru, pentru că... utilizatorii nu ies din program, lasă-i să adoarmă. A mai intampinat cineva o problema asemanatoare? Cum te-ai hotarat?

Răspuns:

Nu există o astfel de posibilitate.

Care este rostul să rulezi o lucrare de fundal și să aștepți să se finalizeze?
pentru a nu crea mai mult de 8 sarcini de fundal?

Trageți „managerul” joburilor de fundal în partea de server și lăsați-l să controleze....

Am rulat 40-50 de sarcini de fundal pe Pentuim D840 - zborul a fost normal, apoi a fost limitat de procesor/memorie.

Întrebare: Cum se transferă un fișier într-o lucrare de fundal


Platforma 8.3.6.2152
Trebuie să transferați fișierul de la UV la o lucrare de fundal pentru procesarea ulterioară.
Fa asta:
&OnClient
Procedură Command1(Command) FileDD = New BinaryData(FileName); StorageAddressForBackground = PlaceInTemporaryStorage(FileDD, UniqueIdentifier); Start UploadLoadOnServer(StorageAddressForBackground) EndProcedure &OnServer Funcția StartUploadLoadOnServer(StorageAddressForBackground) Metodă Parametri = New Array; MethodParameters.Add(StorageAddressForBackground); Job = BackgroundTasks.Run("MyGeneralModule.MyBackground", MethodParameters); EndFunction
În modulul general:

Procedura MyBackground(StorageAddress) Export FileDD = GetFromTemporaryStorage(StorageAddress); Dacă TypeValue(FileDD) = Type(„BinaryData”), atunci Înregistrare în jurnal Înregistrare în jurnal("Depanare","Fără DD"); EndIf ; Sfârșitul procedurii Am încercat asta: PlacedFiles = New Array; PlacedFiles.Add(NewDescriptionofTransferFile(FileName)); PlacedFiles = New Array; Dacă NU PlaceFiles (PlaceFiles, PlaceFiles, False, UniqueIdentifier), atunci returnați; EndIf ; StorageAddressForBackground = PlacedFiles.Storage; Am încercat asta: StorageAddressForBackground = PlaceInTemporaryStorage(Undefined, UniqueIdentifier); PlaceFile(StorageAddressForBackground, FileName, False);
Este transferat în mod normal de la fundal la client prin stocare temporară, dar din anumite motive nu se transferă de la client în fundal.

Răspuns:În general, totul s-a dovedit a fi destul de simplu. Se dovedește că puteți trece în mod prostesc Date Binare ca parametru unui job de fundal. Pentru amatorii necalificați să citeze referințe și să le spună că „așa a fost intenționat”, codul de lucru este:
&OnClient
Procedură Command1 (Comandă) Porniți UploadLoadOnServer(New BinaryData(FileName)) EndProcedure
Funcția &OnServer StartUploadLoadOnServer(DD) Metodă Parametri = New Array; MethodParameters.Add(DD); Job = BackgroundTasks.Run("MyGeneralModule.MyBackground", MethodParameters); EndFunctions Procedura MyBackground(FileDD) Export If TypeValue(FileDD) = Type("BinaryData") Then Înregistrare în jurnal("Depanare","Da DD"); In caz contrar Înregistrare în jurnal("Depanare","Fără DD"); EndIf ; Sfârșitul procedurii

Întrebare: Rularea unui job de fundal sub utilizatorul dorit


Buna ziua!
Există 1C:Enterprise 8.3 (8.3.11.2924), UT 11.3.4.93 client - server.
În această configurație, mișcările în registrul „Decontări cu clienți pe documente” se efectuează nu la momentul înregistrării documentului, ci cu sarcina de rutină „Executarea mișcărilor amânate în decontări cu clienți\furnizori”.
În același timp, uneori sarcina de rutină a generat o eroare, deoarece a încercat să facă mișcări într-o perioadă închisă (Înainte de data interzicerii editării). În setările sarcinii de rutină, am înregistrat un utilizator special a cărui dată de interzicere era deschisă, după care totul a început să funcționeze.
Cu toate acestea, este necesar să se asigure că aceste mișcări în registre se fac în momentul în care documentul este postat, și nu atunci când lucrarea de fundal este începută conform programului.
Dacă rulați codul în sine, care efectuează o sarcină de rutină atunci când postați un document, atunci apare aceeași eroare - perioada este închisă. Și dacă rulați în mod programatic o sarcină de fundal care rulează același cod în momentul în care documentul este postat, atunci provoacă exact aceeași eroare, deoarece perioada este închisă, iar jobul de fundal, lansat programatic, este lansat sub numele utilizatorului curent, iar data banului acestuia este închisă. Cu toate acestea, atunci când o lucrare de fundal este lansată conform unui program, care are utilizatorul „corect” instalat în planificator, atunci totul merge cu succes. Iată cum să faceți acest lucru programatic, cum să rulați programatic o sarcină de fundal sub utilizatorul dorit „prin programator”, așa cum fac sarcinile programate standard, vă rog să-mi spuneți?

Răspuns:

Nu este cel pentru care este configurat?
Aceasta trebuie să fie o eroare de configurare

Lis2007 a spus:

Bună ziua! Uneori, sarcina de rutină a generat o eroare deoarece... a încercat să facă mișcări într-o perioadă închisă (Înainte de data interzicerii editării). În setările sarcinii de rutină, am înregistrat un utilizator special a cărui dată era deschisă, după care totul a început să funcționeze

Faceți clic pentru a extinde...

Întrebare: Depanarea unui job de fundal


Lucrarea de fundal rulează cu o eroare. Am decis să-l depanez.
Îl lansez prin procesare externă cu o singură linie:
BackgroundTasks.Run("MyModule.MyTask");
Punctul de întrerupere din modul nu este atins.
Depanarea pe server este permisă, depanarea este verificată, conexiunea automată, joburile de fundal sunt activate. Ce altceva ar putea fi problema?

Răspuns:În modulele comune, a existat un apel la funcții care necesitau mai degrabă clientul decât execuția serverului. A trebuit să le pun între paranteze #If Client Then. A funcționat și cel de fundal.

Întrebare: Eroare la efectuarea unui schimb


Bună ziua. Spune-mi unde să sap:
Efectuez schimb in baza de date contabila. Aproximativ trei duzini de documente sunt încărcate de la UT-shka printr-un schimb standard. Se gândesc mult timp (aproximativ o oră) și se încheie cu mesajul:
Procesul de lucru în fundal s-a blocat

Probabil că fiecare programator 1C 8.3 mai devreme sau mai târziu a trebuit să configureze execuția anumitor sarcini într-un program. Mai jos voi oferi o descriere detaliată a acestor mecanisme, sper că acestea vor fi informații utile pentru programatorii începători 1C. Acest lucru este foarte convenabil, deoarece nu necesită acțiune umană, sarcina de rutină este configurată o singură dată și funcționează conform programului dvs.

Veți găsi instrucțiuni detaliate folosind un exemplu de mai jos.

Care sunt sarcinile de rutină și de fundal în 1C

  • Sarcini programate este un mecanism special 1C Enterprise 8.3 conceput pentru a efectua o acțiune specifică conform unui program dat.
  • Lucru de fundal- obiecte generate de o sarcină de rutină care realizează direct acțiunea intenționată fără participarea utilizatorului sau a programatorului 1C 8.2.

Mecanismul joburilor programate și de fundal funcționează în modul client-server (SQL), datorită funcționalității DBMS. Dacă aveți o bază de date de fișiere, atunci și sarcina poate fi configurată, dar după un principiu puțin diferit.

Configurarea joburilor de fundal în modul client-server 1C

Mai întâi, să creăm un nou obiect de metadate - o sarcină de rutină. Îmi voi numi sarcina „Încărcare cursuri valutare”. Să ne uităm la paleta de proprietăți a acestui obiect de configurare:

Obțineți 267 de lecții video pe 1C gratuit:

  • 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. Este recomandat să nu folosiți cele standard, ci să vă creați propriile. Nu uitați că joburile de fundal rulează pe server!
  • Utilizare— un 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 acest indicator. În caz contrar, va trebui să utilizați procesarea Job Console sau să faceți ca jobul 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.

Și cel mai interesant decor este Programa:

Aici configurați intervalul de lansare al procedurii specificate în câmpul „Numele metodei”. Să zicem că am configurat

Atenţie! Nu uitați să dezactivați blocarea execuției joburilor de rutină și de fundal la nivel DBMS!

Acest lucru se poate face în utilitarul de administrare al versiunii client-server sau la crearea unei noi baze de date:

Configurarea sarcinilor de rutină în modul fișier 1C

În modul fișier, configurarea unor astfel de lucrări este ceva mai dificilă. Pentru o astfel de sarcină, trebuie lansată o sesiune separată a programului 1C. Acest lucru este adesea rezolvat prin crearea unui utilizator „tehnic” a cărui sesiune rulează mereu.

În modul fișier, un job de rutină este inițializat atunci când este lansată metoda „RunTaskProcessing()”.

Pentru un anumit utilizator, puteți configura această metodă să ruleze folosind o altă metodă -

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

  • Numele procedurii— numele procedurii conectate ca operator de așteptare. Numele procedurii exportate a unui modul de aplicație gestionat (un modul de aplicație obișnuit) sau a unui modul partajat global. Procedura trebuie să fie localizată pe client.
  • Interval— perioada dintre execuțiile operațiunilor în secunde.
  • O dată- cum să finalizați sarcina, o dată sau nu.

ConnectWaitHandler, 3600);

Un videoclip de două minute care arată cum să configurați o sarcină de rutină în configuratorul 1C:

Probabil, nici o singură configurație serioasă pe 1C 8.3 sau 8.2 nu poate face fără utilizarea sarcinilor de rutină și de fundal. Sunt foarte convenabile, deoarece vor fi executate conform unui program clar definit, fără intervenția utilizatorului sau programatorului.

De exemplu, trebuie să faceți schimb de date cu un alt program o dată pe zi. Folosind sarcini de rutină și de fundal, 1C va putea efectua aceste acțiuni în mod independent, de exemplu, în timpul orelor de lucru. Această metodă nu va afecta în niciun fel experiența utilizatorului și va ajuta la economisirea de timp.

Mai întâi, să ne dăm seama ce înseamnă și care este diferența lor:

  • Activitate programata vă permite să lansați orice acțiuni specifice conform unui program preconfigurat.
  • Lucru de fundal este un obiect care conține acțiunile de efectuat.

Să presupunem că compania noastră vinde ceva și are propriul site pe care se află prețurile. Dorim să le încărcăm o dată pe zi pentru a menține relevanța.

Deschideți configurația și adăugați o sarcină programată.

Setarea proprietăților

Să ne uităm la cei mai importanți parametri care trebuie completați în proprietățile sale.

  • In camp " Numele metodei» selectează procedura unui modul general specific care va fi executat direct. Acesta va indica toți pașii pentru încărcarea prețurilor pe site-ul nostru. Vă rugăm să rețineți că execuția va avea loc pe server. Acest lucru este logic, deoarece operațiunile de rutină sunt efectuate fără participarea utilizatorului.
  • Sarcina programată poate fi dezactivată sau activată după cum este necesar. Nu este nevoie să-i editezi programul de fiecare dată. Pentru a face acest lucru, în paleta de proprietăți, setați sau ștergeți steagul " Utilizare».
  • Un alt lucru important este să stabiliți dacă această sarcină de rutină va fi predeterminat, sau nu. Activitățile programate predefinite sunt lansate automat. Dacă această caracteristică nu este instalată, atunci va trebui să le lansați în mod programatic sau să utilizați procesarea „Consola de activități” cu ITS.
  • De asemenea, puteți specifica numărul de repetări și intervalul dintre eleîn caz de încetare anormală. Încetarea anormală se referă la acele situații în care lucrările nu au fost finalizate din cauza unei erori.

Stabilirea unui program

Pasul final este să stabilim un program pentru încărcarea noastră pe site folosind hyperlinkul corespunzător din paleta de proprietăți.

Veți vedea o setare tipică de program în 1C 8.3. Nu este nimic complicat aici. În acest exemplu, am configurat lansarea încărcării noastre de prețuri pe site în fiecare zi, de la cinci la șapte dimineața. În cazul în care sarcina programată nu are timp să fie finalizată înainte de ora 7:00, aceasta va fi finalizată chiar a doua zi.

Blocarea sarcinilor programate

Rulați utilitarul standard „Administrarea serverelor 1C Enterprise” și deschideți proprietățile bazei de informații în care ați creat sarcina de rutină (pentru versiunile client-server ale 1C).

În fereastra care se deschide (după ce ați introdus datele de conectare și parola pentru a accesa securitatea informațiilor), verificați dacă caseta de selectare „Blocarea sarcinilor de rutină este activată” nu este bifată. Dacă întâmpinați o situație în care sarcina nu funcționează, verificați mai întâi această setare.

În același mod, puteți dezactiva complet sarcinile de rutină în 1C 8.3. Pentru a dezactiva anumite lucrări de fundal, puteți utiliza procesarea „Background Job Console” încorporată în cele mai recente versiuni.

Activități de fundal și programate în modul fișier

În acest mod, configurarea și lansarea acestor sarcini este mult mai dificil de organizat. Cel mai adesea, se creează un cont suplimentar, a cărui sesiune va fi întotdeauna deschisă.

În acest caz, sarcinile de rutină sunt activate folosind metoda „RunTaskProcessing()”.

De asemenea, puteți utiliza următoarea construcție:

Ca nume de procedură, trebuie să specificați numele procedurii client care va fi executată. Intervalul arată câte secunde mai târziu va avea loc execuția. Parametrul „O singură dată” nu este necesar. Acesta reflectă dacă această procedură va fi efectuată o dată sau de mai multe ori.

Urmărirea erorilor în joburile de fundal

Puteți vedea progresul lucrărilor de fundal, precum și prezența unor posibile erori, în jurnal. În filtru, selectați aplicația „Lucră de fundal” și, dacă este necesar, selectați importanța interesului, de exemplu, doar „Erori”.

Jurnalul va afișa toate intrările care se potrivesc cu selecția dvs., împreună cu un comentariu care vă va ajuta să înțelegeți motivul erorii.

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ă faci 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 de server, 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 să fie 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țiune 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ă la o funcție 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.

Ne permite să efectuăm orice calcule în sistem neobservate de utilizator, adică în fundal. Mai mult, acest mecanism ne permite să paralelizăm procesul de calcul. Putem chiar paraleliza procedura care va fi executată. Pentru a face acest lucru, jobul nostru de fundal trebuie să ruleze mai multe joburi de fundal. În acest caz, procesele sunt paralelizate și, dacă avem un sistem multiprocesor, multi-core, algoritmul nostru va funcționa eficient. După lansarea mai multor procese, putem spune sistemului că trebuie să aștepte finalizarea acestor procese pentru a combina cumva rezultatul.

De exemplu, în configurațiile tipice, în timp ce utilizatorul lucrează, sunt executate diferite tipuri de joburi de servicii de fundal. Acest lucru poate fi evidențiat de intrările de jurnal care înregistrează faptul că astfel de acțiuni au fost efectuate. Mai mult, acest lucru nu afectează în niciun fel munca utilizatorului, pur și simplu nu le observă.

În mod ideal, un job de fundal este implementat într-o versiune client-server, caz în care întreaga încărcare merge către server. În ceea ce privește versiunea fișierului, este posibilă o lucrare de fundal, dar are unele particularități.

Acesta este ceea ce va produce sistemul dacă nu luați în considerare aceste caracteristici și executați un job de fundal în versiunea de fișier a bazei de informații.


Lucrarea de fundal 1C are unele limitări. Deoarece rulează pe partea serverului, nu există posibilitatea de a lucra interactiv cu utilizatorul. De exemplu, nu puteți afișa un mesaj sau nicio informație. Toate aceste date trebuie stocate în baza de informații și procesate în continuare într-un fel.
Contactând asistentul de sintaxă, puteți obține informații mai detaliate despre joburile de fundal 1C. Trebuie remarcat aici că acest obiect este pur software și nu este în niciun fel stocat în baza de date. Adică, creăm o instanță a clasei, inițializam proprietățile și o lansăm pentru execuție.

Ce instrumente avem pentru a gestiona joburile de fundal? Această facilitate este un obiect de metadate „Manager de activități de fundal”. Acest obiect are o metodă "Alerga", folosind această metodă, se lansează jobul de fundal.

Are urmatorii parametri:
„NumeMetodă”- denumirea procedurii sau funcției de executat și trebuie să fie o procedură sau funcție a contextului serverului;

"Opțiuni"- o matrice de parametri, al căror număr de elemente trebuie să corespundă numărului de parametri ai procedurii/funcției noastre specificate în parametru „NumeMetodă”;

"Cheie"- o anumită cheie de unicitate, care este o linie prin care sistemul înțelege dacă o sarcină de fundal trebuie lansată sau dacă o astfel de sarcină rulează deja;

"Nume"- aici puteți specifica o descriere arbitrară a metodei noastre.

Valoarea returnată este un obiect „Sarcina de fundal”, care conține numele metodei curente, cheia curentă și alte câteva proprietăți și metode. O astfel de metodă este metoda „Așteptați finalizat”. Scopul său este că putem spune sistemului să nu facă nimic până la finalizarea lucrării de fundal.

Job de fundal 1C 8.2, 8.3 - Exemplu de utilizare

Să dăm un exemplu de lucru cu joburi de fundal 1C. În primul rând, vom crea un algoritm simplu care va încărca pentru scurt timp sistemul 1C în așa fel încât să nu putem face nimic în acest moment.

Pentru aceasta:

1. Să creăm un modul comun „Gestionari de sarcini de fundal”, care va fi compilat pe partea de server;


2. Vom descrie în el procedura de export „ProduceBackgroundCalculation(Parameter)”, care ia un parametru de tip șir;

Procedură PerformBackgroundCalculation(Parameter) ExportStartTime = CurrentDate() ; În timp ce CurrentDate() - Ora de începere< = 6 Цикл КонецЦикла ; КонецПроцедуры Процедура КнНажатие() ОбработчикиФоновыхЗаданий. ПроизветиФоновоеВычисление(„Ceva parametru”); Sfârșitul procedurii
Gata. Acum, când începeți procesarea și apăsați un buton, sistemul îngheață câteva secunde, timp în care nu se poate face nimic. Este exact ceea ce trebuia să facem.

Acum ne vom asigura că aceste calcule sunt efectuate în fundal, adică astfel încât sarcina de fundal 1C 8.2, 8.3 să fie executată, dar să nu interfereze cu noi.

Pentru aceasta:

1. În procesare, în evenimentul butonul click, scrieți următorul cod.

Procedura KnPress() Parametri = New Array; Opțiuni. Adăuga( „Ceva parametru”); Sarcină de fundal. Alerga ( „Gestionare de sarcini de fundal. Efectuați calculul de fundal”, Parametri, Nou UniqueIdentifier, "Test"); Sfârșitul procedurii

Aici trecem numele procedurii modulului comun ca prim parametru și o matrice de parametri ca al doilea. Al treilea parametru trebuie să primească o cheie unică, iar al patrulea parametru o descriere a procedurii noastre.



Ți-a plăcut articolul? Împărtășește-l