Introducere

Formulare gestionate. O nouă dezvoltare 1C concepută pentru a ușura munca dezvoltatorului, oferindu-i mai mult timp pentru a scrie cod prin simplificarea designului interfeței. De fapt, adesea se dovedește că așa-numitul. „formele controlate” sunt complet incontrolabile. UV-urile nu pot face lucruri atât de banale precum minimizarea/maximizarea unei ferestre, ca să nu mai vorbim de poziționarea acesteia pe ecran și setarea dimensiunii sale în pixeli. Poate că aceste funcții au fost considerate nerevendicate și nu au fost incluse în noua interfață, dar practica arată că uneori lipsesc foarte mult. De ceva timp problema a fost parțial rezolvată de WSH, dar îmi doream ceva mai mult. Așa a fost implementat componentă externă pentru a face „formularele gestionate” puțin mai ușor de gestionat.

Ce? Unde? Când?

Acest VK este o bibliotecă de funcții pentru controlul stării și poziției ferestrelor. Biblioteca conține, de asemenea, câteva funcții utile de sistem.

Controlul stării ferestrei:

Extinde ( HeaderWindow ) extinde fereastra la ecran complet

Restrângeți (Titul ferestrei) - minimizează fereastra din bara de activități

Ascunde (Titul ferestrei) - ascunde fereastra (în timp ce codul formularului continuă să fie executat)

Arată () - arată cele mai recente ascuns de funcție fereastra hide().

CollapseWindow (WindowTitle) - în restabilește starea inițială a ferestrei

TRUE Vizibility (WindowTitle) - p verifică dacă fereastra este vizibilă pe ecran

TRUE extins (WindowTitle) - verifică dacă fereastra este maximizată la ecran complet

TRUE restrâns (WindowTitle) - verifică dacă fereastra este minimizată în bara de activități

Setați Transparența(Titlu fereastră, Coeficient) - setează transparența ferestrei. Gradul de transparență este stabilit folosind un coeficient (0-255).

Controlul poziției ferestrei:

GetPosition(Titlul ferestrei, X, Y) - Obține coordonatele colțului din stânga sus al ferestrei în raport cu ecranul. Coordonatele sunt returnate prin intermediul parametrilorX,Y.

Mişcare(Titlul ferestrei, X, Y) - mută fereastra într-o poziție specificatăXY.În acest caz XYsunt coordonatele colțului din stânga sus al ferestrei.

Obțineți dimensiuni- obține dimensiunile ferestrei în pixeli. Valorile sunt returnate prin parametrii corespunzători.

Setați dimensiuni(Titul ferestrei, lățimea, înălțimea) - setează dimensiunea ferestrei în pixeli.

Functiile sistemului:

GetCurrentPermission(Horz, Vert) - obține rezoluția curentă a ecranului. Valorile sunt returnate prin parametrii corespunzători.

GetPermissionList() - primește o listă de rezoluții de ecran disponibile în sistem. Datele sunt returnate sub forma „RESOL.1, RESOL.2, RESOL.3...”. În procesarea demonstrativă există un exemplu de generare a unei liste de permisiuni pe un formular.

SetPermission(SelectedScreenResolution) - setează rezoluția ecranului. Numărul de serie al permisiunii este specificat ca parametru. Procesarea demonstrativă arată un exemplu de setare a unei rezoluții dintr-o listă generată anterior.

Bonusuri:

Somn (timpul de somn) dormi().Timpul de somn este indicat în milisecunde.

Semnal (frecvență, durată) - implementarea functiei clasicebip().Vă permite să setați frecvența și durata sunetului.

Total

Biblioteca a fost scrisă pentru propriile noastre nevoi și probabil va fi dezvoltată în continuare, după cum va fi nevoie. Dacă cineva are o idee strălucitoare de a-și extinde funcționalitatea în domeniul pentru care a fost conceput, atunci scrie-ți dorințele. Dacă ideile se dovedesc a merita, ele vor fi implementate.

Setul de livrare include: O bază cu un VC conectat sub forma unui aspect general și procesare demonstrativă. VK în arhiva zip.

Implementat în versiunea 8.3.7.1759.

Pentru a clarifica despre ce vorbim în acest articol, este necesar să facem o mică explicație.

O caracteristică a formularelor gestionate este că dezvoltatorul nu creează aspect forme direct. Dezvoltatorul creează doar o descriere a formularului folosind anumite reguli logice. Pe baza acestor reguli, platforma generează independent o reprezentare vizuală a formularului. Mai mult, această reprezentare vizuală depinde de dimensiunea ferestrei în care este afișat formularul. Aceeași formă afișată într-o fereastră îngustă sau într-o fereastră extinsă la ecran complet va avea un aspect vizual diferit.

Deci, acea parte a platformei care formează reprezentarea vizuală a formei se numește mecanism de plasare a elementelor în formă.

De ce a fost nevoie de un nou mecanism?

În primul rând, mecanismul anterior, din păcate, a avut deficiențe. Cea mai semnificativă dintre acestea a fost că multe modificări ale proprietăților elementelor de formular efectuate pe client au necesitat un apel către server. Și orice acces la server duce la încetinire.

În al doilea rând, am evaluat experiența utilizării formularelor gestionate și am descoperit o serie de nevoi critice care trebuiau abordate.

Și în al treilea rând, am vrut să construim în noul mecanism oportunități de dezvoltare viitoare.

Schimbări majore

Funcționarea mecanismului anterior poate fi reprezentată schematic după cum urmează:

Dezvoltatorul creează un arbore de elemente de formular în configurator și stabilește proprietățile elementelor. În momentul în care soluția aplicației trebuie să arate formularul utilizatorului, se întâmplă următoarele. În primul rând, pe server, platforma creează descrierea formei vizuale. Apoi această descriere este transmisă clientului. Și asupra clientului vizualizator formează imaginea pe care o va vedea utilizatorul.

Acțiunea principală care a fost efectuată pe server la crearea unei descrieri a formei vizuale a fost calcularea lungimii liniilor. Aceasta se referă la tot felul de titluri, inscripții și așa mai departe. Cunoscând lungimile liniilor, puteți calcula deja aranjarea elementelor din formular.

Din moment ce această operațiune a fost efectuată pe server, au existat două aspecte negative. În primul rând, pentru calcul am folosit nu fonturile care vor fi folosite pe client, ci cele instalate pe server. Și pot diferi, mai ales când vine vorba de platforme diferite (Windows, Linux). Sau chiar și fonturile necesare nu pot fi instalate deloc pe server. În al doilea rând, pentru a calcula lungimile, am folosit motorul de rasterizare a fonturilor care se află pe server. Și poate să nu funcționeze exact ca mecanismul de redare a șirurilor de text care există pe client într-un browser de internet, de exemplu. Ca urmare, formele ar putea apărea fie cu texte „trunchiate”, fie, dimpotrivă, cu inscripții prea largi.

O altă problemă a fost că nu a existat nicio adaptare la dimensiunea ferestrei în care formularul va fi afișat clientului. De fapt, pe server, descrierea formularului a fost creată pe baza dimensiunii minime posibile a ferestrei, iar succesul suplimentar al afișajului său depindea de cât de bine „se poate” întinde.

În noul mecanism, am împărțit generarea unei descrieri a unei forme vizuale, care anterior a fost realizată în întregime pe server, în două părți, server și client:

Partea de server a devenit semnificativ mai mică. Nu efectuează niciun calcul. Pe server este creată doar o descriere „goldă”, care nu conține lungimile exacte ale câmpurilor de text, iar elementele de adaptabilitate nu sunt permise în ea. Serverul se ocupă de vizibilitatea elementelor, dar numai de cea care este determinată de opțiunile funcționale și cea care este setată de utilizator. Dar aici este imposibil să faci altfel, deoarece opțiunile funcționale în sine sunt disponibile numai pe server. Și schimbarea interactivă a setărilor de către utilizator va duce în orice caz la un apel pe server.

Rezultatul este un fel de „produs semifabricat” al unei reprezentări vizuale a formei, care este transferată clientului.

Modificările necesare la descrierea formei vizuale se fac pe client. Se calculează lungimile liniilor, se calculează elementele de răspuns legate de dimensiunea afișajului clientului și se calculează vizibilitatea. După aceasta, ca și înainte, vizualizatorul începe să funcționeze, ceea ce creează forma finală pe care o vede clientul.

Datorită faptului că calculul lungimii șirurilor se efectuează pe client, am reușit să scăpăm de „golurile” inutile și neglijente dintre elemente. Și realizarea vizibilității pe client fără accesarea serverului a făcut posibilă accelerarea procesului de lucru a formularelor. Deoarece activarea/dezactivarea vizibilității elementelor de formular este una dintre cele mai comune operațiuni.

Câteva caracteristici noi

Elemente de interfață receptive

Noul mecanism de plasare a elementelor pe formular nu numai că îmbunătățește capabilitățile care erau disponibile înainte, dar adaugă și noi capabilități. De exemplu, adaptează aspectul formularului la dimensiunea afișajului clientului. Există mai multe moduri de a face acest lucru.

În primul rând, se realizează împachetarea automată a liniilor, ajustând înălțimea titlurilor și decorațiunilor. Puteți vedea cum funcționează acest lucru în figură:

Dacă există linii lungi în formă care pot fi împărțite în cuvinte individuale, atunci astfel de linii sunt împachetate dacă este necesar. În consecință, înălțimea formei crește, deoarece partea sa inferioară „se mișcă” în jos. Ca rezultat, forma va arăta normal chiar și pe ecrane înguste. Mai mult, acest mecanism funcționează dinamic, ceea ce înseamnă că puteți comprima formularul modul real

timp, iar rândurile lungi vor fi împachetate împreună cu aceasta. Împachetarea automată funcționează pentru titlurile elementelor, titlurile grupurilor, decorațiunile de text și textul în butoane care arată ca.

Hyperlink Al doilea element de adaptabilitate este schimbarea orientării grupurilor. Grupurile și forma în ansamblu au dobândit noua optiune Pe orizontală dacă este posibil" În această opțiune, dacă afișajul client permite poziționarea orizontală a elementelor, acestea sunt poziționate orizontal. Dacă nu, atunci acestea sunt situate vertical.

Al treilea element de adaptabilitate este detecție automată numărul de coloane pentru un comutator sau comutator. Anterior, dacă nu existau instrucțiuni speciale, numărul de coloane era setat la maxim și era afișat pe o singură linie. Acum, în aceeași situație, se analizează lățimea formularului și se stabilește numărul de coloane astfel încât comutatorul/comutatorul să arate bine pe ecran.

Alinierea orizontală și verticală

Anterior, această posibilitate era absentă, iar pentru a implementa alinierea non-standard a fost necesar să se inventeze diverse „trucuri”. Acum forma și grupul pot fi specificate cum ar trebui să fie aliniate elementele sale vertical și orizontal. De exemplu, în figura de mai jos, grupul de butoane arată trei opțiuni posibile aliniere: Stânga, CentruŞi Corect:

În această imagine, butoanele sunt plasate într-un grup obișnuit care se întinde pe orizontală. Plasarea butoanelor în cadrul unui grup este controlată de proprietatea grupului HorizontalPositionSubordonate.

Control extern al alinierii

De exemplu, aveți un formular care conține câmpuri Subdiviziune, grupuri AdresaŞi Telefon. Mecanismul anterior a aliniat câmpurile acestor grupuri așa cum se arată în figura din stânga. Câmpurile din formular au fost aliniate unele cu altele, iar câmpurile din fiecare grup au fost aliniate unele cu altele.

Acum aveți oportunitatea de a seta alinierea de la capăt la capăt pentru grupuri, drept urmare, de exemplu, toate câmpurile de formular vor fi aliniate în mod egal. Această opțiune este afișată în imaginea din dreapta.

Mai mult, puteți gestiona alinierea de la capăt la capăt pentru fiecare grup separat. Prin urmare, puteți, de exemplu, să dezactivați alinierea de la capăt la capăt pentru un grup Telefon, iar apoi formularul va arăta ca cel prezentat în imaginea din dreapta.

Alinierea elementelor și a titlurilor

O altă caracteristică nouă care a apărut este capacitatea de a controla poziția relativă a elementelor și a titlurilor. Atât în ​​toate formele, cât și în grupuri individuale. De exemplu, puteți „întinde” titlurile și elementele la diferite margini ale formularului sau, invers, le puteți „trage” unul spre celălalt, aliniind titlurile la dreapta și elementele la stânga.

Limitarea lățimii maxime a elementelor

Anterior, dacă spuneai unui element să se întindă, elementul s-ar întinde cât de mult ar putea. De exemplu, ecran complet. Pentru unele elemente acest lucru a fost bun (cum ar fi un câmp HTML), dar pentru alte elemente ar putea să nu fie atât de bun. De exemplu, pentru câmpurile numerice. Pentru că datele numerice, sau butoanele care controlează câmpul, au ajuns undeva departe în dreapta.

Acum elementele au proprietăți booleene, cu ajutorul cărora puteți seta modul de întindere automată în lățime sau înălțime. În acest mod, platforma determină independent până la ce limite poate fi întins câmpul. Dacă modul automat dezactivați, atunci platforma se va comporta la fel ca înainte. Dacă specificați o anumită lățime/înălțime de câmp, aceasta va fi folosită. Și dacă specificați o valoare de 0, atunci elementul se va întinde pe cât posibil.

Controlul distanței dintre elemente

De asemenea, este posibil să controlați distanța orizontală și verticală dintre elemente. De exemplu, în figura următoare, grupul din stânga a crescut distanța verticală, în timp ce grupul din dreapta a scăzut distanța verticală.

Dezactivați întinderea formularului

Am implementat altul, mod nou operație de formă, care dezactivează întinderea verticală a elementelor sale. Acest mod va fi util pentru formularele care nu conțin număr mare elemente.

Dezactivați defilarea în pagini

Pentru formularele care conțin un număr mare de elemente, am schimbat ușor și comportamentul. Acum defilarea verticală nu apare pe pagini. Derularea verticală poate fi acum pe formularul propriu-zis sau în interiorul elementelor de formular, cum ar fi un tabel, document foaie de calculși așa mai departe. Și pagina de formular va fi întotdeauna la înălțimea maximă. Acest lucru ar trebui să facă experiența utilizatorului mai ușoară, deoarece un număr mare de scrollere dintr-un formular poate fi adesea confuz și confuz.

Relua

În acest articol de recenzie, am enumerat doar principalele caracteristici oferite de noul mecanism de plasare a elementelor în formular. Dar nu mai puțin important, în opinia noastră, este faptul că acest mecanism conține o rezervă semnificativă pentru dezvoltarea viitoare.

Pe formularele obișnuite, locația elementelor este desenată în întregime manual. Pentru a facilita acest proces, platforma oferă mai multe mecanisme:

- alinierea elementelor- asigură centrarea automată sau „apăsarea” comenzilor la liniile directoare ale celuilalt sau alinierea dimensiunilor comenzilor:

- net- prin Opțiuni puteți configura afișarea grilei pentru alinierea manuală precisă a elementelor:

Răspunsul corect este al doilea. Acesta este un panou pentru alinierea și unificarea dimensiunilor elementelor.

Întrebarea 10.79 a examenului 1C: Platform Professional.

  1. Nimic nu se va schimba
  2. Elementul „Inscription1” va fi deplasat pe orizontală, iar chenarul său din dreapta va fi aliniat cu marginea din dreapta a elementului „Inscription2”
  3. Elementul „Inscription2” va fi deplasat pe orizontală, iar chenarul său din dreapta va fi aliniat cu marginea din dreapta a elementului „Inscription1”
  4. Ambele elemente se vor muta la linia de aliniere a marginii din dreapta a formularului

Răspunsul corect este al doilea. Etichetele vor fi aliniate la dreapta.

Întrebarea 10.82 a examenului 1C: Platform Professional. Ce se întâmplă când faceți clic pe butonul din bara de comandă marcat în imagine?

  1. Toate inscripțiile vor avea aceeași dimensiune pe orizontală
  2. Nimic nu se va schimba
  3. Etichetele se vor schimba. Axa verticală de simetrie a fiecărui element de control va coincide cu axa verticală de simetrie a formei, i.e. centrarea fiecărui control pe orizontală
  4. Etichetele se vor deplasa orizontal. Controalele nu se vor mișca unele față de altele în cadrul grupului, de exemplu. centrând, parcă, un element în ansamblu
  5. Etichetele se vor deplasa pe verticală. Controalele nu se vor mișca unele față de altele în cadrul grupului, de exemplu. centrând, parcă, un element în ansamblu

Răspunsul corect este al patrulea. Toate comenzile selectate vor fi centrate în jurul liniei lor centrale comune.

Întrebarea 10.83 a examenului 1C: Platform Professional. Ce se întâmplă când faceți clic pe butonul din bara de comandă marcat în imagine?

  1. Toate inscripțiile vor avea aceeași dimensiune pe verticală. Elementul de control „Inscription1” va fi luat ca probă.
  2. Nimic nu se va schimba
  3. Toate inscripțiile vor avea aceeași dimensiune pe verticală. Elementul de control „Inscription3” va fi luat ca probă.
  4. Fiecare etichetă va fi centrată vertical
  5. Va exista o distribuție uniformă a inscripțiilor în direcția verticală. Controalele „Inscription1” și „Inscription3” vor rămâne pe loc, iar elementul „Inscription2” va fi mutat în direcția dorită. Când mutați un element, aprinderea la grila de aspect nu este luată în considerare
  6. Va exista o distribuție uniformă a inscripțiilor în direcția verticală. Controalele „Inscription1” și „Inscription3” vor rămâne pe loc, iar elementul „Inscription2” va fi mutat în direcția dorită. Când mutați un element, acesta se va fixa pe grila de marcare dacă este setat modul de utilizare

Răspunsul corect este primul. Înălțimea elementelor va fi standardizată

Întrebarea 10.86 a examenului 1C: Platform Professional. Ce se întâmplă dacă faceți clic pe butonul din bara de comandă anulat din imagine?

  1. Toate inscripțiile vor avea aceeași dimensiune pe verticală și pe orizontală. Elementul de control „Inscription1” va fi luat ca probă.
  2. Toate inscripțiile vor avea aceeași dimensiune pe verticală și pe orizontală. Elementul de control „Inscription3” va fi luat ca probă.
  3. Nimic nu se va schimba
  4. Etichetele vor fi aliniate automat
  5. Toate etichetele vor avea un fundal transparent.

Răspunsul corect este numărul patru, butonul în sine se numește „Aliniere automată”

Întrebarea 10.90 a examenului 1C: Platform Professional. Dezactivați modul de aliniere folosind linii de aliniere într-o formă creată anterior:

  1. Este interzis
  2. Can. Pentru a face acest lucru, în paleta de proprietăți de formular, trebuie să dezactivați proprietatea „Utilizați linii de aliniere”.
  3. Can. Pentru a face acest lucru, selectând elementul din meniul principal „Instrumente-Opțiuni”, în fila „Formular”, trebuie să dezactivați proprietatea „Utilizați linii de aliniere”
  4. Can. Pentru a face acest lucru, în paleta de proprietăți formular trebuie să dezactivați proprietatea „Utilizați linii de aliniere” sau, selectând elementul din meniul principal „Instrumente-Opțiuni”, din fila „Formular”, dezactivați proprietatea „Utilizați linii de aliniere”

Răspunsul corect este al doilea. Liniile de aliniere (marcate cu o săgeată) sunt dezactivate de proprietatea formularului corespunzătoare:

Întrebarea 10.92 a examenului 1C: Platform Professional. La alinierea elementelor de formular, poate fi afișată o grilă de aspect:

  1. Linii continue
  2. Puncte din tablă de șah
  3. Puncte situate la intersecția liniilor de marcare
  4. Răspunsurile 1 și 2 sunt corecte
  5. Răspunsurile 2 și 3 sunt corecte
  6. Răspunsurile 1, 2 și 3 sunt corecte

Răspunsul corect este numărul cinci. Locația punctelor este controlată de opțiunea Checkerboard din Parametrii sistemului (vezi captura de ecran din postare).

Întrebarea 10.95 a examenului 1C: Platform Professional.

  1. Un marcator special de aliniere care arată decalajul controalelor. Elementul de control selectat este oferit pentru a fi mutat la stânga
  2. Un marcator special de aliniere care arată decalajul controalelor. Elementul de control selectat este oferit pentru a fi mutat în jos
  3. Un marcator de aliniere special care arată suprapunerea controalelor. Elementul de control selectat este oferit pentru a fi mutat la stânga
  4. Un marcator de aliniere special care arată suprapunerea controalelor. Elementul de control selectat este oferit pentru a fi mutat în jos

Răspunsul corect este primul. Marginea inferioară este deplasată la dreapta față de partea de sus, așa că se propune să o deplasăm la stânga.

Întrebarea 10.96 a examenului 1C: Platform Professional. Pot folosi linii de aliniere pentru a redimensiona și a muta controalele formularului?

  1. Este interzis
  2. Da, dacă controalele sunt atașate acestor linii
  3. Este posibil dacă controalele sunt atașate acestor linii, dar doar le mutați
  4. Este posibil dacă controalele sunt atașate acestor linii, dar doar redimensionați
  5. Poți, întotdeauna

Răspunsul corect este al doilea. Elementele atașate la aceeași tijă pot fi mutate împreună.

Întrebarea 10.97 a examenului 1C: Platform Professional. În figură, cercul roșu marchează:

  1. Un marcator special de aliniere care arată decalajul controalelor. Elementul de control selectat este oferit pentru a fi mutat la stânga și în sus
  2. Un marcator special de aliniere care arată decalajul controalelor. Elementul de control selectat poate fi mutat la dreapta și în jos
  3. Un marcator de aliniere special care arată suprapunerea controalelor. Elementul de control selectat este oferit pentru a fi mutat la stânga și în sus
  4. Un marcator de aliniere special care arată suprapunerea controalelor. Elementul de control selectat poate fi mutat la dreapta și în jos

Răspunsul corect este al patrulea. Unde indică săgețile, trebuie să vă deplasați acolo.

Întrebarea 10.98 a examenului 1C: Platform Professional. În figură, cercul roșu marchează:


Întrebarea 10.110 a examenului 1C: Platform Professional. Cum pot folosi butonul din bara de comandă prezentat în figură pentru a alinia toate cele trei etichete la dreapta?

  1. Mai întâi, selectați controlul „Inscription1” făcând clic pe acesta cu butonul stâng al mouse-ului și apăsând simultan tasta. Apoi apăsați butonul indicat
  2. Doar faceți clic pe butonul indicat
  3. Folosind acest buton nu puteți alinia etichetele, deoarece aparțin unor panouri diferite
Răspunsul corect este al treilea. Alinierea funcționează într-un singur panou.

Întrebarea 10.115 a examenului 1C: Platform Professional. Pentru a afișa o grilă de aspect într-o formă existentă, este suficient:

  1. În paleta de proprietăți formular, setați proprietatea „Utilizați grilă”.
  2. Selectând elementul din meniul principal „Instrumente-Opțiuni”, în fila „Formular”, setați indicatorul „Utilizați grilă”
  3. Selectând elementul din meniul principal „Instrumente-Opțiuni”, în fila „Formular”, setați steagul „Grilă de afișare”
  4. Selectând elementul din meniul principal „Instrumente-Opțiuni”, în fila „Formular”, setați indicatorul „Grilă de afișare”, iar apoi în paleta de proprietăți a formularului setați proprietatea „Utilizați grilă”.
  5. Selectând elementul din meniul principal „Instrumente-Opțiuni”, în fila „Formular”, setați steaguri „Grilă de afișare” și „Utilizați grilă”.

Răspunsul corect este al patrulea pentru formular, de asemenea, puteți specifica opțiunea de afișare sau nu.

Și Data Transfer Object la structurarea codului, formă controlatăîn mediul 1C 8.2.

Introducere

Să începem cu o scurtă descriere a conceptului de „formă gestionată” și a conceptelor conexe ale platformei 1C. Cunoscătorii de platforme ar putea dori să omite această secțiune.

În 2008 a devenit disponibil noua versiune platforma 1C: Enterprise 8.2 (denumită în continuare Aplicația Gestionată), care schimbă complet întregul nivel de lucru cu interfața. Aceasta include interfață de comandă, și formulare și sistem de ferestre. În același timp, nu numai că se schimbă modelul de dezvoltare a interfeței cu utilizatorul în configurație, dar este propusă și o nouă arhitectură de separare a funcționalității între aplicația client și server.
Aplicația gestionată acceptă următoarele tipuri de clienți:

  • Client gros (mod de lansare normal și gestionat)
  • Client subțire
  • Client web
O aplicație gestionată utilizează formulare construite pe baza tehnologie nouă. Sunt numiti Formulare gestionate. Pentru a ușura tranziția, sunt acceptate și formularele anterioare (așa-numitele formulare Regular), dar funcționalitatea lor nu este dezvoltată și sunt disponibile doar în modul de lansare a clientului gros.
Principalele diferențe ale formularelor gestionate pentru un dezvoltator:
  • Descriere declarativă, nu „pixel cu pixel” a structurii. Amplasarea specifică a elementelor este efectuată automat de către sistem atunci când formularul este afișat.
  • Toate funcționalitățile formularului sunt descrise ca detaliiŞi echipe. Detaliile sunt datele cu care funcționează formularul, iar comenzile sunt acțiunile care trebuie efectuate.
  • Formularul rulează atât pe server, cât și pe client.
  • În contextul clientului, aproape toate tipurile de aplicații sunt indisponibile și, în consecință, este imposibil să se modifice datele din baza de informații.
  • Pentru fiecare metodă sau variabilă de formă, aceasta trebuie specificată directivă de compilare, definirea locației de execuție (client sau server) și accesul la contextul formularului.
Să enumerăm directivele pentru compilarea metodelor de formulare:
  • &OnClient
  • &OnServer
  • &OnServerWithout Context
  • &OnClientOnServerWithout Context
Să ilustrăm cele de mai sus. Captura de ecran arată un exemplu de formular gestionat și modulul acestuia în modul de dezvoltare. Găsiți descrierea declarativă, elementele de recuzită, directivele de compilare etc.

Toate discuțiile ulterioare vor fi despre partea dreaptă a ilustrației, despre cum să structurați codul modulului și ce principii vă vor permite să implementați interacțiunea eficientă client-server.

Să definim problema

Au trecut câțiva ani de când noua versiune a platformei 1C este utilizată în mod activ și multe soluții (configurații) au fost lansate atât de 1C, cât și de numeroșii săi parteneri.
În acest timp, au dezvoltat dezvoltatorii o înțelegere comună a principiilor interacțiunii client-server la crearea formularelor și s-a schimbat abordarea implementării? module softwareîn noile realități arhitecturale?

Să ne uităm la structura codului (modul formular) în mai multe forme ale aceleiași configurații standard și să încercăm să găsim modele.
Prin structură înțelegem secțiuni de cod (cel mai adesea acestea sunt blocuri de comentarii) alocate de dezvoltator pentru a grupa metode și directive de compilare pentru aceste metode.
Exemplul 1:
Secțiunea de gestionare a evenimentelor Metoda - pe client Metoda - pe server Metoda - pe client Secțiunea proceduri și funcții de service Funcții auxiliare de control al intrărilor
Exemplul 2:
Proceduri și funcții de service Documente de plată Valori Manipulatori de evenimente
Exemplul 3:
Proceduri de service pe server Proceduri de service pe client Proceduri de service pe server fără context.
Exemplul 4:
Proceduri de uz general Manipulatori de evenimente de formulare Proceduri ale subsistemului „informații de contact”.
În esență, structura codului lipsește sau, pentru a spune ușor, este similară cu ceea ce era în Forms 8.1:

  • Cuvinte neinformative „General, Serviciu, Auxiliar”.
  • Încercări timide de a separa metodele client și server.
  • Metodele sunt adesea grupate pe elemente de interfață „Lucrul cu partea tabelară Produse, Informații de contact”.
  • Aranjamentul arbitrar al metodelor și grupurilor de coduri. De exemplu, Event Handlers pot fi în partea de sus într-o formă, în partea de jos într-o alta, deloc evidențiate într-o a treia, etc.
  • Și să nu uităm că toate acestea sunt într-o singură configurație.
  • Da, există configurații în care cuvintele „General, Service, Auxiliar” sunt întotdeauna în aceleași locuri, dar...
De ce aveți nevoie de structură de cod?
  • Simplificarea întreținerii.
  • Simplificați învățarea.
  • Înregistrarea principiilor generale/importante/de succes.
  • ...opțiunea ta
De ce nu ajută standardul de dezvoltare existent de la 1C?
Să ne uităm la principiile publicate pe discuri ITS și în diverse „Ghiduri pentru dezvoltatori...” care sunt recomandate atunci când scrieți un formular gestionat.
  • Minimizați numărul de apeluri pe server.
  • Calcul maxim pe server.
  • Apelurile non-contextuale ale serverului sunt mai rapide decât cele contextuale.
  • Program cu comunicarea client-server în minte.
  • etc.
Acestea sunt sloganuri care sunt absolut adevărate, dar cum să le implementăm? Cum să minimizezi numărul de apeluri, ce înseamnă să programezi în modul client-server?

Modele de design sau înțelepciune generațională

Interacțiunea client-server este utilizată în diverse tehnologii software mai mult de o duzină de ani. Răspunsul la întrebările prezentate în secțiunea anterioară este cunoscut de mult și este rezumat în două principii de bază.
  • Fațada la distanță(denumită în continuare Interfață acces la distanță)
  • Obiect de transfer de date(denumit în continuare obiect de transfer de date)
Un cuvânt de la Martin Fowler, descrierea sa a acestor principii:
  • Fiecare obiect potențial destinat accesului de la distanță trebuie să aibă interfață cu granularitate scăzută, care va minimiza numărul de apeluri necesare pentru a efectua o anumită procedură. ... În loc să solicitați o factură și toate articolele ei separat, trebuie să citiți și să actualizați toate elementele facturii într-o singură solicitare. Acest lucru afectează întreaga structură a obiectului... Amintiți-vă: interfața de acces la distanță nu conține logica domeniului.
  • ...dacă aș fi o mamă grijulie, cu siguranță i-aș spune copilului meu: „Nu scrie niciodată obiecte de transfer de date!” În cele mai multe cazuri, obiectele de transfer de date nu sunt altceva decât set câmp umflat... Valoarea acestui monstru dezgustător constă numai în posibilitatea transmite mai multe informații prin rețea într-un singur apel- o tehnică de mare importanță pentru sistemele distribuite.
Exemple de șabloane în platforma 1C
Aplicat interfata software disponibil dezvoltatorului atunci când dezvoltă un formular gestionat, conține multe exemple ale acestor principii.
De exemplu, metoda OpenForm(), o interfață tipică „aspră”.
Parametri de deschidere = Structură nouă(„Parametru1, Parametru2, Parametru3”, Valoare1, Valoare2, Valoare3); Form = OpenForm(FormName, OpeningParameters);
Comparați cu stilul adoptat în v8.1.
Form = GetForm(FormName); Form.Parameter1 = Value1; Form.Parameter2 = Value2; Form.Open();

În contextul unui formular gestionat, există multe „Obiecte de transfer de date”. Puteți selecta sistemicăŞi definit de dezvoltator.
Cei de sistem modelează un obiect de aplicație pe client, sub forma unuia sau mai multor elemente de date de formular. Este imposibil să le creați în afara conexiunii la detaliile formularului.

  • DataFormsStructure
  • DataFormsCollection
  • DataFormStructureWithCollection
  • DataShapesTree
Conversia obiectelor de transfer de date de sistem în tipuri de aplicații și invers se realizează folosind următoarele metode:
  • ValueInFormData()
  • FormDataValue()
  • CopyFormData()
  • ValueInFormAttributes()
  • FormAttributesValue()
Conversia explicită este adesea folosită în adaptare solutie existenta. Metodele se pot aștepta (utiliza caracteristici) parametri de intrare, cum ar fi ValueTable, mai degrabă decât FormDataCollection, sau metoda a fost definită în contextul unui obiect aplicație și a devenit indisponibilă pentru apelul direct din formular.
Exemplul 1C v8.1:
// pe client în contextul formularului FillUserCache(DepartmentLink)
Exemplul 1C v8.2:
// pe server în contextul formularului ProcessingObject = Form AttributesValue("Object"); ProcessingObject.FillUserCache(DepartmentRef); ValueÂFormAttributes(ProcessingObject, "Object");

Obiectele de transfer de date, a căror structură este determinată de dezvoltator, sunt un mic subset al tipurilor disponibile atât pe client, cât și pe server. Cel mai adesea, următoarele sunt utilizate ca parametri și rezultate ale metodelor unei interfețe „groșate”:

  • Tipuri primitive (șir, număr, boolean)
  • Structura
  • Corespondenţă
  • Matrice
  • Legături către obiectele aplicației ( identificator unicși reprezentarea textului)
Exemplu: metoda acceptă o listă de comenzi pentru schimbarea statutului și returnează clientului o descriere a erorilor.
&OnServerWithoutContext Funcția ServerChangeOrderStatus(Comenzi, NewStatus) Erori = Potrivire nouă(); // [comanda][descrierea erorii] Pentru fiecare comandă din ciclul comenzi StartTransaction();

Încercați DocOb = Order.GetObject();

…. alte actiuni, posibile nu numai cu comanda... Exceptie CancelTransaction();
  • Errors.Insert(Comandă, ErrorDescription()); EndTempt;
  • EndCycle;
  • Eroare de returnare; EndFunction // ServerChangeOrderStatus() O chestiune de gust, acceptăm comanda atunci când modulul începe cu proceduri de creare a unui formular pe server și metode de acces la distanță.
  • Mentenabilitatea. Trebuie să existe o locație clară pentru adăugarea unui cod nou. Punct importantȘabloanele de metodă create automat de configurator sunt adăugate la sfârșitul modulului. Deoarece manipulatorii de evenimente pentru elementele de formular sunt cel mai adesea creați automat, blocul corespunzător este situat ultimul, pentru a nu trage fiecare handler în alt loc din modul.
Mai jos este structura de bază a modulului care implementează obiectivele enumerate.
  • Versiune grafică – arată clar fluxul principal de execuție.
  • Opțiunea text este un exemplu de design șablon pentru inserarea rapidă a unei structuri într-un nou modul de formular.

//////////////////////////////////////////////////////////////////////////////// // <(c) Автор="„Data=""/> // <Описание> // // //////////////////////////////////////////////////////////////////// ////////////////////////////// VARIABILE DE MODUL ////////////////// // ////////////////////////////////////////////////////////////////////// ////////// // PE SERVER //******* EVENIMENTE PE SERVER ******* &Pe Procedura Server când este creat pe server (Eșec, Procesare standard) / /Inserați conținutul handler-ului Sfârșitul procedurii //******* INTERFAȚA DE ACCES LA DISTANȚĂ ******* //******* LOGICA DE AFACERI PE SERVER ******* ///////// ///////////////////////////////////////////////////////////// /////// //////////////////// // METODE COMUNE DE CLIENT ȘI SERVER ///////////////// /////// /////////////////////////////////////////////////////////////// ///// //////// // PE CLIENT //******* LOGICA DE AFACERI PE CLIENT ******* //******* ECHIPA * ****** //******* EVENIMENTE CLIENȚI ******* //////////////////////////// ///// ///////////////////////////////////////////////////////////////// // / / PRINCIPALI OPERATORI DE PROGRAM

Întrebări înrudite
În concluzie, vom schița câteva domenii la care este util să ne gândim atunci când programați interacțiunea client-server.
  • Opțiuni de implementare a interfeței de acces la distanță. Asincronie, nivel de detaliu...
  • Memorarea în cache. 1C a luat o decizie arhitecturală nereușită, introducând memorarea în cache doar la nivelul metodelor de apelare a modulelor comune și neasigurând capabilități de control (timp de relevanță, resetare la cerere).
  • Apeluri implicite pe server. Nu uitați de caracteristicile tehnologice multe operațiuni „inofensive” pe client provoacă platforma să contacteze serverul.
19.05.2015

Implementat în versiunea 8.3.7.1759.

Pentru a clarifica despre ce vorbim în acest articol, este necesar să facem o mică explicație.

O caracteristică a formularelor gestionate este că dezvoltatorul nu modelează în mod direct aspectul formularului. Dezvoltatorul creează doar o descriere a formularului folosind anumite reguli logice. Pe baza acestor reguli, platforma generează independent o reprezentare vizuală a formularului. Mai mult, această reprezentare vizuală depinde de dimensiunea ferestrei în care este afișat formularul. Aceeași formă afișată într-o fereastră îngustă sau într-o fereastră extinsă la ecran complet va avea un aspect vizual diferit.

Deci, acea parte a platformei care formează reprezentarea vizuală a formei se numește mecanism de plasare a elementelor în formă.

De ce a fost nevoie de un nou mecanism?

În primul rând, mecanismul anterior, din păcate, a avut deficiențe. Cea mai semnificativă dintre acestea a fost că multe modificări ale proprietăților elementelor de formular efectuate pe client au necesitat un apel către server. Și orice acces la server duce la încetinire.

În al doilea rând, am evaluat experiența utilizării formularelor gestionate și am descoperit o serie de nevoi critice care trebuiau abordate.

Și în al treilea rând, am vrut să construim în noul mecanism oportunități de dezvoltare viitoare.

Schimbări majore

Funcționarea mecanismului anterior poate fi reprezentată schematic după cum urmează:

Dezvoltatorul creează un arbore de elemente de formular în configurator și stabilește proprietățile elementelor. În momentul în care soluția aplicației trebuie să arate formularul utilizatorului, se întâmplă următoarele. În primul rând, platforma creează o descriere a formei vizuale pe server. Apoi această descriere este transmisă clientului. Iar pe client, vizualizatorul generează imaginea pe care utilizatorul o va vedea.

Acțiunea principală care a fost efectuată pe server la crearea unei descrieri a formei vizuale a fost calcularea lungimii liniilor. Aceasta se referă la tot felul de titluri, inscripții și așa mai departe. Cunoscând lungimile liniilor, puteți calcula deja aranjarea elementelor din formular.

Din moment ce această operațiune a fost efectuată pe server, au existat două aspecte negative. În primul rând, pentru calcul am folosit nu fonturile care vor fi folosite pe client, ci cele instalate pe server. Și pot diferi, mai ales când vine vorba de platforme diferite (Windows, Linux). Sau chiar și fonturile necesare nu pot fi instalate deloc pe server. În al doilea rând, pentru a calcula lungimile, am folosit motorul de rasterizare a fonturilor care se află pe server. Și poate să nu funcționeze exact ca mecanismul de redare a șirurilor de text care există pe client într-un browser de internet, de exemplu. Ca urmare, formele ar putea apărea fie cu texte „trunchiate”, fie, dimpotrivă, cu inscripții prea largi.

O altă problemă a fost că nu a existat nicio adaptare la dimensiunea ferestrei în care formularul va fi afișat clientului. De fapt, pe server, descrierea formularului a fost creată pe baza dimensiunii minime posibile a ferestrei, iar succesul suplimentar al afișajului său depindea de cât de bine „se poate” întinde.

În noul mecanism, am împărțit generarea unei descrieri a unei forme vizuale, care anterior a fost realizată în întregime pe server, în două părți, server și client:

Partea de server a devenit semnificativ mai mică. Nu efectuează niciun calcul. Pe server este creată doar o descriere „goldă”, care nu conține lungimile exacte ale câmpurilor de text, iar elementele de adaptabilitate nu sunt permise în ea. Serverul se ocupă de vizibilitatea elementelor, dar numai de cea care este determinată de opțiunile funcționale și cea care este setată de utilizator. Dar aici este imposibil să faci altfel, deoarece opțiunile funcționale în sine sunt disponibile numai pe server. Și schimbarea interactivă a setărilor de către utilizator va duce în orice caz la un apel pe server.

Rezultatul este un fel de „produs semifabricat” al unei reprezentări vizuale a formei, care este transferată clientului.

Modificările necesare la descrierea formei vizuale se fac pe client. Se calculează lungimile liniilor, se calculează elementele de răspuns legate de dimensiunea afișajului clientului și se calculează vizibilitatea. După aceasta, ca și înainte, vizualizatorul începe să funcționeze, ceea ce creează forma finală pe care o vede clientul.

Datorită faptului că calculul lungimii șirurilor se efectuează pe client, am reușit să scăpăm de „golurile” inutile și neglijente dintre elemente. Și realizarea vizibilității pe client fără accesarea serverului a făcut posibilă accelerarea procesului de lucru a formularelor. Deoarece activarea/dezactivarea vizibilității elementelor de formular este una dintre cele mai comune operațiuni.

Câteva caracteristici noi

Elemente de interfață receptive

Noul mecanism de plasare a elementelor pe formular nu numai că îmbunătățește capabilitățile care erau disponibile înainte, dar adaugă și noi capabilități. De exemplu, adaptează aspectul formularului la dimensiunea afișajului clientului. Există mai multe moduri de a face acest lucru.

În primul rând, se realizează împachetarea automată a liniilor, ajustând înălțimea titlurilor și decorațiunilor. Puteți vedea cum funcționează acest lucru în figură:

Dacă există linii lungi în formă care pot fi împărțite în cuvinte individuale, atunci astfel de linii sunt împachetate dacă este necesar. În consecință, înălțimea formei crește, deoarece partea sa inferioară „se mișcă” în jos. Ca rezultat, forma va arăta normal chiar și pe ecrane înguste. Mai mult, acest mecanism funcționează dinamic, ceea ce înseamnă că puteți comprima formularul în timp real, iar liniile lungi se vor înfășura împreună cu el.

Împachetarea automată funcționează pentru titlurile elementelor, titlurile grupurilor, decorațiunile de text și textul din butoanele care au vizualizarea Hyperlink.

Al doilea element de adaptabilitate este schimbarea orientării grupurilor. Grupurile și formularul în ansamblu au o nouă opțiune de orientare - „Orizontal dacă este posibil”. În această opțiune, dacă afișajul client permite poziționarea orizontală a elementelor, acestea sunt poziționate orizontal. Dacă nu, atunci acestea sunt situate vertical.

Al treilea element de adaptabilitate este determinarea automată a numărului de coloane ale unui comutator sau comutator basculant. Anterior, dacă nu existau instrucțiuni speciale, numărul de coloane era setat la maxim și era afișat pe o singură linie. Acum, în aceeași situație, se analizează lățimea formularului și se stabilește numărul de coloane astfel încât comutatorul/comutatorul să arate bine pe ecran.

Alinierea orizontală și verticală

Anterior, această posibilitate era absentă, iar pentru a implementa alinierea non-standard a fost necesar să se inventeze diverse „trucuri”. Acum forma și grupul pot fi specificate cum ar trebui să fie aliniate elementele sale vertical și orizontal. De exemplu, în imaginea de mai jos, un grup de butoane arată trei opțiuni posibile de aliniere: Stânga, Centru și Dreapta:

În această imagine, butoanele sunt plasate într-un grup obișnuit care se întinde pe orizontală. Plasarea butoanelor în cadrul unui grup este controlată de proprietatea HorizontalSubordinatePosition a grupului.

Control extern al alinierii

De exemplu, aveți un formular în care se află câmpul Departament, grupele Adresă și Telefon. Mecanismul anterior a aliniat câmpurile acestor grupuri așa cum se arată în figura din stânga. Câmpurile din formular au fost aliniate unele cu altele, iar câmpurile din fiecare grup au fost aliniate unele cu altele.

Acum aveți oportunitatea de a seta alinierea de la capăt la capăt pentru grupuri, drept urmare, de exemplu, toate câmpurile de formular vor fi aliniate în mod egal. Această opțiune este afișată în imaginea din dreapta.

Mai mult, puteți gestiona alinierea de la capăt la capăt pentru fiecare grup separat. Prin urmare, puteți, de exemplu, să dezactivați alinierea de la capăt la capăt pentru grupul Telefon, iar apoi formularul va arăta ca în figura din dreapta.

Alinierea elementelor și a titlurilor

O altă caracteristică nouă care a apărut este capacitatea de a controla poziția relativă a elementelor și a titlurilor. Atât în ​​toate formele, cât și în grupuri individuale. De exemplu, puteți „întinde” titlurile și elementele la diferite margini ale formularului sau, invers, le puteți „trage” unul spre celălalt, aliniind titlurile la dreapta și elementele la stânga.

Limitarea lățimii maxime a elementelor

Anterior, dacă spuneai unui element să se întindă, elementul s-ar întinde cât de mult ar putea. De exemplu, ecran complet. Pentru unele elemente acest lucru a fost bun (cum ar fi un câmp HTML), dar pentru alte elemente ar putea să nu fie atât de bun. De exemplu, pentru câmpurile numerice. Pentru că datele numerice, sau butoanele care controlează câmpul, au ajuns undeva departe în dreapta.

Acum elementele au proprietăți booleene, cu ajutorul cărora puteți seta modul de întindere automată în lățime sau înălțime. În acest mod, platforma determină independent până la ce limite poate fi întins câmpul. Dacă modul automat este dezactivat, atunci platforma se va comporta la fel ca înainte. Dacă specificați o anumită lățime/înălțime de câmp, aceasta va fi folosită. Și dacă specificați o valoare de 0, atunci elementul se va întinde pe cât posibil.

Controlul distanței dintre elemente

De asemenea, este posibil să controlați distanța orizontală și verticală dintre elemente. De exemplu, în figura următoare, grupul din stânga a crescut distanța verticală, în timp ce grupul din dreapta a scăzut distanța verticală.

Dezactivați întinderea formularului

Am implementat un alt mod de operare nou al formularului, care dezactivează întinderea verticală a elementelor sale. Acest mod va fi util pentru formularele care conțin un număr mic de elemente.

Dezactivați defilarea în pagini

Pentru formularele care conțin un număr mare de elemente, am schimbat ușor și comportamentul. Acum defilarea verticală nu apare pe pagini. Derularea verticală poate fi acum pe formularul propriu-zis sau în interiorul elementelor de formular, cum ar fi un tabel, un document de foaie de calcul și așa mai departe. Și pagina de formular va fi întotdeauna la înălțimea maximă. Acest lucru ar trebui să facă experiența utilizatorului mai ușoară, deoarece un număr mare de scrollere dintr-un formular poate fi adesea confuz și confuz.

Relua

În acest articol de recenzie, am enumerat doar principalele caracteristici oferite de noul mecanism de plasare a elementelor în formular. Dar nu mai puțin important, în opinia noastră, este faptul că acest mecanism conține o rezervă semnificativă pentru dezvoltarea viitoare.