Exemple de interogări pentru lucrul cu directoare ierarhice. Operatorul „în ierarhie” într-o interogare Într-o interogare ierarhică 1c

Directoarele 1C sunt un obiect specializat de arbore de metadate care servește la stocarea informațiilor statice de referință. De exemplu, în configurațiile tipice puteți vedea următoarele vizualizări: , Nomenclatură, Angajați, Mije fixe etc. Informațiile din directoare, de regulă, nu se schimbă des. Directoarele sunt utilizate ulterior în aproape toate obiectele contabile ca secțiune contabilă sau informații de referință.

Mai jos ne vom uita la configurarea și proiectarea unui director din configurator folosind directorul „Nomenclatură” ca exemplu.

Tabă de bază

Fila „De bază” specifică numele, sinonimul, reprezentarea obiectului și descrierea scopului.

Fila „Ierarhia directorului”.

Aici se stabilește ierarhia directorului.

Ierarhia din 1C 8.3 este de două tipuri - „ grupuri și elemente" Și " elemente". Diferă prin aceea că, în primul caz, doar un folder (grup) poate fi părinte (dosar), iar în al doilea caz, un element poate fi și părinte.

„Place grupuri în partea de sus” - steag este responsabil pentru afișarea grupurilor sub formă de listă.

De asemenea, în setări puteți limita numărul de grupuri din ierarhia directorului folosind setarea corespunzătoare.

Fila Proprietari

Un director poate fi subordonat altui director. Din punctul de vedere al configurării 1C 8.3, aceasta înseamnă că atributul „Owner” devine obligatoriu pentru elementul subordonat. Un exemplu de astfel de conexiune între directoare în configurații standard „Nomenclatură - Unități de măsură”, „Contrapărți - Acorduri între contractori”.

Proprietarul directorului poate fi, de asemenea, următoarele obiecte de metadate: , .

Fila Date

Obțineți 267 de lecții video pe 1C gratuit:

Cea mai importantă filă din punctul de vedere al unui programator. Conține detaliile directorului.

Directorul are un set de detalii standard care nu sunt editate de programatorul 1C 8.2 o listă a acestora poate fi văzută făcând clic pe butonul „Detalii standard”:

Mă voi opri asupra fiecăruia mai detaliat:

  • Acesta este un grup— un atribut de tip boolean, care indică dacă este un grup sau un element. Disponibil numai în directorul ierarhic. Vă rugăm să rețineți valoarea acestui atribut nu poate fi modificată în 1C: modul Enterprise.
  • Cod— recuzită, tip număr sau șir (de obicei un șir). Un număr atribuit automat de către sistem. De obicei calculat ca (cod anterior + 1). Recomand să utilizați tipul șir, deoarece sortarea valorilor numerice nu funcționează așa cum era de așteptat. Poate fi folosit ca prezentare de director într-o listă și în câmpurile de intrare. Folosit de obicei pentru a căuta un element la introducerea unui șir. Dacă trebuie să eliminați câmpul Cod, introduceți zero în lungimea liniei.
  • Nume— detalii obligatorii, tip șir. Lungimea maximă a rândului este de 150 de caractere. Poate fi folosit ca reprezentare de director într-o listă și în câmpurile de intrare. Folosit de obicei pentru a căuta un element la introducerea unui șir. Dacă trebuie să eliminați câmpul Nume, introduceți zero în lungimea liniei.
  • Mamă— un atribut de tip DirectoryLink.<ИмяТекущегоСправочника>. Disponibil numai în directorul ierarhic. Indică părintele superior din ierarhie. Dacă elementul sau grupul se află la rădăcina directorului, este specificată valoarea Directory.<ИмяТекущегоСправочника>.EmptyLink.
  • Proprietar— link la elementul proprietar al elementului (grupului) directorului curent. Disponibil numai în directorul subordonat 1C.
  • Ștergerea steagului— recuzită cu tip Boolean. Responsabil pentru afișarea „marcajului de ștergere” în sistem. Un element marcat pentru ștergere este considerat inutilizabil, dar mișcările documentelor vechi pot rămâne pe el.
  • Legătură— câmp de tip șir. Acest atribut stochează un identificator unic de obiect - GUID. Ceea ce vedem în sistem într-un afișaj vizual numit „link” este doar o reprezentare a obiectului. Nu poate fi schimbat.
  • Predefinit— tip boolean, afișează dacă elementul este predefinit, mai multe despre asta mai târziu. Nu poate fi schimbat.

Fila „Date” indică și reprezentarea directorului în sistem înainte de versiunea 8.2.16, reprezentarea putea fi doar Cod sau Nume; În versiunile recente ale platformei (începând de la 8.3), vizualizarea poate fi descrisă independent în modulul manager folosind handlerul „ViewReceivingProcessing”.

Fila de numerotare

Aici puteți specifica setările directorului în ceea ce privește numerotarea. Se recomandă utilizarea numărării automate. Controlul unicității este un steag care ajută, dacă este necesar, ca codul să fie unic. Dacă, cu steagul setat, încercați să scrieți un element de director cu un cod neunic, în 1C veți primi mesajul „Codul directorului a devenit neunic”.

Serie de coduri - determină modul de numerotare a directorului, puteți introduce numerotarea directorului în funcție de proprietar. De exemplu, contrapartea „Horns and Hooves” va avea propria numerotare a contractelor - „1, 2, 3”, etc.

Fila Formulare

Formularele pentru director sunt descrise aici. Dacă configurația este lansată atât în ​​modul normal, cât și în modul gestionat, atunci vor exista două file cu formulare în mod implicit: „principal” și „avansat” - diferite pentru aplicațiile normale și gestionate.

Această pagină are o caracteristică importantă a directorului - „“. Aceasta este o funcție foarte convenabilă a 1C 8, care vă permite, atunci când completați datele în câmpul de intrare, să nu intrați în director, ci să introduceți numele, codul etc. și selectați elementul dorit din lista verticală. Arata cam asa:

Altele Tab

Pe filă puteți obține acces rapid la modulele principale ale directorului - modulul obiect și modulul manager.

De asemenea, puteți defini o listă de elemente de director predefinite pe pagină. Acestea sunt elemente care nu pot fi șterse în modul Enterprise. Elementele predefinite pot fi accesate direct în configurator după nume, de exemplu: Directories.Nomenclature.Service.

Această filă determină și modul de blocare - automat sau controlat. Utilizarea căutării full-text, precum și a informațiilor de referință despre director, disponibile în 1C: modul Enterprise.

În acest articol dorim să discutăm totul cu tine Funcții de limbaj de interogare 1C, și de asemenea constructele limbajului de interogare. Care este diferența dintre funcție și design? Funcția este apelată cu paranteze și posibili parametri în ele, iar constructul este scris fără paranteze. Fără îndoială toate structurile și funcțiile limbajului de interogare 1C face procesul de achiziție a datelor flexibil și multifuncțional. Aceste funcții și constructe se aplică câmpurilor de solicitare, iar unele se aplică și condițiilor.

1C Funcții limbaj de interogare

Pentru că o descriere clară Funcții de limbaj de interogare 1C este mult mai puțin obișnuită decât descrierile structurilor, am decis să începem să ne uităm la funcții. Acum să ne uităm la fiecare separat, descriindu-i scopul, sintaxa și exemplul de utilizare, deci:

1. Funcţie DATETIME- această funcție creează un câmp constant cu tipul „Dată”.

Sintaxă: DATETIME(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Exemplu de utilizare:

2. Funcția DATE DIFERENTĂ- returnează diferența dintre două date într-unul dintre dimensiuni (an, lună, zi, oră, minut, secundă). Măsurarea este trecută ca parametru.

Sintaxă: DIFERENCEDATE(<Дата1>, <Дата2>, <Тип>)

Exemplu de utilizare:

Query.Text = „SELECT | DIFFERENCEDATE(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS Număr de zile”;

3. Funcția VALUE- setează un câmp constant cu o înregistrare predefinită din baza de date, puteți obține și un link gol de orice tip;

Sintaxă: VALUE(<Имя>)

Exemplu de utilizare:

Request.Text = „SELECT //element predefinit | VALUE(Directory.Currencies.Dollar) AS Dollar, //link gol | VALUE(Document.Receipt of Goods and Services.EmptyLink) AS Receipt, //transfer value | VALUE(Transfer . Persoană fizică juridică) AS Persoană fizică, //cont predefinit VALUE(Planul de conturi. Auto-contabil.Materiale) AS Account_10" ;

4. Funcția SELECT- avem în fața noastră un analog al construcției IF, care este folosit în cod, doar acesta este folosit în interogările 1C.

Sintaxă: ALEGERE CÂND<Выражение>APOI<Выражение>ALTFEL<Выражение>Sfârşit

Exemplu de utilizare:

Solicitare.Text = //dacă suma este mai mare de 7500, atunci ar trebui să existe o reducere de 300 de ruble, //deci dacă condiția este declanșată, funcția //returnează Suma - 300 //altfel solicitarea va returna pur și simplu Suma „SELECT | SELECT | WHEN TTCReceipts.Amount > 7500 | THEN TTCReceipts.Amount - 300 | ELSE TTCReceipts.Amount | END AS AmountWithDiscount | FROM |

5. Funcția EXPRESS- vă permite să exprimați un câmp constant cu un anumit tip.

Sintaxă: EXPRESS(FieldName AS TypeName)

Exemplu de utilizare:

Query.Text = "SELECT VARIOUS | Sales.Registrar.Number, | SELECT | WHEN Sales.Registrar LINK Document.Expense | THEN EXPRESS(Sales.Registrar AS Document.Expense) | ELSE SELECT | WHEN Sales.Registrar LINK Document.Implementation | THEN EXPRESS(Sales.Registrar AS Document.Implementation) |. END AS Număr |.

Există o altă opțiune pentru utilizarea funcției EXPRESS în câmpuri de tipuri mixte, unde apar acestea? Cel mai simplu exemplu este „Registrul” pentru orice registru. Deci, de ce ar trebui să calificăm tipul în registrator? Să luăm în considerare situația când selectăm câmpul „Număr” de la registrator, din ce tabel va fi selectat numărul? Răspunsul corect al tuturor! Prin urmare, pentru ca interogarea noastră să funcționeze rapid, trebuie să specificăm un tip explicit folosind funcția EXPRESS

Exemplu de utilizare:

Query.Text = "SELECT | EXPRESS(Nomenclature.Comment AS Line(300)) AS Comment, | EXPRESS(Nomenclature.Sum AS Number(15,2)) AS Sum |FROM | Directory.Nomenclature AS Nomenclature";

6. Funcția ISNULL(ortografie alternativă ISNULL) - dacă câmpul este de tip NULL, atunci se înlocuiește cu al doilea parametru al funcției.

Sintaxă: ISNULL(<Поле>, <ПодставляемоеЗначение>)

Exemplu de utilizare:

De asemenea, rețineți că este recomandabil să înlocuiți ÎNTOTDEAUNA tipul NULL cu o anumită valoare, deoarece comparația cu tipul NULL returnează întotdeauna FALSE chiar dacă comparați NULL cu NULL. Cel mai adesea, valorile NULL sunt formate ca urmare a îmbinării tabelelor (toate tipurile de îmbinări, cu excepția celor interne).

Query.Text = //Selectați întregul articol și soldurile acestuia //dacă nu există sold într-un articol, atunci va exista un câmp //NULL care va fi înlocuit cu valoarea 0 "SELECT | No. Link, | ISNULL (ProductsInStockRemains.InStockRemaining, 0) CUM Rămas DIN Directory.Nomenclatură AS Nr. |.

7. Funcția REPREZENTARE- vă permite să obțineți o reprezentare a câmpului de solicitare.

Sintaxă: PERFORMANŢĂ(<НаименованиеПоля>)

Exemplu de utilizare:

Query.Text = "SELECT | REPRESENTATION(FreeRemainingRemains.Nomenclature) AS Nomenclature, | REPRESENTATION(FreeRemainingRemaining.Warehouse) AS Warehouse, | FreeRemainingRemaining.InStockRemaining |FROM |Acumulare Register.FreeRemaining AS FreeRemaining;Remaining"

Construcții în limbajul de interogare 1C

Am discutat cu tine mai sus Funcții de limbaj de interogare 1C, acum este timpul să luați în considerare constructe în limbajul de interogare 1C, nu sunt mai puțin importante și utile, să începem.

1. Constructii LINK- este un operator logic pentru verificarea unui tip de referință. Cel mai des întâlnit la verificarea unui câmp de tip complex cu un anumit tip. Sintaxă: LEGĂTURĂ<Имя таблицы>

Exemplu de utilizare:

Solicitare.Text = //dacă tipul de valoare înregistrator este document Recepție, //atunci interogarea va returna „Recepție de mărfuri”, în caz contrar, „Vânzări de mărfuri” „SELECT | SELECT | WHEN Remaining.Registrar LINK Document.Receipt of GoodsServices | THEN ""Chitare" |. ELSE ""Consum" |. END AS Tipul de Mișcare |.

2. Design INTRE- acest operator verifică dacă valoarea se află în intervalul specificat.

Sintaxă: ÎNTRE<Выражение>ŞI<Выражение>

Exemplu de utilizare:

Request.Text = //obține întreaga nomenclatură al cărei cod se află în intervalul de la 1 la 100 "SELECT | Nomenclature.Link |FROM | Directory.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code BETWEEN 1 AND 100" ;

3. Construcția B și B IERARHIE- verificați dacă valoarea se află în lista transferată (matricele, tabelele de valori etc. pot fi transferate ca listă). Operatorul ÎN IERARHIE vă permite să vizualizați ierarhia (un exemplu de utilizare a Planului de conturi).

Sintaxă: ÎN(<СписокЗначений>), ÎN IERARHIE(<СписокЗначений>)

Exemplu de utilizare:

Solicitare.Text = //selectați toate subconturile contului „SELECT | Auto-susținut. Link AS Account | FROM | Plan de conturi. Auto-susținut AS Auto-susținut | WHERE | Auto-susținător. Link ÎN VALOAREA IERARHIEI (Graficul de Conturi. Bunuri.

4. Design similar- Această funcție ne permite să comparăm un șir cu un model de șir.

Sintaxă: LIKE "<ТекстШаблона>"

Opțiuni de model de rând:

% - o secvență care conține orice număr de caractere arbitrare.

Un personaj arbitrar.

[...] - orice caracter unic sau secvență de caractere enumerate între paranteze drepte. Enumerarea poate specifica intervale, de exemplu a-z, adică un caracter arbitrar inclus în interval, inclusiv capetele intervalului.

[^...] - orice caracter unic sau secvență de caractere enumerate între paranteze drepte, cu excepția celor enumerate după semnul de negație.

Exemplu de utilizare:

Interogare.Text = //găsiți întreaga nomenclatură care conține rădăcina TABUR și începe //fie cu o literă mică sau majusculă t „SELECT | Nomenclatură. Link | FROM | Director. Nomenclatura AS Nomenclatură | WHERE | Produse. Nume LIKE "" [Tt ]abur%""" ;

5. Design PERMIS- acest operator vă permite să selectați doar acele înregistrări din baza de date pentru care apelantul are permisiunea de citire. Aceste drepturi sunt configurate la nivel de înregistrare (RLS).

Sintaxă: ALLOWED este scris după cuvântul cheie SELECT

Exemplu de utilizare:

Request.Text = "SELECTARE PERMIS | Contrapartide. Link | DIN | Director. Contrapartide AS Contrapartide";

6. Design DIVERSE- vă permite să selectați înregistrări în care nu există înregistrări duplicat.

Sintaxă: VARIOUS este scris după cuvântul cheie SELECT

Exemplu de utilizare:

Solicitare.Text = //selectează înregistrările la care cititorul are drepturi "SELECTARE DIVERSE | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties" ;

De asemenea, construcția VARIOUS poate fi folosită cu operatorul PERMIS și alți operatori.

Exemplu de utilizare:

Request.Text = //selectează diverse înregistrări la care cititorul are drepturi „SELECT ALLOWED VARIOUS | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties”;

7. Design FIRST- selectează numărul de înregistrări specificat în parametru din rezultatul interogării.

Sintaxă: FIRST<число>

Exemplu de utilizare:

Solicitare.Text = //selectați primele 4 numere CCD din directorul "SELECT FIRST 4 | Numere CCD. Link | FROM | Director. Numere CCD AS Numere CCD";

8. Design PENTRU SCHIMBARE- vă permite să blocați un tabel, funcționează numai în tranzacții (relevant doar pentru blocările automate).

Sintaxă: A SCHIMBA<НаименованиеТаблицы>

Exemplu de utilizare:

Query.Text = "SELECT | Resturi libere. Nomenclator, | Resturi libere. Depozit, | Resturi libere. În stoc rămase | DIN | Registrul acumulărilor. Resturi libere. Rămășii ca resturi libere | PENTRU SCHIMBARE | Registrul acumulărilor. . Resturi libere”;

9. Design COMANDA DE- organizează datele după un anumit câmp. Dacă câmpul este un link, atunci când setați steag COMANDA AUTOMATA Sortarea va avea loc în funcție de reprezentarea link-ului dacă indicatorul este dezactivat, atunci linkurile sunt sortate după vechimea adresei link-ului în memorie.

Sintaxă: COMANDA PENTRU<НаименованиеПоля>COMANDA AUTOMATA

Exemplu de utilizare:

Query.Text = "SELECT | Resturi libere. Nomenclator AS Nomenclator, | Resturi libere. Depozit AS Depozit, | Resturi libere rămase. În stoc rămase | DIN | Înregistrați acumulări. Resturi libere. Rămase AS gratuite rămase BY | COMANDA | |. Nomenclatura |.

10. Design GROUP BY- folosit pentru gruparea șirurilor de interogări după anumite câmpuri. Câmpurile numerice trebuie utilizate cu orice funcție de agregare.

Sintaxă: GROUP BY<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Exemplu de utilizare:

Query.Text = "SELECT | ProductsInWarehouses.Nomenclature AS Nomenclature, | ProductsInWarehouses.Warehouse, | SUM(GoodsInWarehouses.InStock) AS INSTOCK |FROM | RegisterAccumulations.ProductsInWarehouses AS ProductsInWarehouses |

11. Design AVÂND- vă permite să aplicați o funcție agregată unei condiții de selecție a datelor, similară construcției WHERE.

Sintaxă: AVÂND<агрегатная функция с условием>

Exemplu de utilizare:

Query.Text = //selectează înregistrările grupate în care câmpul InStock este mai mare de 3 "SELECT | ItemsInStocks.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) AS INSTOCK |FROM | RegisterAccumulations.Stocks AS | ItemsInWarehouses.Warehouse AS | GROUP BY |. ProductsInWarehouses.Nomenclatură, |.

12. Constructii INDEX BY- folosit pentru indexarea câmpului de interogare. O interogare cu indexare durează mai mult, dar accelerează căutarea prin câmpurile indexate. Poate fi folosit doar în mesele virtuale.

Sintaxă: INDEX PRIN<Поле1, ... , ПолеN>

Exemplu de utilizare:

Request.Text = „SELECT | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | PLACE DataTs | FROM | &Ts AS Ts | | INDEX BY | Ts.NameOS, | Ts .CodeOS";

13. Design UNDE- vă permite să impuneți o condiție oricăror câmpuri de selecție. Rezultatul va include numai înregistrările care îndeplinesc condiția.

Sintaxă: UNDE<Условие1 ОператорЛогСоединения УсловиеN>

Exemplu de utilizare:

Query.Text = //toate înregistrările cu CompensationRemaining sunt selectate<>0 și //AmountForCalcCompRemaining > 100 "SELECT | CompensationRPORemains.Counterparty, |CompensationRPORemains.Child, | CompensationRPORemains.CompensationRemaining, | CompensationRPORemains.AmountForCalcCompRemains |Place Data Compensation.RPORemains.RPORemains.RPA | UNDE |CompensationRPORemaining.CompensationRemaining<>0 | Și CompensationRPORemains.AmountForCalcCompRemaining> 100" ;

14. Design REZULTATE... GENERAL- utilizat pentru calcularea totalurilor, proiectul specifică câmpurile prin care vor fi calculate totalurile și funcțiile de agregare aplicate câmpurilor totale. Când se folosesc totaluri pentru fiecare câmp după construcția TOTAL, datele sunt grupate. Există o construcție GENERAL opțională. Veți vedea un exemplu de rezultat al cererii mai jos.

Sintaxă: REZULTATE<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>DE<ОБЩИЕ> <Поле1, ... , ПолеN>

Exemplu de utilizare:

Solicitare.Text = "SELECT | Calcule. Contract de contrapartidă. Tip de acord AS Tip de contract, | Calcule. Contract de contraparte AS Contract, | Calcule. Contraparte, | Calcule. Valoarea soldului decontării reciproce AS Sold | FROM | Registrul de acumulări. Mutual Decontare CU Contrapartide Calcule AS |. TOTAL |. | GENERAL |

Figura conturează grupările care s-au format în timpul executării cererii, cea de sus se referă la secțiunea GENERAL, iar cea de-a doua la câmpul Counterparty Agreement Agreement Type.

Această secțiune prezintă exemple de rezolvare a problemelor tipice atunci când lucrați cu directoare ierarhice.

Obținerea elementelor unui director ierarhic care sunt subordonate unui grup dat

Pentru a obține elemente subordonate ale unui director ierarhic, limbajul de interogare furnizează constructul IN HIERARCHY. Exemplu de utilizare ÎN IERARHIE:


ALEGE
Nomenclatură.Cod,
Nomenclatură.PurchasePrice
DIN

În acest exemplu, vor fi obținute toate înregistrările directorului Nomenclatură situat în grupul &Group, inclusiv el însuși, grupurile sale subordonate și elementele aparținând grupurilor subordonate.

Dacă ne interesează doar elementele și grupurile situate direct într-un anumit grup, atunci putem obține astfel de elemente punând o condiție în câmpul Parent. Exemplu:


ALEGE
Nomenclatură.Cod,
Nomenclatură Nume AS Nume,
Nomenclatură.PurchasePrice
DIN
Director.Nomenclatura AS Nomenclatura

UNDE
Nomenclatură.Parent = &Grup

Această interogare va selecta grupuri și elemente subordonate grupului cu legătura &Grup.

Verificarea prezenței elementelor subordonate unui element director

Pentru a verifica prezența înregistrărilor subordonate ale unui element de director, puteți utiliza o interogare similară cu cea prezentată:

În acest exemplu, referința elementului pentru care doriți să verificați copii este scrisă în parametrul de interogare Parent. După executarea unei astfel de interogări, trebuie să verificați rezultatul pentru gol. Dacă rezultatul nu este gol, atunci există înregistrări subordonate. Altfel - nu. Exemplu:


Dacă Request.Execute().Empty() Atunci
Raport ("Fără intrări");
Altfel
Raport ("Înregistrări disponibile");
endIf;

Obținerea tuturor părinților unui element

Limbajul de interogare nu oferă niciun mijloc special pentru a regăsi toți părinții unui element. Puteți utiliza totaluri ierarhice pentru a finaliza sarcina, dar obținerea totalurilor ierarhice este optimizată pentru construirea de totaluri pentru un număr mare de înregistrări și nu este complet eficientă pentru obținerea părinților unui singur element. Pentru a prelua mai eficient toate înregistrările părinte ale unui element, se recomandă să parcurgeți în buclă părinții acestuia în porțiuni mici. Exemplu:


CurrentItemItem = ItemItem;

Interogare = Interogare nouă ("SELECT
| Nomenclatură.Parinte,
| Nomenclatură.Parinte.Părinte,
| Nomenclatură.Parinte.Părinte.Părinte,
| Nomenclatură.Părinte.Părinte.Părinte.Părinte,
| Nomenclatură.Părinte.Părinte.Părinte.Părinte.Părinte
|DIN
| Director.Nomenclatura AS Nomenclatura
|UNDE
| Nomenclature.Link = &CurrentNomenclatureElement";

În timp ce Ciclul Adevărului
Request.SetParameter("CurrentItemItem", CurrentItemItem);
Rezultat = Query.Run();
Dacă Rezultat.Gol() Atunci
Avorta;
endIf;
Selectie = Result.Select();
Selection.Next();
Pentru ColumnNumber = 0 By Result.Columns.Quantity() - 1 Loop
CurrentItemItem = Selecție[ColumnNumber];
Avorta;
Altfel
Raport (CurrentItemItem);
endIf;
EndCycle;

Dacă CurrentItemItem = Directories.Nomenclature.EmptyLink() Atunci
Avorta;
endIf;
EndCycle;

În acest exemplu, toți părinții pentru legătura înregistrată în variabila ElementNomenclature sunt afișați în fereastra de mesaje de serviciu. În ciclu sunt selectați 5 părinți link.

Dacă numărul de niveluri din director este limitat și mic, atunci este posibil să obțineți toți părinții cu o singură solicitare fără o buclă.

Afișarea unui director ierarhic într-un raport

Pentru a afișa un director ierarhic într-un raport, păstrând ierarhia, trebuie să utilizați o interogare similară cu următoarea:


ALEGE
Nomenclatură.Cod,
Nomenclatură Nume AS Nume,
Nomenclatură.PurchasePrice
DIN
Director.Nomenclatura AS Nomenclatura
COMANDA PENTRU
Nume IERARHIE

Această interogare selectează toate înregistrările din director și le aranjează pe ierarhii. Rezultatul va fi ordonat după nume, ținând cont de ierarhie.

Pentru ca grupurile de directoare să fie plasate deasupra elementelor, este necesar să înlocuiți clauza ORDER BY din această solicitare cu următoarele:


COMANDA PENTRU
Nomenclatură. Aceasta este IERARHIA Grupului,
Nume

Rezultatul va fi tot ordonat ierarhic, dar grupurile vor apărea deasupra elementelor.

De asemenea, este posibilă înlocuirea ofertei ORDER BY cu opțiunea AUTO ORDER. În acest caz, rezultatul va fi ordonat în conformitate cu setările directorului, adică. dacă directorul afirmă că grupurile ar trebui să fie situate deasupra elementelor, atunci acestea vor fi localizate deasupra.

De asemenea, se poate obține structura ierarhică a directorului folosind rezultatele.


ALEGE
Nomenclatură.Cod,
Nomenclatură Nume AS Nume,
Nomenclatură.PurchasePrice

FROM Directory.Nomenclature AS Nomenclatură

UNDE
(Nomenclatură.ThisGroup = FALSE)

COMANDA PENTRU Nume

Obținerea totalurilor pe ierarhie

Pentru a obține totaluri pe ierarhie într-o interogare, trebuie să specificați cuvântul cheie IERARHIE în clauza TOTAL SOFTWARE după ce ați specificat câmpul după care vor fi calculate totalurile. Un exemplu de raport „Cifra de afaceri articole” cu obținerea totalurilor pe ierarhie:


ALEGE

DIN

Nomenclatura IERARHIE

Ca urmare a acestei solicitări, totalurile vor fi calculate nu numai pentru fiecare articol, ci și pentru grupurile cărora le aparține un articol sau altul.

În cazul în care nu avem nevoie de totaluri pentru elemente, ci avem nevoie doar de totaluri pentru grupuri, trebuie să folosim construcția DOAR IERARHIE în totaluri. Exemplu:


ALEGE
Contabilitatea Nomenclaturii Cifra de afaceri.Nomenclatura AS Nomenclatura,
Contabilitatea Nomenclaturii Cifra de afaceri.Nomenclatura.Prezentare,
Contabilitate pentru Nomenclatura Cifra de afaceri.Cantitatea Cifra de afaceri AS Cantitatea Cifra de afaceri
DIN
Registrul de acumulare.Nomenclatura Contabilitate.Cifra de afaceri CUM Nomenclatura Contabilitate Cifra de afaceri
REZULTATE SUMA (Cantitate Cifra de afaceri) PO
Nomenclatura DOAR IERARHIE

Rezultatul acestei interogări va fi înregistrări totale numai pentru grupurile de articole.

Designul „ÎN IERARHIE” din interogările 1C:Enterprise 8.x vă permite să obțineți elemente subordonate ale unui obiect de configurare ierarhică în funcție de o selecție dată. Astăzi, în articol, vom analiza un exemplu de utilizare a acestuia, precum și acțiunile platformei din partea DBMS și impactul acesteia asupra performanței.

Utilizare

Să ne uităm la un exemplu simplu de utilizare a construcției „ÎN IERARHIE”. La executarea următoarei solicitări se vor obține elementele subordonate din directorul ierarhic „Produse” pentru valoarea transmisă a variabilei „Link”.

Text de interogare = " SELECTAȚI | Produse . Legătură,| Bunuri |. Articol DIN . Produse AS Produse|UNDE | Bunuri"

. Link ÎN IERARHIE(& Link)

În baza de date de testare, directorul „Produse” are următoarele date de testare:

Desigur, imaginea nu arată toate intrările din director. Captura de ecran arată doar structura de stocare a datelor din directorul ierarhic. Tabelul de directoare stochează 10 grupuri de nivel superior, fiecare dintre ele conține 5 grupuri imbricate cu 200 de elemente fiecare.

Să revenim la cererea de testare. Să transmitem linkul către grupul „Grup - 1” către parametrul „&Link” (vezi captura de ecran de mai sus). Apoi rezultatul interogării va arăta astfel:

După cum putem vedea, cererea a returnat un link către grupul de sus în sine (transmis ca parametru), precum și grupuri imbricate cu elementele din ele. Astfel, utilizarea construcției „ÎN IERARHIE” vă permite să obțineți în mod convenabil date subordonate ierarhic. Sintaxa limbajului de interogare 1C:Enterprise SQL clasic

foarte asemănătoare în unele privințe. Dar pentru expresia „IN IERARHIE” nu există un analog în limbajul de interogare SQL, deoarece, de exemplu, pentru expresia limbajului de interogare a platformei „B” există un operator SQL similar „IN”. Prin urmare, munca platformei cu SGBD atunci când se utilizează acest operator este interesantă.

În culise

  1. Deci, să începem. De exemplu, vom folosi interogarea scrisă anterior pentru directorul „Produse”. Vom analiza acțiunile platformei pentru două situații:
  2. Vom trece grupul de nivel superior „Grupul 1” ca parametru „&Link” (cum am făcut mai devreme).

În parametru vom trece un link către grupul „Grupul 1 - 1”, imbricat în grupul de nivel superior „Grupul 1”.

1. Acum, în ordine. În primul caz, platforma va efectua următoarele acțiuni pe serverul SQL:

2. Mai întâi, este executată o interogare SQL pentru a obține o legătură către grupul de directoare transmis ca parametru și toate grupurile subordonate. Rezultatul este plasat în tabelul temporar „#tt1”.

În a doua etapă, aceeași interogare este executată de două ori:

În cazul nostru, a doua interogare va returna un rezultat gol, deoarece nu există elemente subordonate pentru înregistrările situate la nivelul 3 al ierarhiei (nu există grupuri acolo).

3. Pentru a obține rezultatul final al interogării, platforma generează următoarea interogare SQL:

Rezultatul acestei solicitări poate fi procesat în continuare de algoritmi în limbajul încorporat al platformei. Astfel, intrările din tabelul temporar „#tt1” sunt folosite pentru a seta condiția de eșantionare din tabelul de referință „_Reference41”.

4. La ultimul pas, platforma 1C:Enterprise 8.x șterge tabelul temporar „#tt1”, deoarece nu va mai fi folosit în viitor.

Aceasta completează procesul de execuție a operatorului „ÎN IERARHIE”. Permiteți-mi să vă reamintesc că secvența considerată de acțiuni pe serverul SQL a fost efectuată atunci când am transmis un link către grupul de nivel superior „Grup - 1” către o solicitare din partea platformei. Dar cum se va comporta platforma dacă trecem un link către grupul de nivel al doilea „Grup - 1 - 1” ca parametru „&Link”? Totul se va întâmpla la fel, cu excepția următorului punct: mai sus, în a doua etapă a executării interogărilor SQL de către platformă, s-a scris că interogarea pentru obținerea elementelor subordonate a fost executată de două ori - în cazul obținerii elementelor subordonate pt. grupul "Grup - 1 - 1" nu este așa . Cererea va fi executată o singură dată.

Cert este că numărul de solicitări pentru obținerea elementelor subordonate depinde de numărul de grupuri din ierarhie. Cu alte cuvinte, dacă nivelul ierarhiei elementelor conține cel puțin un grup, atunci cerere de la punctul 2.

Impactul asupra performanței

Utilizarea incorectă a oricărui operator într-o interogare poate duce la o performanță suboptimă a sistemului. Operatorul luat în considerare „ÎN IERARHIE” nu face excepție. Trebuie utilizat cu prudență, deoarece complică foarte mult algoritmul de executare a interogărilor SQL către baza de date și, prin urmare, crește încărcarea pe serverul DBMS.

Permiteți-mi să vă dau un exemplu de interogare suboptimă care poate duce la consecințele triste menționate mai sus:

SELECT produse. Link FROM Director. Products AS Products WHERE (Produse. Link ÎN IERARHIE (& Link) SAU Produse. Link ÎN IERARHIE (& Link1) SAU Produse. Link ÎN IERARHIE (& Link2) )

După cum ați putea ghici, cererea va duce la generarea multor interogări SQL, ceea ce va duce la o scădere a performanței sistemului informațional.

Trageți-vă concluziile!

Depinde de tine sa tragi concluzii. Permiteți-mi să spun doar că operatorul „ÎN IERARHIE” este utilizat de platformă pentru sistemul de compunere a datelor atunci când condițiile de selecție includ „ÎN GRUP”, „ÎN GRUP DIN LISTĂ” și altele. Cred că nu este nevoie să explic că, cu manipulări incorecte, utilizatorii pot configura selecții foarte complexe și pot crește sarcina pe serverul 1C și pe DBMS de mai multe ori. Să modificăm setările numai pentru utilizatorii experimentați.

Și bineînțeles, când scrieți propriile mecanisme, acordați atenție operatorului „ÎN IERARHIE”. Foarte convenabil pe de o parte și periculos pe de altă parte.

Ce este un director 1C și de ce este necesar? Directorul stochează în mod condiționat informații permanente, de ex. informații care rămân aproape neschimbate pe o perioadă lungă de timp. De exemplu, directorul „Nomenclatură” conține o listă de bunuri vândute sau produse. De asemenea, un director poate conține multe proprietăți care descriu un element de director.

Dacă luăm genul unei persoane pentru comparație, atunci lista este limitată și nu se schimbă, așa că o enumerare este mai potrivită pentru aceasta.

După ce am creat un nou director, vom vedea următoarea imagine.

Să ne uităm la toate marcajele lui.

De bază

Aici sunt indicate numele (identificatorul din baza de date) și sinonimul (numele de utilizator al directorului). Un comentariu opțional este unul care poate explica scopul directorului sau poate descrie caracteristicile acestuia.

Ierarhie

În această filă puteți configura adâncimea de imbricare a elementelor de director. Folosind această setare, este convenabil să diferențiezi și să detaliezi elementele în funcție de anumite criterii. De exemplu, produsele „Dulapuri” sunt într-un grup, iar produsele „Tabele” sunt într-un altul. În mod implicit, atunci când este creat, directorul se prezintă lista de elemente. Dacă bifați caseta de selectare Director ierarhic, atunci fiecare element poate fi subordonat altui element (grup). Mai jos sunt opțiuni pentru personalizarea acestui marcaj și schimbarea afișajului în modul personalizat.

Tip de ierarhie:

Ierarhia grupurilor și elementelor

Cu această setare, elementele pot fi imbricate numai în grupuri (dosare).

Aici, după cum puteți vedea, toate elementele și grupurile au aceleași pictograme și orice element poate fi imbricat.

Așezați grupurile deasupra

Când această casetă de selectare este bifată, grupurile vor fi întotdeauna în partea de sus, altfel vor fi aranjate în ordine de sortare, de exemplu, astfel:

Limitarea numărului de niveluri ierarhice

Dacă caseta de selectare nu este bifată aici, atunci imbricarea este nelimitată.

Dacă caseta de selectare este bifată, puteți specifica numărul de niveluri de mai jos.

Proprietarii

Pe marcaj proprietarii pot fi indicate alte directoare în raport cu care acesta este subordonat. Diagrama de relații a directoarelor subordonate este similară cu diagrama de relații a unui director ierarhic, doar că aici un alt director acționează ca părinte și se numește proprietar. În configurațiile tipice, un bun exemplu este subordonarea directorului „Acorduri” directorului „Contrapărți”, deoarece Nu poate exista un acord care să nu aparțină niciunei contrapărți.

Câmpul „List of Directory Owners” specifică lista directoarelor care dețin elementele acestui director.

Mai jos în câmpul „Utilizarea subordonării” este indicat căruia vor fi subordonate elementele acestui director.

Cum să afli în mod programatic dacă un director este ierarhic sau nu

Pentru a face acest lucru, trebuie să vă referiți la metadate

Acesta este HierarchicalDirectory = Metadata.Directories.Counterparties.Hierarchical;

De continuat...