Acasă / Diverse / Parametru standard & Perioada și probleme în utilizare. Parametru standard &Perioadă și probleme în utilizarea parametrilor tabelului virtual 1c

Parametru standard & Perioada și probleme în utilizare. Parametru standard &Perioadă și probleme în utilizarea parametrilor tabelului virtual 1c

Articolul descrie implementarea fizică masă virtuală rămășițe ale configurației care funcționează în modul client-server folosind exemplul de utilizare a SGBD-ului MS SQL Server.

Aplicabilitate

Articolul discută versiunea 8.3.5.1383 a platformei 1C:Enterprise. În versiunea actuală a platformei, sunt posibile unele modificări ale textului descris în material, Interogări T-SQL, executat pe partea serverului DBMS.

Dispozitivul unui tabel virtual de solduri

Să luăm în considerare ce fel de interogare DBMS este transformată în utilizarea unui tabel virtual de solduri de registru de acumulare. De exemplu, va fi luat în considerare următorul text de solicitare:

ALEGE
MărfuriInventoryRemains.Product,
MărfuriInventariesRemains.Depozit,
InventaryRemaining.QuantityRemaining
DIN
ÎnregistrareAcumulări.Inventare.Rămășițe(&Data , Depozit = &Depozit ) CUM
Stocuri de mărfuriRămăși

În primul rând, folosind metoda contextului global GetDatabaseStorageStructure() obținem o listă de tabele de baze de date în care sunt stocate datele registrului de acumulare „Stocuri de mărfuri”:

Compoziția câmpurilor din tabelul principal al registrului de acumulare și tabelul totalurilor este prezentată mai jos:

Stocarea totalurilor pentru acest registru este configurată în modul „1C:Enterprise 8” după cum urmează:

Să completăm parametrii din cererea în cauză după cum urmează:


Platforma convertește textul solicitării în următoarea solicitare, care va fi executată pe serverul DBMS:

SELECTA
Q_000_T_001.Fld82 ,
Q_000_T_001.Fld83 ,
Q_000_T_001.Fld84Balance
DIN
(SELECTARE Fld82,
Fld83,

DIN
(SELECTARE Fld82,
Fld83,
SUM (Fld84 ) AS Fld84Balance
DE LA AccumRgT85
WHERE Perioada = DATETIME (3999, 11, 1)
ȘI ((Fld83 = ))
ȘI(Fld84<>0 ) ȘI (Fld84<> 0 )
GROUP BY Fld82 , Fld83
AVÂND Fld84Balance<> 0
UNIREA TOȚI
SELECTează Fld82,
Fld83,
SUM (CAZ WHEN RecordKind = 0 THEN – Fld84 ELSE Fld84 END ) AS Fld84Balance
DE LA AccumRg81
WHERE Perioada >= DATETIME (2012, 9, 1)
ȘI Perioada< DATETIME (3999 , 11 , 1 )
ȘI Activ
ȘI ((Fld83 = 9:))
GROUP BY Fld82 , Fld83
AVÂND Fld84Balance<>0) T
GROUP BY Fld82 , Fld83
AVÂND Fld84Balance<>0 ) Q_000_T_001

Să examinăm solicitarea primită mai detaliat.

În primul rând, prima interogare din unire selectează datele din tabelul AccumRgT85 rezultat. Totalurile se obțin la data stocării totalurilor curente (01.11.3999), se aplică o condiție suplimentară câmpului Depozit (deoarece o astfel de condiție a fost folosită în parametrii tabelului virtual). În plus, se efectuează o verificare pentru a se asigura că rezultatul nu conține rânduri cu rest zero.

Vă rugăm să rețineți că gruparea se realizează după dimensiunile selectate în textul de solicitare. De aceea, nu este necesară gruparea suplimentară după dimensiuni în text în limbajul de interogare 1C:Enterprise.

A doua interogare de alăturare utilizează tabelul de mișcare a registrului AccumRg81. În funcție de tipul de mișcare (dacă RecordKind este 0, atunci este Venit, în caz contrar este Cheltuială), în expresie se introduce un semn. Platforma selectează datele pentru perioada de la data specificată ca parametru al tabelului virtual până la data la care totalurile curente sunt stocate (11/01/3999).

În plus, sunt selectate numai înregistrările active; câmpul Depozit trebuie să fie egal cu valoarea specificată. Ca și în cazul primei interogări de alăturare, aceasta grupează și în funcție de dimensiunile selectate și elimină înregistrările cu valori zero de resurse.

Dacă este utilizat SGBD MS SQL Server și decalajul de dată este setat la 2000 pentru baza de date, atunci toate datele vor fi stocate cu decalajul specificat, de exemplu. în loc de 01.11.3999 vei vedea 01.11.5999.

Dacă dezactivați totalurile curente pentru registrul de acumulare, platforma va primi mai întâi cele mai recente totaluri calculate la o dată mai devreme decât cea specificată în parametrul Perioada tabel virtual.

Apoi, în mod similar, aceste date vor fi completate din tabelul de mișcare, dar numai pentru perioada de la data ultimelor rezultate până la perioada tabelului virtual.

SELECTA
Q_000_T_001.Fld82 ,
Q_000_T_001.Fld83 ,
Q_000_T_001.Fld84Balance
DIN
(SELECTARE Fld82,
Fld83,
SUM (Fld84Balance ) AS Fld84Balance
DIN
(SELECTARE Fld82,
Fld83,
SUM (Fld84 ) AS Fld84Balance
DE LA AccumRgT85
WHERE Perioada = DATETIME (2012, 4, 1)
ȘI ((Fld83 = 9:))
ȘI(Fld84<> 0 )
ȘI(Fld84<> 0 )
GROUP BY Fld82 , Fld83
AVÂND Fld84Balance<> 0
UNIREA TOȚI
SELECTează Fld82,
Fld83,
SUM (CAZ WHEN RecordKind = 0 THEN Fld84 ELSE – Fld84 END ) AS Fld84Balance
DE LA AccumRg81
WHERE Perioada >= DATETIME (2012, 4, 1)
ȘI Perioada< DATETIME (2012 , 9 , 1 )
ȘI Activ
ȘI ((Fld83 = 9:))
GROUP BY Fld82 , Fld83
AVÂND Fld84Balance<>0) T
GROUP BY Fld82 , Fld83
AVÂND Fld84Balance<>0 ) Q_000_T_001

Vă rugăm să rețineți următoarea condiție în corpul cererii.

Limbajul de interogare din 1C 8 este un analog simplificat al binecunoscutului „limbaj de programare structurat” (cum este mai des numit, SQL). Dar în 1C este folosit doar pentru citirea datelor este folosit pentru a schimba datele model de obiect date.

O altă diferență interesantă este sintaxa rusă. Deși de fapt poți folosi construcții în limba engleză.

Exemplu de solicitare:

ALEGE
Banci.Nume,
Bănci.CorrAccount
DIN
Director.Bănci CUM Bănci

Această solicitare ne va permite să vedem informații despre numele și contul de corespondent al tuturor băncilor existente în baza de date.

Limbajul de interogare este cel mai simplu și mod eficient obtinerea de informatii. După cum se poate vedea din exemplul de mai sus, în limbajul de interogare trebuie să utilizați nume de metadate (aceasta este o listă de obiecte de sistem care alcătuiesc configurația, adică directoare, documente, registre etc.).

Descrierea constructelor limbajului de interogare

Structura de interogare

Pentru a obține date, este suficient să folosiți construcțiile „SELECT” și „FROM”. Cea mai simplă cerere arată astfel:

SELECTAȚI * FROM Directoare.Nomenclatură

Unde „*” înseamnă selectarea tuturor câmpurilor din tabel, iar Directories.Nomenclature – numele tabelului din baza de date.

Să ne uităm la un exemplu mai complex și general:

ALEGE
<ИмяПоля1>CUM<ПредставлениеПоля1>,
Sumă(<ИмяПоля2>) CUM<ПредставлениеПоля2>
DIN
<ИмяТаблицы1>CUM<ПредставлениеТаблицы1>
<ТипСоединения>COMPUS<ИмяТаблицы2>CUM<ПредставлениеТаблицы2>
DE<УсловиеСоединениеТаблиц>

UNDE
<УсловиеОтбораДанных>

GROUP BY
<ИмяПоля1>

COMANDA PENTRU
<ИмяПоля1>

REZULTATE
<ИмяПоля2>
DE
<ИмяПоля1>

În această interogare, selectăm datele câmpurilor „FieldName1” și „FieldName1” din tabelele „TableName1” și „TableName”, atribuim sinonime câmpurilor folosind operatorul „HOW” și le conectăm folosind o anumită condiție „TableConnectionCondition”. ”.

Din datele primite, selectăm numai datele care îndeplinesc condiția din „UNDE” „Condiția de selecție a datelor”. Apoi, grupăm cererea după câmpul „Nume câmp 1”, însumând „Nume câmp 2”. „Field Name1” și câmpul final „Field Name2”.

Ultimul pas este sortarea cererii folosind constructul ORDER BY.

Proiecte generale

Să ne uităm la structurile generale ale limbajului de interogare 1C 8.2.

PRIMULn

Prin utilizarea al acestui operator puteți obține n număr de primele înregistrări. Ordinea înregistrărilor este determinată de ordinea în interogare.

SELECTAȚI PRIMILE 100
Banci.Nume,
Bănci Cod AS BIC
DIN
Director.Bănci CUM Bănci
COMANDA PENTRU
Bănci.Nume

Solicitarea va primi primele 100 de intrări din directorul „Bănci”, sortate alfabetic.

PERMIS

Acest design este relevant pentru lucrul cu mecanismul. Esența mecanismului este de a restricționa citirea (și alte acțiuni) la utilizatori pentru anumite înregistrări dintr-un tabel de bază de date, și nu tabelul în ansamblu.

Dacă un utilizator încearcă să folosească o interogare pentru a citi înregistrările care nu sunt disponibile pentru el, va primi un mesaj de eroare. Pentru a evita acest lucru, ar trebui să utilizați construcția „PERMIS”, adică solicitarea va citi numai înregistrările care îi sunt permise.

SELECTARE PERMIS
Depozitul de informații suplimentare
DIN
Director.Documentul de informații suplimentare

DIVERSE

Utilizarea „DIFERENT” va împiedica introducerea liniilor duplicate în rezultatul interogării 1C. Dublarea înseamnă că toate câmpurile de solicitare se potrivesc.

SELECTAȚI PRIMILE 100
Banci.Nume,
Bănci Cod AS BIC
DIN
Director.Bănci CUM Bănci

EmptyTable

Această construcție este folosită foarte rar pentru a combina interogări. Când vă alăturați, poate fi necesar să specificați un tabel imbricat gol într-unul dintre tabele. Operatorul „EmptyTable” este potrivit pentru asta.

Exemplu din 1C 8 ajutor:

SELECT Link.Number, EMPTY TABLE.(Nr., Articol, Cantitate) AS Compoziție
DIN Document.Factură de cheltuieli
COMBINA TOTUL
SELECTează Link.Number, Conținut.(LineNumber, Product, Quantity)
FROM Document.Invoice Document.Invoice.Composition.*

ISNULL

O caracteristică foarte utilă care vă permite să evitați multe greșeli. Există NULL() vă permite să înlocuiți Valoare NULL la ceea ce este necesar. Foarte des folosit pentru a verifica prezența unei valori în tabelele unite, de exemplu:

ALEGE
Nomenclatură Ref.
IsNULL(Articol rămas.Cantitate rămasă,0) AS Cantitate rămasă
DIN


Poate fi folosit în alte moduri. De exemplu, dacă pentru fiecare rând nu se știe în ce tabel există valoarea:

ISNULL(Data primirii facturii, Data emiterii facturii)

CUM este un operator care ne permite să atribuim un nume (sinonim) unui tabel sau câmp. Am văzut un exemplu de utilizare mai sus.

Aceste construcții sunt foarte asemănătoare - vă permit să obțineți o reprezentare în șir a valorii dorite. Singura diferență este că REPRESENTATION convertește orice valoare într-un tip șir, în timp ce REPRESENTATIONREF convertește doar valorile de referință. REPREZENTAREA REFERINȚEI este recomandată a fi utilizată în interogările sistemului de compoziție a datelor pentru optimizare, cu excepția cazului în care, desigur, câmpul de date de referință este planificat să fie utilizat în selecții.

ALEGE
Vizualizare(Link), //șir, de exemplu „Raportul anticipat nr. 123 din 10.10.2015
Vizualizare(DeletionMark) AS DeleteMarkText, //șir, „Da” sau „Nu”
ViewReferences(DeletionMark) AS DeleteMarkBoolean //boolean, True sau False
DIN
Document.Raport de avans

EXPRES

Express vă permite să convertiți valorile câmpurilor în tipul de date dorit. Puteți converti o valoare fie într-un tip primitiv, fie într-un tip de referință.

Express pentru un tip de referință este utilizat pentru a restricționa tipurile de date solicitate în câmpuri de tip complex, adesea folosite pentru a optimiza performanța sistemului. Exemplu:

EXPRESS(TableCost.Subconto1 AS Directory.Cost Items).Tip de activitatePentruTaxAccountingCosts

Pentru tipurile primitive, această funcție este adesea folosită pentru a limita numărul de caractere din câmpurile de lungime nelimitată (astfel de câmpuri nu pot fi comparate). Pentru a evita eroarea " Parametri nevalidi în operația de comparare. Nu poți compara câmpuri
lungime nelimitată și câmpuri de tipuri incompatibile
", trebuie să exprimați astfel de câmpuri după cum urmează:

EXPRESS(Comentează AS Line(150))

DATA DIFERENTATA

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

Un exemplu de utilizare a IS NULL într-o solicitare 1C:

SELECTAȚI * DIN
Ref
CONEXIUNEA STÂNGA ÎnregistrareAcumulări.ProduseÎnDepozite.Rămas ca produs rămas
Software NomenclatureRef.Link = Sold GoodsCommitteesRemains.Nomenclature
UNDE NU Mărfuri rămase

Tipul de date dintr-o interogare poate fi determinat folosind funcțiile TYPE() și VALUETYPE() sau prin utilizarea operatorului logic REFERENCE. Cele două funcții sunt similare.

Valori predefinite

Pe lângă utilizarea parametrilor trecuți în interogări în limbajul de interogare 1C, puteți utiliza valori predefinite sau . De exemplu, transferuri, directoare predefinite, planuri de conturi și așa mai departe, se folosește constructul „Valoare()”.

Exemplu de utilizare:

WHERE Nomenclature.Type of Nomenclature = Value(Directory.Types of Nomenclature.Product)

WHERE Counterparties.Type of Contact Information = Value(Enumeration.Types of Contact Information.Phone)

WHERE Soldurile contului.Cont contabil = Valoare(Planul de conturi.Profit.ProfitsLoss)

Conexiuni

Există 4 tipuri de conexiuni: STÂNGA, CORECT, COMPLET, INTERN.

CONEXIUNEA STÂNGA și DREAPTA

Îmbinările sunt folosite pentru a lega două tabele pe baza unei anumite condiții. Caracteristică când LEFT JOIN este că luăm primul tabel specificat în întregime și legăm condiționat al doilea tabel. Câmpurile celui de-al doilea tabel care nu au putut fi legate de condiție sunt completate cu valoarea NUL.

De exemplu:

Va returna întregul tabel de Contrapartide și va completa câmpul „Bancă” numai în acele locuri în care va fi îndeplinită condiția „Contrapărți.Nume = Bănci.Nume”. Dacă condiția nu este îndeplinită, câmpul Bank va fi setat la NUL.

RIGHT JOIN în limba 1C absolut asemănătoare Conexiune STÂNGA, cu excepția unei diferențe - în DREPTUL DE CONECTARE Masa „principală” este a doua, nu prima.

CONEXIUNE COMPLETA

CONEXIUNE COMPLETA diferă de stânga și dreapta prin faptul că afișează toate înregistrările din două tabele și le conectează numai pe cele pe care le poate conecta în funcție de condiție.

De exemplu:

DIN

CONEXIUNE COMPLETA
Director.Bănci CUM Bănci

DE

Limbajul de interogare va returna ambele tabele complet numai dacă este îndeplinită condiția de a se alătura înregistrărilor. Spre deosebire de o îmbinare stânga/dreapta, este posibil ca NULL să apară în două câmpuri.

INNER JOIN

INNER JOIN diferă de full prin aceea că afișează numai acele înregistrări care ar putea fi conectate în funcție de o anumită condiție.

De exemplu:

DIN
Directorul contrapărților AS Clienți

INNER JOIN
Director.Bănci CUM Bănci

DE
Clients.Name = Banks.Name

Această interogare va returna numai rândurile în care banca și contrapartea au același nume.

Asociații

Construcțiile JOIN și JOIN ALL combină două rezultate într-unul singur. Aceste. rezultatul efectuării a două va fi „unit” într-unul, unul comun.

Adică sistemul funcționează exact la fel ca și cele obișnuite, doar pentru un tabel temporar.

Cum se utilizează INDEX BY

Cu toate acestea, un punct trebuie luat în considerare. Construirea unui index pe un tabel temporar necesită, de asemenea, timp. Prin urmare, este recomandabil să utilizați construcția „ ” numai dacă se știe cu siguranță că vor exista mai mult de 1-2 înregistrări în tabelul temporar. În caz contrar, efectul poate fi invers - performanța câmpurilor indexate nu compensează timpul necesar pentru construirea indexului.

ALEGE
Currency Currency Ultima secțiune transversală Moneda AS.
Rate valutare Ultima secțiune transversală.
Ratele valutare PUT
DIN
Informații Registrul.Currency Rates.Last Slice(&Period,) AS Currency RatesLast Slice
INDEX PRIN
Valută
;
ALEGE
Nomenclatura prețurilor.Nomenclatura,
PreturiNomenclaturi.Pret,
PrețuriNomenclaturi.Moneda,
Rate valutare.Rate
DIN
Registrul de informații.Nomenclatura prețurilor.Ultima felie(&perioada,
Nomenclatură B (&Nomenclatură) AND PriceType = &PriceType) AS PriceNomenclature
LEFT JOIN Currency Rates AS Currency Rates
Software PricesNomenclatures.Currency = Currency Rates.Currency

Gruparea

Limbajul de interogare 1C vă permite să utilizați funcții de agregare speciale atunci când grupați rezultatele interogării. Gruparea poate fi folosită și fără funcții de agregare pentru a „elimina” duplicatele.

Există următoarele funcții:

Cantitate, Cantitate, Număr de diferite, Maxim, Minim, Medie.

Exemplul #1:

ALEGE
Nomenclatura vânzărilor de bunuri și servicii.
SUM(Vânzări de mărfuriServiciiBunuri.Cantitate) AS Cantitate,
SUM(Vânzări de mărfuriServiciiBunuri.Suma) AS Sumă
DIN

GROUP BY
Vânzări de Bunuri și Servicii Nomenclatură

Interogarea primește toate rândurile cu mărfuri și le rezumă după cantitate și sume pe articol.

Exemplul nr. 2

ALEGE
Codul băncilor,
CANTITATE(Bănci diferite.Link) CA Număr de duplicate
DIN
Director.Bănci CUM Bănci
GROUP BY
Bănci.Cod

Acest exemplu va afișa o listă de BIC-uri în directorul „Bănci” și va arăta câte duplicate există pentru fiecare dintre ele.

Rezultate

Rezultatele sunt o modalitate de a obține date dintr-un sistem cu o structură ierarhică. Funcțiile de agregare pot fi utilizate pentru câmpurile de rezumat, la fel ca și pentru grupări.

Una dintre cele mai populare moduri de a utiliza rezultatele în practică este anularea în loturi a mărfurilor.

ALEGE




DIN
Vânzări de bunuri și servicii
COMANDA PENTRU

REZULTATE
SUM(Cantitate),
SUM(Suma)
DE
Nomenclatură

Rezultatul interogării va fi următorul ierarhic:

Rezultate generale

Dacă trebuie să obțineți totaluri pentru toate „totalurile”, utilizați operatorul „GENERAL”.

ALEGE
Vânzări de bunuri și servicii Nomenclatură AS.
Vânzări de Bunuri și Servicii Bunuri Link AS Document,
Vânzări de bunuri și servicii.
Vânzări de Bunuri și Servicii Bunuri
DIN
Vânzări de bunuri și servicii
COMANDA PENTRU
Vânzări de Bunuri și Servicii Data
REZULTATE
SUM(Cantitate),
SUM(Suma)
DE
GENERAL,
Nomenclatură

Ca urmare a executării cererii, obținem următorul rezultat:

În care 1 nivel de grupare este agregarea tuturor câmpurilor necesare.

Aranjarea

Operatorul ORDER BY este folosit pentru a sorta rezultatul unei interogări.

Sortarea pentru tipurile primitive (șir, număr, boolean) urmează regulile obișnuite. Pentru câmpurile de tip referință, sortarea are loc prin reprezentarea internă a legăturii (identificatorul unic), mai degrabă decât prin cod sau prin reprezentarea referințelor.

ALEGE

DIN
Director.Nomenclatura AS Nomenclatura
COMANDA PENTRU
Nume

Solicitarea va afișa o listă de nume în directorul nomenclatorului, sortate alfabetic.

Comanda automată

Rezultatul unei interogări fără sortare este un set de rânduri prezentat haotic. Dezvoltatorii platformei 1C nu garantează că rândurile vor fi afișate în aceeași secvență atunci când execută aceleași interogări.

Dacă trebuie să afișați înregistrările tabelului într-o ordine constantă, trebuie să utilizați constructul Auto-Order.

ALEGE
Nomenclatură.Nume AS Nume
DIN
Director.Nomenclatura AS Nomenclatura
COMANDA AUTOMATA

Mesele virtuale

Tabelele virtuale din 1C sunt o caracteristică unică a limbajului de interogare 1C care nu se găsește în alte sintaxe similare. Un tabel virtual este o modalitate rapidă de a obține informații de profil din registre.

Fiecare tip de registru are propriul set de tabele virtuale, care pot diferi în funcție de setările registrului.

  • tăierea primului;
  • tăierea acestuia din urmă.
  • resturi;
  • revoluții;
  • soldurile si cifra de afaceri.
  • mișcări din subconto;
  • revoluții;
  • viteza Dt Kt;
  • resturi;
  • soldurile si cifra de afaceri
  • subconto.
  • baza;
  • date grafice;
  • perioada efectivă de valabilitate.

Pentru dezvoltatorul de soluții, datele sunt preluate dintr-un singur tabel (virtual), dar de fapt platforma 1C le preia din mai multe tabele, transformându-le în forma necesară.

ALEGE
Produse în Depozite Resturi și Cifra de afaceri,
ProductsIn WarehousesRemainingAndTurnover.QuantityInitialRemaining,
ProductsIn WarehousesRemainsAndTurnover.QuantityTurnover,
MărfuriÎnDepoziteRemainsAndTurnover.CantityIncoming,
MărfuriÎnDepoziteRămășiȘi Cifra de afaceri.CantitateConsum,
ProductsIn WarehousesRemainingsAndTurnover.CantityFinalRemaining
DIN
ÎnregistrareAcumulări.MărfuriÎnDepozite.Rămăși și Cifra de afaceri CA Mărfuri ÎnDepoziteRămăși și Cifra de afaceri

Această interogare vă permite să preluați rapid o cantitate mare de date.

Opțiuni de masă virtuală

Un aspect foarte important al lucrului cu tabele virtuale este utilizarea parametrilor. Parametrii tabelului virtual – parametri specializați pentru selecție și configurare.

Pentru astfel de tabele, se consideră incorectă utilizarea selecției în construcția „UNDE”. Pe lângă faptul că interogarea devine suboptimă, este posibil să primiți date incorecte.

Un exemplu de utilizare a acestor parametri:

Registrul de acumulări de mărfuri în depozite (& Începutul perioadei, & Sfârșitul perioadei, Mișcări și limite ale perioadei, Nomenclatură = & Nomenclatură obligatorie).

Algoritm pentru tabele virtuale

De exemplu, cel mai folosit tabel virtual de tip „Rămășițe” stochează date din două tabele fizice – solduri și mișcări.

Când se utilizează o masă virtuală, sistemul efectuează următoarele manipulări:

  1. Obținem cea mai apropiată valoare calculată în termeni de dată și măsurători în tabelul cu totaluri.
  2. „Adăugăm” suma din tabelul de mișcări la suma din tabelul cu totaluri.


Astfel de pași simpli poate îmbunătăți semnificativ performanța sistemului în ansamblu.

Folosind Generatorul de interogări

Generator de interogări– un instrument încorporat în sistemul 1C Enterprise care facilitează foarte mult dezvoltarea interogărilor bazei de date.

Generatorul de interogări are o interfață destul de simplă, intuitivă. Cu toate acestea, să ne uităm la utilizarea constructorului de interogări mai detaliat.

Constructorul de text de interogare este lansat din meniul contextual (butonul dreapta al mouse-ului) în locul dorit din codul programului.

Descrierea constructorului cererii 1C

Să ne uităm la fiecare filă a designerului mai detaliat. Excepție este fila Builder, care este un subiect pentru o altă discuție.

fila Tabele și câmpuri

Această filă specifică sursa de date și câmpurile care trebuie afișate în raport. În esență, aici sunt descrise construcțiile SELECT.. FROM.

Sursa poate fi un tabel fizic de bază de date, un tabel de registru virtual, tabele temporare, interogări imbricate etc.

În meniul contextual al tabelelor virtuale, puteți seta parametrii tabelului virtual:

fila Conexiuni

Fila este folosită pentru a descrie conexiunile mai multor tabele și creează construcții cu cuvântul CONEXIUNE.

Fila Grupare

În această filă, sistemul vă permite să grupați și să rezumați câmpurile obligatorii ale rezultatului tabelului. Descrie utilizarea construcțiilor GROUP BY, SUM, MINIM, MEDIE, MAXIMUM, CANTITATE, NUMĂR DE DIFERENȚI.

fila Condiții

Raspunde de tot ce intra in textul de solicitare dupa constructia WHERE, adica de toate conditiile impuse datelor primite.

Fila Avansat

Tab În plus plin cu tot felul de parametri care sunt foarte importanți. Să ne uităm la fiecare dintre proprietăți.

Gruparea Selectarea înregistrărilor:

  • În primul rând N– un parametru care returnează doar N înregistrări la interogare (PRIMUL operator)
  • Fără duplicate– asigură unicitatea înregistrărilor primite (operator DIFERIT)
  • Permis– vă permite să selectați doar acele înregistrări pe care sistemul vă permite să le selectați ținând cont (construcție PERMISĂ)

Gruparea Tip cerere determină ce tip de interogare va fi: preluarea datelor, crearea unui tabel temporar sau distrugerea unui tabel temporar.

Mai jos este un steag Blocați datele primite pentru modificare ulterioară. Vă permite să activați capacitatea de a seta blocarea datelor, ceea ce asigură siguranța datelor din momentul în care sunt citite și până când sunt modificate (relevant doar pentru Modul automat interblocări, design A SCHIMBA).

Fila Joins/Aliases

Această filă a designerului de interogări setează capacitatea de a uni diferite tabele și aliasuri (constructia CUM). Tabelele sunt indicate în partea stângă. Dacă setați steagurile vizavi de masă, se va folosi construcția UNITE, în caz contrar - UNITE ALL (diferențe între cele două metode). În partea dreaptă este indicată corespondența câmpurilor din diferite tabele dacă nu este specificată corespondența, interogarea va returna NULL.

fila Comanda

Aceasta specifică ordinea în care sunt sortate valorile (ORDER BY) - descendent (DESC) sau crescător (ASC).

Există și un steag interesant - Comanda automată(in cerere - COMANDA AUTO). În mod implicit, sistemul 1C afișează datele într-o ordine „haotică”. Dacă setați acest indicator, sistemul va sorta datele după datele interne.

Fila Lot de interogări

În fila Designer de interogări, puteți crea altele noi și, de asemenea, le puteți utiliza ca navigare. În textul cererii, pachetele sunt separate prin simbolul „;” (virgulă).

Butonul „Interogare” din designerul de interogări

În colțul din stânga jos al designerului de solicitări există un buton Solicitare, cu ajutorul căruia puteți vizualiza textul solicitării în orice moment:

În această fereastră, puteți face ajustări la cerere și o puteți executa.


Folosind consola de interogări

Consola de interogări este o modalitate simplă și convenabilă de a depana interogări complexe și de a obține rapid informații. În acest articol, voi încerca să descriu cum să utilizați Query Console și să ofer un link pentru a descărca Query Console.

Să aruncăm o privire mai atentă la acest instrument.

Descărcați consola de interogări 1C

În primul rând, pentru a începe să lucrați cu consola de interogări, trebuie să o descărcați de undeva. Tratamentele sunt de obicei împărțite în două tipuri - forme controlateși obișnuit (sau uneori numit 8.1 și 8.2/8.3).

Am încercat să combin aceste două vederi într-o singură prelucrare - forma dorită se deschide în modul de operare dorit (în modul gestionat, consola funcționează doar în modul gros).

Descrierea consolei de interogări 1C

Să începem să ne uităm la consola de interogări cu o descriere a panoului principal de procesare:

În antetul consolei de interogări, puteți vedea timpul de execuție al ultimei interogări cu precizie în milisecunde, acest lucru vă permite să comparați diferite modele în ceea ce privește performanța.

Primul grup de butoane din bara de comandă este responsabil pentru salvarea interogărilor curente într-un fișier extern. Acest lucru este foarte convenabil, puteți reveni oricând la scrierea unei cereri complexe. Sau, de exemplu, stocați o listă de exemple tipice ale anumitor modele.

În stânga, în câmpul „Solicitare”, puteți crea cereri noi și le puteți salva într-o structură arborescentă. Al doilea grup de butoane este responsabil de gestionarea listei de solicitări. Folosind-o puteți crea, copia, șterge, muta o solicitare.

  • Executacerere– execuție simplă și rezultate
  • Executați pachetul– vă permite să vizualizați toate interogările intermediare într-un lot de interogări
  • Vizualizarea tabelelor temporare– vă permite să vedeți rezultatele pe care interogările temporare le returnează pe un tabel

Parametri de solicitare:

Vă permite să setați parametrii actuali pentru cerere.

În fereastra parametrilor de interogare, următoarele sunt interesante:

  • Buton Ia de la cerere găsește automat toți parametrii din cerere pentru confortul dezvoltatorului.
  • Pavilion Parametri comuni pentru toate cererile– la instalare, procesarea acestuia nu șterge parametrii la trecerea de la cerere la cerere în lista generală de solicitări.

Setați un parametru cu o listă de valori Este foarte simplu, doar când alegeți o valoare a parametrului, faceți clic pe butonul de ștergere a valorii (cruce), sistemul vă va solicita să selectați tipul de date, unde trebuie să selectați „Lista de valori”:

De asemenea, în panoul de sus există un buton pentru a apela setările consolei de interogare:

Aici puteți specifica parametrii pentru salvarea automată a interogărilor și parametrii de execuție a interogărilor.

Textul solicitării este introdus în câmpul de cerere de consolă. Acest lucru se poate face prin simpla tastare a unui test de interogare sau apelând un instrument special - designerul de interogări.

Constructorul cererii 1C 8 este apelat de la meniul contextual(butonul dreapta al mouse-ului) când faceți clic pe câmpul de introducere:

De asemenea, în acest meniu sunt și așa caracteristici utile, cum ar fi ștergerea sau adăugarea de întreruperi de linie (“|”) la cerere sau obținerea codului de solicitare în această formă convenabilă:

Solicitare = Solicitare nouă;
Solicitare.Text = ”
|SELECT
| Monede.Link
|DIN
| Director.Monede AS Monede”;
RequestResult = Request.Execute();

Câmpul inferior al consolei de interogări afișează câmpul rezultat al interogării, motiv pentru care a fost creată această procesare:



De asemenea, consola de interogări, pe lângă listă, poate afișa date sub formă de arbore - pentru interogările care conțin totaluri.

Optimizarea interogărilor

Unul dintre cele mai importante puncte în creșterea productivității întreprinderii 1C 8.3 este optimizarecereri. Acest punct este, de asemenea, foarte important când trecerea certificării. Mai jos vom vorbi despre motivele tipice pentru care nu performanță optimă interogări și metode de optimizare.

Selecții într-un tabel virtual folosind constructul WHERE

Este necesar să se aplice filtre la detaliile tabelului virtual numai prin parametrii VT. În niciun caz nu trebuie să utilizați constructul WHERE pentru selecție într-un tabel virtual, aceasta este o greșeală gravă din punct de vedere al optimizării. În cazul selecției folosind WHERE, de fapt, sistemul va primi TOATE înregistrările și abia apoi le va selecta pe cele necesare.

CORECT:

ALEGE

DIN
Registrul Acumulărilor Decontări reciproce cu Participanții Organizațiilor (.
,
Organization = &Organizare
AND Individ = &Individual) CUM Decontări reciproce cu participanții organizațiilor Solduri

GREŞIT:

ALEGE
Decontări reciproce cu Participanții Organizațiilor Solduri
DIN
Registrul Acumulărilor. Decontări reciproce cu Participanții Organizațiilor Solduri
UNDE
Decontari reciproce cu Participantii Organizatiilor Solduri Organizatie = & Organizatie
ȘI Decontări reciproce cu Participanții Organizațiilor Solduri Persoană fizică

Obținerea valorii unui câmp de tip complex folosind un punct

La primirea datelor de tip complex într-o interogare printr-un punct, sistemul se conectează cu o îmbinare la stânga exact atâtea tabele câte tipuri sunt posibile în domeniul tipului complex.

De exemplu, este extrem de nedorit ca optimizarea să acceseze câmpul de înregistrare a registrului – registrator. Registratorul are un tip de date compus, printre care se numără toate tipurile de documente posibile care pot scrie date în registru.

GREŞIT:

ALEGE
Record Set.Recorder.Date,
RecordSet.Quantity
DIN
ÎnregistrareAcumulări.ProduseOrganizații AS SetRecords

Adică, de fapt, o astfel de interogare va accesa nu un tabel, ci 22 de tabele de baze de date (acest registru are 21 de tipuri de registrator).

CORECT:

ALEGE
ALEGERE
WHEN ProductsOrg.Registrar LINK Document.Vânzări de produse și servicii
THEN EXPRESS(ProductsOrg.Registrar AS Document.Vânzări de bunuriServicii).Data
WHEN GoodsOrg.Registrar LINK Document.Receipt of GoodsServices
APOI EXPRESS(GoodsOrg.Registrar AS Document.Reception of GoodsServices).Data
SFÂRȘIT CA DATA,
ProduseOrg.Cantitate
DIN
ÎnregistrareAcumulări.ProduseOrganizații AS ProductsOrganization

Sau a doua opțiune este să adăugați astfel de informații la detalii, de exemplu, în cazul nostru, adăugarea unei date.

CORECT:

ALEGE
ProductsOrganizations.Date,
ProduseOrganizaţii.Cantitate
DIN
Registrul Acumulărilor Bunuri ale Organizațiilor AS Bunuri ale Organizațiilor

Subinterogări într-o condiție de alăturare

Pentru optimizare, este inacceptabil să folosiți subinterogări în condiții de unire, acest lucru încetinește semnificativ interogarea. Este recomandabil să folosiți VT în astfel de cazuri. Pentru a vă conecta, trebuie să utilizați doar metadate și obiecte VT, indexându-le anterior după câmpurile de conexiune.

GREŞIT:

ALEGE…

LEFT JOIN (
SELECTAȚI FROM RegisterInformation.Limits
UNDE…
GRUPA DE...
) PRIN…

CORECT:

ALEGE…
PUT Limite
DIN Registrul de informații.Limite
UNDE…
GRUPA DE...
INDEX PRIN...;

ALEGE…
DIN Vânzări de bunuri și servicii
Limite LEFT JOIN
PRIN …;

Unirea înregistrărilor cu mese virtuale

Există situații când, la conectarea unei mese virtuale la altele, sistemul nu funcționează optim. În acest caz, pentru a optimiza performanța interogării, puteți încerca să plasați tabelul virtual într-unul temporar, fără a uita să indexați câmpurile unite în interogarea tabelului temporar. Acest lucru se datorează faptului că VT-urile sunt adesea conținute în mai multe tabele DBMS fizice, ca urmare, este compilată o subinterogare pentru a le selecta, iar problema se dovedește a fi similară cu punctul anterior;

Utilizarea selecțiilor bazate pe câmpuri neindexate

Una dintre cele mai frecvente greșeli atunci când scrieți interogări este utilizarea condițiilor pe câmpuri neindexate, acest lucru contrazice regulile de optimizare a interogărilor. SGBD nu poate executa o interogare optim dacă interogarea include selecția pe câmpuri neindexabile. Dacă luați un tabel temporar, trebuie să indexați și câmpurile de conexiune.

Trebuie să existe un index adecvat pentru fiecare condiție. Un indice adecvat este acela care îndeplinește următoarele cerințe:

  1. Indexul conține toate câmpurile enumerate în condiție.
  2. Aceste câmpuri se află chiar la începutul indexului.
  3. Aceste selecții sunt consecutive, adică valorile care nu sunt implicate în condiția de interogare nu sunt „pănate” între ele.

Dacă DBMS nu selectează indecșii corecti, întregul tabel va fi scanat - acest lucru va avea un impact foarte negativ asupra performanței și poate duce la blocarea prelungită a întregului set de înregistrări.

Utilizarea SAU logic în condiții

Asta e tot, acest articol a acoperit aspectele de bază ale optimizării interogărilor pe care fiecare expert 1C ar trebui să le cunoască.

Un curs video gratuit foarte util despre dezvoltarea și optimizarea interogărilor, Recomand cu incredere pentru incepatori si nu numai!

Platforma generează tabele virtuale Solduri, Cifra de afaceri și Solduri și Cifra de afaceri; numai pentru cifra de afaceri curentă:
Tabelele virtuale nu există fizic în baza de date, acestea sunt generate la nivel de platformă pentru a crește viteza și comoditatea accesului dezvoltatorului la date.

Înainte de a construi tabele virtuale, datele pot fi selectate prin parametri. Setul de parametri este diferit pentru diferite tabele. Pentru tabelul de sold, aceasta este perioada de sold și o condiție arbitrară:

Pentru tabelul Cifra de afaceri, perioada este împărțită în două (început și sfârșit), iar setarea Periodicitate este adăugată:

Pentru tabelul de solduri și cifra de afaceri, se adaugă setarea Metodă de adunare:

Să aruncăm o privire mai atentă la toți acești parametri.

  • Parametru Perioada (Începutul perioadei, Sfârșitul perioadei) poate lua valori de tipul Data:

precum și tipurile Moment în timp și Graniță:

Este important ca, dacă utilizați tipul Date sau Moment in Time (combinații de Date și Link), a doua oară, specificată în câmpul de selecție, nu este luată în considerare la selecția datelor! Este deja „în afara” lui, eșantionul este construit înainte/după un moment dat.

În cazul utilizării tipului Boundary, această nuanță este personalizabilă, deoarece puteți specifica tipul de chenar: afișați datele incluzând sau excluzând secunda specificată:

  • Parametrul Frecvență- vă permite să determinați perioada la care vor fi date înregistrările. De exemplu, dacă frecvența este An, atunci toate înregistrările vor fi afișate începând cu 01 ianuarie.

Opțiunea Frecvență automată este deosebit de interesantă, vă permite să aduceți date în mai multe perioade într-o singură solicitare. În designerul de interogări, toate opțiunile de perioadă devin disponibile, le puteți selecta pe cele de care aveți nevoie:

Rezultat:

  • Metoda de adăugare a parametrilor- determină dacă se construiește o cerere numai pe baza mișcărilor pentru perioada (opțiunea de mișcare) sau se ia în considerare solduri de deschidere(Opțiune de mișcare și limite de perioadă). Ieșirea este excelentă în următoarele: dacă, de exemplu, conform nomenclatorului au existat solduri la început, dar nu au existat cifre de afaceri pentru perioada, atunci în cazul Mișcărilor nu va fi inclusă în eșantion; în cazul Mișcării și limitelor perioadei – va scădea cu cifra de afaceri zero
  • Condiția parametrului- vă permite să impuneți o condiție arbitrară asupra măsurării registrului:

Întrebarea 07.46 a examenului 1C: Platform Professional. Când definiți opțiunea de frecvență „Auto” în tabelul virtual „Solduri și cifre de afaceri”:

  1. sistemul va selecta automat frecvența de primire a rotațiilor pe baza regulii: astfel încât rezultatul să fie de cel puțin 3 valori de perioadă, dar nu mai mult de 12
  2. sistemul va selecta automat frecvența de primire a rotațiilor pe baza regulii: astfel încât rezultatul să fie de cel puțin 5 valori de perioadă, dar nu mai mult de 10
  3. în câmpurile de selecție a interogării, dezvoltatorul va putea selecta câmpuri de perioadă cu o frecvență diferită

Răspunsul corect este al treilea, analiza de mai sus.

Registre de acumulareîn sistemul 1C:Enterprise se împart în două tipuri: registre de acumulare resturişi registrele de acumulare rpm.

Tipul de registru este selectat la crearea acestuia în configurator

După cum sugerează și numele, unele sunt menite să obțină solduri de la o anumită dată, iar al doilea sunt menite să obțină cifra de afaceri pentru o perioadă selectată. În funcție de tipul de registru de acumulare, platforma 1C:Enterprise generează un set diferit de tabele virtuale. În acest articol ne vom uita la lucrul cu tabele virtuale de registre de acumulare. Pentru a face acest lucru, vom crea un registru pentru acumularea soldurilor - ProduseRămășiși registrul de acumulare a revoluției - Produse Cifra de afaceri.

Acum să ne uităm la ce tabele virtuale oferă platforma pentru fiecare dintre aceste registre.

Registrul de acumulare a revoluției

Pentru claritate, să deschidem și să vedem ce tabele sunt disponibile pentru registru Produse Cifra de afaceri. Acesta este tabelul registrului în sine - Produse Cifra de afaceri, care există fizic în baza de date și un tabel virtual - ProduseCifra de afaceri.Cifra de afaceri

Cu tabelul standard totul este clar. Să aruncăm o privire mai atentă la cea virtuală.

Cifra de afaceri la masa virtuală

Acest tabel vă permite să obțineți cifra de afaceri a resurselor din punct de vedere al dimensiunilor. În cazul nostru avem două dimensiuni: DepozitŞi Produs. Și o resursă - Cantitate

Lăsați registrul nostru să aibă următoarele intrări

Să revenim la designerul de interogări și să începem prin a selecta pur și simplu din tabel ProduseCifra de afaceri.Cifra de afaceri toate domeniile

În consecință, cererea va arăta astfel:

SELECT ProductsTurnoverTurnover.Warehouse, ProductsTurnoverTurnover.Product, ProductsTurnoverTurnover.QuantityTurnover FROM RegisterAcumulare.ProductsTurnover.Turnover(,) AS ProductsTurnoverTurnover

Rezultatul interogării arată astfel:

Adică am primit cifră de afaceri din punct de vedere al mărfurilor și al depozitelor pentru tot timpul. Sa presupunem ca nu ne intereseaza depozitele si vrem sa obtinem cifra de afaceri doar la marfa.

Pentru a face acest lucru, excludem dimensiunea din cerere Depozit

SELECT ProductsTurnoverTurnover.Product, ProductTurnoverTurnover.QuantityTurnover FROM RegisterAcumulation.ProductsTurnover.Turnover(,) AS ProductsTurnoverTurnover

și ca urmare ne vom mai avea doar două rânduri

Dar, de regulă, nu este nevoie să se încaseze cifra de afaceri pe întreaga existență a registrului. Practic, sunt necesare pentru o anumită perioadă: lună, trimestru, an etc. În plus, de obicei sunt necesare selecții după dimensiuni (Produs, Depozit). Acest lucru se realizează folosind parametrii tabelului virtual. Este convenabil să completați parametrii din constructor. Prin buton Opțiuni de masă virtuală Se deschide o casetă de dialog în care puteți introduce tot ce avem nevoie:

După aceasta, cererea noastră inițială va lua următoarea formă

SELECT BunuriTurnoverTurnover.Warehouse, BunsTurnoverTurnover.Product, GoodsTurnoverTurnover.QuantityTurnover FROM RegisterAcumulation.GoodsTurnover.Turnover(&Începutul perioadei, &Sfârșitul perioadei, Depozit = &Depozit) AST BunuriTurnover

După cum putem vedea, diferența este că în paranteze după numele tabelului virtual există parametri care trebuie completați înainte de a executa interogarea.

Cei care abia încep să lucreze cu tabele virtuale sunt adesea tentați să seteze selecția în mod obișnuit, în loc să folosească parametrii:

FROM RegisterAccumulations.ProductsTurnover.Turnover(,) CUM ProductsTurnoverTurnover WHERE ProductsTurnoverTurnover.Warehouse = &Depozit

La completarea parametrilor pe care i-am omis Periodicitate. Să deschidem lista și să alegem din multitudinea de opțiuni posibile Lună. Vom elimina toți ceilalți parametri pentru a nu ne confunda.

După aceasta, observăm că în câmpurile tabelului apare un câmp Perioadă.

Adăugând-o la câmpurile selectate, obținem următorul text de solicitare:

SELECT ProductsTurnoverTurnover.Perioada, ProductsTurnoverTurnover.Warehouse, ProductsTurnoverTurnover.Product, ProductsTurnoverTurnover.QuantityTurnover FROM RegisterAcumulation.ProductsTurnover.Turnover(, Month,) AST Produsturnover

Executam cererea:

Astfel, în intervalul de timp selectat, putem împărți rotațiile în intervale mai mici în conformitate cu frecvența selectată.

Registrul de acumulare a soldului

La fel ca în cazul registrului invers, să vedem în designerul de interogări ce tabele virtuale sunt disponibile pentru registrul de acumulare a soldului

După cum puteți vedea, trei tabele virtuale sunt disponibile pentru registrul de acumulare a soldului: Revoluții, Resturile, Rămășițe și cifre de afaceri. Să luăm în considerare fiecare dintre ele separat.

Cifra de afaceri la masa virtuală

În ciuda faptului că tipul de registru este Resturile, putem primi totuși cifra de afaceri de la aceasta. În plus, avem două resurse suplimentare aici: VenireŞi Consum

Vă reamintesc că atunci când se face o înscriere în registrul de sold, este indicat tipul de mișcare de acumulare (venit sau cheltuială), în timp ce pentru registrul cifrei de afaceri nu este indicat tipul de mișcare. Prin urmare, aici avem un bonus suplimentar sub forma oportunității de a primi nu numai cifra de afaceri totală a perioadei, ci și venituri și cheltuieli separat. Dar, desigur, dacă metadatele conțin un registru invers cu un set similar de măsurători, atunci este mai bine să le folosiți pentru a obține cifra de afaceri. În general, lucrul cu acest tabel virtual este similar cu lucrul cu un tabel virtual Revoluții registrul negociabil discutat mai sus.

Solduri de masă virtuală

Acest tabel este utilizat pentru a obține soldurile de resurse pe dimensiune. În parametrii tabelului putem specifica data pentru care primim solduri și setăm selecții:

Să ne uităm la un mic exemplu. Avem următoarele înregistrări în registru:

Să selectăm toate câmpurile disponibile și să setăm sfârșitul lunii iunie ca dată pentru primirea soldurilor. Nu vom stabili selecția pe baza măsurătorilor. Apoi textul cererii va arăta astfel:

SELECT ProductsRemainingsRemainings.Warehouse, ProductsRemainingsRemainings.Product, ProductsRemainingsRemainings.QuantityRemaining FROM RegisterAcumulations.ProductsRemainings.Remainings(&DateRemainings,) AS ProductsRemainingRemainings

Și după ce o executăm obținem acest rezultat

Solduri și cifre de afaceri la masa virtuală

Acest tabel le combină pe cele două discutate anterior și vă permite să obțineți cifra de afaceri pentru perioada de timp selectată, precum și solduri la începutul și sfârșitul perioadei. De asemenea, puteți seta selecția.

Utilizarea acestui tabel poate fi justificată atunci când trebuie să obțineți simultan atât cifra de afaceri, cât și soldurile la începutul și sfârșitul perioadei într-un singur raport. În alte cazuri, nu ar trebui să abuzați de utilizarea sa.

Să creăm un raport cu un set de date de interogare:

SELECTARE PRODUSE ÎN DEPOZITE Rămas. Depozit, MărfuriÎnDepoziteRămăși. Nomenclator, produse în depozite rămase. CantitateBalance DIN Registrul de acumulare. ProductsInWarehouses. Rămășițe(&MyDate ,) AS ProductsInWarehousesRemains

Acum să mergem la fila parametri și să vedem că sistemul, pe lângă parametrul nostru &MyDate, a creat și parametrul &Period.
Pentru a monitoriza vizual perioadele, vom crea un formular de raport principal și vom plasa un câmp de tabel cu date pe el: Setări Composer.Settings.DataParameters

Să salvăm raportul și să-l deschidem în întreprindere. În câmpul tabel cu parametri, este afișat doar parametrul &Period:

În consecință, orice modificare a acestui parametru nu va da rezultatul dorit.

De ce parametrul &MyDate nu este disponibil? Desigur, pentru că în fila de parametri are bifată o casetă de selectare Limitare de disponibilitate.

Debifați caseta. Acum le vedem pe ambele în parametrii disponibili. Numai la generarea raportului vom vedea că raportul reacționează la parametrul &Period, și nu la &MyDate.

În acest exemplu, cel mai simplu lucru de făcut este să redenumiți parametrul &MyDate în &Period în cerere și să obțineți rezultatul dorit. Dar poate aveți o interogare în care parametrul &Period a fost deja folosit, sau opiniile dumneavoastră religioase nu vă permit să utilizați acest parametru, în orice caz, puteți rezolva problema astfel:

SELECTARE PRODUSE ÎN DEPOZITE Rămas. Depozit, MărfuriÎnDepoziteRămăși. Nomenclator, produse în depozite rămase. CantitateBalance DIN Registrul de acumulare. ProductsInWarehouses. Rămășițe((&MyDate) ,) AS ProductsInWarehousesRemains

UPD de la utilizator Boo:

Principala problemă când se utilizează parametri „standard” (adăugați de sistem) este că atunci când se utilizează mai multe tabele virtuale într-un raport, dacă acest parametru este definit, valoarea lui va fi folosită în toate celelalte cazuri în locul celor „proprii”.

Să vă dau un exemplu:

SELECT EmployeesSP.Employee, WorkersSP.ReasonChangesConditions, WorkersSP.Period, WorkersSPAnotherDate.Period AS Period2, WorkersSPAnotherDate.ReasonChangesStates AS ReasonChangesState2 FROM RegisterInformation.EmployeesLast,&Period SP CONEXIUNEA STÂNGA Register of Information.Employees of Organizations.Slice of the Latest(&OtherDate ,) AS EmployeesSPAnotherDate BY EmployeesSP.Employee = EmployeesSPAnotherDate.Employee

În a doua subinterogare, valoarea parametrului „standard” PERIOD va fi utilizată ca parametru pentru data secțiunii, mai degrabă decât valoarea OtherDate.

Această „glitch” va fi observată chiar dacă a doua subinterogare este scoasă la al doilea set de date și conectată folosind ACS. Opțiunea care folosește în a doua cerere o expresie de genul „ADDATE(&Period, MONTH, -1)” nu va funcționa, de asemenea, luna nu va fi scăzută. Dar redenumirea parametrului „Perioada” din cerere la, de exemplu, „FirstDate” rezolvă această problemă.

Apropo, exact aceeași problemă se observă cu tabele virtuale de acumulare și registre contabile, folosite pentru a obține, de exemplu, cifra de afaceri. Acolo sistemul adaugă parametrii „Începutul perioadei” și „Sfârșitul perioadei”.
Deci, în cazul interogărilor cu o complexitate chiar ușor crescută, este logic să dezactivați disponibilitatea și utilizarea „perioadelor standard”.