1s 8.3 Perioada de raportare ACS. Parametru standard & Perioada și probleme în utilizare

Când creați rapoarte pe un sistem de control al accesului, este adesea nevoie să afișați o selecție a perioadei pe formularul de raport, astfel încât să nu fie nevoie să introduceți datele manual, ci să selectați dintr-o listă de perioade standard, cum ar fi: „Anul” , „Lună”, „Săptămână”, etc. Pentru parametrii de tip Data, puteți specifica doar „Începutul acestui an, luna, etc.”, dar „Sfârșitul” nu este furnizat.

Chestia este că, dintre tipurile de date, este disponibil doar tipul „Data de început standard”, dar vreau și „Data de încheiere standard”.

Există o modalitate de a ocoli asta.

  1. Să creăm un nou parametru, numim „Perioadă”
  2. Setați acest parametru la tipul „Perioada standard”
  3. În câmpul „Expresie” al parametrilor „Începutul perioadei” și „Sfârșitul perioadei”, care sunt utilizați în cerere, setați expresiile „ &Period.StartDate" și " &Period.Data de încheiere” respectiv.

Dar există o ușoară subtilitate. Dacă folosim tabele virtuale în interogare, atunci cel mai probabil raportul nu va mai funcționa și va fi afișat un mesaj de eroare precum „Eroare la procesarea vizualizării, nepotrivirea tipului, numărul parametrului...”.

Pentru a evita acest lucru, trebuie să eliminați toți parametrii tabelului virtual.

Și adăugați-le în tabelele din fila „Compoziția datelor”.

Pentru ca parametrii să fie afișați în setările raportului rapid, să activăm marcajul corespunzător pentru parametrii raportului.

Acum, selecția perioadei de pe formularul de raport arată astfel.

Câteva caracteristici de setare a perioadei în sistemul de control acces.

Majoritatea rapoartelor care sunt dezvoltate folosind un sistem de compoziție a datelor (DCS) solicită utilizatorului să introducă perioada pentru care va fi creat raportul.

De regulă, în ACS, intrarea perioadei este organizată prin parametri, folosind următoarea construcție, a se vedea. Această metodă de introducere a perioadei este considerată „clasică”; este descrisă într-un articol despre ITS și altă literatură dedicată dezvoltării în 1C, deci hai sa o luam ca baza. Să luăm ca exemplu o cerere simplă care primește toate documentele Vânzări de Bunuri și Servicii pentru o anumită perioadă, vezi

Când folosește acest raport, utilizatorul setează perioada prin parametri, vezi.Totul pare să fie corect...,DAR există o mică problemă:

Chestia este că marea majoritate a utilizatorilor „înțeleg” perioada altfel decât „înțelege” 1C, exemple:

Din punctul de vedere al utilizatorului, nu este specificată perioada, adică NELIMITAT, adică TOATE documentele fără restricții de dată ar trebui incluse în raport.

„Din punctul de vedere” al sistemului 1C, parametrul-perioada este setat și... ambele limite ale acestuia sunt egale cu 01.01.0001 și în raport vor fi incluse doar documentele cu data goală, ceea ce în practică înseamnă nu va fi inclus un singur document.

Din punctul de vedere al utilizatorului, raportul trebuie să cuprindă toate documentele începând cu data de 28.01.2010.

„Din punct de vedere” al 1C, perioada 28/01/2010 - 01/01/0001 va face excepție.

Puteți, desigur, să încercați să explicați utilizatorului de ce raportul nu afișează documentele pe care se așteaptă să le vadă și cum este prezentată perioada din „punctul de vedere” al 1C, dar aceasta este o sarcină ingrată și este este de asemenea greșit. Un program bun ar trebui, în primul rând, să fie ușor de utilizat, deoarece programul există pentru utilizator, și nu invers, de aceea va trebui să „învățați” 1C să înțeleagă perioada așa cum o înțelege utilizatorul, și anume:

1). Începutul perioadei și Sfârșitul perioadei nu sunt specificate -> toate documentele.

2). Se specifica doar Inceputul Perioadei -> toate documentele incepand de la Inceputul Perioadei

3). În plus, vom verifica că Sfârșitul perioadei >= Începutul perioadei, iar dacă acest lucru nu este adevărat, atunci vom presupune că Sfârșitul perioadei nu este specificat, adică. 2).

Pe baza celor de mai sus, expresia pentru parametrul Data de încheiere este:

WHEN &Period.EndDate=DATETIME(1,1,1)

APOI DATETIME(3999,12,31)

WHEN &Period.Data de încheiere<&Период.ДатаНачала

APOI DATETIME(3999,12,31) DATETIME(3999,12,31,23,59,59)

&Perioada.Data de încheiere

Forma finală a designului nostru de selecție a perioadei este afișată în

Notă: acest mecanism de setare a parametrilor este destinat platformelor mai vechi 1C 8.1 și 8.2 (și configurațiilor care rulează sub controlul acestora); versiunile mai vechi ale platformei 1C au mecanisme încorporate pentru controlul parametrilor gol și nu este nevoie să recurgeți la mecanism descrise în acest articol, în plus Pe unele versiuni ale platformei 1C sunt posibile erori și funcționare incorectă.

Deci, să începem.

Pentru simplitate, înțelegerea exemplului, vom construi pe un registru de acumulare circulant simplu.

În cazul meu, acesta este registrul de acumulare „Contabilitatea lucrărilor în curs”.

De exemplu, vom indica parametrii săi în mod rigid (nu prin impunerea ușoară a parametrilor asupra sistemului de control al accesului):

Vă rugăm să rețineți că frecvența tabelului virtual este „Înregistrare”.

Dar, după cum am menționat mai sus, avem nevoie de perioada din punct de vedere al periodicității, așa că îmi propun să calculăm câmpul „Perioadă” în felul următor (nu foarte frumos, dar nu am văzut opțiuni mai bune):

După cum se poate vedea din captură de ecran, la cerere este transmis un parametru, pe care utilizatorul îl specifică pe formular: Valoarea enumerației „Frecvență” - această enumerare se găsește în aproape toate soluțiile standard.

Vom indica tipurile disponibile în fila „Parametri”:

Cu această setare ne formatăm menstruația astfel încât totul să fie frumos și plăcut ochiului)

Iată formatele în sine:

Luna: DF="MMMM aaaa "a."

Zi: DF = zz.LL.aaaa

Săptămâna: DF = „„Săptămâna de la „zz.LL.aaaa”

Trimestru: DF = „la „sfert” aaaa „y.”

An: DF = "aaaa "y."

Deceniu: DF = ""Deceniu cu "zz.LL.aaaa"

Semăn de an: DF = „„Jumătate de an de la” zz.LL.aaaa”

Asta e tot. Ieșirea este o imagine minunată:

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 răspunde 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”.

Hai sa-ti dau un exemplu:

SELECTE EmployeesSP.Employee, WorkersSP.ReasonChangesConditions, WorkersSP.Period, WorkersSPAnotherDate.Period AS Period2, WorkersSPAnotherDate.ReasonChangesStates AS ReasonChangesCondition2 FROM RegisterInformation.EmployeesLast,Angajații &Angajați.AS.Period este JV 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 PERIOD „standard” va fi utilizată ca parametru al datei 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 o expresie precum „ADDATE(&Period, MONTH, -1)” în a doua solicitare, de asemenea, nu va funcționa, 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 solicitărilor de complexitate chiar ușor crescută, este logic să dezactivați disponibilitatea și utilizarea „perioadelor standard”.

Acest articol discută unele dintre caracteristicile configurarii unei perioade atunci când se utilizează un sistem de compunere a datelor (DCS), probleme care apar din cauza diferențelor în conceptul de perioadă dintre un utilizator obișnuit și sistemul 1C și, de asemenea, sugerează modalități de rezolvare a acestora .
Majoritatea rapoartelor care sunt dezvoltate folosind un sistem de compoziție a datelor (DCS) solicită utilizatorului să introducă perioada pentru care va fi creat raportul. De regulă, în ACS, intrarea perioadei este organizată prin parametri, folosind următoarea construcție, vezi. Fig.1 Această metodă de intrare într-o perioadă este considerată „clasică”; este descrisă într-un articol despre ITS și altă literatură dedicată dezvoltării în 1C, așa că să o luăm ca bază. Să luăm ca exemplu o cerere simplă care primește toate documentele Vânzări de Bunuri și Servicii pentru o anumită perioadă, vezi Fig.2 Când folosește acest raport, utilizatorul setează perioada prin intermediul parametrilor, vezi. Fig.3 Totul pare să fie corect... DAR există o mică problemă:

Chestia este că marea majoritate a utilizatorilor „înțeleg” perioada altfel decât „înțelege” 1C, exemple:
1). Sa luam in considerare Fig.3
Din punctul de vedere al utilizatorului, nu este specificată perioada, adică NELIMITAT, adică TOATE documentele fără restricții de dată ar trebui incluse în raport.
„Din punctul de vedere” al sistemului 1C, parametrul-perioada este setat și... ambele limite ale acestuia sunt egale cu 01.01.0001 și în raport vor fi incluse doar documentele cu data goală, ceea ce în practică înseamnă nu va fi inclus un singur document.
2). Sa luam in considerare Fig.4
Din punctul de vedere al utilizatorului, raportul trebuie să cuprindă toate documentele începând cu data de 28.01.2010.
„Din punct de vedere” al 1C, perioada 28/01/2010 – 01/01/0001 va face excepție.

Puteți, desigur, să încercați să explicați utilizatorului de ce raportul nu afișează documentele pe care se așteaptă să le vadă și cum este prezentată perioada din „punctul de vedere” al 1C, dar aceasta este o sarcină ingrată și este este de asemenea greșit. Un program bun ar trebui, în primul rând, să fie ușor de utilizat, deoarece programul există pentru utilizator, și nu invers, de aceea va trebui să „învățați” 1C să înțeleagă perioada așa cum o înțelege utilizatorul, și anume:
1). Începutul perioadei și Sfârșitul perioadei nu sunt specificate -> toate documentele.
2). Este specificat doar Începutul Perioadei –> toate documentele începând de la Începutul Perioadei
3). În plus, vom verifica că Sfârșitul perioadei >= Începutul perioadei, iar dacă acest lucru nu este adevărat, atunci vom presupune că Sfârșitul perioadei nu este specificat, adică. 2).
Pe baza celor de mai sus, expresia pentru parametrul Data de încheiere va arăta astfel:

SELECTAȚI WHEN &Period.EndDate=DATETIME(1,1,1) THEN DATETIME(3999,12,31,23,59,59) ELSE SELECT WHEN &Period.EndDate<&Период.ДатаНачала ТОГДА ДАТАВРЕМЯ(3999,12,31,23,59,59) ИНАЧЕ &Период.ДатаОкончания КОНЕЦ КОНЕЦ

Forma finală a designului nostru de selecție a perioadei este afișată în Fig.5