1c este modulul aplicației gestionate în care se execută. Module comune. Ce să folosești

Salutare tuturor.
Astăzi vom lua în considerare modulele platformei 1C Enterprise 8.2, sunt mai multe decât în ​​versiunea 8.1 și uneori nu este atât de ușor să-ți dai seama.
Exemplu:

Dacă te uiți la ajutorul 1C, vei vedea următoarea definiție pentru modul:
Un modul este un program în limbajul încorporat al sistemului 1C: Enterprise.

Și dacă este mai simplu atunci: B modulele 1C conţine cod executabil, care este necesar pentru a reacționa cumva la acțiunile sistemului sau ale utilizatorului, atunci când mijloacele vizuale nu sunt suficiente pentru a descrie interacțiunea obiectelor din configurator. De asemenea, în modulele de program, vă puteți descrie propriile metode.

Orice linie de cod este într-un modul, aceasta este o diferență față de 1C7.7, unde codul programului ar putea fi localizat atât în ​​celulele tabelelor de aspect, cât și în proprietățile elementelor de formular.

Să enumerăm modulele care sunt în 1C 8.2

Modulele platformei 1C Enterprise 8.2:

Modul aplicație gestionată
Modul de aplicare obișnuit
Modul de conectare extern
Modul de sesiune
Module comune
Modul obiect
Modul formular
Modulul de gestionare a obiectelor
Modulul de management al valorii
Module recordset

Principalele secțiuni ale modulului:
1. Secțiune care descrie variabilele locale a acestui modul, puteți specifica o directivă de compilare (nu există pentru toate modulele).
2. Secțiune care descrie proceduri și funcții. Dacă nu scrieți o directivă de compilare, atunci implicit este & AtServer, ordinea procedurilor și funcțiilor nu contează.
3. Secțiunea programului principal al modulului (conține câțiva operatori). Această secțiune se execută la accesarea unui modul (nu există pentru toate modulele).

Nu toate modulele conțin secțiuni de declarații variabile și o secțiune principală a programului.
De exemplu: modul comun sau modul sesiune.

Reguli de compilare a modulelor:
1. Unele module sunt compilate complet fie pe partea client, fie pe partea serverului. Toate metodele din ele sunt fie pe partea client, fie pe partea serverului. Un exemplu de modul client este un modul de aplicație gestionat.
2. Unele module pot combina metode client și server. În acest caz, pentru fiecare metodă, trebuie să specificați directivele de compilare - & AtClient sau & AtServer. Un exemplu sunt modulele de formulare gestionate.

Clasificarea modulelor:
1. Camere de servere. Compilat numai pe partea de server - modul obiect, modul manager, modul recordset.
2. Partea clientului. Compilat numai pe client, cum ar fi un modul de aplicație gestionat.
3. Combinat. Poate fi compilat atât pe server, cât și pe client - modul de formular și module comune.

Unde sunt compilate modulele:
1. Thin Client (Oferă posibilitatea de a utiliza un browser web).
2. Server.
3. Client gros.

După cum puteți vedea, modulele nu sunt atât de puține, aproape fiecare obiect de configurare are un modul care are propriul său scop.

Scopul fiecărui modul 1C 8.2

paznici: Te-ai gândit să cumperi 1C Enterprise și nu știi de la cine? Compania LBS este inclusă în top 20 1C: Francizații. El este angajat în automatizarea contabilității bazate pe produse 1C. Cumpărați produse 1C de la LBS și obțineți asistență și servicii 1C de înaltă calitate.

P.S. Râzi de anecdota din Lukașenka))

Ce sunt modulele și pentru ce sunt destinate exact? Modulul conține codul programului. Mai mult, este de remarcat faptul că, spre deosebire de platforma 7.7, unde codul ar putea fi localizat atât în ​​proprietățile elementelor de formular, cât și în celulele tabelelor de layout, în platforma 8.x orice linie de cod trebuie să fie amplasată în orice modul. De obicei, un modul este format din trei secțiuni - aceasta este o secțiune care descrie variabile, o secțiune care descrie proceduri și funcții, precum și o secțiune a programului principal. Această structură este tipică pentru aproape toate modulele platformei, cu unele excepții. Unele module nu au o secțiune de declarare a variabilelor și o secțiune principală a programului. De exemplu, Modulul de sesiune și orice Modul comun.

Contextul de execuție al modulelor, în general, este împărțit în client și server. În plus, unele module pot fi compilate atât pe partea client, cât și pe partea serverului. Și unele sunt doar pe partea serverului sau pe partea clientului. Asa de:

Modul de aplicație

Modulul este conceput pentru a surprinde momentele lansării aplicației (încărcarea configurației) și terminarea acesteia. Și procedurile de verificare pot fi plasate în evenimentele corespunzătoare. De exemplu, la începutul aplicației, actualizați orice date de configurare de referință, la sfârșitul lucrării, întrebați dacă merită să o părăsiți, poate că ziua de lucru nu s-a încheiat încă. În plus, interceptează evenimente din echipamente externe, de exemplu, comerciale sau fiscale. De menționat că modulul aplicației interceptează evenimentele descrise doar în cazul lansării interactive. Acestea. atunci când fereastra programului în sine este creată. Acest lucru nu se întâmplă dacă aplicația este lansată în modul com-connection.

Există două module de aplicație diferite în platforma 8.2. Sunt un modul de aplicație comună și un modul de aplicație gestionată. Acestea sunt declanșate la lansarea diverșilor clienți. Acesta este modul în care se declanșează modulul aplicației gestionate atunci când clientul web, clientul subțire și clientul gros sunt lansate în modul aplicație gestionată. Iar modulul de aplicație obișnuit este declanșat atunci când clientul gros este lansat în modul de aplicație normal.

Toate secțiunile pot fi localizate în modulul de aplicație - descrieri ale variabilelor, procedurilor și funcțiilor, precum și descrierile programului principal. Modulul de aplicație este compilat pe partea clientului, așa că acest lucru ne limitează sever în disponibilitatea multor tipuri de date. Puteți extinde contextul unui modul de aplicație folosind metode ale modulelor comune, pentru care este setată proprietatea „Apel server”. Toate variabilele și metodele care sunt marcate ca export vor fi disponibile în orice modul de configurare pe partea clientului. Oricum, oricât de tentant este, nu ar trebui postat aici. un numar mare de metode. Cu cât este mai mult cod în el, cu atât timpul de compilare este mai lung și, în consecință, timpul de lansare a aplicației, ceea ce este foarte enervant pentru utilizatori.

După cum sa menționat mai sus, modulul de aplicație se ocupă de evenimentele de pornire și de terminare a aplicației. Pentru a gestiona fiecare dintre aceste evenimente în modulul de aplicație, există o pereche de handlere Before ... și When ... Diferența dintre ele este astfel încât atunci când codul este executat în handler Before ..., acțiunea nu a încă a fost finalizată și putem refuza să o executăm. Pentru aceasta este destinat parametrul Eșec. În handlere Când .. acțiunea a avut deja loc și nu putem refuza lansarea aplicației sau ieșirea din ea.

Modul de conectare extern

Scopul modulului este același cu scopul modulului de aplicație. Procesează punctele de început și de sfârșit ale aplicației. Modulul de conexiune externă este declanșat atunci când aplicația este lansată în modul de conectare com. Procesul de îmbinare exterioară în sine este un proces non-interactiv. În acest mod are loc lucrul programatic cu infobaza și fereastra aplicației nu se deschide, ceea ce impune anumite restricții privind utilizarea metodelor destinate lucrului interactiv. În acest mod, nu puteți utiliza apeluri către formulare de dialog, mesaje de avertizare etc. Pur și simplu nu vor funcționa.

Ca și în modulul de aplicație, secțiunile care descriu variabile, metode și o secțiune a programului principal sunt disponibile aici. De asemenea, puteți declara variabile și metode de export. Diferența este că, în modul de conectare com, toate lucrările cu baza de informații au loc pe partea serverului, astfel încât modulul de conectare externă este compilat exclusiv pe server. În consecință, variabilele de export și metodele modulelor client comune nu sunt disponibile în acesta.

Modul de sesiune

Acesta este un modul foarte specializat și este destinat exclusiv inițializării parametrilor de sesiune. De ce a trebuit să-ți faci propriul modul pentru asta? Acest lucru se datorează faptului că procesul de inițializare poate necesita executarea unui anumit cod și, în plus, aplicația poate fi lansată sub diferiți clienți (ceea ce duce la executarea diferitelor module de aplicație sau modul de conectare extern), precum și a parametrilor de sesiune. trebuie inițializat în orice mod de lansare. Prin urmare, a fost necesar un modul suplimentar, care se execută în orice mod de lansare a aplicației.

Există un singur eveniment SessionParameterSetting în modulul de sesiune, care este executat foarte întâi, chiar înainte de evenimentul modulului de aplicație BeforeSystemWorking. Secțiunea de declarare a variabilelor și secțiunea principală a programului nu sunt disponibile în ea. Și, de asemenea, nu puteți declara metode de export. Modulul este compilat pe partea serverului.

Nu fi tentat că acest modul este executat de fiecare dată când se lansează aplicația și plasează în el cod care nu are legătură directă cu inițializarea parametrilor sesiunii. Acest lucru se datorează faptului că handlerul SessionParameterSetting poate fi apelat în mod repetat în timpul funcționării sistemului. De exemplu, acest lucru se întâmplă atunci când accesăm parametri neinițializați. Și deși este posibil să se surprindă momentul primei lansări a acestui eveniment (RequiredParameters este de tipul Undefined), totuși, trebuie remarcat că acest modul este compilat în modul privilegiat, adică. nu controlează drepturile de acces. Și al doilea punct, încă nu putem fi sută la sută siguri că sistemul va fi lansat. Brusc, apare o eroare în modulul aplicației și încercăm să efectuăm unele acțiuni cu baza de date.

Module comune

Modulele sunt destinate să descrie niște algoritmi comuni care vor fi apelați din alte module de configurare. Modulul general nu conține o secțiune care descrie variabile și o secțiune a programului principal. În acesta, puteți declara metode de export, al căror context de accesibilitate va fi determinat de steaguri de compilare. Datorită faptului că secțiunea de declarare a variabilelor nu este disponibilă, nu puteți defini variabile globale în modulele comune. Pentru a face acest lucru, trebuie să utilizați funcțiile modulelor comune cu returnare cache sau un modul de aplicație. Trebuie avut în vedere faptul că, chiar dacă proprietatea de reutilizare a unui modul comun este setată la „Pentru durata sesiunii”, atunci, în acest caz, durata de viață a valorilor stocate în cache nu depășește 20 de minute din momentul ultimei acces la ele.
Comportamentul unui modul comun depinde de parametrii setati (globali sau nu, steagurile de compilare diferite, daca este disponibil un apel de server etc.). În acest articol, nu vom lua în considerare toate tipurile de setări, precum și caracteristicile comportamentale și capcanele care apar atunci când setați în mod nerezonabil semnalizatoarele de proprietate. Acesta este un subiect pentru un articol separat. Să ne oprim doar la câteva puncte care ar trebui urmate atunci când setați steaguri:

  • Este o regulă bună să nu folosiți steagul Global peste tot. Acest lucru va scurta timpul de lansare al aplicației, precum și va îmbunătăți lizibilitatea codului (desigur, dacă modulul general are un nume semnificativ).
  • Nu este recomandabil să folosiți mai mult de un semnal de compilare. Nu există atât de multe metode care trebuie efectuate în contexte diferite și, dacă astfel de metode sunt încă necesare, atunci se poate distinge un modul comun separat pentru ele.
  • Indicatorul „Call Server” are sens numai dacă modulul este compilat „Pe server”. Prin urmare, toate celelalte steaguri de compilare ar trebui să fie debifate pentru a evita diverse probleme.
  • Dacă în metodele modulului există o procesare în masă a datelor, citirea și scrierea în baza de date, atunci pentru a crește viteza de lucru este mai bine să dezactivați controlul accesului prin setarea steagului „Privilegiat”. Acest mod este disponibil numai pentru modulele partajate compilate pe server.

Modul formular

Este conceput pentru a procesa acțiunile utilizatorului, de ex. diverse evenimente legate de introducerea datelor și procesarea corectitudinii introducerii acestora. Un modul de formular obișnuit este compilat în întregime pe client. Modulul formă gestionată este clar delimitat de contextul de execuție, astfel încât toate variabilele și metodele trebuie să aibă o directivă de compilare. Dacă directiva nu este specificată în mod explicit, atunci această variabilă sau metodă va fi compilată pe partea serverului. În modulul formular, există secțiuni care descriu variabile și metode, precum și o secțiune a programului principal.

Modul obiect

Acest modul este tipic pentru multe obiecte de configurare și este destinat, în cazul general, să proceseze evenimente obiect. De exemplu, evenimente de înregistrare și ștergere a obiectelor, eveniment de postare a documentelor etc.

Unele evenimente din modulul obiect dublează evenimentele din modulul formular. De exemplu, înregistrarea evenimentelor. Cu toate acestea, trebuie să se înțeleagă că evenimentele modulului formular vor fi executate exclusiv pe forma specifică a obiectului. În general, pot exista mai multe dintre aceste forme. Și evenimentele modulului obiect vor fi apelate în orice caz, chiar și în acest moment munca programatică cu obiectul. Prin urmare, dacă trebuie să executați un cod în toate cazurile, atunci este mai bine să utilizați evenimentele modulului obiect pentru aceasta.

Modulul obiect este compilat exclusiv pe server. În acesta, puteți defini variabilele de export și metodele care vor fi disponibile în alte module de configurare. Cu ajutorul acestor proprietăți și metode, putem extinde semnificativ funcționalitatea obiectului.

Modulul de gestionare a obiectelor

Acest modul există pentru multe obiecte de configurare. Scopul principal al acestui modul este de a redefini evenimentul de selecție standard care are loc în momentul introducerii prin linie și de a extinde funcționalitatea managerului. Modulul este compilat pe partea serverului. Este posibil să se definească proprietăți și metode de export. Apelarea metodelor de export ale managerului nu necesită crearea obiectului în sine.

La toate cele de mai sus, puteți adăuga o imagine a unor module de configurare și metode de apeluri de metode reciproce în modul aplicație gestionată. Săgeata indică direcția în care vă puteți referi la apelarea metodei corespunzătoare. După cum puteți vedea din diagramă, contextul serverului este complet închis. Dar din contextul clientului este posibil să apelăm metode server.

Legendă pe diagramă: О.М. Client - Modul comun Client; O. M. Server - Modul comun server; M.F. Client - Proceduri client ale modulului formular; M.F. Server - Proceduri server ale modulului formular.

Imprimare (Ctrl + P)

Obiectele situate în ramura arborelui de configurare a modulelor generale sunt destinate să conțină texte ale funcțiilor și procedurilor care pot fi apelate din orice alt modul de configurare.
ATENŢIE! Un modul comun poate conține doar definiții ale procedurilor și funcțiilor.
Proceduri și funcții comune ale modulului pentru care indică titlurile cuvânt cheie Exporturile sunt printre părți componente context global. Puteți afla mai multe despre procedurile de scriere în modulul general din secțiunile „Formatul textelor sursă module software„Și „Operatorii” din limbajul încorporat ajută.
Pentru a edita un modul comun, în paleta de proprietăți a unui obiect de tip Module comune a ferestrei Configurare, în proprietatea Modul, faceți clic pe linkul Deschidere. Textul modulului general va fi emis pentru editare în editorul de text al sistemului 1C: Enterprise în modul de editare a textului modulului de program.
Modulul comun, fiind parte a configurației, este stocat doar ca parte a configurației.
Proprietatea Global determină dacă metodele exportate ale modulului partajat fac parte din contextul global.
Dacă proprietatea Global este setată la True, atunci metodele exportate ale modulului comun sunt disponibile ca metode ale contextului global.
Dacă proprietatea Global este setată la Fals, atunci o proprietate este creată în context global cu un nume care se potrivește cu numele modulului comun din metadate. Această proprietate este numai pentru citire. Valoarea acestei proprietăți este obiectul CommonModule. Metodele exportate ale acestui modul comun sunt disponibile prin intermediul acestui obiect. Astfel, apelarea metodelor modulelor comune non-globale arată ca XXXXX.YYYYY, unde XXXXX este numele proprietății corespunzătoare contextului modulului comun, iar YYYYY este numele metodei exportate a modulului comun.
Exemplu:

WorkSales Equipment.ConnectBarcode Scanner ();

Context diferit și module comune

Folosind proprietățile modulelor comune și instrucțiunile preprocesorului, puteți organiza execuția diferitelor metode ale modulelor comune în contextul dorit.
Fiecare proprietate a unui modul comun este responsabilă pentru compilarea (și executarea) unui modul comun într-un anumit context.
Sunt disponibile următoarele proprietăți care sunt responsabile pentru contextul în care sunt disponibile metodele modulului comun:
Client (aplicație obișnuită)- metodele modulului comun vor fi disponibile clientului gros în modul normal de aplicare;
● - metodele modulului comun vor fi disponibile pentru clientul subțire, clientul web și, de asemenea, pentru clientul gros în
modul de aplicare gestionat;
● Server - metodele modulului comun vor fi disponibile pe server;
Conexiune externă- metodele modulului comun vor fi disponibile în conexiune externă.
Dacă sunt setate mai multe proprietăți în același timp, aceasta înseamnă că metodele modulului comun vor fi disponibile în mai multe contexte.
Dacă un modul comun are proprietatea Server și alte proprietăți setate, aceasta înseamnă că modulul comun va fi disponibil simultan pe server și în clientul selectat. Trebuie înțeles că de fapt vor fi mai multe versiuni ale codului compilat (în funcție de numărul de clienți selectați și pentru serverul însuși).
Mai mult, dacă metoda situată într-un astfel de modul comun este apelată din partea clientului, atunci se va folosi copia client a modulului comun, iar dacă de pe server - copia serverului. În acest caz, folosind directive de preprocesor (vezi detalii aici), poți „proteja” serverul de codul care nu poate fi executat pe el.
Să ne uităm la un exemplu. Într-un modul comun (care poate fi executat pe client slabși pe server) există o metodă care are un comportament ușor diferit pe partea clientului subțire și pe partea serverului. Să vedem cum poți face asta:



# Dacă Thin Client Atunci
// Afișează un avertisment
Afișați alertă utilizator(„Pe client”);
#EndIf
Sfârșitul procedurii
Apoi, pe partea de server, codul arată astfel:
Procedură Metoda CommonModule (). Export
// Diverse coduri importante merg aici
Sfârșitul procedurii
Pe partea de client subțire, codul va arăta astfel:
ProcedureCommonModuleMethod () Export
// Diverse coduri importante merg aici
// Afișează un avertisment
ShowUserNotification („Pe client”);
Sfârșitul procedurii

Există mai multe moduri de a transfera controlul de la client la server:
● apelarea unei metode a modulului comun server;
● într-un modul de formular sau de comandă, apelați o metodă care este precedată de directive de compilare & AtServer, & AtServerWithoutContext

În același timp, este imposibil să apelați metode ale modulelor comune client (pentru care proprietatea Server nu este setată) și metode client ale unui modul de formular sau modul de comandă din procedurile serverului. Controlul va reveni la client după finalizarea apelului cel mai extern la metoda serverului.
Excepție fac metodele din modulul formular și modulul de comandă, care sunt precedate de directive de compilare. & OnClientOnServer, & OnClientOnServerWithout Context
De asemenea, trebuie menționate următoarele puncte:
● Dacă un modul comun este disponibil pentru mai mult de un client, atunci când scrieți cod, luați în considerare restricțiile maxime pe care clienții le pot impune sau utilizați instrucțiunile preprocesorului pentru a „izola” codul specific clientului.
● Instrucțiunile preprocesorului au sens și atunci când un modul comun are mai multe contexte de execuție, de exemplu, o conexiune externă și un client subțire sau (ceea ce este mult mai comun) un client și un server. În acest caz, instrucțiunile preprocesorului vor încadra cod interactiv care nu poate fi folosit pe server, dar este posibil pe client (vezi exemplul de mai sus).
Pentru mai multe informații despre instrucțiunile preprocesorului și directivele de compilare, consultați secțiunea Executarea procedurilor și funcțiilor din ajutorul limbajului încorporat.
Proprietatea Call server este utilizată pentru a controla capacitatea de a apela metodele exportate ale modulului comun server din codul client.
Dacă proprietatea este setată, atunci metodele exportate ale modulului comun server sunt disponibile pentru apel de la client. Dacă proprietatea nu este setată, atunci astfel de metode exportate pot fi apelate numai din metodele de pe partea de server (ambele metode ale modulelor comune de pe partea de server, cât și metodele de pe partea de server ale modulelor de formular și ale modulelor de comandă).
Sfat . Este recomandat să setați proprietatea Call server la False în cazurile în care modulul comun al serverului conține metode pe care nu doriți să le apelați de la client (de exemplu, din motive de securitate).
Notă... Dacă proprietățile sunt setate în același timp Client (aplicație obișnuită), Client (aplicație gestionată), Conexiune externă, apoi proprietatea Apel server este ștearsă automat. Dacă proprietatea Server de apeluri este setată, atunci proprietățile sunt resetate automat. Client (aplicație obișnuită), Client (aplicație gestionată)și Conexiune externă dacă aceste proprietăți au fost setate în același timp.
Proprietate Privilegiat este destinat să dezactiveze controlul accesului la executarea metodelor unui modul comun.
NOTĂ. Dacă proprietatea Privilegiat este setată, apoi proprietatea Server este setată automat la modulul comun și restul proprietăților sunt resetate ( Client (aplicație obișnuită), Client (aplicație gestionată) si in conexiune externă). Un modul partajat cu privilegii poate rula numai pe server.

Reutilizarea valorilor returnate

Dacă modulul partajat nu este global, atunci proprietatea de reutilizare a valorii returnate devine disponibilă. Această proprietate poate lua următoarele valori:
● Nu utilizați — Reutilizarea valorii returnate nu este utilizată pentru funcțiile din acest modul comun.
● La ora apelului și la ora sesiunii — Metoda de determinare a reutilizarii datelor este utilizată pentru modulul comun. Esența acestei metode este că în timpul execuției codului, sistemul își amintește parametrii și rezultatul funcției după primul apel al funcției. Când funcția este apelată din nou cu aceiași parametri, valoarea stocată este returnată (de la primul apel) fără a executa funcția în sine. Dacă funcția modifică valorile parametrilor în timpul execuției sale, atunci apelul repetat al funcției nu va face acest lucru.
Următoarele caracteristici ale salvării rezultatelor apelurilor pot fi distinse:
● dacă funcția este executată pe server și este apelată din codul serverului, atunci valorile parametrilor și rezultatul apelului sunt stocate pentru sesiunea curentă pe partea serverului;
● dacă funcția este executată pe un client gros sau subțire, atunci valorile parametrilor și rezultatele apelurilor sunt stocate pe partea clientului;
● dacă funcția este executată pe partea de server, dar este apelată din codul client, atunci valorile parametrilor de apel sunt reținute atât pe partea client, cât și pe partea server (pentru sesiunea curentă).
Valorile stocate sunt șterse:
● dacă proprietatea este setată la La momentul apelului:
● pe partea serverului - când controlul este returnat de la server;
● pe partea clientului - atunci când o procedură sau funcție a limbajului încorporat de nivel înalt (apelată de sistem din interfață, și nu dintr-o altă procedură sau funcție a limbajului încorporat) se termină;
● dacă proprietatea modulului comun este setată la Pentru durata sesiunii:
● pe partea serverului - la finalul sesiunii;
● pe partea client - când aplicația client este închisă.
Valorile stocate vor fi șterse:
● pe server, în fat client, în conexiunea externă, în thin client și în web client la viteza normală de conectare - la 20 de minute după calcularea valorii stocate sau la 6 minute după ultima utilizare.
● într-un client subțire și un client web cu viteză redusă de conectare - la 20 de minute de la calcularea valorii stocate;
● în caz de lipsă memorie cu acces aleatorîn fluxul de lucru al serverului;
● la repornirea unui flux de lucru;
● când un client trece la un alt flux de lucru.
După ștergerea valorilor, apelul la funcția exportată se efectuează ca la primul apel.
Această proprietate a modulelor comune nu afectează execuția procedurilor - procedurile sunt întotdeauna executate.

Dacă un modul comun este setat să refolosească valorile returnate, atunci sunt impuse o serie de restricții asupra tipurilor de parametri ale funcțiilor exportate. Tipurile de parametri pot fi doar:
● Tipuri primitive ( Nedefinit, NULL, boolean, număr, șir, dată).
● Orice referințe la obiectele bazei de date.
● Structuri cu valori de proprietate ale tipurilor de mai sus. În acest caz, identitatea parametrilor este controlată „de conținutul” structurilor.
Dacă funcția exportată returnează orice obiect, atunci de fapt este returnată o referință la obiectul stocat în cache. Dacă după primirea acestei referințe are loc o schimbare în starea obiectului, atunci un apel ulterioar la aceeași funcție va avea ca rezultat returnarea unei referințe la obiectul deja modificat fără a executa efectiv funcția. Acest comportament va continua până când valoarea stocată este ștearsă (din orice motiv). Cu alte cuvinte - schimbarea stării unui obiect obținut ca urmare a apelării unei funcții dintr-un modul comun cu reutilizare valorile returnate nu sunt baza pentru apelul de funcție real. De asemenea, trebuie amintit că memoria cache a obiectelor returnate este indiferentă
starea modului privilegiat la momentul apelului funcției cu reutilizarea valorilor returnate. Această caracteristică poate duce la următoarea caracteristică comportament:
● Execuția efectivă a apelului de funcție cu reutilizarea valorilor returnate (primul apel) s-a făcut cu modul privilegiat activat.
● La executarea funcției, a fost primit un obiect care nu poate fi primit cu modul privilegiat dezactivat.
● Apelurile de funcții ulterioare au fost efectuate fără a seta modul privilegiat.
● Cu toate acestea, până când memoria cache a obiectelor returnate este golită sau apelul efectiv este repetat, funcția va returna un obiect inaccesibil formal.
● Comportamentul opus este de asemenea adevărat, atunci când primul apel este efectuat fără a seta modul privilegiat, iar în modul privilegiat nu este returnat obiectul care ar fi putut fi primit în modul privilegiat.

Dacă un modul comun are proprietatea Reutilizarea valorilor returnate este setat la Pentru durata sesiunii, apoi valorile de tip Manager temporar de tabel.
Dacă o funcție a unui modul comun, cu o reutilizare setată, este apelată din același modul comun (de exemplu, cu numele CommonModule), atunci amintiți-vă următoarea particularitate: dacă funcția este numită cu numele MyFunction (), atunci funcția va fi executată de fiecare dată când funcția este apelată... Pentru a utiliza valorile stocate, funcția trebuie apelată prin numele complet:
CommonModule.MyFunction ().
Metoda contextului global elimină toate valorile reutilizabile, atât pe partea de server, cât și pe partea clientului, indiferent de locul în care este apelată metoda. După executarea metodei RefreshReusedValues ​​​​() primul apel la funcție va fi executat complet.

Aproape toate obiectele de configurare au un modul manager, iar pentru majoritatea obiectelor, un modul obiect. Adesea, programatorii începători nu înțeleg diferența în scopul acestor două module.

Înțelegerea diferenței în scopul lor vă permite să scrieți un cod de program mai structurat și, în unele cazuri, să economisiți resursele serverului 1C și să creșteți performanța soluției aplicate.

În articol, vom lua în considerare diferențele fundamentale dintre aceste module atât din punct de vedere teoretic, cât și pe un exemplu practic specific.

Teorie

Să ne întoarcem la elementele de bază ale programării orientate pe obiecte (OOP) și să facem o analogie cu exemplul nostru. În OOP, metodele pentru obiecte pot fi împărțite în static și simplu. Metode simple poate fi apelat doar pentru un anumit obiect la care avem acces în contextul curent al codului programului. Metodele statice nu au acces direct la datele obiectului. Pentru a face referire la un obiect, mai întâi trebuie să creați o instanță a acestuia. Același lucru este valabil și pentru platforma 1C: Enterprise 8.x.

În modulul obiect, platforma stochează proceduri și funcții care pot fi apelate numai atunci când se lucrează cu un anumit obiect, de exemplu, cu un articol din articolul de catalog „Nomenclatură”. Modulul manager conține proceduri și funcții care pot fi aplicate tuturor obiectelor de acest tip dar cu crearea iniţială a unei instanţe a acestui obiect. Adică, pentru a schimba un element din acest modul, inițial pentru a se referi la element, executați metoda „GetObject ()” și apoi lucrați cu ea.

Să trecem de la teorie la practică.

Practică

Să trecem la exemplu practic... Să presupunem că trebuie să rezolvăm problema tipăririi unei liste de produse.Utilizatorul tipărește produsul fie direct dintr-un articol de catalog, fie sub forma unei liste de produse. Luați în considerare două moduri de a îndeplini această sarcină.

Procedura de imprimare în modulul obiect

În modulul obiectului director, adăugați următoarea funcție:

// Treceți referința la elementul de referință în funcție Funcție PrintSelected Items (Link) Export TabDoc = Nou document tabelar; Layout = Referințe. Produse. Obține aspectul („Layout”); Solicitare = Solicitare nouă; Anchetă. Text = „SELECT | Produse ... Reprezentare ca produs,| Produse ... Ștergeți marca,| Produse ... Cod furnizor |DIN| Director ... Produse AS Produse| UNDE | Produse ... Link In (& ArrayProducts)"; Solicitare. SetParameter (" ArrayProducts ", Link); // Setați selecția prin link

Codul programului este complet generat de designerul de imprimare. Singurul lucru care merită remarcat este selecția prin referire la articolul de catalog „Produse” din cerere. Referința este transmisă ca parametru funcției. Ca urmare a apelării funcției „PrintSelected Items”, funcția document foaie de calcul cu un articol de mărfuri umplut.

Codul programului pentru apelarea metodei obiectului „PrintSelected Items” prin comanda formularului „Print” este afișat în următoarea listă:

& Procedura de imprimare la client (comandă) // Apelarea procedurii serverului pentru a obține documentul generat de foaia de calcul TabDoc = PrintServer (); // Afișează documentul tabelar generat TabDoc. Spectacol() ; Funcția EndProcedure și AtServer PrintServer () // Convertiți obiectul formular în obiectul de catalog „Produse” pentru a apela funcția din modulul obiect ObjectGood = FormInValue ("Obiect"); // Apelăm procedura modulului obiect, trecând acolo un link către elementul curent al dicționarului. Rezultat // revenim la partea clientului Returnează elementul obiect. Imprimați articolele selectate (Object. Link); EndFunction

Astfel, am tipărit elementul curent al directorului, lucrând cu obiectul său. Dar sarcina i s-a spus să imprime o listă de produse pe care utilizatorul însuși trebuie să le selecteze. Când lucrați cu un obiect, oferiți utilizatorului o astfel de oportunitate calea usoara nu pare posibil. Cel mai corect ar fi să tipăriți din lista de articole din catalogul „Produse”.

Procedura de imprimare în modulul manager

Adăugați următoarea procedură de export la modulul de manager de directoare:

// Transmite o serie de link-uri către produse Funcție Print Selected Items (Matrice de articole) Export TabDocs = New Tabular Document; Layout = Referințe. Produse. Obține aspectul („Layout”); Solicitare = Solicitare nouă; Anchetă. Text = „SELECT | Produse ... Reprezentare ca produs,| Produse ... Ștergeți marca,| Produse ... Cod furnizor |DIN| Director ... Produse AS Produse| UNDE | Produse ... Link In (& ArrayProducts)"; Solicitare. SetParameter ("Matrice de bunuri", Matrice de bunuri); // Setați selecția după matrice Rezultat = Solicitare. Alerga (); AreaHeader = Aspect. GetScope ("Titlu"); AreaFooter = Aspect. GetArea („Demisol”); AreaTablesHead = Aspect. GetArea ("Cap de masă "); AreaFooterTables = Aspect. GetArea ("Subsolul tabelului"); DetailRecords Area = Aspect. GetArea („Detalii”); TabDoc. Clar (); TabDoc. Afișare (ScopeHeader); TabDoc. Afișare (ScopeTableHap); TabDoc. StartAutoGroupLines (); SampleDetailed Records = Rezultat. Selectați() ; În timp ce SampleDetailed Records. Următorul () Loop DetailRecords Zona. Parametrii. Completare (SelectionDetailed Records); TabDoc. Ieșire (DetailRecordsArea, SelectionDetailRecords. Level ()); Sfârșitul ciclului; TabDoc. EndAutoGroupLines (); TabDoc. Ieșire (ScopeTableFootball); TabDoc. Afișare (AreaFooter); Returnarea TabDoc; EndFunction

Principala diferență față de o funcție dintr-un modul obiect este parametrul funcției. Acum o matrice cu link-uri către produsele de tipărit este transmisă ca parametru.

Codul de program al modulului de comandă a formularului „Print” arată astfel:

& Pe Procedura Client Print (Comandă) TabDoc = PrintServer (); TabDoc. Spectacol() ; Funcția EndProcedure și AtServer PrintServer () // Treceți o serie de link-uri ale produselor selectate în lista de directoare // în funcția modulului manager „PrintSelected Items” Retur Directoare. Produse. PrintSelectedProducts (Articole. Listă. Linii selectate); EndFunction

În acest caz, rezultatul executării comenzii în 1C: modul Enterprise va fi următorul:

În cazul utilizării metodei din modulul manager, putem accesa datele directorului „Produse” fără a obține un obiect pentru fiecare link. Deoarece obținerea unui obiect înseamnă obținerea tuturor datelor din baza de date pentru un element de referință și introducerea datelor primite în RAM, implementarea sarcinii în a doua modalitate va avea un efect pozitiv asupra performanței. Într-adevăr, în acest caz, vom folosi un minim de resurse (RAM) ale mașinii server.

Ce ar trebui să folosești?

Ca întotdeauna, totul depinde de sarcina specifică. Dacă trebuie să imprimați un document, atunci o opțiune mai bună este să utilizați modulul manager. Dacă trebuie să umpleți un obiect, de exemplu, prelucrare externă umplere secțiuni tabelare, atunci în acest caz procedurile și funcțiile sunt mai bine plasate în modulul obiect, deoarece munca lor implică exact obiectul.

V configurație tipică„Trade Management” versiunea 11 este un modul de manager utilizat pe scară largă pentru tipărirea documentelor. Dacă vă uitați la configurația „Managementul întreprinderii de producție”, atunci modulul de manager practic nu este utilizat, deoarece configurația a fost scrisă în versiuni mai vechi ale platformei, unde acest mecanism nu a fost pe deplin acceptat.

Configurare cu exemple din articol.

Modulele platformei 1C: Enterprise 8.3, 8.2

Module comune

Funcțiile care sunt declarate cu indicatorul „export” într-un astfel de modul pot fi apelate de oriunde în configurație. Apelul se face prin CommonModuleName.FunctionName ().

Nu există o secțiune variabilă în astfel de module.

Execuția modulelor comune depinde de parametrii stabiliți în proprietățile lor:

Steagul „Global”

Dacă acest indicator este setat, atunci contextul unui astfel de modul devine global. Adică, atunci când accesați funcțiile sale de export, nu trebuie să specificați numele modulului. Dar numele funcțiilor sale de export trebuie să fie unice în contextul configurației globale.

Steagul serverului

Funcțiile unui astfel de modul pot fi executate pe server.

Indicator client (aplicație obișnuită).

Funcțiile unui astfel de modul pot fi executate pe client în modul normal de aplicație.

Indicator client (aplicație gestionată).

Funcțiile unui astfel de modul pot fi executate pe client în modul de aplicație gestionată.

Steagul apelului serverului

Steagul este disponibil pentru modulele cu setul de steag "Server". Permite apeluri către client la funcțiile de export ale acestui modul (să fie executate pe server).

Steagul de îmbinare exterior

Funcțiile de export ale unui astfel de modul pot fi apelate atunci când sunt conectate de la o sursă externă.

Steagul „Privilegiat”

Într-un modul cu un astfel de semnalizare, verificarea drepturilor va fi dezactivată. Potrivit pentru acțiuni de productivitate sau administrare.

Opțiune de reutilizare

Dacă includeți acest parametru, atunci valorile returnate ale funcțiilor de export vor fi stocate în cache imediat după primul apel. Memorarea în cache este posibilă pe durata unui apel (timpul de execuție a unei anumite proceduri) sau pe durata unei sesiuni de utilizator.

Modul de aplicație

Proiectat pentru a gestiona evenimentele de pornire și oprire a aplicației. Există două tipuri: pentru aplicații obișnuite și gestionate.

Nu îl supraîncărcați, deoarece acest lucru afectează timpul de pornire a aplicației.

Modul de sesiune

Un modul special care este utilizat pentru a inițializa parametrii sesiunii. Este necesar pentru a nu duplica codul în diferite module de aplicație.

Ar trebui folosit cu prudență, deoarece modulul poate fi executat de mai multe ori și, de asemenea, poate fi executat fără a porni în continuare baza. Execut înaintea modulelor de aplicație.

Salutări, (profesor și dezvoltator).