1c câmpuri calculate. Limbajul de expresie al sistemului de compoziție a datelor (1Cv8). Operația de verificare a unei valori pentru non-NULL

  • 1C-Bitrix
  • Una dintre cele mai importante domenii ale software-ului de afaceri este raportarea. Cât de ușor este să personalizați un raport existent la nevoile în schimbare ale afacerii (și ale legislației) sau să faceți unul nou poate depinde (și nu într-un sens figurat!) de soarta unei afaceri, dacă este un raport pentru oficiu fiscal sau o diagramă a cererii de mărfuri în funcție de sezon și de alți factori. Un sistem de raportare puternic și flexibil care vă permite să extrageți cu ușurință datele potrivite din sistem, să le prezentați într-o formă ușor de înțeles, permițând utilizatorului final să reconfigureze raportul standard pentru a vedea datele într-o nouă lumină - acesta este idealul pentru fiecare sistemul de afaceri ar trebui să depună eforturi pentru.

    În platforma 1C:Enterprise, un mecanism numit Data Composition System (ACS, pe scurt) este responsabil pentru generarea de rapoarte. În acest articol, vom încerca să dăm scurta descriere ideile și arhitectura mecanismului ACS și capacitățile acestuia.


    ACS este un mecanism bazat pe descrierea declarativă a rapoartelor. ACS este conceput pentru a construi rapoarte și a afișa informații care au o structură complexă. Apropo, pe lângă dezvoltarea rapoartelor, mecanismul ACS este folosit și în 1C:Enterprise într-o listă dinamică, un instrument pentru afișarea informațiilor de listă cu funcționalitate bogată (afișarea listelor plate și ierarhice, formatare condiționată a rândurilor, grupare etc.) .

    Un pic de istorie

    În prima versiune a platformei 1C:Enterprise 8, versiunea 8.0, rapoartele au fost făcute după cum urmează:
    1. Una sau mai multe interogări au fost scrise în limbajul de interogare 1C (limbaj asemănător SQL, mai multe despre el mai jos).
    2. A fost scris un cod care a transferat rezultatele interogărilor executate într-un document sau o diagramă de calcul. Codul ar putea face, de asemenea, lucrări care nu pot fi făcute într-o interogare - de exemplu, a calculat valori folosind limbajul 1C încorporat.
    Abordarea este simplă, dar nu cea mai convenabilă - există un minim de setări vizuale, totul trebuie programat corp la mână. Și unul dintre atuurile la acea vreme era complet noua platforma„1C:Enterprise 8” este o minimizare în soluția de aplicare a cantității de cod care trebuie scris manual, în special datorită designului vizual. Ar fi logic să urmați aceeași cale în mecanismul de raportare. Acest lucru a fost realizat prin dezvoltarea unui nou mecanism - Sistemul de compunere a datelor.

    Una dintre ideile care au stat la baza ACS a fost flexibilitatea și personalizarea rapoartelor, care este disponibilă atât pentru dezvoltator, cât și pentru utilizatorul final. În mod ideal, am dori să oferim utilizatorului final acces la același set de instrumente de proiectare a rapoartelor ca și dezvoltatorului. Ar fi logic să punem la dispoziția tuturor un singur set de instrumente. Ei bine, deoarece instrumentele implică participarea utilizatorului final, înseamnă că utilizarea programării în ele ar trebui eliminată la minimum (cel mai bine, complet eliminată), iar setările vizuale ar trebui utilizate la maximum.

    Formularea problemei

    Sarcina în fața echipei de dezvoltare a fost aceasta - să realizeze un sistem de raportare bazat nu pe un algoritmic (adică prin scrierea codului), ci pe o abordare declarativă a creării de rapoarte. Și credem că problema a fost rezolvată cu succes. Din experiența noastră, aproximativ 80% din raportarea necesară poate fi implementată folosind ACS fără o singură linie de cod (cu excepția scrierii formulelor pentru câmpurile calculate), în cea mai mare parte - prin setări vizuale.
    Dezvoltarea primei versiuni a ACS a durat aproximativ 5 ani-om.

    Două limbi

    În crearea rapoartelor sunt implicate două limbi. Unul este limbajul de interogare folosit pentru a prelua datele. Al doilea este limbajul de expresie al compoziției datelor, conceput pentru a scrie expresiile utilizate în diverse părți sistem, de exemplu, în setările de compoziție a datelor, pentru a descrie expresii de câmp personalizate.

    Limbajul de interogare

    Limbajul de interogare se bazează pe SQL și este ușor de stăpânit de cei care cunosc SQL. Exemplu de solicitare:

    Este ușor să vezi analogii secțiunilor standard de interogare SQL - SELECT, FROM, GROUP BY, ORDER BY.

    În același timp, limbajul de interogare conține un număr semnificativ de extensii care vizează reflectarea specificului sarcinilor financiare și economice și reducerea maximă a eforturilor de dezvoltare a soluțiilor aplicate:

    • Câmpuri de referință printr-un punct. Dacă câmpurile oricărui tabel sunt de tip referință (stochează link-uri către obiecte dintr-un alt tabel), dezvoltatorul se poate referi la ele în textul de interogare prin „.”, în timp ce numărul de niveluri de imbricare ale unor astfel de link-uri nu este limitat de sistemul (de exemplu, Comandă client. Contract. Organizație. Telefon).
    • Formarea multidimensională și pe mai multe niveluri a rezultatelor. Totalurile și subtotalurile se formează ținând cont de grupare și ierarhie, nivelurile pot fi ocolite într-o ordine arbitrară cu însumarea subtotalurilor, se asigură construirea corectă a totalurilor pe dimensiuni de timp.
    • Suport pentru mese virtuale. Tabelele virtuale furnizate de sistem vă permit să obțineți date aproape gata făcute pentru majoritatea sarcini aplicate fără a fi nevoie de interogări complexe. Astfel, un tabel virtual poate furniza date despre soldul mărfurilor în contextul perioadelor la un anumit moment în timp. În același timp, tabelele virtuale profită la maximum de informațiile stocate, de exemplu, totaluri calculate anterior etc.
    • Tabele temporare. Limbajul de interogare vă permite să utilizați tabele temporare în interogări. Cu ajutorul lor, puteți îmbunătăți performanța interogărilor, în unele cazuri puteți reduce numărul de blocări și puteți face textul interogării mai ușor de citit.
    • cereri de lot. Pentru o muncă mai convenabilă cu tabelele temporare, limbajul de interogare acceptă lucrul cu interogări în lot - astfel, crearea unui tabel temporar și utilizarea acestuia sunt plasate într-o singură interogare. O cerere de lot este o succesiune de cereri separate prin punct și virgulă (";"). Cererile din lot sunt executate una dupa alta. Rezultatul executării unei interogări lot, în funcție de metoda utilizată, va fi fie rezultatul returnat de ultima interogare a lotului, fie o matrice a rezultatelor tuturor solicitărilor lotului în ordinea în care urmează cererile din lot .
    • Obținerea vizualizărilor câmpului de referință. Fiecare tabel de obiecte (în care este stocat un director sau document) are un câmp virtual - „Reprezentare”. Acest câmp conține o reprezentare textuală a obiectului și facilitează munca reporterului. Deci, pentru un document, acest câmp conține toate informațiile cheie - numele tipului de document, numărul și data acestuia (de exemplu, „Vânzare 000000003 din 07/06/2017 17:49:14”), salvând dezvoltatorul de scrierea unui câmp calculat.
    • si etc.
    Motorul de interogare modifică automat interogarea, ținând cont de rolurile utilizatorului în numele căruia se execută interogarea (adică, utilizatorul va vedea doar datele pe care are dreptul să le vadă) și de opțiunile funcționale (adică, în conformitate cu cel configurat în funcționalitatea soluției aplicației).

    Există, de asemenea, extensii speciale de limbaj de interogare pentru SKD. Extinderea se realizează folosind instrucțiuni de sintaxă speciale, incluse între acolade și plasate direct în textul solicitării. Cu ajutorul extensiilor, dezvoltatorul stabilește ce operațiuni va putea efectua utilizatorul final prin personalizarea raportului.

    De exemplu:

    • ALEGE. Această propoziție descrie câmpurile pe care utilizatorul le va putea selecta pentru ieșire. Dupa asta cuvânt cheie alias-urile câmpurilor din lista principală de selecție a interogărilor, care vor fi disponibile pentru personalizare, sunt listate separate prin virgule. Exemplu: (SELECT Nomenclator, Depozit)
    • UNDE. Descrie câmpurile pe care utilizatorul poate aplica selecția. Această propunere utilizează câmpuri de tabel. Nu este permisă utilizarea aliasurilor de câmpuri selectate. Fiecare parte de unire poate conține propriul element WHERE. Exemple: (WHERE Nomenclatura.*, Warehouse ), (WHERE Document.Date >= &StartDate, Document.Date<= &ДатаКонца}
    • si etc.
    Un exemplu de utilizare a extensiilor:

    Limbajul de exprimare al compoziției datelor

    Limbajul de expresie al compoziției datelor este conceput pentru a scrie expresii utilizate, în special, pentru a descrie expresii de câmp personalizate. ACS vă permite să definiți câmpuri personalizate într-un raport folosind fie propriile expresii, fie seturi de opțiuni cu condiții pentru selecția lor (analog cu CASE în SQL). Câmpurile personalizate sunt analoge cu câmpurile calculate. Ele pot fi setate atât în ​​configurator, cât și în modul 1C:Enterprise, dar funcțiile modulelor comune nu pot fi utilizate în expresiile de câmp personalizate. Prin urmare, câmpurile personalizate sunt mai mult pentru utilizator decât pentru dezvoltator.

    Exemplu:

    Procesul de creare a unui raport privind ACS

    Când creăm un raport, trebuie să creăm un aspect care să definească modul în care datele vor fi afișate în raport. Puteți crea un aspect bazat pe o schemă de compunere a datelor. Schema de compoziție a datelor descrie esența datelor care sunt furnizate raportului (de unde să obțineți datele și cum puteți controla compoziția acestora). Schema de compunere a datelor este baza pe care pot fi generate tot felul de rapoarte. Schema de compunere a datelor poate conține:
    • solicitați text cu instrucțiuni ale sistemului de compunere a datelor;
    • descrierea mai multor seturi de date;
    • o descriere detaliată a câmpurilor disponibile;
    • descrierea relațiilor dintre mai multe seturi de date;
    • descrierea parametrilor de achiziție a datelor;
    • descrierea structurilor de câmp și grupărilor;
    • si etc.

    De exemplu, puteți adăuga o interogare la schema de compunere a datelor ca un set de date și puteți apela constructorul de interogare, care vă permite să compuneți grafic o interogare de complexitate arbitrară:

    Rezultatul rulării generatorului de interogări va fi textul interogării (în limbajul de interogare 1C:Enterprise). Acest text poate fi ajustat manual dacă este necesar:

    Pot exista mai multe seturi de date într-o schemă de compunere a datelor, seturile de date pot fi legate într-un aspect într-un mod arbitrar, pot fi adăugate câmpuri calculate, pot fi setați parametrii de raport etc. Merită menționată o caracteristică interesantă a mecanismului de interogare din 1C:Enterprise. Interogările sunt în cele din urmă traduse într-un dialect al SQL specific DBMS-ului cu care lucrează direct aplicația. În general, încercăm să folosim la maximum capacitățile serverelor DBMS (suntem limitați de faptul că folosim doar acele capabilități care sunt disponibile simultan în toate DBMS suportate de platforma 1C:Enterprise - MS SQL, Oracle, IBM DB2 , PostgreSQL). Astfel, la nivel de interogare în câmpurile calculate, putem folosi doar acele funcții care sunt traduse în SQL.

    Dar la nivelul schemei de compunere a datelor, putem deja adăuga câmpuri personalizate și folosi funcții în ele în limbajul de dezvoltare 1C încorporat (inclusiv cele scrise de noi), ceea ce extinde foarte mult capacitățile rapoartelor. Din punct de vedere tehnic, arată așa - tot ceea ce poate fi tradus în SQL este tradus în SQL, interogarea este executată la nivel DBMS, rezultatele interogării sunt plasate în memoria serverului de aplicații 1C, iar ACS calculează valorile de câmpuri calculate pentru fiecare înregistrare, ale căror formule sunt scrise în limbajul 1C.


    Adăugarea câmpurilor personalizate

    Puteți adăuga orice număr de tabele și diagrame la raport:


    Designer de rapoarte


    Raportați în timpul executării

    Cu ajutorul ACS, utilizatorul poate adăuga selecții complexe la raport (care vor fi adăugate la interogare în locurile potrivite), design condiționat (permițându-vă să formatați diferit - font, culoare etc. - câmpuri de ieșire în funcție de acestea valori) și multe altele.

    Descrieți pe scurt procesul de construire și generare a unui raport, după cum urmează:

    • Dezvoltatorul în timpul proiectării cu ajutorul designerului (sau în timpul rulării cu ajutorul codului) definește schema de aspect al datelor:
      • Textul cererii/cererilor
      • Descrierea câmpurilor calculate
      • Relații între interogări (dacă există mai multe)
      • Opțiuni de raportare
      • Setări implicite
      • etc.
    • Setările de mai sus sunt salvate în aspect
    • Utilizatorul deschide un raport
      • Posibil efectuează setări suplimentare (de exemplu, modifică valorile parametrilor)
      • Apăsați butonul „Generare”.
    • Setările utilizatorului se aplică schemei de compoziție a datelor definită de dezvoltator.
    • Se formează un aspect intermediar al compoziției datelor, care conține instrucțiuni despre de unde să se obțină datele. În special, interogările specificate în aspect sunt corectate. Deci, câmpurile care nu sunt utilizate în raport sunt eliminate din cerere (acest lucru se face pentru a minimiza cantitatea de date primite). Toate câmpurile care sunt utilizate în formulele de câmp calculate sunt adăugate la interogare.
    • Procesorul de compunere a datelor este inclus în carcasă. Procesorul de layout execută interogări, conectează seturi de date, calculează valorile câmpurilor și resurselor calculate, efectuează grupări. Într-un cuvânt, face toate calculele care nu au fost efectuate la nivel de SGBD.
    • Procesorul de ieșire a datelor lansează o interogare pentru execuție și trimite datele primite într-o foaie de calcul, diagramă etc.


    Procesul de generare a unui raport de către mecanismul ACS

    Încercăm să minimizăm cantitatea de date de raportare transferate de la server la aplicația client. La afișarea datelor într-un document foaie de calcul, la deschiderea unui document foaie de calcul, transferăm de pe server doar acele linii pe care utilizatorul le vede la începutul documentului. Pe măsură ce utilizatorul se deplasează de-a lungul liniilor documentului, datele lipsă sunt descărcate de pe server la client.

    Setarile utilizatorului

    Toate instrumentele ACS sunt disponibile atât pentru dezvoltator, cât și pentru utilizatorul final. Dar practica a arătat că utilizatorul final este adesea speriat de abundența capabilităților instrumentului. Mai mult, în cele mai multe cazuri, utilizatorul final nu are nevoie de toată puterea setărilor - este suficient pentru el să aibă acces rapid la setarea unuia sau doi parametri de raport (de exemplu, perioada și contrapartea). Începând cu o anumită versiune a platformei, dezvoltatorul de rapoarte are posibilitatea de a marca ce setări de raport sunt disponibile utilizatorului. Acest lucru se face folosind caseta de selectare „Include în setările utilizatorului”. De asemenea, setările raportului au acum un semnalizator „Mod de afișare” care ia una dintre cele trei valori:
    • Acces rapid. Setarea va fi afișată direct în partea de sus a ferestrei de raport.
    • Comun. Setarea va fi disponibilă prin butonul „Setări”.
    • Nu este disponibil. Setarea nu va fi disponibilă pentru utilizatorul final.


    Setarea modului de afișare în timpul de proiectare


    Afișați setarea în modul Acces rapid în timpul rulării (sub butonul Generare)

    Planuri de dezvoltare

    Una dintre prioritățile în dezvoltarea ACS pentru noi este simplificarea setărilor utilizatorului. Experiența noastră arată că pentru unii utilizatori finali, lucrul cu setările utilizatorului este încă o muncă serioasă. Luăm în considerare acest lucru și lucrăm în această direcție. În consecință, va deveni, de asemenea, mai ușor pentru dezvoltatori să lucreze cu ACS, deoarece noi, ca și înainte, dorim să oferim un singur set de instrumente pentru crearea rapoartelor atât pentru dezvoltator, cât și pentru utilizatorul final.

    În lumina viitoarei lansări a 8.2.14, voi încerca să descriu câteva dintre noile caracteristici ale sistemului de compunere a datelor.

    Deschideți schema de compunere a datelor, de preferință într-un raport extern, pentru a facilita editarea.

    Adăugăm un set de date de interogare și scriem, fie manual, fie folosind generatorul de interogări, cea mai simplă interogare:

    1. Configurați o solicitare în ACS.

    2. Configurați câmpurile calculate în ACS

    3. Configuram aspectul datelor din fila de setări

    4. Lansăm 1C Enterprise 8.2.14. Deschidem raportul. Formăm, primim.

    Descrierea noilor caracteristici în sine:

    1. data curentă ()

    Returnează data sistemului. La așezarea layout-ului, în toate expresiile care sunt prezente în layout, funcția CurrentDate() este înlocuită cu valoarea datei curente.

    2. CALCULATEAZĂ EXPRESIA()

    Sintaxă:

    Calculați expresia(<Выражение>, <Группировка>, <ОбластьВычисления>, <Начало>, <Конец>, <Сортировка>, <ИерархическаяСортировка>, <ОбработкаОдинаковыхЗначенийПорядка>)

    Descriere:

    Funcția este concepută pentru a evalua o expresie în contextul unei grupări.

    Funcția ia în considerare selecția grupărilor, dar nu ia în considerare selecțiile ierarhice.

    Funcția nu poate fi aplicată unei grupări din selecția grupului respectiv. De exemplu, în selectarea grupării Nomenclatură, nu puteți folosi expresia Calculate Expression ("Suma(SumTurnover)", "TotalTotal") > 1000. Dar o astfel de expresie poate fi folosită în selecția ierarhică.

    Dacă înregistrarea finală precede înregistrarea de început, atunci se consideră că nu există înregistrări pentru calcularea datelor detaliate și calculul funcțiilor agregate.

    La calcularea expresiilor de interval pentru totalul general (parametrul Grupare este setat la GrandTotal), se consideră că nu există înregistrări pentru calcularea datelor detaliate și calcularea funcțiilor agregate.

    Generatorul de layout, atunci când generează expresia funcției Calculate Expression, dacă expresia de ordonare conține câmpuri care nu pot fi utilizate în grupare, înlocuiește funcția Calculate Expression cu NULL.

    Opțiuni

    <Выражение>

    __________________________

    Tip: șir. Expresia de evaluat.

    <Группировка>

    __________________________

    Tip: șir. Conține numele grupării în al cărei context urmează să fie evaluată expresia. Dacă un șir gol este folosit ca nume de grupare, calculul va fi efectuat în contextul grupării curente. Dacă șirul GrandTotal este folosit ca nume de grupare, calculul va fi efectuat în contextul totalului general. În caz contrar, calculul va fi efectuat în contextul grupării părinte cu acel nume.

    De exemplu:

    Sumă(Vânzări.Suma Cifra de afaceri)/Calculați(„Suma(Vânzări.Suma Cifra de afaceri)”, „TotalTotal”)

    În acest exemplu, rezultatul va fi raportul dintre suma pentru câmpul Vânzări.SumăVolum al înregistrării de grupare și valoarea aceluiași câmp în întregul aspect;

    <ОбластьВычисления>

    _________________________

    Tip: șir. Parametrul poate lua următoarele valori:

    · GeneralTotal - expresia va fi calculată pentru toate înregistrările de grupare.

    · Ierarhie - expresia va fi evaluată pentru intrarea ierarhică părinte, dacă există una, și pentru întreaga grupare, dacă nu există intrare ierarhică părinte.

    · Grupare - expresia va fi evaluată pentru înregistrarea de grupare curentă.

    · GroupingNotResource- la calcularea unei funcții pentru o înregistrare de grup pe resurse, expresia va fi calculată pentru prima înregistrare de grup a grupării inițiale.

    Când se calculează funcția CalculateExpression() cu valoarea GroupingNotResource pentru înregistrările de grup care nu sunt grupări după resurse, funcția este calculată în același mod în care ar fi calculată dacă valoarea parametrului ar fi egală cu valoarea Grouping.

    Generatorul de aspect al compoziției de date, când generează un aspect al compoziției de date, când afișează un câmp de resurse care este grupat după, plasează o expresie în aspect care este calculată utilizând funcția Calculate Expression(), specificând parametrul GroupingNotResource. Pentru alte resurse grupate după resursă, sunt plasate expresii de resurse obișnuite.

    <Начало>

    _____________________

    Tip: șir. Specifică ce înregistrare să pornească fragmentul în care să se calculeze funcțiile agregate ale expresiei și din ce înregistrare să se obțină valorile câmpurilor din afara funcțiilor agregate. Valoarea poate fi una dintre următoarele:

    · Anterior

    <Конец>

    ____________________

    Tip: șir. Indică în ce înregistrare să se continue fragmentul în care să se calculeze funcțiile agregate ale expresiei. Valoarea poate fi una dintre următoarele:

    · Primul (Primul) . Trebuie să obțineți prima înregistrare de grupare. După cuvântul dintre paranteze, puteți specifica o expresie, al cărei rezultat va fi folosit ca decalaj de la începutul grupării. Valoarea rezultată trebuie să fie un număr întreg mai mare decât zero. De exemplu, First(3) - obținerea a treia înregistrare de la începutul grupării.

    Dacă prima intrare este în afara grupării, atunci se consideră că nu există intrări. De exemplu, dacă există 3 înregistrări și doriți să obțineți primul (4), atunci se consideră că nu există înregistrări.

    Ultimul (Ultimul). Trebuie să obțineți cea mai recentă intrare de grupare. După cuvântul dintre paranteze, puteți specifica o expresie, al cărei rezultat va fi folosit ca decalaj față de sfârșitul grupării. Valoarea rezultată trebuie să fie un număr întreg mai mare decât zero. De exemplu, Last(3) - obține a treia înregistrare de la sfârșitul grupării.

    Dacă ultima intrare este în afara grupării, atunci se consideră că nu există intrări. De exemplu, dacă există 3 înregistrări și doriți să obțineți Last(4), atunci se consideră că nu există înregistrări.

    · Anterior. Trebuie să obțineți intrarea anterioară de grupare. După cuvântul din paranteză, puteți specifica o expresie, al cărei rezultat va fi folosit ca o schimbare înapoi de la înregistrarea de grupare curentă. De exemplu, Previous(2) - obțineți precedentul din înregistrarea anterioară.

    Dacă înregistrarea anterioară se află în afara grupării (de exemplu, a doua înregistrare de grupare trebuie să obțină Previous(3), atunci se obține prima înregistrare de grupare.

    La obținerea înregistrării anterioare pentru totalul grupării, se consideră că se obține prima înregistrare.

    · Următorul (Următorul) . Trebuie să obțineți următoarea intrare de grupare. După cuvântul dintre paranteze, puteți specifica o expresie, al cărei rezultat va fi folosit ca o schimbare înainte de la înregistrarea de grupare curentă. De exemplu, Next(2) - obțineți următorul din următoarea înregistrare.

    Dacă următoarea înregistrare depășește gruparea, atunci se consideră că nu există înregistrări. De exemplu, dacă există 3 înregistrări și a treia înregistrare primește Next(), atunci se consideră că nu există înregistrări.

    Când se primește următoarea înregistrare pentru totalul grupării, se consideră că nu există nicio înregistrare.

    · Curent (curent) . Trebuie să obțineți intrarea curentă.

    Când este preluată pentru un total de grupare, prima înregistrare este preluată.

    · BoundaryValue. Necesitatea de a obține înregistrarea cu valoarea specificată. După cuvântul RestritingValue dintre paranteze, trebuie să specificați expresia cu valoarea căreia doriți să începeți fragmentul, primul câmp de ordonare.

    Înregistrarea va fi prima înregistrare a cărei valoare a câmpului de ordonare este mai mare sau egală cu valoarea specificată. De exemplu, dacă câmpul Period este folosit ca câmp de comandă și are valorile 01/01/2010, 02/01/2010, 03/01/2010 și doriți să obțineți LimitValue(DateTime(2010) , 1, 15)), apoi se va primi o înregistrare cu data 02/01. 2010.

    <Сортировка>

    _____________________

    Tip: șir. Sunt enumerate expresiile separate prin virgulă care descriu regulile de ordonare. Dacă nu este specificat, atunci ordonarea se realizează în același mod ca și pentru gruparea pentru care este evaluată expresia. După fiecare expresie, puteți specifica cuvintele cheie Asc (pentru a sorta în ordine crescătoare), Descending (pentru a sorta în ordine descrescătoare) și AutoOrder (pentru a sorta câmpurile de referință după câmpurile după care doriți să sortați obiectul referit). Cuvântul AutoOrder poate fi folosit atât cu cuvinte crescătoare, cât și cu cuvinte descrescătoare.

    <ИерархическаяСортировка>

    _____________________

    Tip: șir. Similar cu opțiunea Sortare. Folosit pentru a aranja înregistrările ierarhice. Dacă nu este specificat, generatorul de layout generează o comandă conform ordinii specificate în parametrul Sortare.

    <ОбработкаОдинаковыхЗначенийПорядка>

    ____________________

    Tip: șir. Specifică o regulă pentru a determina înregistrarea anterioară sau următoare dacă există mai multe înregistrări cu aceeași valoare de ordonare:

    · Separat înseamnă că o secvență de înregistrări ordonate este utilizată pentru a determina înregistrările anterioare și următoare. Valoare implicită.

    · Together (Together) indică faptul că înregistrările anterioare și următoare sunt determinate pe baza valorilor expresiilor de ordonare.

    De exemplu, dacă secvența rezultată este ordonată după dată:
    |Data|Numele complet|Sens
    1 | 01 ianuarie 2001 | Ivanov M. | 10
    2 | 02 ianuarie 2001 | Petrov S. | 20
    3 | 03 ianuarie 2001 | Sidorov R. | treizeci
    4 | 04 ianuarie 2001 | Petrov S. | 40

    Dacă valoarea parametrului este Separat, atunci:

    § intrarea anterioară la intrarea 3 va fi intrarea 2.

    § dacă fragmentul de calcul este definit ca Current, Current (respectiv, parametrii Start și End), atunci pentru înregistrarea 2 acest fragment va consta dintr-o înregistrare 2. Expresia Calculate Expression ("Suma (Valoare)", Current, Current) va fi egal cu 20.

    Dacă valoarea parametrului este Together , atunci:

    § intrarea anterioară la intrarea 3 va fi intrarea 1.

    § dacă fragmentul de calcul este definit ca Current, Current (respectiv, parametrii Start și End), atunci pentru înregistrarea 2 acest fragment va fi format din înregistrările 2 și 3. Expresia Calculate Expression ("Suma (Valoare)", Current, Current ) va fi egal cu 50.

    La specificarea valorii parametrului egală cu Together, în parametrii Start și End, nu puteți specifica un offset pentru pozițiile First, Last, Previous, Next.

    CalculateExpression(„Suma(Suma Cifra de afaceri)”, „Primul”, „Actual”)

    Dacă doriți să obțineți valoarea de grupare în linia anterioară, puteți utiliza următoarea expresie:

    CalculateExpression(„Curs”, „Anterior”)

    Lista de noi funcții:

    ComputeExpressionGroupedArray(<Выражение>, <ВыражениеПолейГруппировки>, <ОтборЗаписей>, <ОтборГруппировок>) -

    Funcția returnează un tablou, fiecare element al căruia conține rezultatul evaluării expresiei pentru grupare după câmpul specificat.

    CalculateExpressionWithGroupValueTable(<Выражения>, <ВыражениеПолейГруппировки>, <ОтборЗаписей>, <ОтборГруппировок>) -

    Funcția returnează un tabel de valori, fiecare rând conține rezultatul evaluării expresiilor pentru gruparea după câmpul specificat

    ValoareComplet(<Выражение>) - Returnează True dacă valoarea este alta decât valoarea implicită a acestui tip, alta decât NULL, alta decât o referință nulă, alta decât Undefined. Valorile booleene sunt testate pentru NULL. Șirurile sunt verificate pentru caractere care nu includ spații albe.

    Format(<Выражение>, <Форматная строка>) - Obțineți șirul formatat al valorii transmise. Șirul de format este setat în conformitate cu șirul de format al sistemului 1C:Enterprise.

    subșir(<Выражение>, <Начальные символ>, <ДлинаПодстроки>) - Această funcție este concepută pentru a selecta un subșir dintr-un șir.

    StringLength(<Выражение>) - Funcția este concepută pentru a determina lungimea unui șir. Parametru - expresie de tip șir

    Linia(<Выражение>) - Dacă o matrice este transmisă ca parametru, atunci funcția returnează un șir care conține reprezentări șir ale tuturor elementelor matricei, separate prin caractere "; ". Dacă un tabel de valori este transmis ca parametru, atunci funcția returnează un șir care conține reprezentări șir ale tuturor rândurilor din tabelul de valori, iar reprezentările celulelor fiecărei linii sunt separate prin caracterele „; „ și liniile. sunt separate prin caracterul newline. Dacă orice element are o reprezentare șir goală, atunci în loc de reprezentare, este afișat un șir<Пустое значение>.

    [trebuie să vă înregistrați pentru a vedea linkul]

    Conectați-vă ca student

    Conectați-vă ca student pentru a accesa conținutul școlii

    1C 8.3 Sistem de compunere a datelor pentru începători: numărarea rezultatelor (resurse)

    Scopul acestei lecții va fi:

    • Scrieți un raport care să afișeze o listă de produse (directorul de alimente), conținutul caloric și gustul acestora.
    • Grupați produsele după culoare.
    • Familiarizați-vă cu caracteristica de rezumare (resurse) și câmpurile calculate.

    Crearea unui nou raport

    Ca și în lecțiile anterioare, deschideți baza de date " Delicatese" în configurator și creați un nou raport prin meniu " Fişier"->"Nou...":

    Tipul documentului - raport extern:

    În formularul de setări ale raportului, scrieți numele „ Lecția 3"și apăsați butonul" Diagrama de compoziție a datelor deschise":

    Lăsați numele implicit al schemei și faceți clic pe „ Gata":

    Adăugarea unei interogări prin intermediul constructorului

    Pe fila " Set de date"clic verde semnul plus și selectați „ Adăugați un set de date - Interogare":

    În loc să scrieți manual textul solicitării, rulați din nou constructor de interogare:

    Pe fila " Mese„trageți masa” Alimente" de la prima coloană la a doua:

    Selectați din tabel Alimente" câmpurile pe care le vom solicita. Pentru a face acest lucru, trageți câmpurile " Nume", "Gust", "Culoare" Și " calorii„de la a doua coloană la a treia:

    A ieșit așa:

    Apasa butonul " Bine" - textul cererii a fost generat automat:

    Formarea setărilor de prezentare a raportului

    Accesați marcajul Setări"și faceți clic pe bagheta magica, a apela constructor de setări:

    Selectați tipul de raport Listă..." și apăsați butonul " Mai departe":

    Trageți și plasați din coloana din stânga la dreapta câmpurile care vor fi afișate în listă și faceți clic pe „ Mai departe":

    Trageți din coloana din stânga în câmpul din dreapta " Culoare„- conform se va întâmpla gruparea rânduri din raport. Presa " Bine":

    Și iată rezultatul constructorului. Ierarhia raportului nostru:

    • raport în ansamblu
    • gruparea „Culoare”
    • înregistrări detaliate - rânduri cu denumiri de alimente

    Salvați raportul (buton dischetă) Și fără a se închide configurator, îl vom deschide imediat în modul utilizator. A ieșit așa:

    Modificarea ordinii coloanelor

    Dar haideți schimba ordinea coloane (săgeți în sus și în jos), astfel încât să arate ca în imaginea de mai jos:

    Salvați raportul și redeschideți-l în modul utilizator:

    Grozav, e mult mai bine.

    Însumarea (suma) după conținutul de calorii

    Ar fi bine să afișați conținutul total de calorii al alimentelor pe grupe. Pentru a vedea suma conținutului de calorii al tuturor produselor, să zicem, alb sau galben. Sau aflați conținutul total de calorii al tuturor alimentelor din baza de date.

    Există un mecanism de calcul al resurselor pentru aceasta.

    Accesați fila " Resurse"și trageți câmpul" calorii„(vom rezuma) din coloana din stânga la dreapta.

    În același timp, în câmpul expresie, selectați din lista derulantă " Cantitate (calorii)", întrucât totalul va fi suma tuturor elementelor incluse în total:

    Salvarea și generarea unui raport:

    Avem rezultatele pentru fiecare dintre grupuri și pentru raportul în ansamblu.

    Însumarea (medie) după conținutul de calorii

    Acum să facem astfel încât să se afișeze o altă coloană in medie conținutul caloric al produselor pe grupe și în general pentru raport.

    Este imposibil să atingeți coloana deja existentă „Conținut de calorii” - suma totală este deja afișată în ea, prin urmare hai sa adaugam un alt camp, care va fi o copie exactă a câmpului „Calorie”.

    Pentru a crea un astfel de câmp „virtual”, folosim mecanismul câmpuri calculate.

    Accesați marcajul Câmpuri calculate„și apăsați verde semnul plus:

    Într-o coloană" Calea datelor„scrieți numele noului câmp ( împreună, fara spatii). Să se numească Calorii medii", iar în coloana " Expresie" scriem numele unui câmp deja existent, pe baza căruia se va calcula noul câmp. Scriem acolo " calorii". Coloana " antet" va fi completat automat.

    Am adăugat un câmp nou (" Calorii medii"), dar nu va apărea în raport de la sine - trebuie fie să-l apelați din nou constructor de setări("bagheta magică") sau adăugați acest câmp manual.

    Să acţionăm al doilea cale. Pentru a face acest lucru, accesați fila " Setări", alege" Raport" (la urma urmei, dorim să adăugăm câmpul în întregime la raport), selectați fila de mai jos " Câmpurile selectate"și trageți câmpul" Calorii medii" din coloana din stânga la dreapta:

    A ieșit așa:

    Salvarea și generarea unui raport:

    Câmpul a apărut și vedem că valorile sale sunt valorile câmpului „Calorie”. Grozav!

    Pentru a face acest lucru, folosim din nou mecanismul deja familiar pentru noi. resurse(rezumat). Accesați marcajul Resurse"și trageți câmpul" Calorii medii" din coloana din stânga la dreapta:

    În același timp, în coloană Expresie"alege" Medie (calorii medii)":

    Salvarea și generarea unui raport:

    Vedem că pentru grupuri, adică pentru fiecare culoare, și pentru raport în ansamblu, valoarea medie a fost calculată destul de corect. Dar prezent intrări suplimentare pentru produse individuale (nu pentru grupuri) pe care doriți să le eliminați din raport.

    Știți de ce au apărut (înțelesuri nu în grupuri)? Pentru că atunci când am adăugat câmpul " Calorii medii" în setările raportului, la pasul doi am selectat întregul raport iar acest câmp nou a lovit elementul " Detaliat înregistrări".

    Să reparăm eroarea. Pentru a face acest lucru, reveniți la fila " Setări", alege" Înregistrări detaliate" mai întâi sus (pasul 2) și apoi " Înregistrări detaliate„de jos (pasul 3), mergeți la marcaj” Selectat câmpuri" și vedeți în coloana din dreapta elementul " Auto".

    Element " Auto" - acesta nu este un singur câmp. Acestea sunt câteva câmpuri care ajung automat aici pe baza setărilor mai mari.

    Pentru a vedea care sunt aceste câmpuri - faceți clic pe elementul " Auto" dreapta butonul și selectați " Extinde":

    Element " Auto" extins în următoarele domenii:

    Aici este domeniul nostru Calorii medii"care a ajuns aici din paragraful" Raport„când am târât-o acolo. Doar hai sa decolam bifați lângă acest câmp pentru a elimina rezultatul acestuia.

    Schema de compunere a datelor (1C SKD)- un designer convenabil pentru crearea de rapoarte complexe în produse software 1C:Enterprise care contribuie la dezvoltarea și urmărirea automatizării producției, permițându-vă să le faceți cât mai flexibile și frumoase într-un timp minim. Un plus suplimentar al Schemelor de compunere a datelor (1C SKD) este generarea automată a unui formular de raport controlat, iar odată cu dezvoltarea ulterioară a acestei direcții, este un factor important în alegerea unei metode de elaborare a rapoartelor. Dar datorită complexității structurii Schemei de compunere a datelor (1C SKD) și a unui număr mare de setări, aceasta duce adesea la o dezvoltare mai lungă a raportului decât prin „constructorul formularului de ieșire”. Prin urmare, un programator 1C trebuie să înțeleagă toate complexitățile Schemei de compunere a datelor (1C SKD) pentru a accelera și mai mult timpul de dezvoltare pentru generarea de rapoarte.

    Să analizăm primele trei file ale Schemei de compoziție a datelor (1C SKD) - setul de date, legăturile setului de date și câmpurile calculate.

    Set de date în 1C SKD

    Setul de date include capacitatea de a crea trei obiecte - interogare, obiect și unire, să ne oprim asupra fiecăruia dintre ele mai detaliat:

    Reprezintă o interogare obișnuită care este generată de butonul Constructor de interogări. Dacă este setat indicatorul de completare automată, atunci toate detaliile selectate vor intra automat în câmpurile setului de date. De asemenea, este posibil să personalizați completarea câmpurilor din cerere în fila Compoziție date, unde există trei file:

    Tabele, aici selectați tabelele care vor participa la generarea raportului, de obicei sunt selectate datele implicite, deoarece în fila Tabele și câmpuri am selectat deja documentele, directoarele, registrele de care avem nevoie...

    Câmpuri, aici selectăm acele obiecte care ar trebui incluse în raport, steag-ul copil indică dacă vor fi disponibile elemente copil pentru obiect sau nu, este logic ca pentru date șir, numerice și similare nu se va putea seta steagul la Adevărat.

    Condiții, aici selectăm acele obiecte care pot fi folosite în condițiile din ACS.

    O parte din muncă este realizată în schema de compunere a datelor, o parte în mod programatic, să ne uităm la un exemplu simplu:

    Mai întâi, să creăm un aspect al schemei de prezentare a datelor pentru document și să îl numim SKD (de exemplu: 1C SKD), creăm un set de date obiect în el, apoi completăm câmpurile, de exemplu, avem o parte tabelară a documentul bunurilor cu detalii - nomenclator, cantitate si pret.

    Să adăugăm trei câmpuri și să completăm câmpul pentru fiecare coloană cu numele detaliilor, coloanele rămase vor fi completate automat:

    Să creăm un buton pe formularul de document, să descriem mecanismul de lucru în formularele gestionate:

    &AtClient

    Procedura Print()

    OurReport = PrintOnServer(); // apelează funcția de pe server

    OurReport.Show(); //iesire raportul generat

    EndProcedure

    &Pe server

    Funcția PrintOnServer()

    DocumentObject = FormAttributeToValue("Obiect");

    //plasăm partea tabulară Bunuri în structura cu numele GoodsSKD în același mod în care am indicat numele obiectului care conține datele în ACS însuși

    DataSet = Structură nouă;

    DataSet.Insert(„SKD Goods”, DocumentObject.Goods);

    //obțineți aspectul nostru și setați setările implicite, astfel încât toate setările de ieșire a raportului să fie preluate din aspectul nostru

    OurLayout = DocumentObject.GetLayout(„SKD”);

    Setări = OurLayout.Setări implicite;

    //creați un aspect de aspect al datelor cu setările noastre

    Layout Layout Builder = Noua versiune de date Layout Layout Builder;

    LayoutLayout = LayoutComposer.Run(OurLayout, Settings);

    //efectuați compunerea datelor cu setul nostru de date

    DataCompositionProcessor = DataCompositionProcessor nou;

    DataCompositionProcessor.Initialize(LayoutLayout, DataSet);

    //formăm un document foaie de calcul și afișăm raportul nostru în el

    ReportDocument = New SpreadsheetDocument;

    OutputProcessor = Nou OutputProcessorofDataCompositionResultIntoSpreadsheetDocument;

    OutputProcessor.SetDocument(ReportDocument);

    OutputProcessor.Output(DataCompositionProcessor);

    ReturnDocumentReport;

    EndFunctions

    Dacă doriți, puteți obține zone din orice alt aspect și, de asemenea, să le afișați în acest raport, de exemplu, avem un aspect tipic pentru generarea unui ordin de plată și un antet este foarte bine creat în el, astfel încât să nu facem Nu trebuie să facem muncă suplimentară, primim mai întâi aspectul, afișam antetul, apoi vom genera și afișa raportul nostru pe ACS.

    DESPRE unificare

    Ne putem pune interogările și obiectele în el, dar, spre deosebire de o conexiune, pur și simplu adaugă tabele unul la celălalt, adică dacă legăm două tabele identice, vom ajunge la unul și, atunci când sunt combinate, se va dubla, luați în considerare un exemplu simplu:

    Avem tabele:

    Când suntem contactați, vom primi:

    Și când sunt combinate:

    Să luăm în considerare acum completarea coloanelor din seturile de date (vom sări peste unele, deoarece sunt legate de alte file, vom reveni la ele în articolele viitoare):

    - camp, specificați denumirea generală a atributului;

    ­­- cale, specificați numele atributului prin care ne vom referi la el în ACS, de exemplu, în Câmpuri calculate;

    - antet, specificați numele atributului care va fi afișat în raport;

    - constrângere de marjă, indicați disponibilitatea acestui atribut;

    - limitarea recuzitei, indicăm disponibilitatea elementelor copil, este important ca dacă se specifică disponibilitatea detaliilor, atunci câmpul în sine va fi disponibil, poate că această mecanică va fi schimbată în edițiile viitoare;

    - expresie prin care se calculează reprezentarea câmpului, este convenabil de utilizat atunci când trebuie să schimbăm puțin rezultatul detaliilor, de exemplu, trebuie să facem după nume nomenclatură afișat stoc, unde se află, apoi completați următoarele: Nomenclator + „este în stoc” + Depozit. Repet că adresa detaliilor se realizează prin numele indicat în coloană cale;

    - expresie ordonatoare, un mecanism convenabil pentru setarea ordonării raportului, în care condiția poate fi setată manual, similar paragrafului anterior, dar, după cum arată practica, acest mecanism adesea nu funcționează așa cum ne-am dori și vă sfătuiesc să utilizați standardul triere;

    - tipul valorii, este indicat tipul valorii atributului, este necesar să se completeze dacă utilizați următorul câmp;

    - valorile disponibile, funcționează numai când este umplut tipul valorii, deschideți formularul de completare și în coloană Sens indicăm elementul de modificat, după tip, acesta poate fi obiecte predefinite sau numerice, de exemplu, atributele au valori simple, în supunere indicați în ce trebuie să schimbăm, un exemplu de tip boolean:

    - decor– setarea standard a formatului câmpului, similară cu setarea din formularele gestionate, vă permite să personalizați mai precis și mai frumos rezultatul unui anumit atribut.

    Legături seturi de date în 1C SKD

    Aici, numai stânga alăturați-vă, într-o manieră asemănătoare cu conexiuniîn cereri, sursa de comunicare specificați tabelul principal pentru conexiune, în receptor adiţional. ÎN expresie sursăȘi expresia receptorului specificați detaliile prin care va avea loc conexiunea. Vom lua în considerare coloanele rămase mai detaliat când vom analiza fila Opțiuni. Dacă nu există o conexiune suplimentară cu parametri, atunci se recomandă să faceți conexiunea în cerere, acest lucru va grăbi raportul.

    Un exemplu despre cum puteți obține câmpurile înregistrării anterioare într-o grupare și nu numai. Convenabil pentru calcularea diferenței dintre valorile prețului anterior și cel actual.

    Esența soluției este utilizarea funcției limbajului de expresie SKD Calculați expresia()în câmpul calculat adăugat pe care l-am sunat Delta. Funcția are următorii parametri:

    Opțiuni:

    • Expresie. Tip Linia;
    • gruparea. Tip Linia;
    • Tip de calcul. Tip Linia;
    • start
    • Sfârşit. Un șir care conține una dintre opțiuni;
    • Triere. Linia;
    • Sortare Ierarhică;
    • Gestionarea comenzii cu aceleași valori

    Suntem interesați de parametrii 4 și 5 ( startȘi Sfârşit). Expresia va arăta astfel:

    isNULL((CALCULATE EXPRESSION ("Preț", "Anterior", "Anterior") - Preț), 0)

    Aici calculăm valoarea anterioară a câmpului Prețși scădeți din ea valoarea curentă a câmpului Preț. Desigur, pentru prima înregistrare, valoarea anterioară nu va fi calculată și rezultatul scăderii cu valoarea câmpului curent va fi Null, așa că pentru a face totul „curat” folosim funcția isNULL(isNull) pentru a converti Null la zero. .

    Plasați un tabel de valori într-o celulă a unui document de foaie de calcul

    Uneori este necesar să plasați partea tabelară a documentului sau datele care sunt rândurile părții tabulare într-o celulă a documentului foaie de calcul, de exemplu astfel:

    Pentru a face acest lucru, trebuie să utilizați funcția: ComputeExpressionGroupedValueTable() , care are parametrii:

    • Expresie este expresia de evaluat. Tastați șir. O linie poate conține mai multe expresii separate prin virgule. Fiecare expresie poate fi urmată de cuvântul cheie opțional AS și de numele coloanei din tabelul de valori. De exemplu: „Contractant, Sumă(Suma Cifra de afaceri) Ca volum de vânzări”.
    • Câmp ExpresiiGrupuri- gruparea expresiilor de câmp separate prin virgule. De exemplu, „Contractant, Partid”;
    • Selectarea înregistrărilor este o expresie aplicată înregistrărilor detaliate. De exemplu, „DeletionMark = False”;
    • Selectarea grupării- selecția aplicată înregistrărilor de grup. De exemplu: „Amount(AmountTurnover) > &Parameter1”.

    Pentru a face acest lucru, creăm un câmp calculat în care vom afișa tabelul rezultat, apoi plasăm acest câmp în resurse cu expresia CalculateExpressionGroupedValueTable ("Nomenclatură, Cantitate")

    Număr coloane

    Un exemplu despre cum pot fi numerotate coloanele în SKD.

    Esența soluției:

    1. Creăm o interogare în care numerotăm rândurile rezultatului interogării într-o anumită subordonare
    2. Afișarea rezultatului într-un tabel încrucișat

    IMPORTANT!

    După ce liniile din interogare sunt numerotate, acestea trebuie plasate în BT și apoi selectate din acest BT, altfel ACS va face totul în felul său și câmpurile greșite vor intra în grupare

    Pentru a obține rezultatul, trebuie să creați un câmp calculat cu expresia „Angajat” + Format(NPP, „FH=3; FH=")și numele câmpului calculat, în care este ușor de plasat Angajatul, apoi plasăm câmpul Numele complet la o resursă cu o expresie Maxim (nume complet) sau pur și simplu Numele complet- nicio diferenta

    Grupuri alternate cu evidențierea culorilor

    Undeva pe Mista sau pe același 1Cskd.ru a fost o întrebare cum să evidențiezi culoare diferitașiruri care formează grupuri

    Acest lucru se realizează prin crearea unui câmp calculat:

    Calculați expresia ("Cantitate (articole diferite)", "Primul", "Anterior", "Împreună") % 2

    Numărăm numărul de „grupări” diferite ale câmpului Nomenclatură, grupările pot fi numărate prin setarea valorii parametrului ProcessingSameOrderValues ​​= „Împreună”

    Restul împărțirii cu doi va clarifica dacă acest grup este egal sau nu, respectiv, creăm un element de proiectare condiționat cu condiția Camp = 1

    Rămânând în contextul caracteristicilor. Caracteristici pe linie cu cantitatea între paranteze

    Pe același 1CSkd.ru a existat un astfel de subiect în care autorul cere ajutor în realizarea unui raport, unde într-una dintre coloane este necesară o listă de caracteristici (mărimi de pantofi) cu numărul lor. http://1cskd.ru/2013/05/podskazhite-novichku-v-skd/

    Acest lucru se realizează folosind aceeași funcție Calculați ExpressionWith GroupingArray()

    În acest exemplu, funcția arată astfel:

    Calculate ExpressionWith GroupingArray ("Caracteristica Nomenclaturii.Descriere +
    ""("" + Format(Număr de rest,""CH=0"") + "")""",
    ,
    „ValueFilled(FeatureNomenclature)”)

    Al treilea parametru este o selecție, vă permite să evitați prezentarea unui șir gol "" - în consecință, nu veți vedea reziduuri fără caracteristici

    Uniți două tabele cu cheia String = Number

    Sau o variantă a modului de conversie a valorii unui tip de număr într-un șir în SKD

    Periodic pe forumuri văd un subiect de genul „Cum se transformă un număr într-un șir într-o interogare”. Dacă scrieți un raport despre ACS și trebuie să efectuați o astfel de transformare, atunci nu trebuie să scrieți niciun truc în cerere.

    Pentru a converti un număr într-un șir, pur și simplu utilizați funcția de limbaj de expresie a sistemului de compunere a datelor SKD Linia() sau Format()

    Pentru a converti un șir într-un număr, puteți utiliza funcția Calcula()

    Sortați după șir ca după număr

    În exemplul meu, voi afișa pur și simplu directorul angajaților, sortându-l după numărul de personal(cod)

    Rezultatul va arăta astfel:

    Acest lucru se realizează prin crearea unui câmp calculat și folosind funcția de limbaj de expresie SKD Calcula()

    1. Creați un câmp calculat TabNumberNumber, cu expresia: Calculați(Cod.angajat)
    2. Sortați după acest câmp

    de fapt, aceasta este conversia unui șir într-un număr folosind funcția limbajului de expresie SKD Calcula()

    De asemenea, vă sfătuiesc să vă uitați la „Tutoriale video pe skd” (căutate ușor pe Google)

    Când dezvolt, folosesc un .