Exemple de utilizare a funcției scd - calculați o expresie. Exemple de utilizare a funcției skd - calculați expresia 1s skd sum prin grupare


Să ne uităm la un exemplu:

Mai multe unități de mărfuri sunt expediate către client la diferite reduceri. Trebuie să afișați într-un raport valorile reducerii pentru fiecare produs și să calculați reducerea medie. Să creăm un raport despre sistemul de control al accesului.
Pentru toate câmpurile pentru care trebuie să afișăm totaluri, vom seta o expresie (metodă) pentru calculul lor în fila „Resurse”. Pentru câmpul „Reducere”, setați metoda de calcul ca „Medie”.

Emitem raportul:

După cum puteți vedea, totalul pentru câmpul „Reducere” este calculat ca media aritmetică a valorilor câmpului, de exemplu. suma tuturor valorilor împărțită la numărul de valori. Dar pentru că Deoarece volumele de mărfuri expediate cu reduceri diferite sunt diferite, reducerea medie poate fi calculată într-un alt mod: de exemplu, ca raport dintre cantitatea totală de mărfuri expediate, ținând cont de reducere, și cantitatea totală de mărfuri expediate. Dar aici apare o întrebare: dacă puteți scrie o formulă pentru a calcula valorile câmpurilor înregistrărilor detaliate din ACS, atunci totalurile sunt calculate automat conform expresiei specificate în fila „Resurse” și acolo, după cum Am văzut mai devreme, „Media” este calculată ca medie aritmetică a valorilor afișate, ca în acest caz, calculați totalul din această coloană folosind propria formulă?
De fapt, nu este greu. Pentru a face acest lucru, ne vom ajusta raportul adăugând la acesta câmpurile necesare care vor participa la calcul, în cazul nostru acestea sunt „AmountWithDiscount” și „AmountAtPrice”.

Pentru a „învăța” ACS să ne afișeze rezultatele, luăm următorii pași:
1. în fila „Setări”, atribuiți un nume grupării „”, de exemplu, „ResultSKD”, pentru a face acest lucru, apelați meniul contextual pentru grupare și faceți clic pe „atribuiți un nume”;

2. în fila „Aspecte”, adăugați un „aspect antet de grupare”, unde selectăm numele atribuit anterior „TotalSKD”;

3. trasăm o linie a aspectului, unde lăsăm toate rezultatele, al căror calcul ni se potrivește, așa cum sunt, iar pentru a calcula procentul mediu de reducere scriem o formulă de calcul;

Dacă totul este corect, atunci când raportul este afișat, sub acesta vor fi afișate două linii totale, mai întâi cea care este generată automat, apoi cea creată de tine.

Pentru a lăsa numai rezultatul liniei totale, trebuie să dezactivați, în fila „Setări” din secțiunea „Alte setări” a ieșirii aspectului, ieșirea pentru „Aspect total mare orizontal” și „Aspect total general vertical”

La crearea rapoartelor, există o serie de sarcini care, atunci când sunt rezolvate frontal, duc adesea la scriere interogări grele sau interogări într-o buclă sau ieșire manuală a datelor într-un tabel.

Iată exemple de astfel de sarcini:

  • Obținerea volumului de vânzări în creștere pe lună, de exemplu, pentru producție sub formă de diagramă
  • Calculul diferenței de vânzări din perioada curentă și cea anterioară - pentru toate liniile de raport
  • Compararea volumului de vânzări al fiecărui manager cu valoarea de referință, care se calculează în timpul generării acestui raport
  • Obținerea unui total cumulat orizontal și vertical în tabele încrucișate

Și toate aceste probleme sunt rezolvate pur și simplu folosind funcțiile ACS - literalmente în câteva minute. Fără interogări într-o buclă și cod strâmb.

Astăzi ne vom uita la utilizarea unor funcții ACS folosind exemple specifice.

Video 1. Cum să obțineți suma din raport ca total cumulat?

Probleme similare sunt adesea întâlnite în practică. Cel mai tipic exemplu este că raportul ar trebui să afișeze vânzările pe perioadă, trebuie să cunoașteți nu numai valoarea vânzărilor pentru luna curentă, ci și totalul cumulat de la începutul generării raportului;

De fapt, această problemă poate fi rezolvată folosind o interogare (fără funcții ACS), dar există 2 probleme:

  • În sine, o astfel de solicitare va fi complexă - va dura timp pentru ao dezvolta și depana.
  • O astfel de solicitare va încărca serios sistemul - și cu cât mai multe date, cu atât va funcționa mai lent.

Folosind funcțiile ACS, această sarcină este rezolvată cu o singură linie de cod, iar raportul va funcționa cât mai repede posibil, uite:

Video 2. Cum să obțineți o valoare din rândul anterior al unui raport?

Această funcționalitate poate fi utilă atunci când este necesară urmărirea tendinței unei anumite resurse - există o scădere sau o creștere față de starea anterioară, plus trebuie calculată delta.

Iată câteva exemple în care acest lucru ar putea fi util:

  • Analiza conturilor de încasat pe zi - calculăm tendința și creșterea sau scăderea absolută a datoriei față de perioada anterioară
  • Analiza cursurilor de schimb și evaluarea profiturilor sau pierderilor din diferențele de curs valutar - trebuie să obțineți delta dintre cursurile curente și cele precedente și să înmulțiți cu soldul fondurilor în monedă.

Astfel de probleme necesită, de asemenea, forță de muncă pentru a fi rezolvate folosind o interogare, dar în ACS acest lucru se face într-o singură linie:

Video 3. Cum se compară totalul pentru rândul curent cu valoarea de referință?

Un exemplu când această funcționalitate poate fi utilă:

  • Sistemul ține evidența vânzărilor de către manageri
  • Șeful departamentului conduce vânzările personale împreună cu managerii
  • Este necesară afișarea unui raport privind vânzările de către manager
  • De asemenea, raportul trebuie să afișeze delta relativă la volumul vânzărilor șefului de departament.

Adică vorbim despre necesitatea de a compara fiecare linie a vânzărilor managerului cu vânzările șefului de departament.

Și aceste date pot fi folosite, de exemplu, pentru a calcula bonusurile.

Și din nou, cu ajutorul SKD, această problemă este rezolvată într-o singură linie:

Video 4. Obținerea unui total cumulat într-un tabel încrucișat

Într-un raport cu tabele încrucișate, totalul curent poate fi calculat atât vertical (pe rânduri), cât și orizontal (pe coloane).

Vom arăta cum să controlăm direcția de calcul a totalurilor folosind un parametru ACS:

Video 5. Afișarea părții tabulare într-o celulă separată a raportului

Să presupunem că trebuie să dezvoltați un raport care să afișeze informații despre documente. În acest caz, o celulă separată trebuie să conțină partea tabelară a documentului.

Pentru a rezolva o problemă similară folosind o interogare obișnuită, va trebui să scrieți manual rezultatul într-un document de foaie de calcul.

În ACS, această sarcină este din nou rezolvată de o funcție.

Se pare că nimic nu este mai simplu, dar există o problemă cu o definiție clară.
Asa de.

Grupare (grupare) - colaps intrări în grup De grup câmpuri(câmpuri cu aceeași valoare).
Exemplu. Trebuie să știm numărul total de produse pentru anumit depozit (...total 999 tone..). Fiecare mișcare este înregistrată în registru, și chiar și o simplă solicitare din două câmpuri (Depozit și Cantitate) va genera o selecție din mai multe înregistrări cu aceeași valoare a câmpului Depozit și valori diferite ale câmpului Cantitate.
Restrângeți (grupați) soldurile după câmpul Depozit - aceasta este pentru a obține cantitatea totală de mărfuri din acest depozit.
Aceasta implică necesitatea (pentru exemplul nostru, dar nu neapărat în general) de a calcula agregat funcții (produce o singură valoare pentru un anumit grup de câmpuri de tabel) după câmpul de grup (în termenii generatorului de interogări - Câmpul sumă).
În exemplul nostru- grupați câmpul Depozit și calculați funcția de agregare folosind câmpul Cantitate - obținem CANTITATEA TOTALĂ a tuturor mărfurilor din depozit.
Deoarece Deoarece interogările simple sunt foarte rare, atunci în toate celelalte cazuri când se utilizează Gruparea, acestea vor fi grupate Toate câmpuri de interogare (cu excepția Summarizable) și selecție vor fi reduse (restrânse) numai pe acele înregistrări, în care toate câmpurile grupului sunt aceleași (același depozit, același produs, aceeași dimensiune a produsului - aceste înregistrări sunt restrânse, dacă măcar ceva este diferit, nu sunt).

Rezultate(așa-zisul sunt comune)- linii suplimentare ca urmare a unei cereri care continetotaluri pentru câmpurile și grupările specificate (așa-numitele subtotaluri).
Rezultate generale- linia ca urmare a unei interogări cu valoarea totalurilor pentru toate înregistrările.

Rezultate pe grupări - valorile funcțiilor agregate conform câmpuri de grup (câmpuri cu aceeași valoare).

Diferențele o cerere de lafracțiunile(GROUP BY) din o cerere de larezultate pe grupări.

În primul caz, în rezultatul interogării vor apărea doar rândurile totale. În exemplu, câmpul de grup este nomenclatură:

Al doilea conține rezultatele și înregistrările inițiale. Motivul este în definiție (rezultate nu "colapseste" date, și adăuga linii) În exemplu, câmpul de grup este nomenclatură:

Important! Nu este nevoie să utilizați atât gruparea, cât și totalurile în interogarea dvs.! Totul depinde de ce avem nevoie...

Ordinea grupărilor într-o interogare cu totaluri de grupare este importantă deoarece rezultatele sunt calculate în ordine.

Rezumatul ierarhiei. Dacă un câmp de grupare este o legătură către un director, atunci pentru a calcula totalurile pe grupuri ale directorului (sau elemente părinte, dacă directorul nu are grupuri), trebuie să specificați cuvântul cheie IERARHIE. În acest caz, înregistrările cu totaluri pentru nivelurile ierarhiei directoare vor fi adăugate la rezultat.

Important! Limbajul de interogare permite utilizarea diferitelor totaluri într-o singură interogare (generală, grupare și ierarhică).

Sintaxă pentru lucrul cu totaluri într-o selecție dintr-un rezultat de interogare

Metoda RecordType().
Exemplu:
Dacă Eșantion . PostType() = RequestRecordType. TotalByGrouping Apoi

Continua;
endIf;

Rezultatele trebuie să fie prezente în orice raport. De exemplu, dacă aveți câmpuri Nume cantitate preț și sumă, atunci este logic să obțineți totalul din ultimele coloane. Astăzi ne vom uita la cum să facem acest lucru folosind DCS (Data Composition System).

Astăzi, ACS este utilizat pe scară largă pentru a crea diverse rapoarte. Acest lucru se datorează faptului că aproape orice raport poate fi creat folosind ACS. Cei care au folosit sistemul de compunere a datelor știu că este foarte convenabil și rapid, nu este nevoie să scrieți codul frenetic, puteți face totul în constructor.

De exemplu, voi lua raportul pe care l-am creat în articolul anterior. Așa arăta pentru noi.

Să adăugăm totalul la acesta în coloana Sumă.

Cum să afișați totalurile pentru o coloană folosind SKD 1C

Și așa lansăm configuratorul, deschidem raportul de primire a mărfurilor și facem clic pe Schema de aranjare a datelor.

În fereastra care se deschide, accesați fila Resurse. Din fereastra de câmpuri disponibile din stânga, selectați câmpul Sumă și trageți-l în fereastra din dreapta. Nu schimbam nimic altceva.

Să lansăm 1C și să vedem ce avem. Dacă ați făcut totul corect, totalul coloanei ar trebui să apară la sfârșitul tabelului.

Ca rezultat, obținem totalul pentru toate coloanele.

Ei bine, am învățat cum să afișam totalurile în coloane folosind un sistem de aspect de date.

Au aceeași sarcină - să efectueze operații matematice sau statistice asupra datelor eșantionului. Dar există și diferențe semnificative:

  1. Rezultate adăugați rânduri la datele eșantionului, în timp ce grupările restrânge selecția și există mai puține rânduri.
  2. Rezultate poate fi calculat pentru toate datele eșantionului sau pentru câmpurile individuale, în timp ce, spre deosebire de grupări, pot exista câmpuri care nu sunt nici totale, nici grupări.
  3. Rezultate poate lua în considerare ierarhia.

În primul rând, o mică teorie. Secțiunea de rezumat din interogările 1C constă din două secțiuni.

Prima începe cu un cuvânt cheie REZULTATEși conține câmpuri rezumative cu o funcție de agregare aplicată acestora. Această secțiune poate rămâne goală, atunci rezultatul solicitării va fi pur și simplu gruparea după câmpurile secțiunii următoare fără a calcula datele totale.

Există 6 tipuri de funcții agregate utilizate în grupări:

  1. SUMĂ— însumează valorile coloanei grupate, se aplică numai valorilor numerice.
  2. IN MEDIE - Calculează media aritmetică a valorilor coloanei grupate, aplicabilă numai valorilor numerice.
  3. MAXIM - poate fi folosit pentru orice tip de valoare a coloanei grupate și returnează valoarea maximă a tuturor celor grupate. Dacă valorile nu sunt numerice, atunci ultima este returnată la sortarea în ordine crescătoare.
  4. MINIM - poate fi folosit pentru orice tip de valoare a coloanei grupate și returnează valoarea minimă a tuturor celor grupate. Dacă valorile nu sunt numerice, atunci prima este returnată la sortarea în ordine crescătoare.
  5. CANTITATE— returnează numărul de valori din coloana grupată, poate fi folosit pentru orice tip de valoare. Valorile tipului nu sunt luate în considerare NUL.
  6. CANTITATE DIFERITĂ – returnează numărul de valori distincte din coloana grupată, poate fi folosit pentru orice tip de valoare. Valorile tipului nu sunt luate în considerare NUL.

A doua secțiune începe cu un cuvânt cheie DEși conține câmpuri de grupare în contextul cărora rezultatul va fi calculat pe baza câmpurilor totale. Și/sau cuvânt SUNT COMUNE, dacă trebuie să calculați totalurile pentru întregul eșantion. Ordinea în care vor fi amplasate câmpurile este importantă aici, aceasta depinde și de ordinea în care sunt calculate totalurile ca urmare a solicitării.

Dacă câmpul de grupare conține date care au o structură ierarhică (director ierarhic), atunci puteți calcula totalurile de-a lungul întregului lanț ierarhic. Cuvântul cheie folosit pentru aceasta este IERARHIE după numele câmpului de grupare. Dacă totalurile trebuie calculate de-a lungul întregului lanț ierarhic, cu excepția câmpului de grupare în sine, atunci cuvântul cheie este utilizat DOAR IERARHIE.

Să luăm ca exemplu un tabel cu livrările de mărfuri.

Sarcina 1. Calcularea totalurilor pentru mai multe câmpuri.

Trebuie să aflați câte bunuri au fost livrate în total și câte mese și scaune există.

Cerere. Text= "ALEGE
Rechizite.Produs ca produs,


DIN
Rechizite CUM Rechizite
REZULTATE
SUMA(Cantitate)
DE
SUNT COMUNE,
Produs"
;

Ca rezultat, obținem următorul tabel cu totaluri (rândurile totale sunt evidențiate cu galben).

Sarcina 2. Gruparea înregistrărilor după câmp.

Este necesar să grupați înregistrările din tabel după tipul de produs.

Cerere. Text= "ALEGE
Rechizite.Produs ca produs,
Supplies.Supplier AS Furnizor,
Rechizite.Cantitate AS Cantitate,
DIN
Rechizite CUM Rechizite
REZULTATE

DE
Produs" ;

Sarcina 3. Calcularea totalurilor câmpurilor ținând cont de ierarhie.

Cerere. Text= "ALEGE
Rechizite.Produs ca produs,
Supplies.Supplier AS Furnizor,
Rechizite.Cantitate AS Cantitate,
DIN
Rechizite CUM Rechizite
REZULTATE
SUMA(Cantitate)
DE
IERARHIA Furnizorilor"
;

Ca rezultat, obținem următorul tabel.

Sarcina 4. Calcularea totalurilor numai pe ierarhie.

Cerere. Text= "ALEGE
Rechizite.Produs ca produs,
Supplies.Supplier AS Furnizor,
Rechizite.Cantitate AS Cantitate,
DIN
Rechizite CUM Rechizite
REZULTATE
SUMA(Cantitate)
DE
DOAR IERARHIA Furnizorilor"
;

Ca rezultat, obținem următorul tabel.

Cum să ocoliți rezultatul unei interogări cu totaluri

Rezultatul interogării cu totaluri poate fi ocolit în mai multe moduri:

  1. Exact ca o cerere normală. În acest caz, înregistrările de grupare și detaliate vor fi afișate secvenţial. Un exemplu de astfel de ocolire este dat în articol.
  2. Ocoliți separat grupările și înregistrările detaliate.
    Ca exemplu, să luăm cererea de la sarcina 1. Dar nu vom ține cont de rezultatele generale.

    GroupsProduct = Solicitare. Alerga() . Selectați(BypassQueryResult.ByGrouping, „Produs”);
    În timp ce GrupăriProdus. Next() Buclă
    //aici procesăm șirurile de grupare ale rezultatului interogării
    DetailedRecords = GroupsProduct. Alegeți() ;
    În timp ce DetailedRecords. Next() Buclă
    //aici procesăm rânduri de înregistrări detaliate aparținând unor grupuri
    EndCycle ;
    EndCycle ;