Numărul de serie din cerere este 1c. Funcțiile View și ViewLink

Să ne uităm la restul acum.

Funcții pentru lucrul cu șiruri în interogări 1C

Există puține funcții și operatori pentru a lucra cu date șiruri în interogări 1C.

În primul rând, pot fi adăugate șiruri în interogări. Pentru a face acest lucru, utilizați operatorul „+”:

Cerere. Text = „SELECT
" "Linie: " " + Sursă.Nume
;

În al doilea rând, puteți selecta o parte a liniei. Pentru a face acest lucru, utilizați funcția SUBSTRUCȚIE. Funcția este similară cu limbajul 1C încorporat. Are trei parametri:

  1. Șir sursă.
  2. Numărul caracterului cu care trebuie să înceapă linia selectată.
  3. Personaje.

Cerere. Text= "ALEGE
SUBSTRING("
"Linie:" ", 4, 3) CA REZULTAT"; // Rezultat: ok

Funcţie ISNULL

NULL este un tip de date special pe platforma 1C:Enterprise. Este, de asemenea, singura valoare posibilă de acest tip. NULL poate apărea în interogări în mai multe cazuri: la conectarea surselor de interogare, dacă nu a fost găsită o valoare corespunzătoare într-unul dintre tabele; la accesarea detaliilor unui obiect inexistent; dacă a fost specificat NULL în lista câmpurilor de interogare (de exemplu, la combinarea rezultatelor selecției din mai multe tabele), etc.

Pentru că NULL nu este nici nul, nici șirul gol, nici măcar o valoare Nedefinit, este adesea util să îl înlocuiți cu un tip de date mai util. Pentru asta este concepută funcția. ISNULL.

Are doi parametri:

  1. Valoarea care se verifică.
  2. Valoarea cu care se înlocuiește primul parametru dacă se dovedește a fi NULL.

Cerere. Text= "ALEGE
ISNULL(Source.Remainder, 0) AS Remainder"
; // Dacă rezultatul solicitării este restul câmpului = NULL,
// apoi va fi înlocuit cu 0 și puteți efectua operații matematice cu acesta

Funcții PERFORMANŢĂȘi INTRODUCERE LEGĂTURĂ

Aceste funcții sunt concepute pentru a obține reprezentări în șir de diferite valori. Adică convertesc referințe, numere, booleeni etc. în text simplu. Diferența dintre ele este că funcția PERFORMANŢĂ convertește orice tip de date în text (șir) și funcția INTRODUCERE LEGĂTURĂ- numai linkuri și returnează valorile rămase așa cum sunt, neconvertite.

Cerere. Text= "ALEGE
REPREZENTARE(ADEVĂRAT) CA Boolean,
REPREZENTARE (4) ca număr,
REPREZENTARE (Source.Link) AS Link,
REPREZENTARE(DATETIME(2016,10,07)) AS Data"
;
// Boolean = „Da”, Număr = „4”, Link = „Document Încasare numerar Nr. comandă... de la...”
// Data="07.10.2016 0:00:00"

Cerere. Text= "ALEGE
REPRESENTATIONREFERENCE(TRUE) CA Boolean,
REPREZENTARE REFERINȚĂ(4) CA NUMĂR
PRESENTINGLINK(Source.Link) AS Link,
REPRESENTATIONREFERENCE(DATETIME(2016,10,07)) AS Data"
;
// Boolean = ADEVĂRAT, Număr = 4, Link = „Document Ordin de primire numerar Nr.... de la...”
// Data=07.10.2016 0:00:00

Funcții TIPȘi VALORI DE TIP

Funcţie TIP returnează tipul de date al platformei 1C:Enterprise.

Cerere. Text= "ALEGE
TIP (număr)
TYPE (șir),
TIP (Document. Ordin de numerar pentru cheltuieli)"
;

Funcţie VALORI DE TIP returnează tipul valorii transmise acestuia.

Cerere. Text= "ALEGE
VALORI TIP (5) AS Număr,
TIP ("
"Linia" ") AS String,
TYPE (Source.Link) AS Referință
Din Directory.Source AS Source"
;
//Număr=Număr, String=Șir, Director = DirectoryLink.Source

Aceste funcții sunt convenabile de utilizat, de exemplu, atunci când trebuie să aflați dacă un câmp primit într-o solicitare este o valoare de un anumit tip. De exemplu, să obținem informațiile de contact ale contrapărților din registrul de informații ContactInformation (acolo sunt stocate contactele nu numai ale contrapărților, ci și ale organizațiilor, persoanelor fizice etc.):

Cerere. Text= "ALEGE

DIN

UNDE
VALUES TYPE(ContactInformation.Object) = TYPE(Directory.Counterparties)"
;

Funcţie SENS

Funcţie Sens vă permite să utilizați obiecte de configurare 1C direct într-o solicitare, fără a utiliza .

Să mai adăugăm o condiție la exemplul anterior. Trebuie doar să obțineți numerele de telefon ale contrapărților dvs.

Cerere. Text= "ALEGE
Informații de contact.Introducere
DIN
Registrul de informații Informații de contact CUM Informații de contact
UNDE
VALUES TYPE(ContactInformation.Object) = TYPE(Directory.Counterparties)
AND ContactInfo.Type = VALUE(Enum.ContactInfoTypes.Phone)"
;

Trebuie remarcat faptul că această funcție poate fi utilizată numai cu valori predefinite, adică. cu valori care pot fi accesate direct din configurator. Adică funcția SENS nu poate fi folosit cu elemente de director create de utilizatori, dar poate lucra cu enumerari, cu elemente de director predefinite, cu valori EmptyLink.

Operator LEGĂTURĂ

Operator LEGĂTURĂ este conceput pentru a verifica valorile returnate de o solicitare pentru a vedea dacă aparțin unui anumit tip de referință. Aceeași sarcină poate fi îndeplinită folosind funcții TIPȘi VALORI DE TIP(care au un domeniu mai larg și au fost discutate mai sus).

De exemplu, sarcina de selectare a informațiilor de contact pentru contrapărți ar putea fi rezolvată astfel:

Cerere. Text= "ALEGE
Informații de contact.Introducere
DIN
Registrul de informații Informații de contact CUM Informații de contact
UNDE
ContactInformation.Object LINK Directory.Contrapartide"
;

Operator EXPRES

Operator EXPRES utilizat în interogări 1C în două cazuri:

  • când trebuie să modificați caracteristicile unui tip primitiv;
  • atunci când trebuie să transformați un câmp cu un tip de date compus într-un câmp cu un singur tip.

Tipurile de date primitive includ: număr, șir, dată, boolean. Unele dintre aceste tipuri de date au caracteristici suplimentare. Tip Număr are lungime si precizie, tip linie - lungime sau nelimitat.

Operator EXPRES vă permite să schimbați nu tipul de date, ci caracteristicile suplimentare. De exemplu, el poate transforma un șir cu lungime nelimitată într-un șir cu lungime limitată. Acest lucru poate fi util dacă trebuie să grupați rezultatele interogării după un astfel de câmp. Nu puteți grupa după câmpuri cu o lungime nelimitată, așa că îl convertim într-un șir cu o lungime de 200 de caractere.

Cerere. Text= "ALEGE
CANTITATE (Sosire diferită de bunuri și servicii. Link) AS Link
DIN
Documentul Primirea Bunurilor și Serviciilor CUM Primirea Bunurilor și Serviciilor
A SE GRUPA CU
EXPRESS(Primirea bunurilor și serviciilor. Comentariu AS ROW (200))"
;

În unele cazuri, interogările către câmpuri cu un tip de date compus pot să nu fie procesate optim de platforma 1C. Acest lucru are ca rezultat timpi de interogare mai lungi, deci poate fi util să convertiți în avans un tip compus într-un singur tip.

Cerere. Text= "ALEGE
EXPRESS(Mișcarea mărfurilor. Cifra de afaceri. Comanda ca document. Comanda clientului).Data AS Data comenzii,
Mişcarea mărfurilor Cifra de afaceri.Nomenclatură
DIN
ÎnregistrareAcumulări.Mișcarea mărfurilor.Cifra de afaceri AS Mișcarea mărfurilor Cifra de afaceri
UNDE
Mișcarea mărfurilor Cifra de afaceri.Comandă LINK Document.Comandă client"
;

Operatori ALEGEREȘi ESTE NUL

Operator ALEGERE similar cu operatorul DACĂîn limbajul 1C încorporat, dar are o funcționalitate oarecum redusă.

Să presupunem că vrem să primim informații de contact din registrul de informații ContactInformation și, în același timp, să indicăm într-un câmp separat de cerere dacă aparține unei contrapărți sau unei persoane fizice.

Cerere. Text= "ALEGE
Informații de contact.Introducere,
ALEGERE
WHEN VALUES TYPE(ContactInformation.Object) = TYPE(Directory.Counterparties)
APOI "
Contrapartidă "
ALTA ALEGERE
WHEN VALUES TYPE(ContactInformation.Object) = TYPE(Directory.Individuals)
APOI "
Individual"
ELSE "Altul" "
Sfârşit
TERMINĂ CA PROPRIETAR
DIN
Registrul informațiilor Informații de contact AS Informații de contact".
;

După cum se vede din exemplu, în design ALEGERE există întotdeauna o condiție după cuvânt CÂND; valoare aplicată dacă condiția este adevărată după cuvânt APOIși valoarea aplicată dacă condiția nu este îndeplinită, după cuvânt IN CAZ CONTRAR. Toate cele trei elemente de design ALEGERE sunt obligatorii. Omite element IN CAZ CONTRAR, la fel ca la utilizarea operatorului DACĂîn limbajul 1C încorporat, este imposibil. Tot de la operator ALEGERE nu există un analog al designului ELSEIF, dar poți investi unul ALEGEREîn altul, așa cum sa făcut în exemplul nostru.

Operator ESTE NUL folosit în proiectare ALEGERE pentru a compara un câmp de interogare cu tipul NULL.

Cerere. Text= "ALEGE
ALEGERE
CÂND VALOAREA ESTE NULĂ, atunci 0
ELSE Sens
SFÂRŞIT"
;

În plus, operatorul ESTE NUL poate fi folosit în condiții de interogare, cum ar fi într-o propoziție UNDE.

În configurația de testare din jurnalul de documente, este necesar să se implementeze numerotarea liniilor într-o listă dinamică. Jurnalul include trei documente: „Cerere”, „Comandă de intrare” și „Comandă de ieșire”. Inițial, formularul pentru lista de jurnal de documente arată astfel:

În principiu, problema s-ar rezolva ușor dacă am primi o listă de documente în raport. Dar aici lucrurile stau altfel.

Rapoartele nu sunt o problemă!

Prin crearea unui raport asupra unui sistem de compunere a datelor cu o listă de documente, problema ar fi rezolvată foarte simplu. Trebuie doar să adăugați un câmp special „Număr de secvență” la câmpurile de raport.

Ca rezultat, utilizatorul va vedea un rezultat similar al generării de rapoarte:

Dar dacă trebuie să obțineți numerotarea direct în cerere? De exemplu, acest lucru poate fi necesar pentru a obține numărul de secvență al unei intrări dintr-o listă dinamică.

Numerotarea în cerere

Să modificăm interogarea pentru lista de jurnal dinamic de documente, după cum urmează:

" SELECTAȚI | T . NumberInOrder,| T . Legătură,| T . Data de,| T . MarkDeletion,| T . Număr,| T . Dirijată| T . Tip |DIN | (ALEGE" + // Obține numărul de linkuri atașate în câmpul „NumberByOrder”." CANTITATE (DIFERIT Jurnal de documente Jurnal de documente. Link) AS Număr în ordine, | Jurnalul de documente. Link AS Link, | Jurnalul de documente. Data AS Data, | Jurnalul de documente. MarkDeletion AS MarkDeletion, | Jurnalul de documente. Număr Număr AS, | Jurnalul de documente. Condus AS Conduit, | Jurnalul de documente. Tip AS Tip | DIN | Jurnalul de documente. Jurnal de documente AS Jurnal de documente | LEFT JOINDocumentJournal. Jurnal de documente AS Jurnal de documente Jurnal de documente de documente" + // Conectați tabelul de jurnal de documente la el însuși printr-o legătură de document. Numărul de conexiuni // linkurile sunt numărul de serie " Software-ul Document Journal. Link > = DocumentJournalDocumentJournal. Link / | | A SE GRUPA CU | Jurnalul de documente. Legătură, | Jurnalul de documente. Data de, | Jurnalul de documente. MarkDeletion, | Jurnalul de documente. Număr, | Jurnalul de documente. Dirijată | Jurnalul de documente. Tip) AS T"

Când deschidem o listă dinamică în modul 1C:Enterprise, obținem următorul rezultat:

Notă: exemplul arată doar principiul numerotării liniilor direct în cerere. Dacă ați observat, în captura de ecran de deasupra documentelor din listă, sortate după numărul rândului, „du-te” în ordinea tipului (prima comenzile primite, apoi comenzile de ieșire etc.). Acest lucru se întâmplă deoarece atunci când utilizați un link pentru a vă conecta, nu putem garanta că GUID-urile linkurilor vor fi unice. De asemenea, nu puteți compara link-uri ale diferitelor tipuri de documente - acest lucru va duce la rezultate incorecte alte câmpuri care determină locația specifică a documentului din lista generală a revistei.

Desigur, folosind o astfel de abordare, am complica interogarea către baza de date, în plus, unele caracteristici ale listei dinamice care sunt importante pentru munca utilizatorului ar deveni indisponibile (citirea dinamică a datelor, tabelul principal etc.), dar exemplul a fost creat doar pentru a demonstra capacitatea de a numerota linii în interogări. Folosind acest principiu pentru a rezolva alte probleme, de exemplu pentru tipărirea formularelor, astfel de probleme nu vor apărea.

Rețineți că utilizarea în mod repetat a unui tabel de documente sau a unui tabel de istoric al documentelor poate avea un impact negativ asupra performanței. Soluția optimă ar fi să creați un tabel temporar cu toate documentele selectate și apoi să lucrați cu el. Din nou, totul depinde de sarcina specifică!


Cuvinte cheie: linii de interogare de numerotare, FIRST, linii de numerotare în constructor, număr

Uneori este necesar să adăugați o coloană cu numere de rând la o interogare, de exemplu, când trebuie să afișați numere de rând într-un raport și utilizați generatorul de rapoarte. Numerotarea liniilor este utilă și atunci când este necesar să se afișeze un număr limitat de linii de date pentru anumite grupări. Ceva de genul PRIMELE 5 documente pentru fiecare contraparte.

Deci, există un cod care selectează articolele, sortate după nume:
ALEGE
Nomenclatură.Link
DIN

FILTREAZĂ DUPĂ
Nomenclatură.Nume
cererea inițială

Trebuie să adăugați aici o coloană cu numerele de serie ale articolului (în cadrul acestei sortări).
ALEGE

DIN
Director.Nomenclatura AS Nomenclatura
Software Nomenclature.Name >= Nomenclature_1.Name // Condiție de sortare pentru numerotare

FILTREAZĂ DUPĂ
Nomenclatură.Nume
interogare cu numere de rând

Conectăm masa la sine într-un mod destul de inteligent. Folosind tabelul din dreapta, numărăm numărul de articole cu un nume mai mic decât cel curent din stânga, folosind gruparea.

O tehnică similară poate fi utilizată dacă trebuie să specificați numerotarea rândurilor ținând cont de gruparea după un anumit câmp.
ALEGE
Nomenclature.Link AS Nomenclature,
Nomenclatură.Parent AS Parent,
QUANTITY(Nomenclature_1.Link) AS Number
DIN
Director.Nomenclatura AS Nomenclatura
INNER JOIN Directory.Nomenclatura AS Nomenclatura_1
Software Nomenclature.Name >= Nomenclature_1.Name
Și Nomenclature.Parent = Nomenclature_1.Parent

A SE GRUPA CU
Nomenclatură.Parinte,
Nomenclatură.Link
interogare cu numere de rând în cadrul unei grupări

Aceasta este aceeași cerere, are doar o grupare adăugată prin câmpul „Părinte”, numerotarea este diferită pentru fiecare părinte.

Performanţă:
Dacă vorbim despre performanță, atunci interogările de acest fel sunt în mod natural consumatoare de resurse (din punct de vedere matematic, o falsitate de ordinul N^2). Pentru majoritatea sarcinilor de zi cu zi utilizarea lor este destul de acceptabilă.
Apropo, a doua interogare este executată ceva mai rapid decât prima, acest lucru se datorează dimensiunii mai mici a tabelelor auxiliare.

Exemplu real de utilizare:
Acum, puțin despre motivul pentru care se fac toate acestea, adică despre beneficiul care poate fi derivat din numerotarea șirurilor de interogare.

De exemplu, ne confruntăm cu sarcina de a obține pentru fiecare contraparte ultimele cinci documente de primire a bunurilor și serviciilor:
ALEGE
Primirea Bunurilor și Serviciilor Contraparte AS Contraparte.
Primirea Bunurilor și Serviciilor Link AS Link,
CANTITATE (Recepția Bunurilor și Serviciilor_1.Link) Număr AS
DIN
Documentul Primirea Bunurilor și Serviciilor CUM Primirea Bunurilor și Serviciilor
INTERNAL JOIN Document de primire a bunurilor și serviciilor ca primire de bunuri și servicii_1
Data Primării Bunurilor și Serviciilor<= ПоступлениеТоваровУслуг_1.Дата
Și Recepție de Bunuri și Servicii = Contrapartea

A SE GRUPA CU
Primirea Bunurilor și Serviciilor.
Primirea Bunurilor și Serviciilor Contraparte

AVÂND
CANTITATE(Primirea bunurilor și serviciilor_1.Link)<= 5

FILTREAZĂ DUPĂ
contrapartidă,
Număr
o cerere cu numere de linie dacă există duplicate ale câmpului de interes (cel relativ la care se construiește contorul)
ALEGE
QUANTITY(Individuals_1.Name) AS Number,
Persoane fizice. Link CA NUME COMPLET
DIN
Director.Individuals AS Individuals
INTERNAL JOIN Directory.Persoanele fizice ca persoane fizice_1
Software (Individuals.Name + Individuals.Code >= Individuals_1.Name + Individuals_1.Code)

FILTREAZĂ DUPĂ
Număr
De fapt, ideea este următoarea: utilizați un „câmp compus” pentru a obține un total crescător (în acest caz, un câmp poate conține duplicate, dar al doilea din acest exemplu nu.)
Născut în capul lui NEKRON