Tipuri de date 1s 8.3. Folosind tipuri definite. Tipuri de date generate într-o soluție de aplicație

25.10.2019 Interesant

Tipuri definite − obiect nou Metadatele 1C, care au apărut în versiunea 8.3 a platformei. Obiectul este de natură auxiliară. Să luăm în considerare care sunt tipurile definite și sarcinile pe care acest obiect le poate rezolva.

Sunt definite noi tipuri de date, al căror set este determinat de dezvoltatorul soluției aplicației. Este format din mai multe tipuri valide. Acest tip de date poate fi tipul oricărui atribut de configurare, cu excepția tipului definit în sine și a obiectului „ ”.

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

Setări

Nu există atât de multe setări pentru acest obiect:

Acestea. pe lângă numele și sinonimul din 1C, tipurile definite au doar un set de tipuri de obiecte.

Un exemplu de utilizare a tipurilor definite în 1C 8.3

Pentru acest obiect pot fi găsite o mare varietate de aplicații.

Exemple de utilizare:

  • puteți descrie în detaliile de configurare care se referă la date care vor fi definite atunci când fragmentul este încorporat într-o anumită configurație;
  • atribuiți un tip de date definite unui anumit set de abonamente la evenimente; când setul de tipuri se schimbă, sursa se va schimba dinamic pentru toate abonamentele;
  • utilizarea ca alternativă la planul de tipuri de caracteristici

și mult mai mult.

Dacă începeți să învățați programarea 1C, vă recomandăm curs gratuit(nu uita

— am început să discutăm ce sunt tipurile de valori 1C și conversia tipurilor 1C.

Astăzi vom vorbi mai detaliat despre tipurile de obiecte de configurare 1C (tip document 1C, tip director 1C etc.)

Deoarece în codul programului lucrăm cu valori, trebuie să le cunoaștem periodic tipul. Tipul 1C este întotdeauna indicat în metadatele detaliilor - în directoare și documente.

Lucrul cu tipuri 1C este adesea folosit:

  • Condiții în program
    Acțiuni diferite în funcție de tipul valorii 1C în construcția „Dacă ... Atunci ...”.
  • Limitări atunci când lucrați în interfață
    Interzicerea sau permiterea utilizatorului să introducă valori ale anumitor tipuri de 1C într-un câmp din formular.
  • Determinarea parametrului actual al funcției/procedurii
    Dacă un parametru de funcție/procedură poate fi de orice tip 1C, atunci trebuie să îl definiți pentru a obține corect valoarea.

Tipul 1C poate fi obținut:

  • Determinați tipul valorii reale 1C
  • Obiectele de valoare au proprietăți care indică tipul 1C permis (de exemplu, tipurile 1C permise într-o coloană de tabel, într-un câmp dintr-un formular, în metadate) sau metode care returnează aceste tipuri 1C
  • Din metadate - puteți obține tipul 1C așa cum este specificat în metadate din configurator.

Tipurile 1C pot fi împărțite în trei tipuri:

  • Tipuri de bază 1C
  • Tipuri de baze de date 1C (referință, obiecte)
  • Tipurile 1C.

Definirea tipului 1C și compararea tipurilor 1C

Puteți afla tipul valorii 1C folosind funcția TypeValue (Variable)

Pentru a înțelege ce tip 1C a returnat această funcție, trebuie să specificăm tipul de care avem nevoie („TypeName”)

De exemplu, definiția (comparația) a unei variabile de tip 1C:
Dacă TypeValue(Variable) = Type("TypeName"), atunci

Ce tipuri ar trebui să scriu ca TypeName?

Tipuri de bază

Tipuri de bază de 1C - număr, șir, dată, boolean.

De exemplu:
Znch = 12;
Dacă TypeValue(Value) = Type(„Număr”), atunci
Valoarea ElseIf = Type(„Șir”) Atunci
ElseIf Value = Type ("Data") Atunci
ElseIf Value = Type ("Boolean") Atunci
endIf;

Tipuri de baze de date

1C stochează datele într-o bază de date, dar nu sub formă de înregistrări individuale, ci sub formă de obiecte.

Cele mai multe obiecte salvate (inclusiv: directoare, documente, enumerări, procese de afaceri, sarcini) sunt disponibile ca Obiect (pentru editare și scriere) și ca Link (pentru citire). Consultați „Legături și obiecte” pentru mai multe detalii.

De exemplu:
Valoare = Directories.Organizations.EmptyLink();
Dacă TypeValue(Value) = Type("DirectoryLink.Organizations"), atunci
OtherwiseIf Value = Type("DirectoryObject.Organization") Then
Altfel, dacă TypeValue(Value) = Type("DocumentLink.Receipt of Goods"), atunci
Altfel, Dacă Valoarea = Type(„Obiect Document.Recepția Bunurilor”) Atunci
endIf;

Pot fi prezentate registre tipuri variate. Numele tipului de registru este compus:
RegisterRegisterTypeAccessType.RegisterName

Tipuri de registre 1C:

  • informație
  • Economii
  • Contabilitate
  • Calcul.

Există mai multe tipuri de acces la registru. Cel mai des folosit:

  • Set de înregistrări
  • Listă
  • Probă
  • Record
  • RecordKey.

Total, exemplu:
Dacă TypeValue(Value) = Type("InformationRegisterList.RegisterName"), atunci
OtherwiseIf Value = Type ("AcumulationRegisterRecordSet.RegisterName") Then
endIf;

Limbajul 1C vă permite să lucrați cu multe obiecte create dinamic în program, de exemplu, o matrice, o listă de valori, un tabel de valori, o structură...

Astfel de tipuri 1C sunt indicate prin numele lor (într-un cuvânt, fără spații). De exemplu:
Dacă TypeValue(Value) = Type(„Matrice”), atunci
ElseIf Value = Type ("Lista de valori") Then
endIf;

Determinarea valorii unui tip de referință 1C

Lucrul cu toate obiectele bazei de date (directoare, documente...) se realizează prin link-uri. De exemplu, dacă dorim să facem o referință într-un document, atunci tipul său 1C va fi „DirectoryLink.DirectoryName”.

De exemplu:
Valoare = Directories.Organizations.EmptyLink();
Dacă Directories.TypeAllLinks().Contains(TypeValue(Value)) Atunci
//aceasta este o carte de referință
ElseIf Documents.TypeAllLinks().Contains(TypeValue(Value)) Then
//acesta este un document
endIf;

Într-o cerere, tipul 1C poate fi verificat în două moduri.

Primul este similar cu cel descris, dar numele tipului 1C nu indică „Link” sau „Object”, adică în loc de „DirectoryLink.Organizations” scriem „Directory.Organizations”

De exemplu:

Obținerea tipurilor 1C disponibile

Multe obiecte au o proprietate.ValueType, care conține o listă de tipuri 1C:

  • Câmp de pe formularul de client gras
    Form Elements.FieldName.ValueType
  • Câmp de pe formular client slab(excepție: numită AvailableTypes)
    Elements.FieldName.AvailableTypes
  • Coloana tabelului de valori, arborele de valori
  • Detalii formular
  • Element de selecție

Cum să lucrați cu această listă de tipuri 1C în câmp.ValueType - consultați „Descrierea tipurilor” în secțiunea „Limbaj 1C”.

Lucrul cu tipuri de detalii 1C în metadatele de configurare

La adăugarea și editarea detaliilor în configurator, programatorul specifică tipul (tipurile) de detalii 1C. În codul programului în limbajul 1C, puteți obține (aflați) tipul (tipurile) de detalii 1C.

Metode de bază:

  • Pentru un obiect 1C, apelați metoda Metadata(), care returnează metadatele unui anumit obiect și apoi lucrați cu lista de detalii (și detaliile secțiunii tabelului)
    Documente.Recepția mărfurilor.EmptyLink().Metadate().Detalii
  • Utilizați variabila globală „Metadate”, care returnează toate metadatele de configurare și apoi accesați detaliile unui anumit obiect
    Metadate.Documente.Recepția Bunurilor.Detalii

Atributul are o proprietate.Type, care conține o listă de tipuri 1C setate în configuratorul pentru acest atribut.

Cum să lucrați cu această listă de tipuri 1C - consultați „Descrierea tipurilor” în secțiunea „Limba 1C”.

Specificați filtrul de tip 1C

Pentru multe obiecte este posibil să se specifice un filtru de tipuri de valori 1C care pot fi utilizate, de exemplu:

  • Lista de valori (.AvailableValues)
  • Câmp pentru formularul client gestionat (.AvailableTypes)

Acolo unde filtrul nu este disponibil pentru modificare, este posibil să se specifice filtrul în metoda obiectului. De exemplu, o coloană a unui tabel (arborele) de valori are.ValueType și nu o putem modifica, dar atunci când adăugați o coloană folosind metoda.Add(), al doilea parametru poate fi folosit pentru a specifica o listă de 1C disponibile. tipuri.

Pentru a specifica o listă de tipuri 1C pentru un filtru, se utilizează o listă de tipuri 1C; cum să lucrați cu aceasta, consultați „Descrierea tipurilor” în secțiunea „Limbaj 1C”.

Tip sistem este un sistem special prin care sunt organizate datele utilizate de soluțiile aplicației. Sistemul de tipare vă permite să prezentați informații din lumea reală în termeni care sunt „înțeleși” pentru 1C:Enterprise 8.

Sistemul de tip oferă oportunități ample atât pentru descrierea logicii de afaceri a soluțiilor de aplicație în sine, cât și pentru realizarea sarcinilor intermediare de procesare a datelor.

O descriere a sistemului de tip este conținută în asistentul de sintaxă, în ajutorul încorporat și în documentație.

Caracteristica principală a sistemului de tip este că există tipuri care există în orice soluție de aplicație. Aceste tipuri în sine sunt definite la nivel de platformă și sunt întotdeauna prezente, indiferent de acțiunile dezvoltatorului. Alături de acestea, într-o soluție de aplicație specifică, pot exista diverse tipuri de date inerente acestei soluții de aplicație particulară. Pentru astfel de tipuri de date, doar următoarele sunt definite la nivel de platformă: reguli generale creațiile lor, șabloane. Și tipuri specifice de date sunt create de platformă pe baza modului în care dezvoltatorul creează și modifică structura soluției aplicației.

Tipuri de date definite la nivel de platformă

Setul de tipuri pe care soluțiile de aplicație pot funcționa este destul de divers. Vă permite să rezolvați atât problemele de prelucrare a datelor, cât și sarcinile de prezentare a acestor date utilizatorului și de a lucra interactiv cu acestea. Există mai multe categorii principale de tipuri de date.

Tipuri primitive

Tipurile de date primitive sunt tipuri precum Linia, Număr, Data, boolean si altii. Aceste tipuri nu sunt ceva special pentru 1C:Enterprise 8. De regulă, astfel de tipuri de date există în alte sisteme software.

Valorile tipurilor primitive sunt simple valori indivizibile în care componentele individuale nu pot fi distinse. De exemplu, valori precum Număr poate fi 1, 8, 15 etc. Pentru a crea o valoare de tip primitiv, trebuie să o specificați în textul programului literal- identificatorul simbolic al valorii.

Colecții de valori generice

Există și tipuri de date mai complexe. De exemplu, platforma acceptă întreaga linie tipuri care sunt colecții universale valori: Matrice, Structura, ListValues si altii.

Tipuri comune

În plus, platforma implementează tipuri de date specifice care implementează una sau alta funcționalitate a soluțiilor de aplicație: Document text, TabularDocument, Valori de stocare, Generator de interogări si altii.

Se mai numesc și tipurile generale obiecte comune . Valorile acestor tipuri, spre deosebire de valorile tipurilor primitive, sunt o colecție de valori ale proprietăților individuale ale unui obiect. De aceea sunt numiti instanțe de obiecte.

Instanțele de obiect sunt create folosind un operator de limbaj special încorporat - Nou.

Tipuri de interfață

Tipurile de interfață vă permit să organizați interacțiunea vizuală a unei soluții de aplicație cu utilizatorul. Acestea sunt în principal tipuri legate de funcționarea formelor și a elementelor acestora.

Tipuri de date generate într-o soluție de aplicație

Cu toate acestea, în plus față de tipurile de date care sunt definite la nivel de platformă, o anumită soluție de aplicație poate utiliza tipuri de date unice care există numai în acea soluție de aplicație specifică. Mai mult, platforma va sprijini pe deplin lucrul cu aceste tipuri de date în același mod ca și cu tipurile care sunt definite la nivelul platformei în sine.

De regulă, apariția unor noi tipuri de date într-o soluție de aplicație este asociată cu utilizarea obiectelor de configurare a aplicației. Prin urmare, aceste tipuri sunt, de asemenea, numite tipuri de aplicații sau obiecte aplicate.

La nivel de platformă, sunt acceptate mai multe clase (șabloane) de obiecte de aplicație, care ele însele nu pot fi utilizate într-o soluție de aplicație specifică. De exemplu, puteți lista clase de obiecte de aplicație, cum ar fi Directoare, Documentație, Registre de informații, Planuri de tip caracteristic etc.

Pentru fiecare clasă de obiecte de aplicație este definită funcționalitatea de bază corespunzătoare acesteia: tipuri de tabele de baze de date care trebuie create pentru stocarea datelor, formulare standard, obiecte limbaj standard, seturi de drepturi etc.

Un dezvoltator, atunci când creează o soluție de aplicație, nu are posibilitatea de a utiliza aceste clase direct, dar poate adăuga la soluția sa de aplicație un nou obiect de configurare care moștenește toată funcționalitatea unei anumite clase:

De exemplu, un dezvoltator poate adăuga o nouă carte de referință la soluția sa de aplicație Nomenclatură Directoare, sau un document nou Raport de numerar, care va moșteni funcționalitatea clasei Documentație.

Imediat după o astfel de adăugare, dezvoltatorului devin noi tipuri de date, a căror compoziție este determinată de apartenența obiectului de configurare la o anumită clasă de obiecte de aplicație.

De exemplu, după crearea unui director nou Nomenclatură, următoarele tipuri de date devin disponibile:

  • DirectoryManager.Nomenclatura,
  • DirectoryLink.Nomenclatura,
  • DirectoryObject.Nomenclature,
  • Directory Sampling. Nomenclator,
  • DirectoryList.Nomenclatura.

Sistemul de tipuri descrie doar „structura” generală de acest tip, regulile după care se vor forma obiectele de acest tip. Numele specific al tipului, compoziția proprietăților și metodelor obiectului vor depinde de modul în care dezvoltatorul numește obiectul de configurare și de ce, de exemplu, detalii și părți de tabel va adăuga la acesta.

În același timp, după crearea unui nou registru de acumulare Compania de vânzări, compoziția noilor tipuri de date va fi diferită:

  • Registrul de acumulare Manager vânzări companie,
  • RegisterAccumulationSelection.SalesCompany,
  • RegisterAccumulationList.SalesCompany,
  • RegisterAccumulationSetRecords.SalesCompany,
  • Acumulare RegisterRecord.Company Sales,
  • Registrul de acumulareRecord Key.Company Sales.

Trebuie remarcat din nou că aceste tipuri de date nu sunt acceptate nativ de platformă și există doar într-o soluție de aplicație specifică.

Un alt punct care ar trebui subliniat este cel mai ușor de demonstrat cu un exemplu.

Să presupunem că au fost create două directoare noi într-o soluție de aplicație: NomenclaturăȘi Preturi. Chiar dacă ambele aceste obiecte moștenesc funcționalitatea clasei corespunzătoare Directoare, iar pentru ei în soluția de aplicație a fost creat același set de tipuri de date, aceleași tipuri de date vor fi tipuri de date diferite. De exemplu, DirectoryObject.Nomenclature Tip de date.

/
Crearea și editarea obiectelor metadate

Utilizarea tipurilor definite

Domeniul de aplicare: aplicație gestionată, aplicație normală.

1. Tipurile definite sunt destinate să definească tipuri de date care descriu entități utilizate frecvent sau cu un grad ridicat de probabilitate se pot schimba la implementarea unei soluții de aplicație. Acestea vă permit să reutilizați tipul sau setul de tipuri descris fără a specifica compoziția în diferite locuri din configurație (în detalii, proprietăți ale obiectelor, forme etc.).

Vezi și articolul despre ITS: „Obiecte de configurare – Tipuri definite”

2.1. Pentru a defini un tip simplu și calificatorii săi care au o semnificație aplicată, care este utilizat în diverse atribute, resurse, atribute de formular, machete etc. în cadrul oricărui subsistem sau în întreaga soluție de aplicație. Acest lucru asigură că datele sunt de aceeași lungime și exactitate în toate locurile de utilizare și simplifică modificarea dacă cerințele se modifică.
De exemplu:

  • Număr de factură- Șir, lungime 30. Reglează formatul numărului facturii în diverse documente: Primirea Bunurilor și Serviciilor, Intrare Cărți Cumpărături, Returnarea Bunurilor de la Client si etc.
  • Adresă de livrare- String, 500. Reprezentare text a adresei de livrare în documente Comanda către furnizor, Adresa de livrareCarrier, In prelucrare Asistent de vânzări, în recuzită Adresa de livrareCarrier document Cerere de returnare a bunurilor de la client si etc.

2.2. Pentru a defini un tip compozit care este utilizat pe scară largă în obiectele unui subsistem sau în întreaga soluție de aplicație. Tipul definit garantează aceeași compoziție (tip) de date în toate locurile de utilizare și, de asemenea, simplifică modificarea și implementarea subsistemelor în configurațiile aplicației.

De exemplu, configurația include un subsistem Interacțiuni, care este destinat corespondenței via e-mail, înregistrarea apelurilor și a întâlnirilor. La implementarea acestui subsistem, dezvoltatorul a decis compoziția obiectelor de metadate care pot acționa ca „contacte de interacțiune” - acestea sunt elemente ale directoarelor Persoanele fizice, Parteneri, Contact PersonsPartners, și a specificat această compoziție de tipuri în tipul definit ContactInteracțiuni prevăzute în subsistem. La rândul său, tipul definit este utilizat pe scară largă în detaliile obiectului și formularele subsistemului (în documente Întâlnire, Interacțiune planificată- parte tabulară Participanții, în document MessageSMS– partea tabulară Destinatari, în document Apel telefonic- recuzită AbonatContact, în forme generale Agenda de adrese, Selectați Contact- cerinte ContacteDespre subiect, în parametrul de layout Ierarhia interacțiunilorContact jurnal de documente Interacțiuni etc.) În caz contrar, fără a utiliza un tip definit ContactInteracțiuni ar fi necesar să se elimine obiectele subsistemului din suport și să se specifice compoziția necesară a tipurilor în toate locurile enumerate.

2.3. La dezvoltarea unui subsistem implementat - pentru a redefini tipul de aplicație, care va fi specificat în timpul implementării.
De exemplu, tipul subsistemului Furnizoriîn timpul implementării poate fi înlocuit cu un tip de configurare a aplicației Contrapartide.

3. Este incorect să folosiți tipuri definite pentru a defini un „sinonim” pentru un tip existent, „înlocuiți” entități, pentru utilizare locală (nu în masă) în cadrul unui subsistem (configurație) fără a fi necesară implementarea în alte configurații, doar din motive de ușurință de modificare. De regulă, aceasta indică o eroare de proiectare sau o alegere incorectă metodologic a numelui tipului original.

Acest articol continuă seria de articole „Primii pași în dezvoltarea 1C”. Se va vorbi despre tipurile de date primitive și despre cele mai comune funcții atunci când lucrați cu acestea. După ce ați citit materialul, veți învăța:

  • Ce tipuri de date sunt primitive?
  • Cum poți lucra cu șiruri și ce caracteristici trebuie luate în considerare?
  • Care sunt subtilitățile lucrului cu expresii numerice?
  • Cum să descrii o întâlnire cu o anumită valoare? Cum să setați o dată goală?
  • Cum funcționează conversia tipului?
  • Null și Nedefinit – care sunt acestea și care sunt diferențele?
  • Cum se determină ce tip este un obiect/variabilă?

Aplicabilitate

Articolul a fost scris pentru platforma 1C versiunea 8.3.4.496, deci informațiile sunt relevante și pentru Versiune curentă platforme. Cu toate acestea, trebuie remarcat faptul că în versiunea 8.3.6.1977 au fost adăugate noi funcții pentru lucrul cu șiruri. Prin urmare, atunci când repeți pașii din articol, nu fi surprins dacă în secțiunea corespunzătoare din Syntax Assistant vezi unele funcții care nu sunt afișate în captura noastră de ecran. De asemenea, vă recomandăm să vă familiarizați cu noua metodă StringWithNumber() adăugată în platforma 8.3.10.

Tipuri de date primitive și unele dintre funcțiile acestora

Se disting următoarele tipuri de date primitive:

Constante de șir

Tip de date primitive Linia(constantă șir) constă din diferite caractere. Linia este întotdeauna înconjurat de ghilimele. Exemplu de constantă șir:

Message.Text = „Există date goale”;

Acestea. linia „Există date goale” este atribuită atributului Text obiect Mesaj. Orice lucru înconjurat de ghilimele este considerat un șir.

Șirul poate consta din orice caractere. Șirurile pot fi cu mai multe linii. În acest caz, fiecare linie nouă trebuie definită între ghilimele. De exemplu:

Text = „Detalii nevalide completate”
„Este imposibil să postezi documentul”;

Punctul și virgulă este plasat doar la sfârșitul ultimei rânduri.

Există o altă modalitate - de a încadra întregul text doar cu un singur ghilimele, dar fiecare linie nouă ar trebui să înceapă cu o dungă verticală.

Această sintaxă este folosită cel mai adesea în configurațiile tipice. În special, în limbajul de interogare. De exemplu:

Cerere.Text =
"ALEGE
| Employees.Name AS Angajat,
| Angajații.Data nașterii AS Data nașterii
|DIN
| Director.Angajaţii CUM Angajaţii
|UNDE
| NU angajați. Acesta este un grup”;

Trebuie remarcat faptul că operația de adăugare este definită pentru șiruri. Aceasta nu este o operație aritmetică, se numește operație de concatenare.

Acestea. trebuie să combinați, de exemplu, două linii, cu un semn de adunare „+” între linii:

Text = „Detaliile sunt completate incorect” + „Este imposibil să postezi documentul”;

Astfel, liniile sunt îmbinate. Operația de concatenare, desigur, este aplicabilă și pentru Mai mult linii. Alte operații (scădere, înmulțire, împărțire) nu sunt permise pentru șiruri.

Dacă un cuvânt din interiorul unei linii trebuie să fie înconjurat de ghilimele, atunci ghilimelele din interiorul liniei trebuie definite citat dublu. De exemplu:

Text = „Eroare în modulul „Modul general 1””;

ÎN în acest exemplu Primul ghilime deschide șirul. Al doilea și al treilea ghilimele unul lângă altul indică ghilimele.

Și la sfârșit sunt trei ghilimele: ultimul ghilimele închide linia, cele două anterioare indică ghilimele.

Pe șiruri sunt posibile diferite operații de conversie a șirurilor, identificând primele câteva caractere din stânga, identificarea mai multor caractere din dreapta, căutarea unui subșir într-un șir etc.

Toate aceste funcții sunt disponibile oriunde în configurație.

În asistentul de sintaxă sunt în secțiune descriere generala limbaj încorporatFuncții încorporateFuncții pentru lucrul cu valori de tip String.

Există un număr destul de mare de funcții și sunt de obicei suficiente pentru a lucra cu constante de șir.

Să ne uităm la un exemplu de rezolvare a unei probleme folosind funcții șir.

Sarcina:

Trebuie dezvoltată o funcție. Un șir arbitrar este transmis ca parametru funcției. Caracterele din rând pot fi și numere.

O succesiune de cifre (una sau mai multe), separate de alte caractere prin spații, constituie un întreg pozitiv.

De exemplu, șirul „72 ABC 6AP 31 54f -22” conține două numere întregi pozitive: 72 și 31. În afară de spații, alte caractere nesemnificative (cum ar fi tab-uri, returnări de cărucior) nu sunt folosite. Funcția trebuie să returneze numărul de numere întregi pozitive.

Acesta trebuie să fie localizat într-un modul de aplicație gestionat. Este necesar să vă asigurați că este apelat la pornirea sistemului. Definiți un șir folosind o variabilă.

Deci, să deschidem modulul aplicației gestionate și să selectăm din lista din câmpul de selecție din panoul de configurare Modul manipulator standard AtSystemStart().

În interiorul handlerului definim o variabilă Linia, De exemplu:

Rând = „72 ABC 6AP 31 54f -22”;

Cantitate = Number ofIntegerNumbers(String);

Să trimitem un mesaj despre numărul de numere întregi:

Raport ("Rândul conține " + Număr + " numere întregi");

În acest caz, variabila Cantitate va fi implicit convertit în tip Constantă de șir. Apoi se va efectua operația de concatenare pe cele trei șiruri și mesajul va fi transmis.

Să definim începutul și sfârșitul (adică șablonul) funcției Număr de numere întregi (șir).

Acum să ne uităm la una dintre opțiunile posibile pentru dezvoltarea unei funcții Număr de numere întregi (șir). În același timp, ne vom familiariza cu câteva funcții încorporate concepute pentru a funcționa cu șiruri.

În primul rând, ar trebui să vă familiarizați cu funcția Cod simbol. Această funcție primește codul caracterului aflat în șirul transmis în poziția cu numărul specificat.

Sintaxă:

Cod caracter(,)

Opțiuni:

(necesar)

(opțional) – acesta este numărul caracterului din linia al cărui cod doriți să obțineți. Numerotarea caracterelor dintr-o linie începe de la 1.

Valoare returnată:
Codul caracterului transmis. Codul este returnat conform codificării Unicode.

Vă rugăm să rețineți că parametrul Există o valoare implicită de 1.

Un șir poate consta și dintr-un caracter. Astfel, este posibil să se determine codul 0 și codul 9, iar codurile tuturor celorlalte cifre sunt, după cum se știe, în intervalul dintre ele.

Să definim variabilele corespunzătoare și valorile acestora:

Code0 = CharacterCode(“0”);
Code9 = CharacterCode(“9”);

Pentru a rezolva problema, alegem următoarea schemă:

  1. Dacă linia conține spații de început sau de final în orice cantitate, atunci vom scăpa de ele cu o funcție specială. În continuare ne vor interesa grupurile de personaje între spațiile interne. Dacă grupul este format din doar cifre, atunci este un număr întreg. Există o funcție specială care poate fi folosită pentru a determina poziția primului spațiu.
  2. Odată ce ai poziția primului spațiu, poți folosi o altă funcție pentru a aduce grupul de caractere (subșir) în stânga spațiului.
  3. Să analizăm personajele care alcătuiesc grupul și să stabilim dacă este un număr întreg. Numerele întregi identificate vor fi însumate într-o variabilă specială.
  4. Să scurtăm linia inițială selectând, folosind o altă funcție, toate caracterele aflate acum în dreapta spațiului. Acest spațiu ar putea fi nu doar unul, ci o serie întreagă de spații pe rând, așa că în linia rămasă, folosiți o funcție specială pentru a scăpa de toate spațiile din stânga (în rând) și reveniți la punctul 2. Vom repeta pași de la punctul 2 la punctul 4 până ajungem la condiția să nu mai rămână spații în linie. În acest caz, șirul scurtat va constitui ultimul grup de caractere analizat.

Acum să ne uităm la funcțiile de care avem nevoie pentru a rezolva problema.

AbbrLP
Sintaxă: AbbrLP()
Opțiuni: (necesar).
Decupează spațiile (caracterele nesemnificative) la stânga primului caracter semnificativ din șir și la dreapta ultimului caracter semnificativ din șir.

Găsi
Sintaxă: Find(,)
Opțiuni: (necesar), (necesar).
Returnează poziția primului caracter al unui subșir găsit.
Numerotarea caracterelor dintr-un șir începe de la 1. Dacă șirul nu conține subșirul specificat, atunci este returnat 0. În cazul nostru, vom folosi un spațiu (“ ”) ca subșir.

un leu
Sintaxă: Lev(,)
Opțiuni: (necesar), (necesar).
Selectează primele caractere din stânga unui șir. Folosind această funcție vom determina grupuri de caractere pentru analiză (de la stânga la primul spațiu).

StrLength
Sintaxă: StrLength()
Opțiuni: (necesar).
Obține numărul de caractere din șir. O vom folosi pentru a determina lungimea unui șir.
Funcţie Cod simbol, pe care îl vom folosi pentru a identifica grupuri de caractere care sunt numere întregi, a fost descris mai devreme.

Dreapta
Sintaxă: Right(,)
Opțiuni: (necesar), (necesar).
Selectează caracterele din dreapta dintr-un șir. Folosind această funcție, vom selecta partea încă neprocesată a șirului.

AbbrL
Sintaxă: abreviere()
Opțiuni: (necesar).
Decupează spațiile (caracterele nesemnificative) la stânga primului caracter semnificativ din șir. Folosim această funcție pentru a elimina posibilele spații din partea stângă a restului șirului.

Mai jos este un posibil algoritm pentru funcția cu comentarii.

Expresii numerice

Variabilele modulelor și detaliile obiectelor bazei de date pot fi numerice.
Există o limită de cifre pentru un număr. Pentru detalii numerice, lungimea părții întregi nu poate depăși 32 de caractere.

Precizia părții fracționale nu poate depăși 10 cifre. Când o variabilă este descrisă și îi este atribuită o valoare numerică, adâncimea sa de biți nu este înregistrată nicăieri. Cu toate acestea, există și limitări pentru variabile.

Asistentul de sintaxă spune că adâncimea maximă de biți permisă pentru un număr este de 38 de caractere. O astfel de restricție nu împiedică decizia niciunuia sarcini economice, adică Orice valoare monetară poate fi descrisă folosind aceste numere.

Cu toate acestea, dacă mai trebuie să descrii cantități mari pentru a rezolva unele probleme matematice, atunci în teoria programării există algoritmi care îți permit să descrii numere cu orice dimensiune pe baza restricțiilor existente.

Operații aplicabile numerelor:

  • operații aritmetice obișnuite (-, +, *, /). Înmulțirea și împărțirea au prioritate față de adunarea și scăderea. Parantezele au cea mai mare prioritate. Există și operatori unari + și -, a căror prioritate vine imediat după paranteze;
  • operațiune „restul diviziunii” (%). De exemplu, 12%5=2;
  • funcții matematice care pot fi utilizate pentru numere (funcții trigonometrice, exponențiere, rădăcină pătrată, rotunjire la o valoare de loc specificată, selectarea părții întregi a unui număr)

Dacă vorbim de acuratețea valorilor numerice, în ceea ce privește detaliile bazei de date, există limitări firești.

Dar în ceea ce privește variabilele, există o particularitate aici. De fapt, puteți opera cu numere foarte mari în variabile, dar valorile cu o lungime a unei părți întregi de cel mult 32 de caractere vor fi stocate în baza de informații.

Valori booleene

În ceea ce privește tipul de date boolean, există doar două valori, True și False, care pot fi obținute în diferite moduri.

Puteți, de exemplu, să utilizați operații de comparare între numere sau date. Ca urmare, se va obține o anumită valoare booleană, care în viitor este folosită cel mai des în instrucțiunile condiționate și operatorii de buclă.

Literale de tipul Date

Există două moduri de a descrie o întâlnire. Una dintre ele folosește un literal. Literalul este scris între ghilimele simple.

Se scrie mai întâi anul, apoi luna și apoi ziua.

Dacă este necesar, puteți specifica și ora, deoarece în sistemul 1C:Enterprise 8, orice dată conține atât data, cât și ora. De exemplu:

DocumentDate = '20140315121020';

Dacă ora nu este specificată, aceasta este implicită la zero. Puteți folosi orice separator în descrierea datei. De exemplu:

DocumentDate = '2014.03.15';

A doua modalitate de a determina data este utilizarea funcției context global Data de(). În acest caz, trecem același lucru ca și parametrii acestei funcție: an, lună, zi separate prin virgule.

De asemenea, puteți specifica ora. Dacă nu îl specificați, va fi implicit începutul zilei.

În sistemul 1C:Enterprise 8, o dată goală este chiar începutul calendarului. Opțiuni de înregistrare:

EmptyDate = '00010101';
EmptyDate = Data(1,1,1);

Ambele intrări vor returna același rezultat, iar această dată va fi considerată goală.

Comoditatea funcției Data de() Ideea este că putem trece în el nu valori specifice, ci unele variabile. Adică, uneori construim o dată prin colectarea diferitelor variabile.

Operația de adăugare este aplicabilă datei. Operația de adăugare adaugă la dată numărul specificat de secunde.

Conversii primitive ale tipurilor de date

Într-o declarație de atribuire în care sunt însumate mai multe variabile (de exemplu, Variabila = A + B + C), este posibilă conversia tipurilor de date primitive. Conversia tipului de date se realizează pe valoarea primului tip de date.

Astfel, dacă primul tip de date este un șir, atunci sistemul va încerca să facă din întreaga expresie un șir. Dacă primul tip de date este un număr, atunci sistemul va încerca să obțină un tip de date numerice.

Și așa, șir + număr = șir. Uneori, un număr poate fi adăugat la un șir, dacă poate fi extrasă o valoare numerică din șir (de exemplu, 123 + „456”).

Pentru tipul de date logic, se aplică următoarele expresii:

Adevărat ȘI 1 = Adevărat;
Adevărat ȘI 0 = Fals.

Orice număr mai mare decât zero este convertit în adevărat, 0 este convertit în fals.

Data poate fi adăugată la număr, după cum sa menționat mai devreme. Datele pot fi adăugate și la tipul de date boolean.

În acest caz, True este convertit la 1 și False la 0.

Pe lângă conversia tipului în operatori, este posibilă conversia explicită a tipului folosind funcțiile corespunzătoare: String(), Number(), Data(), Boolean().

LA Linia orice tip de date este convertit.

Numărul poate fi obținut dintr-un șir sau dintr-un boolean. Conversii booleene: adevărat la 1, fals la 0.

Puteți arunca un șir la Date dacă conține o valoare de dată. De exemplu, Data(„20140315”). După cum sa menționat mai devreme, este posibilă conversia după poziție:

Data de(,).

Puteți converti Number și valoarea booleană în sine în boolean.

Aceste funcții pot fi utilizate în codul programului pentru a efectua conversie explicită de tip.

Tipurile de date primitive Number, String, Date și Boolean pot acționa ca câmpuri de bază de date.

Valori nule și nedefinite

NULL este un literal. Este folosit, de regulă, în interogările bazei de date atunci când două sau mai multe tabele sunt unite.

Înregistrările lipsă din al doilea tabel sunt completate cu o valoare NULL. Acestea. este un fel de valoare lipsă.

În viitor, la procesarea rezultatului rezultat, acest lucru trebuie luat în considerare, deoarece NULL nu este zero, ci tipul de date corespunzător.

Pentru ca o valoare să fie procesată, NULL trebuie să fie turnat la un tip de date obișnuit care poate fi scos sau utilizat în operații aritmetice.

O valoare de tip NULL poate fi obținută și în limbajul încorporat. Puteți defini o variabilă și îi puteți atribui aceasta Valoare NULL. Cu toate acestea, o astfel de atribuire nu este aproape niciodată folosită în codul programului.

Acestea. NULL este de fapt tipul de date care se obține atunci când se lucrează cu interogări. Valoarea NULL în limbajul de interogare trebuie să fie tratată într-un mod special.

Și anume, comparația A=NULL nu va funcționa la nivel de interogare; vor trebui utilizate funcții specializate. Cu toate acestea, în limbajul încorporat, comparația cu valoarea NULL va fi gestionată corect.

Tipul de date Nedefinit este o valoare nevidă a unui atribut.

De exemplu, dacă un atribut de director are o legătură către alt director ca tip de date, atunci valoarea goală a acestui atribut nu va fi egală cu Nedefinit.

Acest tip (Undefined) apare, în primul rând, dacă avem o anumită variabilă și nu este inițializată (tipul de date nu este definit).

Al doilea exemplu: Tipul de date nedefinit este returnat de multe funcții de limbaj încorporate dacă acțiunea nu poate fi efectuată.

De exemplu, căutarea unui element de director după nume dacă un director nu are un astfel de nume de element. Metodă FindByName va returna valoarea Nedefinit.

în care Nedefinit este cuvânt cheie, este evidențiat cu roșu. Acesta este și un literal, pentru scris Nedefinit nu este nevoie să folosiți ghilimele, virgule, paranteze etc.

Dacă există o listă de documente și această listă este goală (în consecință, nu există rânduri în ea), atunci linia curentă va lua valoarea Nedefinit.

Dacă în baza de informatii există un atribut cu un tip de date compus, atunci valoarea goală a acestui atribut va fi egală cu Nedefinit.

Dar dacă tipul de date nu este compus, atunci valoarea goală va corespunde valoare goală de acest tip(pentru o dată, aceasta este prima secundă a primei ore din prima zi a primei luni a primului an).

NULL și Undefined sunt ambele tipuri de date și valori în aceste tipuri, și unul și unul singur. Pentru NULL este valoarea NULL, pentru Undefined este Nedefinit.

Tip de date Tip

Utilizarea principală a acestui tip de date este compararea valorii unei anumite variabile sau a unui atribut al bazei de date cu un anumit tip.

Acestea. În algoritm, trebuie să înțelegeți ce tip este un anumit obiect.

În special, acest tip de date nu are un literal. Nu îl putem scrie ca NULL sau Undefined, dar putem obține valoarea de acest tip folosind două funcții TipȘi TypeValue.

Pentru a obține tipul unui obiect (poate fi o variabilă, sau un atribut de bază de date sau un atribut de formular), funcția este utilizată TypeValue.

Această funcție este transmisă obiectului pentru care doriți să obțineți tipul de date.

Această funcție returnează tipul de tip ca valoare returnată.

Pe viitor, ar trebui comparat cu orice tip de interes. De exemplu:

Dacă TypeValue(Element) = Type (“DirectoryLink.Nomenclature”), atunci
Raport ("Acesta este un produs");
endIf;

În concluzie, să rezumăm tot materialul acoperit.

Ne-am uitat la structurile de bază ale limbajului 1C încorporat, am învățat cum să folosim variabilele și operatorii și ne-am dat seama de ce și cum să folosim procedurile și funcțiile. Rețineți că, practic, tot codul programului nostru până în acest moment a fost autosuficient - am scris totul noi înșine de la zero și am folosit câteva obiecte de configurare sau limbaj încorporat la minimum.

Vom explora aceste obiecte mai detaliat în următorul articol, așa că rămâneți pe fază! ;)