Care sunt parametrii formali ai procedurii 1C. Descrierea procedurilor și funcțiilor

Funcțiile 1c și procedurile din 1c Lucrează în mod similar cu alte limbi - funcția este o subrutină numită pentru a apela din alte locații de cod software.

Procedura de declarare a funcțiilor în modulul arbitrar (adică este posibil în textul procedurii situate la începutul modulului de a utiliza procedurile a cărui text va fi localizat mai jos în acest modul). În mod similar, funcțiile 1c pot fi exportate.

Pentru a "ieși" din execuția funcției și a procedurilor 1C, utilizați comanda "Întoarce". Funcția (spre deosebire de procedură) "returnează" rezultatul calculelor, adică este necesar să scrieți "valoare de returnare"; Funcțiile 1C nu sunt tipărite, apoi pot returna valoarea diferitelor tipuri, în funcție de parametrii sau condițiile.

Funcția diferă de procedura pentru capacitatea de a returna rezultatul calculelor, de exemplu:

Funcția funcției1 (parametru)
Retur parametru * 2;
Endfunction

Variabilă1 \u003d funcție1 (10);
// variabila1 va fi egală cu 20

Parametrii funcției și procedurilor 1C sunt legături cu variabilele care există la locul de apel. "Referință" înseamnă atunci când schimbați valoarea parametrului "interior" funcție 1c, acesta va fi schimbat și "exterior". Astfel încât acest lucru nu se întâmplă - parametrul este transmis cu valoarea AC. Cu toate acestea, acest lucru nu funcționează cu valorile obiectelor (liste, tabele, obiecte de bază de date), acestea vor fi în continuare transmise prin referință.

Când transmiteți parametrul la procedură / funcție, acesta este transmis "prin referință". Aceasta înseamnă că schimbarea acestuia în cadrul procedurii, schimbați valoarea sa la accesarea după terminarea funcției 1C. Astfel, exemplul anterior poate fi scris astfel:

Procedura de procedură1 (parametru)
Parametrul \u003d parametrul * 2;
Extradreses.

Variabilă1 \u003d 10;
Procedură1 (variabilă1);
Raport (variabil1);
// rezultatul va fi 20

Pentru a trece în procedură, valoarea variabilei și nu propria sa:

Procedura de procedură1 (parametru de valoare)
// acțiuni ..
Extradreses.

Când lucrați cu obiecte (directoare, documente), trebuie să se reamintească faptul că în interiorul 1C / procedura de proceduri 1C pot fi efectuate.
Dacă funcția 1C / procedură parametrii multiple, atunci inutile pot fi sărite (specificând virgulă dacă parametrul lipsește în mijloc), acesta va fi transmis sau nedefinit (vezi mai jos) sau valoare implicită:

Funcția funcției1 (parametrul1, parametrul2, parametrul3 \u003d "valoarea șirului")
// Fă ceva
Endfunction

// apelarea unei funcții fără parametri
// parametrul2 va fi egal cu incert
// parametrul3 va fi egal cu "valoarea șirului"
Funcția1 (10);

// apelarea unei funcții fără un al doilea parametru
Funcția1 (10, "valoare");

Așa cum am menționat mai devreme, procedurile 1C sunt utilizate ca stivuitoare de eveniment care decurg din utilizator cu formular (deschidere, închidere, apăsare etc.) sau funcționarea platformei (Start, Finalizare etc.). Tipurile posibile de manipulatoare de formă sau elementele sale pot fi văzute în proprietăți - făcând clic pe elementul adecvat al formularului (și în apărarea ferestrei de proprietăți în jos). Tipurile de manipulare din modulul Obiect pot fi văzute utilizând lista derulantă de pe panoul din configurator - unde este afișată lista de evenimente chiar nedeterminate și deja anumite. În diferite evenimente, diverși parametri, atunci când se adaugă un handler 1C, prescrie automat o listă de parametri.

Built-in 1c: Întreprinderile suportă două modalități de transmitere a parametrilor procedurilor și funcțiilor: parametrii de transmisie prin referință și parametrii de transmisie prin valoare.

În mod implicit, în limba încorporată 1c: Întreprinderile 8 Transferarea parametrilor la proceduri și funcții prin referință. Aceasta înseamnă că schimbarea parametrului formal din cadrul procedurii sau funcției se va reflecta asupra valorii parametrului real transmis atunci când se numește procedura sau funcția.


Procedura de procedură1 (parametrul formal1)

FormalPameter1 \u003d 2 * 3;

Extradreses.

ActualParameter \u003d 10;
Procedura1 (parametrul real);

// Valoarea de 6 va fi afișată - modificarea formală
// parametrul din cadrul procedurii a afectat schimbarea

// Procedura de apel: În mod implicit, parametrii sunt transmise
// Link!

Parametrii de transfer prin valoare

Când se transmite parametrul procedurii sau funcției numite, modificarea valorii parametrului formal din cadrul procedurii sau a funcției nu afectează parametrul real transmis atunci când se numește procedura sau funcția. Rețineți că parametrul trebuie transmis prin valoare, se efectuează utilizând cuvântul cheie al valorii.

Exemplu:


Procedura de procedură2 (valoarea formală a parametrilor)

FormalPameter1 \u003d 2 * 3;

Extradreses.

ActualParameter \u003d 10;
Procedura2 (parametrul real);

// va fi afișată valoarea 10 - schimbarea în formal
// parametrul din cadrul procedurii nu a afectat schimbarea
// valorile parametrului real transmis când
// Procedura de apel: Parametrul este transmis de valoare!
Raport (parametru real);

Caracteristicile variabilelor de transmitere a diferitelor tipuri de date prin valoare

Transferul variabilelor de diferite tipuri de date prin valoare are propriile caracteristici. Acestea constau în lucrul cu metode și proprietăți ale contextului parametrilor formali, starea parametrului real transmis atunci când se numește procedura sau funcția.

Luați în considerare ca exemplu situația în care parametrul procedurii transmise de valoarea este tabelul de valoare. În interiorul procedurii numite, cursa procesului () este creată o nouă instanță a tabelului de valori, care adaugă trei linii. Acest lucru nu afectează starea tabelului valorilor TK transmise ca parametru real la apelarea procedurii de manual ():


Procedură de prelucrareTrack (tabel de semnalizare)


Tab valoarea \u003d tabele noi;

// Adăugați două difuzoare la tabelul de valori
Fila Compex. Tablolocks. Addly ("coloana1");
Tab se obligă. Addly ("Coloana2");


Pentru n \u003d 1 până la 3 ciclu
Novstok \u003d valoarea tab-ului. ADDLY ();
Novstok.colonka1 \u003d "Coloana";
Novstok.colonka2 \u003d p;
Endcycle;

Extradreses.

// Creați un nou tabel de valori
Tk \u003d tabele noi;



// Adăugați câteva rânduri către tabelul de valori
Pentru n \u003d 1 până la 10 ciclu
Novstok \u003d tz. Addly ();

Novstok.colonka3 \u003d p;
Endcycle;

// va fi retras 10


Tratate (tk);

// va fi retras 10: în cadrul procedurii de procedură
// în parametrul formal a salvat noul tabel de valori

Luați în considerare ca exemplu situația în care parametrul procedurii transmise de valoarea este tabelul de valoare. În interiorul procedurii rezultate, tabelul de garanție () a valorilor transmise ca parametru la apelarea unei proceduri se prăbușește:


// Se indică faptul că transferul parametrului valorii tabelului este efectuat prin valoare
PROCEDURA Colaps: semnal de masă)

// Vom face cu tabelul de valori pe coloane coloane1 și coloana3
Rezumatul tabelor ("Coloana1", "Coloana3");

Extradreses.

// Creați un nou tabel de valori
Tk \u003d tabele noi;

// Adăugați trei coloane la tabelul de valori
Tk.colonki. Addly (coloana1 ");
Tk.colonki. Addly ("coloana2");
Tk.colonki. Addly ("coloana3");

// Adăugați câteva rânduri către tabelul de valori
Pentru n \u003d 1 până la 10 ciclu
Novstok \u003d tz. Addly ();
Novstok.colonka1 \u003d "coloana1";
Novstok.colonka2 \u003d "coloana2";
Novstok.colonka3 \u003d p;
Endcycle;

// va fi retras 10
Raport ("Numărul de elemente din TK pentru a se întoarce:" + TZ. N'TR. ());

// Condress procedura prin trimiterea parametrului real TK cu valoare
Implementare (tk);

// tabelul de valori acum minimizate: valoarea va fi afișată 1
Raport ("numărul de elemente din TK după pliere:" + tk. Naționalitate ());

Astfel, transmiterea parametrului real prin valoare în acest caz nu a condus la crearea unei copii a tabelului de valori. Când lucrați cu proprietăți și metode de valorile valorilor, lucrăm cu proprietăți și metode ale tabelului de valori utilizate atunci când procedura este numită comandată ().

Diferența pentru toate tipurile la transmiterea parametrului procedurii sau funcției prin referință sau valoarea se manifestă în atribuirea parametrului real al procedurii sau funcția noii valori. Proprietățile de apelare și metodele din contextul parametrului real, dacă există, afectează parametrul formal, indiferent dacă este transmis prin referință sau prin valoare.

1. Descrierea procedurilor și a funcțiilor este recomandată pentru a efectua sub forma unui comentariu la acestea. Necesitatea de a comenta anumite secțiuni ale procedurilor și funcțiilor ar trebui să fie determinată de dezvoltarea bazată pe complexitatea și non-standardul secțiunii specifice a codului.

2. Comentariul obligatoriu necesită proceduri și funcții ale modulelor care sunt incluse în interfața software - astfel de proceduri și funcții sunt destinate utilizării în alte subsisteme funcționale (sau alte aplicații), pentru care alți dezvoltatori pot fi responsabili, astfel încât acestea să fie bine documentate.

Vezi si:Restricții privind utilizarea procedurilor și funcțiilor de export și utilizarea procedurilor și funcțiilor de export în formularele modulelor

4. Comentariile ar trebui evitate care nu oferă explicații suplimentare cu privire la funcționarea procedurii de non-export (funcție).
De exemplu, incorect:

// Procedura - Evenimentul procesorului "Formulare de ieșire" // și procedura de recircuitate fantă () // Procedura de procesare "Calculați" // și procedura corectă calculează () // Procedura de procesare a evenimentului "Impunerea" elementului de tigla de tolnuntare de editare // & Clauze Procedură de editare Intraretolkovdiahepresie (element)

În aceste exemple, comentariile sunt redundante, deoarece este evident din numele procedurilor pe care acestea le sunt angajați de evenimente. Și cu descrierea și atribuirea parametrilor pot fi găsite în sintaxa asistentului.

// funcția revine conform documentului Funcția Clauzenței (date)

Acest comentariu nu oferă informații suplimentare despre funcția.

5. Comentariul este plasat înainte de anunțarea procedurii (funcțiilor) și are formularul următor.

5.1. Secțiunea "Descriere"conține o scurtă descriere verbală a destinației și / sau a principiilor procedurii (funcții). Poate fi singura secțiune pentru procedurile fără parametri.

5.2. Secțiunea "Parametri"descrie parametrii procedurii (funcții). Dacă nu sunt, secțiunea este omisă. Precedat de un șir "Parametri:" , apoi de la noua linie există descrieri ale tuturor parametrilor.

5.2.1. Descrierea parametrului Începe cu o linie nouă, apoi numele parametrului, apoi linia și lista de tip (*), urmată de cratimă și descrierea textului parametrului.
De exemplu:

// parametrii:

De asemenea, pentru fiecare parametru, puteți specifica una sau mai multe descrieri suplimentare ale tipurilor de parametri. Fiecare descriere suplimentară începe cu o linie nouă, apoi o cratimă obligatorie, apoi o listă de tipuri de parametri (*), urmată de o descriere a textului și o descriere a textului.
De exemplu:

// parametrii: // detalii - șir - numele detaliilor enumerate prin virgulă. // de exemplu, "cod, nume, părinte". // - structura, structurile fixe - ca o cheie transmisă // câmpuri pseudonim pentru structura returnată cu rezultatul, // și ca o valoare (opțional), numele câmpului real din tabel. // Dacă valoarea nu este definită, numele câmpului este luat de la cheie. // - o matrice, fixabsiv - o serie de recuzită de recuzită.

5.3. Secțiunea "Valoarea returnării"descrie tipul și conținutul funcției funcției. Pentru proceduri, această secțiune lipsește. Precedat de un șir "Valoarea returnării:". Apoi, de la noua linie a tipurilor de tipuri (*), apoi cratimă și textul.
De exemplu:

// Valoare returnată: // Boolevo - Adevăr, dacă cel puțin unul dintre rolurile transmise este disponibil utilizatorului curent,

5.4. Secțiunea "exemplu" Conține un exemplu de utilizare a procedurii sau a funcției. Pregătit de un șir "exemplu:". Apoi, de la noua linie un exemplu de utilizare.

(*) Notă: În conformitate cu "lista de calitate" înseamnă numele tipurilor separate prin virgule. Numele tipului poate fi simplu (într-un singur cuvânt) sau compozit - în două cuvinte separate de un punct.
De exemplu: Linia, Structura, Danderther Shipdersetts..

Când se dezvoltă pe platforma 1C: Textul de comentariu al întreprinderii 8.3 este afișat și în procedurile, funcțiile și parametrii lor contextuali. Pentru detalii, consultați secțiunea "Sugestie contextuală la introducerea textelor modulelor" Capitolele 26 "Instrumente de dezvoltare" în documentația pentru platformă.

Un exemplu de descriere a funcției cu un parametru:

// determină disponibilitatea rolurilor numai a rolului la utilizatorul curent, // și disponibilitatea drepturilor administrative. // // parametrii: // Tamers - un șir - nume de nume, disponibilitatea căreia este verificată, separată de virgule. // // Valoare returnată: // Boolevo - Adevăr, dacă cel puțin unul dintre rolurile transmise este disponibil utilizatorului curent, // are drepturi administrative. / // exemplu: // daca accesul rulos ("calcule suplimentare de masura, trimite") apoi ... // Funcție Roll Access (nume de nume) Export

Un exemplu de descriere a procedurii fără parametri:

// În manipulatorul de evenimente se efectuează actualizarea documentului; // - curățarea părții de masă a serviciului, dacă contractul este specificat împreună cu agentul Comisiei; // - Verificarea umplerii unității necesare de tranzacții în tabel. părți de bunuri; // - sincronizarea cu factura "subordonată"; // - umplerea depozitului și ordinea cumpărătorului în părțile de masă ale bunurilor și întoarcerii; // - Ștergerea liniilor neutilizate ale părții de masă "Numere de serie"; // - Umplerea variabilei modulului obiect. // Procedura de suprascriere () controlul final

6. Dacă doriți să comentați procedura sau funcția care este utilizată cu o directivă de compilare, trebuie să postați mai întâi un comentariu și apoi -
directiva privind compilarea. De exemplu:

// Procedură - Handler de evenimente "Formularele de plecare". // procesează parametrii formei și umple detaliile valorilor de formă. // efectuează, de asemenea, următoarele acțiuni: // ... // & Nasserver Procedura de conservare (eșec, prelucrare standard)

Acest stil de plasare a comentariului vă permite să acordați mai întâi atenție definiției funcției și directivei de compilare și apoi - la comentariu că un număr suficient de mare de linii poate ocupa.

7. Codul de proceduri și funcții trebuie separat unul de celălalt în textul modulului cu șiruri goale.

Comenzi automate pentru proceduri sau funcții cu directive de compilare

Pentru a aranja automat comentariile la procedurile sau funcțiile cu directivele de compilare, puteți utiliza procesarea aplicată Formatiimedizpilation.epf.. Pentru asta aveți nevoie:

  1. Descărcați module de configurare (Comanda Menu de configurare -\u003e Descărcați fișierele de configurare ...)
  2. Modul de procesare deschisă 1C: Intreprindere și specificați directorul în care modulele au fost descărcate - Apoi faceți clic pe butonul "Format"
  3. Descărcați module în configurație (comanda Meniu de configurare -\u003e Descărcați fișiere de configurare ...)

Găsim: exemplu de anunț și descrieri ale procedurii fără parametri, parametrii Procedura de depășire ()Refrigerate pentru utilizarea furcilor pentru 1c, cum să faceți o procedură în 1c, care nume de funcții sau proceduri trebuie corectate?, Pentru a înțelege și a citi în codul și funcția Cod 1C, 1C 77 Descrierea funcției, comentariul privind materialele de procedură Cantitate, proceduri și funcții în procedurile și funcțiile documentelor 1C, 1c


Îmi cer scuze în avans pentru adnotarea Pathos despre "plasarea punctelor", dar este necesar să vă duceți într-un fel într-un articol)) din partea mea, voi încerca să vă ridicați încă mai justificați așteptările dvs.

Pe scurt despre ceea ce este

Toate acestea sunt, de asemenea, cunoscute, dar încă la început vă voi reaminti modul în care parametrii metodei pot fi transmise în 1c. Ele pot fi transmise "pe link" și "înseamnă". În primul caz, transmitem aceeași valoare la metodă ca la un punct de apel și în al doilea - copia sa.

În mod implicit, argumentele 1c sunt transmise prin referință, iar modificarea parametrului din interiorul metodei va fi văzută din metoda exterioară. Aici înțelegerea în continuare a problemei depinde de exact ce înțelegeți sub cuvântul "Schimbați parametrul". Deci, există o re-atribuire și nimic mai mult. În plus, misiunea poate fi implicită, de exemplu, prin apelarea metodei platformei care returnează ceva în parametrul de ieșire.

Dar dacă nu vrem ca parametrul nostru să fie transmis prin referință, atunci putem specifica cuvântul cheie înainte de parametru Semn

Procedura de cogniție (parametru de valoare) parametru \u003d 2; Parametrul de extracție \u003d 1; Creație (parametru); Raport (parametru); // va ieși 1.

Totul funcționează așa cum a promis - schimbați (și mai corect "înlocuiți") valoarea parametrului nu duce la o modificare a valorii în afara metodei.

Ei bine, care este gluma?

Momentele interesante încep când începem să transmitem ca parametrii nu sunt tipuri primitive (linii, numere, date etc.), dar obiecte. Acesta este locul în care copia "mică" și "adâncă" a obiectului, precum și indicii (nu în ceea ce privește C ++ și ca descriptori abstracți (mânere), pop-up.

Când transmiteți un obiect (de exemplu, tabele) prin referință, transmitem valoarea valorii indicatorului (unele mâner), care în memoria platformei "deține" obiectul. Când transmiteți valoarea, platforma va face o copie a acestui indicator.

Cu alte cuvinte, dacă trecerea unui obiect prin referință, în metoda atribuim valoarea parametrului "matrice", apoi la punctul de apel, obținem o matrice. Re-atribuirea valorii transmise prin referință este observată din site-ul de apel.

Procedură de tratament (parametru) parametru \u003d matrice nouă; Extrop tabelul celular \u003d noua tablement; Tratament (tabel); Raport (Tinte (tabel)); // încărcați o matrice

Dacă, vom da un obiect prin valoare, apoi la punctul de apel, masa noastră nu va dispărea.

Conținutul obiectului și starea acestuia

Când valoarea este transmisă, nu întregul obiect este copiat, dar numai pointerul său. Instanța obiectului rămâne aceeași. Nu contează modul în care treceți obiectul prin referință sau prin valoare - curățarea valorilor valorilor vor duce la curățarea tabelului. Această curățare va fi vizibilă peste tot, pentru că Obiectul a fost unul și unic și indiferent de modul în care a fost transmisă metodei.

Procedură de procesare (parametri). Operați (); Extrop tabelul celular \u003d noua tablement; Tabel. Addly (); Tratament (tabel); Raport (tabel. Număr ()); // retrageți 0.

La transmiterea obiectelor la metode, platforma operează prin indicatori (analogi convenționali, nu direct de la C ++). Dacă obiectul este transmis prin referință, atunci celula de memorie mașină virtuală 1c, în care acest obiect se află, poate fi suprascris de un alt obiect. Dacă obiectul este transmis prin valoare, indicatorul este copiat și suprascrierea unui obiect nu duce la suprascrierea celulei de memorie cu obiectul sursă.

În același timp, orice schimbare stat Obiect (curățare, adăugare a proprietăților etc.) modifică obiectul în sine și, în general, acesta nu este legat de modul în care și unde a fost transmis obiectul. Starea unei instanțe de obiect sa schimbat, poate fi o grămadă de "referință" și "în valori", dar instanța este întotdeauna aceeași. Prin trecerea unui obiect la metodă, nu creăm o copie a întregului obiect.

Și este întotdeauna adevărat, cu excepția ...

Interacțiunea serverului client

Platforma este implementată foarte transparent de apelurile serverului. Pur și simplu numim metoda și sub capota platforma se serializează (se transformă în șir) toate parametrii metodei, transmite pe server și apoi returnează parametrii de ieșire înapoi la client, unde se ocupă și trăiesc, ca și cum nu ar fi făcut-o Du-te la orice server.

După cum știți, nu toate obiectele de platformă sunt serializabile. De aici, restricția crește, deoarece nu toate obiectele pot fi transferate în metoda serverului de la client. Dacă transmiteți un obiect non-ușurat, platforma va începe să jure cuvinte rele.

  • Un anunț explicit al intențiilor programatorului. Privind la semnătura metodei, puteți spune în mod clar ce parametri sunt de intrare și ce ieșire. Acest cod este mai ușor de citit și de însoțit
  • Pentru a schimba parametrul "Link" de pe server, se vede la punctul de apel de pe client,arametrele transmise la server prin referință, platforma va reveni cu siguranță la client pentru a asigura comportamentul descris la începutul articolului. Dacă parametrul nu trebuie returnat, vor exista supraîncărcarea traficului. Pentru a optimiza schimbul de date, parametrii ale căror valori nu avem nevoie la ieșire, trebuie să marcați sensul cuvântului.

Al doilea punct este notabil aici. Pentru a optimiza traficul, platforma nu va returna valoarea parametrului clientului dacă parametrul este marcat cu valoarea cuvântului. Toate acestea sunt minunate, dar duce la un efect interesant.

După cum am spus, când obiectul este transferat la server, se produce serializarea, adică. Se efectuează o copie "profundă" a obiectului. Și dacă există cuvinte Valoareobiectul nu va merge de la server înapoi la client. Folosim aceste două fapte și obținem următoarele:

& Promotion Promotion Procedură (parametru). Recomandă (); Extrudresses & Nasserver Procedura pentru parametrul de cunoștință (parametru de valoare). Recomandă (); Extrudresele și reclamația procedurii de reclamație (parametrul valorii). Recomandă (); Controale de capăt și procedura de revendicare Verificați semnalul () Lista1 \u003d Snaps noi; Lista1. Adăugați ("hi"); List2 \u003d list1.copy (); Lista3 \u003d list1.copy (); // Obiectul este copiat complet, // transmis pe server, apoi returnează. // curățarea listei este vizibilă la punctul post al listei rapide (listei); // Obiectul este copiat complet, // trece la server. Înapoi nu se întoarce. // curățarea listei nu este vizibilă la punctul de apel al creației (listul2); // copiați numai un indicator obiect // curățarea listei este vizibilă la punctul de apel al cunoașterii (listul3); Raport (listul1. N'Tvice ()); Raport (lista2. Numărul ()); Raport (lista3. N'TRB ()); Extradreses.

rezumat

Dacă scurt, este posibil să se rezume după cum urmează:

  • Transferul prin referință vă permite să "transpirați" un obiect cu un obiect complet diferit
  • Transmisia nu este permisă să "transpire" obiectul, dar schimbările în starea internă a obiectului vor fi vizibile, deoarece Lucrați cu aceeași instanță a obiectului
  • Când serverul apel, lucrul vine cu obiecte diferite ale obiectului, deoarece Copierea profundă a fost efectuată. Cuvânt cheie. Valoare Dezactivați copierea instanței serverului înapoi la client și schimbarea stării interne a obiectului de pe server nu va duce la o schimbare similară a clientului.

Sper că această listă simplă de reguli vă va permite să rezolvați disputele cu colegii cu privire la transmiterea parametrilor "cu valoare" și "pe link"