Configurați o sarcină de rutină 1s. Sarcini de rutină și de fundal (1Cv8). Adăugarea unei sarcini programate

" În acesta, ne vom uita la noi funcții care nu se referă la interfața sistemului, dar extind semnificativ funcționalitatea oferită de platforma 1C:Enterprise 8.

Aplicabilitate

Articolul discută versiunea 8.3.4.437 a platformei 1C:Enterprise. Toate funcționalitățile descrise în articol au fost actualizate la versiunea 8.3.11.

Alte inovații în 1C: Enterprise 8.3

Să continuăm să ne familiarizăm cu inovațiile platformei 1C:Enterprise 8.3.

Sarcini de bază și de rutină în baza de informații de fișiere

În multe configurații tipice ale platformei 8.2 exista o constantă care indica utilizatorul sub care au fost executate sarcinile în versiunea fișierului.

Când sistemul a început să ruleze sub acest utilizator, a fost conectat un handler de așteptare, care a numit metoda limbajului încorporat cu o anumită periodicitate ExecuteTaskProcessing().

Această abordare a creat dificultăți și inconveniente suplimentare pentru utilizarea sarcinilor de rutină în baza de date de fișiere.

Acest lucru ar putea fi deosebit de critic atunci când lucrați cu configurații precum „Automatizare cuprinzătoare” sau „Managementul întreprinderii de producție”, în care sarcinile de reglementare joacă un rol destul de important.

Dacă acesta este fișierul IB, atunci
=
Constants.UserForExecutingRoutineTasksInFileVariant.Get();
Dacă chValueVariable(„glCurrentUser”) =
UserTo ExecuteTaskRegl Apoi
// cu un interval de secunde numim procedura de lucru cu sarcini de rutină
Suport RegularTaskForFileVersion();
IntervalForPoll=
Constantes.IntervalForPollingRoutineTasksInFileVariant.Get();
Dacă IntervalForPoll= Nedefinit
SAU IntervalForPoll= 0 Atunci
IntervalForPoll= 60 ;
EndIf ;
ConnectWaitHandler(„Suport pentru RoutineTaskForFileVersion”,
IntervalForPoll);
EndIf ;
EndIf ;

Pe platformă 8.3 a implementat munca de fundal și de rutină în baza de informații de fișiere fără a utiliza apelul la metoda context global ExecuteTaskProcessing().

Sarcinile de fundal și de rutină sunt efectuate direct într-una dintre aplicațiile client (client subțire, gros) sau printr-o extensie de server web.

Un job de fundal început de o sesiune este executat de aceeași aplicație client care a inițiat-o.

Lucrările de fundal sunt executate secvenţial, de exemplu. Pe o aplicație client, o singură activitate de fundal (inclusiv cele de rutină) poate fi executată la un moment dat.

Sarcinile de rutină sunt efectuate de o singură aplicație client. Pentru a controla lansarea sarcinilor programate, este utilizată o tastă de linie de comandă /AllowExecuteScheduledJobs.

Sarcinile de rutină sunt executate de prima aplicație client din ordinea de pornire, care nu este interzis să execute sarcini de rutină (pentru a interzice sesiunea, sesiunea trebuie lansată cu parametrul liniei de comandă /AllowExecuteScheduledJobs -Off).

Când acea sesiune se termină, execuția trece la oricare dintre sesiunile rămase în curs de desfășurare.

Dacă linia de lansare a aplicației client indică în mod explicit necesitatea de a rula sarcini de rutină (în linia de comandă este indicat /AllowExecuteScheduledJobs -Force), apoi încep să fie executate sarcini de rutină pe acesta, indiferent de prezența altor sesiuni.

Sarcinile de rutină sunt procesate o dată la 60 de secunde.

Rețineți că sarcinile de rutină ale soluției aplicației (în versiunea fișierului) au început să fie executate nu mai devreme de 1 minut după lansarea aplicației client. Începând cu versiunea 8.3.8, acest timp a fost dublat și, prin urmare, sarcinile de rutină încep să fie executate la maximum 2 minute după lansarea clientului (în versiunea fișierului).

Această decizie se datorează unei reduceri a întârzierii la demararea cererii. În plus, versiunea 8.3.7 a adăugat capacitatea de a determina rapid dacă sesiunea curentă este o sesiune de lucru în fundal. Acest lucru este implementat folosind noua metodă de context global GetCurrentInfoBaseSession(), precum și o nouă metodă pentru sesiunea bazei de informații GetBackgroundTask().

Mai jos este codul care ilustrează cele de mai sus:

Pentru marire, click pe imagine.

Calculul sumelor de control

Platforma include acum mecanisme pentru calcularea sumelor de verificare a datelor.

Să ne amintim că o sumă de control (hash) este o valoare calculată dintr-un set de date prin aplicarea unui anumit algoritm și folosită pentru a verifica integritatea datelor în timpul transmiterii sau stocării.

Hash-urile pot fi folosite pentru a verifica identitatea datelor (de exemplu, trebuie să vă asigurați că fișierul nu a fost deteriorat la transferul acestuia; verificați dacă au fost făcute modificări fișierului și, dacă da, apoi încărcați-l din nou în baza de date) .

În acest scop, în platformă a fost implementat un obiect HashingData, disponibil pe server, în clientul gros, conexiune externă, precum și pe serverul de aplicații mobile.

Acest obiect are două metode: Adăuga()Și Adauga fisier(), care actualizează suma hash ținând cont de datele trecute în parametri.

Platformă 8.3.4.437 acceptă calcularea următoarelor funcții hash: CRC32, MD5, SHA1, SHA256. Dar funcțiile SHA1Și SHA256 nu sunt acceptate pe platforma mobilă.

Să ne uităm la un exemplu simplu. Se presupune că pe server în directorul programului există un fișier „ ragent.exe" Trebuie să calculezi MD5-sumă pentru acest fișier.

Pentru a face acest lucru, vom crea o prelucrare externă, pe forma căreia vom plasa comanda calculati. Handler-ul conține următorul cod:

&OnClient
Procedură Calculați (comandă)
Rezultat = CalculateOnServer();
Raport (Șir (Rezultat));
Sfârșitul procedurii
&Pe server
Funcţie CalculateOnServer()
Hash = Nou HashingData(HashFunction.MD5);
Hash.AddFile(CatalogPrograme() + „ragent.exe” );
Returnează Hash.HashSum ;
EndFunction

În platforma de ediție 8.3.10+ în metoda Adăuga() obiect HashingData A devenit posibilă utilizarea unui flux de date binare, ceea ce a simplificat foarte mult utilizarea acestora în rezolvarea diferitelor probleme aplicate de actualizare a sumelor hash.

Lucrul cu versiuni protejate de protocoale SMTP/POP3

Pe platformă 8.3 a devenit posibilă utilizarea versiunilor protejate ale protocoalelor SMTP/POP3(există termeni SMTPS/POP3S sau SSLSMTP/SSLPOP3).

Pentru obiect InternetMailProfile noi proprietăți implementate:

  • Utilizați SSLSMTP;
  • UtilizațiSSLPOP3;
  • Numai Secure AuthenticationSMTP;
  • Numai POP3 Secure Authentication.

Proprietăți Autentificare SMTPȘi Autentificare POP3 obiect InternetMailProfile, precum și transferuri Metoda de autentificare SMTPAȘi Metoda de autentificare POP3 Nu este recomandat să le folosiți - sunt acceptate pentru compatibilitate.

Folosind un protocol securizat SMTPS face posibilă trimiterea de e-mailuri de la 1C folosind o cutie poștală Google.

Să ne uităm la un exemplu. Pe formular vom plasa câmpuri pentru introducerea subiectului scrisorii și a adresei destinatarului, iar pentru introducerea textului scrisorii - un câmp de document formatat.

Pentru marire, click pe imagine.

Când apăsați butonul Trimite Se va executa următorul cod:

&OnClient
Procedură Trimitere (comandă) Mail = New InternetMail; Profil = Nou InternetMailProfile;
Profil.SMTPServerAddress= „smtp.googlemail.com” ;
Profil.UserSMTP= “[email protected]” ;
Profil.ParolăSMTP= „PAROLA” ;
Profil.Utilizați SSLSMTP= Adevărat;
Profil.SMTPPort = 465 ; Atentat, încercare
Mail.Connect(Profil);
Excepție
Raport(Descrierea erorii());
Întoarcere ;
EndTempt ; MailMessageText= “” ;
Atașamente = Structură nouă ;
Text.GetHTML(MailMessageText, Atasamente ); MailMessage= Nou InternetMailMessage;
MailMessage.Recipients.Add(La care );
MailMessage.Subiect= Subiect;
MailMessage.Textes.Add(MailMessageText,
MailMessageTextType.HTML); Mail.Send ( MailMessage); Mail.Deconectare();
Sfârșitul procedurii

Rețineți că, în exemplul nostru, dacă serverul SMTP nu a putut trimite un e-mail către destinatarii, atunci metoda Mail.Send(MailMessage) a aruncat o excepție. Acest lucru a cauzat anumite neplăceri dezvoltatorilor, deoarece... Motivul pentru care s-a aruncat excepția nu a fost evident.

În versiunea 8.3.9, acest comportament s-a schimbat, iar acum metoda Send() returnează o potrivire a cărei cheie este destinatarul și a cărei valoare este diagnosticul de la serverul de e-mail. Acest lucru vă permite să determinați cu exactitate motivele eșecului de a trimite un mesaj de e-mail fiecărui destinatar. În modul de compatibilitate cu versiunea 8.3.8, comportamentul nu s-a schimbat.

Imprimare față-verso

Pe platformă 8.2 Platforma în sine nu gestiona imprimarea duplex; această funcție putea fi controlată doar folosind driverul de imprimantă.

Pe platformă 8.3 a devenit posibilă controlul tipăririi duplex pentru un document foaie de calcul, o diagramă grafică (din limbajul încorporat și interactiv) și un document text (doar interactiv).

Enumerările de sistem au apărut în limbajul încorporat:

  • Tip de imprimare duplex(Niciunul, FlipUp, FlipLeft);
  • (Automat, MirrorTop, MirrorLeft, Nu utilizați).

Și pentru obiecte TabularDocumentȘi GraphicScheme au apărut proprietăți Imprimare față-versoȘi Alternarea aranjamentelor paginilor, cu care puteți modifica aspectul paginilor tipărite.

În versiunea platformei 8.3.9, enumerarea sistemului DuplexPrintType are o nouă valoare adăugată Utilizați setările imprimantei. Selectarea acestei valori a permis ca setările imprimantei să fie utilizate la tipărirea documentelor de sistem. În modul de compatibilitate 8.3.8, comportamentul este neschimbat și setările corespunzătoare ale imprimantei sunt ignorate.

Dialogul pentru publicarea unei baze de informații pe un server web a fost făcut mai funcțional. Acum, publicarea din configurator vă permite să setați toți parametrii fișierului implicit.vrd.

Pentru dialogul de publicare a unui client web și a serviciilor web prin configurator, se implementează următoarele:

  • capacitatea de a controla disponibilitatea serviciilor Web în mod implicit (atribut pointEnableCommon element ws);
  • capacitatea de a controla execuția joburilor de fundal în versiunea fișierului (atribut permitexecutescheduledjobs element ws).

Dacă caseta de selectare „Publicați serviciile web în mod implicit” pe marcaj "De bază" este instalat, apoi la actualizarea publicației, serviciile Web selectate vor fi publicate automat.

În caz contrar, serviciile Web vor fi marcate ca nepublicabile. Acest steag corespunde atributului pointEnableCommon element wsîn dosar implicit.vrd, destinat configurarii unui client web si a serviciilor web.

Atribut pointEnableCommon ws element este responsabil pentru posibilitatea de a utiliza în această bază de informații servicii web care sunt publicate fără a indica în mod explicit permisiunea de utilizare (atribut permite element punct).

Dacă atributul are o valoare Adevărat, apoi toate serviciile Web pentru care valoarea atributului nu este specificată în mod explicit permite element punct, vor fi permise pentru utilizare.

În caz contrar, utilizarea unor astfel de servicii web va fi interzisă.

Setări „Lucrări de fundal în modul fișier” se potrivește cu atributul permitexecutescheduledjobs ws element din fișier implicit.vrd.

Atribut permitexecutescheduledjobs controlează capacitatea de a executa sarcini de rutină de către extensia serverului web pentru versiunea de fișier a bazei de informații.

Atributul poate lua următoarele valori:

  • oprit– în acest caz, extensia serverului web nu va efectua sarcini de rutină. Sarcinile de rutină vor fi efectuate de o aplicație client (dacă există), care se conectează direct la baza de informații, fără a utiliza un server web.
  • forta– în acest caz, extensia serverului web va efectua sarcini de rutină.
    Dacă valoarea acestui atribut nu este specificată, atunci sarcinile de rutină vor fi efectuate de aplicația cu care se va realiza prima conexiune la infobază.

Fereastra de publicare a serviciului web a devenit și mai convenabilă și mai ergonomică în versiunea actuală a platformei. Acum, parametrii care descriu autentificarea OpenID sunt plasați într-o filă separată.

Numerotarea obiectelor bazei de informații

Pe platformă 8.3 Mecanismul de numerotare automată a obiectelor de bază de informații a fost reelaborat. Unicitatea unui număr sau cod (inclusiv cele obținute ca urmare a generării automate a unui număr sau cod) este întotdeauna verificată la înregistrarea unui obiect.

O indicație a numărului sau codului care nu este unic a fost adăugată textului mesajului despre încălcarea unicității unui număr sau cod.

Utilizarea unui număr sau cod vacant sa schimbat. Un nou număr sau cod este atribuit fără a utiliza numere sau coduri eliberate dacă există deja numere sau coduri emise cu un prefix mai mare (în ordine) al numărului sau codului.

Funcții agregate ale limbajului de expresie al sistemului de compunere a datelor

Noi funcții de agregare sunt implementate în limbajul de expresie al sistemului de compunere a datelor:

  • Fiecare();
  • Orice();
  • StandardDeviationofPopulation();
  • StandardSampleDeviation();
  • VarianceSamples();
  • VarianceofPopulation();
  • CovariancePopulation();
  • SampleCovariance();
  • Corelație();
  • Panta de regresie();
  • RegressionSegment();
  • RegressionCount();
  • RegressionR2();
  • RegressionAverageX();
  • RegressionAverageY();
  • RegressionAverageSXX();
  • RegressionAverageSYY();
  • RegressionAverageSXY().

După cum indică numele, acestea sunt funcții statistice, ceea ce înseamnă că dezvoltatorii au posibilitatea de a crea rapoarte complexe fără a fi nevoiți să dezvolte proceduri pentru calcularea datelor statistice.

Pentru marire, click pe imagine.

După cum puteți vedea din figură, nu există funcții noi în lista derulantă, dar dacă le introduceți manual, nu va apărea niciun mesaj de eroare și va fi generat raportul:

De asemenea, este de interes și o funcție nouă ClasificareABC(). Rezultatul funcției va fi numărul clasei, începând de la 1 (1 corespunde clasei A, 2 clasei B, 3 clasei C etc.).

Să demonstrăm cum funcționează această funcție. Să creăm un nou raport extern „Clasificarea mărfurilor” pe baza cererii:

ALEGE
Consumul de produseProduse.Produs,
Produs ConsumProduse.Cantitate
DIN
Document.Consumul de bunuri.Marfa CUM Consumul de produseProduse

Să definim un nou câmp calculat Clasă:

Pentru marire, click pe imagine.

Să configuram resursele după cum urmează:

Pentru marire, click pe imagine.

În modul utilizator, raportul arată astfel:

În concluzie, observăm că de la ediție la ediție în platforma 1C 8.3 mecanismul ACS este îmbunătățit și perfecționat în mod constant, iar în cadrul articolului nostru „începător” nu este posibil să prezentăm aceste modificări în totalitate. Da, acest lucru pare inutil, deoarece atunci când lucrați la versiunea actuală a platformei, puteți utiliza întotdeauna diverse sisteme de ajutor care să vă ajute să analizați cutare sau cutare aspect al funcționării acestui mecanism.

În plus, nu uitați de cursul nostru separat Dezvoltarea profesională a rapoartelor din 1C 8.3 privind sistemul de compunere a datelor, care descompune la atom toate subtilitățile și capcanele atunci când lucrați cu acest mecanism. Verificați singur demonstrația.

Deci, să rezumam rezultatele intermediare. Până în acest moment, ne-am familiarizat cu noile capabilități ale interfeței Taxi și formularele gestionate, precum și cu unele capabilități neprevăzute anterior ale platformei în sine. Acum este timpul să vedem ce caracteristici convenabile au devenit disponibile dezvoltatorului în configurator.

Întrebarea pe care am pus-o în titlul articolului este relevantă pentru mulți administratori de sistem care lucrează cu acest produs. Pe cât posibil, încercăm să vorbim despre parametrii care afectează performanța 1C și să dezminți miturile populare. Astăzi, folosind exemplul unui caz recent, vrem să vă vorbim despre un alt aspect care poate afecta serios productivitatea - sarcinile de rutină.

Să începem cu un caz real. Nu cu mult timp în urmă, unul dintre clienții noștri ne-a contactat cu o plângere privind „frânele” 1C ale unuia dintre angajații săi. Simptomele au fost că, după o anumită perioadă de timp, configurația Trade Management 10 a început să încetinească foarte mult sau, mai simplu, a înghețat de ceva timp.

O analiză mai detaliată a situației a relevat că acest lucru se întâmplă doar unui singur angajat și, la orice loc de muncă, se întâmplă de mult timp, dar dacă mai devreme „frânele” au durat aproximativ o secundă, acum, după actualizare, pot. durează până la 15-20 de secunde, ceea ce face munca extrem de incomodă.

În principiu, datele inițiale sunt deja suficiente pentru a trage primele concluzii. Să le enumerăm din nou:

  • „Frânele” apar în mod constant, cu o anumită frecvență
  • Încetinește doar pentru un utilizator
  • „Încetește” la orice loc de muncă

Pentru a confirma presupunerile noastre, să ne uităm la Setări contabile:

Într-adevăr, utilizatorul „cu probleme” este listat ca utilizator pentru îndeplinirea sarcinilor de rutină. După cum s-a dovedit, cândva, o sarcină de schimb automat RIB rula în numele acestui utilizator. Rămâne de văzut care a fost exact cauza „frânării” episodice. Acest lucru este, de asemenea, ușor de făcut:

Și iată „eroul ocaziei” - sarcina de a actualiza indexul de căutare a textului integral, care a fost lansat o dată la 2,5 minute. În acest caz, problema a fost complet rezolvată prin dezactivarea execuției sarcinilor de rutină sub acest utilizator, dar acest lucru nu este întotdeauna posibil sau recomandabil, așa că mai jos vom analiza cum puteți gestiona sarcinile de rutină și cum să ne asigurăm că nu au un impact negativ asupra performanței.

Aplicare regulată

În configurațiile bazate pe o aplicație obișnuită, nu există un singur instrument pentru gestionarea sarcinilor de rutină. Acest lucru se datorează în mare măsură faptului că, la momentul dezvoltării lor inițiale, conceptul de sarcini de rutină în sine era destul de slab dezvoltat.

Multe sarcini de rutină sunt gestionate prin configurarea subsistemelor asociate acestora. De exemplu, setările pentru sarcinile de reglementare legate de schimbul de date ar trebui căutate în setările de schimb asociate cu Sistemul de informații automatizat de stat unificat în setările de comercializare a alcoolului etc.

La prima vedere, totul este destul de logic, dar lipsa unui singur instrument face dificilă controlul sarcinilor de rutină configurate și optimitatea setărilor acestora. Este bine dacă există una sau două sarcini, dar dacă sunt mai multe sau, ca în cazul nostru, există o suspiciune de una dintre sarcinile programate, dar habar nu ai cine a configurat ce în această bază de date.

În acest caz, ar trebui să utilizați procesare externă ConsoleTasks (JobsConsole), care este inclus în setul de procesare standard de pe discul ITS. Procesarea oferă o interfață unică pentru toate joburile și le permite să fie configurate centralizat, precum și să controleze joburile care rulează în prezent.

Această listă ar trebui studiată cu atenție, toate sarcinile inutile ar trebui să fie dezactivate, iar programul celor care sunt necesare ar trebui adus în conformitate cu nevoile imediate și cu bunul simț. De exemplu, în cazul nostru, nu este nevoie să procesați răspunsurile EGAIS o dată la 30 de secunde (această setare a fost făcută pentru testare) și în modul de funcționare va fi suficient să faceți acest lucru, să zicem, o dată la jumătate de oră.

Aplicație gestionată

În configurațiile bazate pe o aplicație gestionată, sarcinilor de rutină li se atribuie un rol mai important; cu ajutorul lor, pot fi efectuate diverse sarcini pentru a menține baza de informații și a o menține la zi, dar, în același timp, cele mai multe sunt sarcinile de rutină. devin adesea cauza „frânelor”.

Există un element separat în meniu pentru a gestiona sarcinile de rutină Administrare - Suport și întreținere.

Se poate observa imediat că numărul de sarcini a crescut semnificativ (de exemplu, am luat aceeași configurație - Retail) și configurarea lor corectă poate îmbunătăți semnificativ performanța bazei de informații. Setările implicite sunt realizate de 1C pe baza nevoilor unei companii sferice medii în vid și nici măcar nu sunt aproape de optime.

În primul rând, dezactivăm ceea ce este clar inutil, cu ce nu lucrați. Apoi optimizăm programul funcțiilor rar utilizate, de exemplu, actualizarea clasificatorului bancar în Retail, precum și verificarea contrapărților, poate fi efectuată o dată pe săptămână în timpul orelor nelucrătoare sau la sfârșitul (începutul) zilei de lucru.

O atenție deosebită trebuie acordată tot ceea ce are legătură cu indexul de căutare. Căutarea în text complet este cu siguranță un lucru convenabil, dar lucrul cu indexul său este o sarcină foarte, foarte intensivă în resurse. Prin urmare, nu ar trebui să mergeți la extrem și să-l abandonați, ci ar trebui să vă reconsiderați serios și să îi ajustați parametrii.

Sa incepem cu extragerea textului, această operațiune vă permite să căutați conținutul fișierelor atașate, așa că dacă nu le utilizați, nu căutați prin ele sau aveți doar imagini acolo, atunci această operațiune poate fi dezactivată; în orice caz, efectuând-o o dată la 85 secunde este în mod clar exagerat.

Actualizare index PPD- una dintre cele mai intensive operațiuni de resurse, efectuată implicit o dată pe minut.

Acum să ne gândim la cât de des sunt adăugate sau actualizate informațiile pe care le cauți cel mai des în baza de date? Evident, nu în fiecare minut, așa că va fi suficient să actualizați indexul mult mai puțin frecvent: o dată pe oră, o dată pe zi sau chiar o dată pe săptămână.

Același lucru este valabil și pentru fuziunea indicelui PPD Dacă actualizați indexul o dată pe zi, ar trebui să configurați îmbinarea să ruleze o dată pe săptămână, alegând timpul cel mai puțin perturbator pentru a începe lucrarea.

Aceste operațiuni simple vă vor permite, fără prea multă deteriorare a funcționalității configurației, să ridicați confortul de a lucra cu ea la un nou nivel, refuzând să efectuați frecvent operațiuni destul de intensive în resurse. Doar nu mergeți la extreme; judecă cu înțelepciune cât de mult aveți nevoie de anumite capacități și cât de des ar trebui să îndepliniți sarcini legate de acestea.

  • Etichete:

Vă rugăm să activați JavaScript pentru a vedea lucrările de fundal în 1C pot fi lansate automat conform unui program (adică pot fi instanțe de joburi de rutină), sau dezvoltatorul însuși poate iniția lansarea unui job de fundal pentru a executa un algoritm arbitrar (un lucru izbitor). exemplu este generarea de rapoarte în fundal).
IMPORTANT!!! Pentru bazele de date de fișiere, începând cu versiunea platformei 8.3.3.641, nu este necesară lansarea unei sesiuni separată în care vor fi executate joburi de fundal. Acestea. Anterior, în bazele de date de fișiere, pentru a rula joburi de fundal, era necesar să se execute metoda contextului global „RunTaskProcessing()”. Detalii la acest link.

Procedura pentru rularea unui algoritm arbitrar într-un job de fundal

Pentru a rula algoritmul nostru într-un job separat de fundal, vom folosi metoda "Alerga()" manager de post de fundal: Sintaxă: A executa(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>)
  • <ИмяМетода>(necesar); Tip: șir
    Numele procedurii exportate sau al funcției unui modul comun non-global care poate fi executat pe server, sub forma ModuleName.MethodName.
  • <Параметры>(optional); Tip: matrice
    O serie de parametri trecuți metodei. Numărul și tipurile de parametri trebuie să se potrivească cu parametrii metodei. (mai multe detalii în Syntax Assistant)
  • <Ключ>(optional); Tip: șir
    Dacă este specificată o cheie, aceasta trebuie să fie unică printre cheile joburilor de fundal active care au același nume de metodă ca și jobul de fundal.
  • <Наименование>(optional); Tip: șir.
    Descrierea sarcinii.

Procedura pentru rularea unui job de fundal

În cazul nostru, vom folosi procedura de export situată în modulul general „GeneralModuleServer”(Cred că nu este necesar să explicăm faptul că modulul trebuie să fie pe partea de server) Procedură Scrieți informații DESPRE Produse în fundal (Parametrul de activitate de fundal) Solicitare de export de date = Solicitare nouă ("SELECT | Produse. Link AS Nomenclatură | FROM | Director. Nomenclatură Produse AS"); Fetch = DataRequest.Execute().Select(); While Selection.Next() MH Cycle = Registre de informații.Date de produs.CreateRecordManager(); MZ.Period = CurrentDate(); MZ.Nomenclature = Sampling.Nomenclature; MH.Information = BackgroundTaskParameter; MZ.Write(); EndCycle; Sfârșitul procedurii Pentru a demonstra funcționarea jobului de fundal, vom crea înregistrări în registrul nostru de informații pentru fiecare articol, iar parametrul va fi transmis din forma în care este lansat jobul de fundal.

Comanda de pornire a lucrării de fundal

Parametrul pe care îl vom trece în procedura de execuție va fi preluat din atributul formularului gestionat (atribut de tip „String”):

Codul modulului de formular gestionat va arăta astfel: &În procedura client StartBackgroundJob(Command) StartBackgroundJobOnServer(); Sfârșitul procedurii &Pe server Procedura Start Job Background On Server () // Formează o matrice cu parametrii Job Parameters = New Array; JobParameters.Add(TaskParameter); // Începem execuția în fundal a algoritmului BackgroundTasks.Execute(// Metoda noastră de export în modulul general „GeneralModuleServer.WriteInformationOnProductsInBackground”, // Trecem o matrice cu parametriTaskParameters, // Specificăm cheia de activitate New UniqueIdentifier, // Specificăm numele jobului de fundal „Lucrul nostru de fundal”); Sfârșitul procedurii

Rezultatul executiei

Ca urmare a executării jobului de fundal, vor fi generate intrări în registrul de informații (de care aveam nevoie).

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 probleme:

  • 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
O dată la ora 01.00Ora 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.

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: