1c Găsiți o poziție în șir. Opțiunile de optimizare sunt nesfârșite

Salutare tuturor
Astăzi, mi-au cerut să tipăresc un document de implementare, să nu prezinte prefixul documentului, sarcina a decis după cum urmează.

Roșul (numărul, leul (numărul, 3), "");

Când m-am uitat în sintaxă-asistent, așa că mi-a plăcut că am vrut să scriu lucrul cu rânduri în "1c: întreprindere".

Linia din 1c se referă la un tip de date primitive.

Dacă vă uitați la ajutorul 1c, vom vedea următoarea descriere a tipului de linie (șir)
Valorile de acest tip conțin un șir în lungimea arbitrară a formatului Unicode.
Dacă în cuvintele voastre despre rânduri, atunci se dovedește. Un șir este o constantă constând din diferite caractere, este întotdeauna încadrată de citate.

Șir de sarcini
Apel \u003d "Hi Pasager";

Liniile multi-line în configurațiile tipice sunt cel mai adesea create folosind un separator vertical "|":
Line \u003d "multi-linie
| Șir
| Scrie
| text ";

Citat în interiorul șirului sunt setate de citate duble.
Rând \u003d "" text în citate "";

Există multe operațiuni pe rânduri (căutați în șirul de livrare, definiția primului, etc.), este mai bine să vedeți sintaxa asistentului.
Asistent de sintaxă - Descrierea generală a limbajului încorporat-\u003e Funcții încorporate-\u003e Funcții pentru lucrul cu rânduri.

Funcții pentru lucrul cu rânduri

Aici, într-o scurtă formă, voi da funcții pentru lucrul cu rânduri:

VREGA (<Строка>) - Toate caracterele de caractere ale șirului se convertește în registrul de sus.

Codeimvol (<Строка>, <НомерСимвола>) - Funcția primește un cod de simbol situat în rândul transmis în poziția cu numărul specificat.

Un leu(<Строка>, <ЧислоСимволов>) - Funcția selectează primul simbol al șirului de stânga.

A găsi(<Строка>, <ПодстрокаПоиска>) - Funcția găsește intrarea șirului dorit ca substring în linia originală.

NREGA (<Строка>) - Funcția convertește toate caracterele șirului la litere mici.

Drepturi (<Строка>, <ЧислоСимволов>) - Această funcție este diferită de funcțiile leului (stânga) prin selectarea ultimelor simboluri ale rândului.

Linie goală (<Строка>) - Funcția verifică șirul pentru prezența unor caractere semnificative.

Simbol(<КодСимвола>) - Funcția convertește codul de simbol într-un șir care conține caracterul.

Sokrel (<Строка>) - Funcția taie caractere nesemnificative în partea stângă a primului caracter de semnificație din rând.

Sokrlp (<Строка>) - Funcția taie caractere nesemnificative care au rămas din primul caracter caracteristic din șir, iar spațiile care sunt dreptate de la ultimul caracter semnificativ din rând.

Copp (<Строка>) - Funcția se taie din caractere nesemnificative în partea dreaptă a ultimului simbol semnificativ din rând.

Medii (<Строка>, <НачальныйНомер>, <ЧислоСимволов>) - funcția selectează șirul de caractere, începând cu simbolul<НачальныйНомер>Cantitate comună<ЧислоСимволов>.

STRDLIN (<Строка>) - Funcția primește numărul de caractere din șir.

Strună (<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>) - Funcția găsește în linia sursă toate intrările substringului de căutare și îl înlocuiește cu substituția de substituție.

Plotchikstka (<Строка>, <НомерСтроки>) - Funcția primește un șir de un șir multi-linie după număr.

Strirling (<Строка>, <ПодстрокаПоиска>) - Funcția calculează numărul de intrări ale substituentului de căutare din linia sursă.

Strokelost (<Строка>) - Funcția consideră numărul de rânduri dintr-un șir multi-linie. Într-un șir cu mai multe linii, șirurile sunt împărțite în simboluri de traducere a șirului.

Trega (<Строка>) - Funcția convertește un șir la registrul de titlu. Aceasta înseamnă că fiecare cuvânt are primul caracter care urmează să fie transformat în registrul de titlu sau în registrul de sus dacă nu este definit registrul de titlu pentru simbol. Caracterele rămase sunt convertite în registrul inferior.

Tip conversie
Pentru a converti în mod explicit tipurile de date, funcțiile de același nume cu tipul de date la care are loc conversia: șir (<Значение>)

Calea de șir \u003d rând (număr);

Toate aceste caracteristici sunt descrise în detaliu în sintaxa asistentului, deoarece un programator de novice poate ajuta sintaxa asistentului, am descris în articol.

Exemple de lucru cu rânduri

Conversia numărului în șir și înapoi.

Pentru a obține o reprezentare a șirului anului, utilizați funcția de format.

Anul \u003d Format (CurrentData (), "df \u003d yyyy") // an \u003d "2012"

Pentru a converti un număr la un șir fără a introduce un simbol de separare a grupului (spațiu inseparabil), trebuie să aplicați funcția de format cu parametrul NG \u003d 0:

Număr \u003d 2012 rând \u003d Format (număr, "чHG \u003d 0"); // rând \u003d "2012"

Rând fără spații.

Numele meu este Pavel Barkets, lucrez la SoftPoint. De mai bine de 10 ani am rezolvat sarcini de optimizare a performanței. Și în ciuda numărului mare de probleme rezolvate, numărul lor nu este redus, dar crește în progresie geometrică. Volumele de date Creșterea și sarcinile pentru optimizarea lucrărilor cu aceste date sunt complicate. Acest proces este inevitabil.

Subiect de articol - abordările netriviale ale optimizării. O sa fie luat in considerare două aspecte:

  • Primul - căutați stres. Utilizatorii o folosesc adesea, iar mulți, probabil, au întâlnit deja o așteptare semnificativă, căutarea substringului nu este suficient de efectuată.
  • Al doilea - realizarea documentelor mari, cum ar fi închiderea lunii, calculul costului. Desigur, mulți au întâlnit faptul că contabilii cheltuiesc aceste documente timp de 5-9 ore, noaptea și nu timp. Cel mai interesant lucru este că metodele clasice de optimizare nu vă ajută întotdeauna. Dacă, atunci când efectuați astfel de documente, executați în măsurarea măsurătorilor de depanare, veți vedea că cea mai mare cantitate de timp este cheltuită pentru scrierea unor structuri temporare sau reale - tabele, registre etc. Și este imposibil să rezolvăm această sarcină cu metode clasice.

Căutați stres

Primul subiect - Căutați stres. În acest an am venit de mai multe ori cu probleme la această operațiune. Veniți la compania de asigurări pentru extinderea politicii, vă este oferit să găsiți la numărul de telefon. Este clar că aceasta nu este o căutare clasică pe numărul complet de telefon, deoarece utilizatorul ar putea avea un număr peste opt, printr-un șapte sau într-un fel, căutând numere ale camerei. În acest caz, se utilizează operațiuni de căutare pe termen lung - într-o serie de situații, întârzierea poate fi câteva secunde și poate veni până la câteva minute.

Căutați caractere inițiale

Voi începe cu primul exemplu atunci când căutarea este efectuată utilizând caractere inițiale. Acesta este un caz special de găsire a unui substring atunci când utilizatorul știe exact că valoarea dorită începe cu anumite caractere.

Căutarea caracterelor inițiale este implementată în 1c utilizând echipa ca (sau într-o versiune în limba engleză, cum ar fi), indicând valoarea cu "%" la sfârșit ("%" desemnează o secvență de orice alte caractere). De exemplu, căutăm:

Numele ca "Ivano%"

Rețineți că dacă aveți un index în acest domeniu în sistem, atunci căutarea indexului va fi utilizată în interogarea SQL - Aceasta este o căutare după index.

Condiția "ca bara de căutare" este echivalentă cu căutarea în intervalul de valori. Într-un caz particular, când căutăm "Ivano%" - aceasta este echivalentă cu căutarea în gama de nume de familie, care începe la "Ivano", și, terminând cu "Ivanp" (deoarece simbolul "P" merge după Simbolul "O").

Optimizatorii moderni convertesc în mod independent cum ar fi solicitarea de căutare a cererii de interogare. Prin urmare, dacă aveți un index în acest domeniu în sistem, veți primi un astfel de rezultat atunci când interpretați interogarea în termeni de condiții SQL - optimizatorul va trimite o cerere de la cum ar fi sub forma unei căutări după gama.

Astfel, puteți exercita o căutare rapidă clasică utilizând un index (căutați index). Nu există probleme cu acest lucru sau să le rezolvăm într-un mod simplu.

Căutați introducerea

Acum, luați un exemplu mai complicat atunci când este necunoscut, în care locația liniei este valoarea dorită și o căutare pentru intrarea rândului este implementată. În acest caz, în interogarea "ca" "%" se află pe ambele părți.

Când convertiți o astfel de interogare în SQL, vedem că numai schimbările de comandă (în valoare există deja două "%").

Luați în considerare detaliile planului de execuție. Aici vedem același index, dar în acest caz nu funcționează eficient.

Faptul este că indicele pe numele cărții de referință, pe care îl considerăm, constă în mai multe domenii.

  • Primul dintre ele este separatorul contabil.
  • Mai mult merge direct câmpul de căutare.

Și, prin urmare, când "căutarea indexului" este afișată în termeni de execuție, înseamnă asta căutarea se face în primul câmp de separator - pe diapozitivul de mai sus puteți vedea asta căutarea în valoarea descrisă dorită nu este absolut utilizată.

Ce să faci în această situație? Am avut foarte des în practică că utilizatorii au interzis utilizarea cererilor de intrare. Și utilizatorii din unele cazuri înșiși nu au folosit această funcție, deoarece timpul de execuție este foarte semnificativ și trebuie să continuați să lucrați. Prin urmare, au trebuit să fie răsucite în alte moduri - au ales în listele, au încercat să găsească pe primele personaje și așa mai departe.

Dar acest lucru duce la nemulțumire față de funcționalitatea și percepția necorespunzătoare a sistemului. Utilizatorul înțelege că sistemul nu poate face față unui lucru și nu funcționează așa cum ar trebui să fie. Nu este corect.

Abordarea nontrivială pentru rezolvarea sarcinii de a găsi un substring

Să luăm în considerare acum abordarea nontrivială pentru rezolvarea acestei sarcini.

Denotă de o serie de toleranțe:

  • În primul rând - de la modern discurile au o dimensiune nelimitată, Să presupunem că spațiul de pe disc pe care îl puteți folosi, aveți destul de mare.
  • Al doilea - utilizatorul caută niciun simboluri, ci pentru un fragment. De exemplu, niciunul dintre noi nu caută "Al" - este o selectivitate prea mică. Căutând o secvență semnificativă de caractere. Aici am ales căutarea a șase simboluri.

Un exemplu de linie dorită "Alexe" a fost înregistrată în formă și ar fi testată cu ea.

  • Să presupunem că avem un domeniu cu numele, numele și patronimic al clientului. Primul pas, am stabilit automat această valoare fragmentelor de șase simboluri cu o schimbare "1"Și obținem o serie de fragmente (vezi mai sus), care aparțin întotdeauna valorii dorite. Avem fragmente care pot intra teoretic la utilizator. Și anume, în trecut, diapozitivul a determinat că căutăm șase caractere. Pot exista cinci dintre ele și patru, doar dimensiunea structurii va fi mai mult.

  • În al doilea pas, noi noi scriem aceste seturi într-o structură separată (Acesta poate fi un tabel, un registru de informații etc.) și obțineți un eșantion în care un anumit fragment aparține valorilor diferite.

  • Și în al treilea pas, noi, atunci când căutăm un substring la proiectarea cererii 1C, adăugați o condiție suplimentară "și", care filtrează numărul de combinații posibile și scoateți din această structură suplimentară (acesta poate fi registrul de informații ) toate elementele la care se găsesc fragmentele necesare.

De exemplu, utilizatorul caută un client cu numele de familie "soldați". Aceasta este opt caractere, înseamnă că vor exista trei fragmente în șase caractere, pe care le căutăm în structura serviciului. Apoi, combinați totul în interogare. Astfel, se obține filtrarea suplimentară.

Ca rezultat, vom scăpa de semnul "%" (adică, în fața acestor fragmente, simbolul de care avem nevoie va fi întotdeauna), iar atunci când efectuați o cerere internă va fi un index caută, pentru care am luptat.

În practică, se pare o poveste foarte interesantă - accelerarea în zeci, sute de ori. Mai mult, toate acestea se pot face cu mijloacele 1C, care este foarte frumos. Nu va trebui să rescrieți logica, utilizatorul se va bucura că interogarea de căutare accelerată. În exemplul, accelerația de la 4 secunde la 0,05 secunde, și dacă inițial am avut o cerere de două minute, ar fi fost executată mai puțin de o secundă.

Mecanismul pe care l-am arătat nu este un exemplu experimental, lucrează deja pentru clienții reali.

Activități pregătitoare

Acum vă voi spune despre activitățile pregătitoare.

  • Primul este necesar să se umple valorile inițiale ale înregistrării.. Pentru a face acest lucru, trebuie să programați fereastra de reglementare.
  • Apoi, trebuie să respectăm consistența datelor - acest lucru înseamnă trebuie să existe un abonament pentru a schimba valoareaAstfel încât aceste fragmente să fie reconstruite automat.
  • Și ultima - adăugați un formular de căutare standard.

Umplerea registrului se poate face atât prin 1c, cât și cu SQL.

Pot spune că umplerea unei astfel de structuri pentru 17 milioane de valori ocupă undeva 20-25 de minute. În mod natural, utilizatorii din acest moment nu ar trebui să schimbe valorile directorului.

Dacă vom calcula pentru un milion de valori de undeva 100 de caractere de 6 în fragment, se va dovedi undeva 4,7 GB. Trebuie să planificați astfel încât locul pe care îl aveți. Dacă aveți în directorul dvs., de exemplu, 100 de milioane de valori, atunci trebuie să programați un loc care va fi disponibil pe disc.

Necesitatea de a ține seama de statisticile privind popularitatea fragmentelor

Această metodă funcționează întotdeauna rapid?

Acest lucru este influențat statistici ale fragmentelor de popularitate.

  • De exemplu, aveți un fragment "Alex", care poate intra în numele lui Alexey, la numele de mijloc Alekseevich, în numele lui Alekseenko, etc. Acest fragment poate fi de 50-100 mii de intrări.
  • Și există fragmente rareori folosite.

Astfel, apar statistici privind popularitatea în fragmente.

Rețineți că dacă popularitatea fragmentelor este scăzută (100 de elemente), atunci primim accelerație - 0,1 secunde.

Dacă substringul este destul de popular (50 de mii de elemente), atunci obținem degradareaȘi mult mai mare decât dacă nu a existat o optimizare.

În acest fel, este necesar să se facă o schemă îmbunătățită de execuție a interogăriiîn care am fi primit mai întâi valoarea popularității subquerice. Acest lucru se face cu trei cinci linii în 1c. În același timp, știm exact că, dacă șirul este nepopular, atunci merge în prima ramură și, dacă este popular, apoi pe al doilea.

Cum funcționează accelerația? Căutarea căutării de la formular este în curs de desfășurare, apoi facem apel la înregistrarea informațiilor cu statistici, obținem un element și alegem în continuare ce să utilizați este o interogare clasică sau accelerată.

Și acum să ne uităm la modul în care solicitarea SQL este efectuată pe serverul SQL.

Slide prezintă o schemă simplificată:

  • solicitați optimizatorului;
  • ne uităm la statisticile pe teren care sunt utilizate în cerere;
  • alegem ce plan de executare de utilizat, adică selectați strategia de execuție a interogării (de exemplu, ciclul investit).

Care este schema implementată de noi?

  • Am făcut propria ta index. Nu este un indice standard SQL, nu index 1c, ci indexul său necesar pentru a rezolva această problemă;
  • Mai mult, sa ciocnit cu ceea ce are nevoie de propria lor statistici;
  • Și aveți nevoie de propria voastră optimizer.care, conform acestei statistici, decide ce fir să aleagă.

Pe baza acestei logici, se poate spune că acest proces dezvăluie semnificația a ceea ce indicii, statisticile și optimizatorul sunt pentru noi.

Cine nu știa ce să servească statistici în SQL, uită-te la această logică și vei înțelege că, dacă este greșit sau irelevant, atunci vom merge pe o ramură greșită. Interogarea va încetini. Înțelegem cum să servim calitativ și corect statisticile - aceasta afectează productivitatea, pe index.

Dacă nu există index - vom scana toate valorile.

Astfel, am creat cel puțin primitiv, dar optimizatorul tău. Putem spune că au urmărit "pe degete" cum face doamna SQL și alte DBM-uri și creând propriile structuri.

Accelerarea documentelor "mari"

Voi merge la al doilea subiect - accelerarea documentelor mari.

Suntem adesea confruntați cu unele proceduri de reglementare ca: închiderea lunii, raportul agentului, calculul costului. Aceste documente grele și masive sunt efectuate și se completează o cantitate considerabilă de timp. Și când ne uităm la debugger și facem următorul operațiuni, vedem asta Linia 1c introduce valorile într-o anumită masă și timpul principal se datorează acestuia.. Și este imposibil să faci nimic despre asta. Singura recomandare care poate fi oferită este să accelereze discul (eficacitatea acestei soluții este foarte dubioasă și necesită o analiză preliminară).

Propun să mă întorc la poveste și să ia în considerare cum sa făcut în 1c, Începând de la 8,0 la 8,3 - acest lucru a fost făcut după linie. Serverul SQL a analizat cererea de fiecare dată, a procesat-o, a creat planul de execuție, adăugat, a trimis comanda la 1c de succes și a primit următoarea solicitare. Și un astfel de pas cu pas a mers de la serverul de aplicații 1c la MS SQL.

Este clar că, dacă aveți 40 de înregistrări în document, nu ar trebui să existe probleme. Dacă aveți 10 mii și mai multe înregistrări (există organizații în cazul în care în documentele de reglementare, un milion de înregistrări), atunci acest proces durează foarte mult timp. O intrare este procesată foarte repede, dar în document sunt prea multe. Ce sunt deasupra capului? În rețea, pe execuția interogării, la semnalul de returnare, la procesarea acestui semnal în sistemul 1C, suma celor patru etape. Toate etapele sunt rezumate, multiplicate cu un milion de linii, iar așteptările noastre de lungă durată sunt obținute. Este clar că nu este teribil.

În 1c, începând cu 8,3, se fac îmbunătățiri. Acum, cererea de inserare în tabele temporare și în registrele de informații este pregătită pe serverul SQL și execuția sa suplimentară are loc cu ajutorul apelurilor clasice RPC, unde furnizorul de acces 1C în sine (nativ sau Ole DB) înregistrează și le inserează prin Năre (de obicei 100 de linii).

Astfel, o accelerație este realizată de la 30% la 300%. Dar nu este încă suficient, pentru că astăzi aveți 10 mii de linii, mâine este de 20 de mii de linii. Aceasta nu este o soluție fundamentală a problemei, încă o întâlnești, dar doar șase luni / an.

Ce cel mai rapid insetat în serverul SQL și într-adevăr în orice DBMS?

aceasta Inserție în vrac.. În inserția 1C este utilizată, dar pentru alte sarcini. Lucrul cu documentele "mari" ar dori, de asemenea, să accelereze prin consolidarea inserțiilor de inserții și adăugarea de intrări cu o singură matrice în baza de date SQL Server.

Să vedem ce efect este atins. În acest exemplu primit accelerația undeva de 5 ori, dar puteți accelera și de 10 ori. Teoretic, principala problemă, astfel încât accelerează este mult mai puternică - aceasta este viteza discului. Discul poate fi un blocaj.

De asemenea este important să vă amintiți despre un astfel de criteriu ca indexuri.. Dacă am fost introduse de introducerea în vrac în tabel fără a actualiza indexurile, am fi primit o accelerație semnificativă (rezultatul este mai mic de o secundă). Aici obținem 69 de secunde datorită faptului că fiecare inserție din tabel necesită indicele de reîmprospătare.

În orice caz, această metodă permite realizarea unui efect de 5-10 ori.

În plus, astfel de oportunități nu sunt considerate aici ca partiționarea, partiționarea. Ar fi posibil să se îmbunătățească situația dacă am știut că inserția în vrac a fost introdusă în perioada curentă și am scos partiția irelevantă la o altă partiție. Ar fi chiar mai mare efect. Se pare că accelerația este foarte bună.

Opțiunile de optimizare sunt nesfârșite

În acest fel, opțiunile de optimizare sunt nesfârșite. Singurul lucru nu este de a vă implica. Înainte de optimizare, întotdeauna are sens să se calculeze dacă fie efectul dorit va fi fie. De asemenea, aș sfătui în anumite situații de a "ridica" asupra problemei, nu folosesc metode clasice pentru optimizarea cererii și unele complet diferite, care pot aduce un rezultat mai semnificativ.

****************

Acest articol este scris în conformitate cu raportul raportului () Citiți la Conferința comunitară a evenimentului InfoStart 2017.

Linii în 1c 8.3 în limba încorporată 1C sunt valori de tip primitiv Linia. Valorile de acest tip conțin un șir în lungimea arbitrară a formatului Unicode. Variabilele de șir sunt un set de caractere închise în citate.

Exemplul 1. Creați o variabilă de șir cu text.

Row-Free \u003d "Bună ziua World!";

Funcții de lucru cu linii în 1c 8.3

Această secțiune va conține funcții de bază care vă permit să schimbați liniile în 1c sau să analizați informațiile conținute în ele.

Strotina.

STRDLIN (<Строка>) . Returnează numărul de caractere conținute în șirul transmis în parametru.

Exemplul 2. Calculați numărul de caractere din șirul "Hello World!".

Rând \u003d "Bună ziua în lume!"; Martensums \u003d Sondin (șir); Raport (citație);

Rezultatul executării acestui cod va afișa numărul de caractere ale șirului: 11.

Sokrel.

Sokrel (<Строка>) . Se taie din caractere nesemnificative în partea stângă a primului simbol de semnificație din rând.
Simboluri neinformate:

  • spaţiu;
  • spațiu fără scutire;
  • tabulare;
  • Întoarcerea transportului;
  • traducere de linie;
  • traducere de formular (pagini).

Exemplul 3. Îndepărtați toate spațiile din partea stângă a liniei "Lumea!" Și atașați-o la linia "Bună ziua".

Linia \u003d sokrel ("pace!"); Rând \u003d "salut" + linie; Raport (șir);

Rezultatul executării acestui cod va fi emis pe ecranul "Bună Mir!".

Socrp.

Copp (<Строка>) . Tăiați din caractere nesemnificative în partea dreaptă a primului simbol de semnificație din rând.

Exemplul 4. Pentru a forma din rândul "Hi" și "Pace!" Expresie "Bună ziua!"

Row \u003d Cropp ("Hi") + "" + Sokrel ("pace!"); Raport (șir);

Sokrlp.

Sokrlp (<Строка>) . Tăiește de caractere nesemnificative în partea dreaptă a primului simbol de semnificație din rând, se taie, de asemenea, din caractere nesemnificative la stânga primului caracter semnificativ din rând. Această funcție este utilizată mai des decât cele două precedente, deoarece este mai versatilă.

Exemplul 5. Îndepărtați caracterele nesemnificative care stau în stânga și la dreapta în numele contrapartidei.

Contrapartidă \u003d referințe. Protects. Enti-mișcare ("Inn", "0777121211"); Contrapartidă \u003d contrapartidă. Obiect de turnare (); Contrapartidă. Nume \u003d Coolp (contrapartidă. Nume); Contrapartidă. Pentru a recruta ();

un leu

Un leu(<Строка>, <ЧислоСимволов>) . Obține primele caractere șir, numărul de caractere este indicat în parametru Slovesmiths.

Exemplul 6. Lăsați în structură Angajat Conține numele, prenumele și numele intermediar al angajatului. Obțineți un șir cu numele și inițialele.

Date inițiale \u003d leu (angajat. Adică, 1); Inițialitate \u003d leu (angajat. Delicații, 1); Îndepliniți \u003d angajat.familia + "" + inițial și "." " + Inițialitate + "";

Dreapta

Drepturi (<Строка>, <ЧислоСимволов>) . Primește cele mai recente simboluri de șir, numărul de caractere este indicat în parametru Slovesmiths. Dacă numărul specificat de caractere depășește lungimea liniei, atunci întregul șir este returnat.

Exemplul 7. Lăsați data în formatul "GGHHMDD" la sfârșitul variabilei de șir, pentru a obține o linie cu data și a le converti la tip Data.

Linie \u003d "Data curentă: 20170910"; Strfedate \u003d drepturi (șir, 8); Data \u003d Data (StrFewar);

Mass-media

Medii (<Строка>, <НачальныйНомер>, <ЧислоСимволов>) . Devine un substring din rândul transmis în parametru Liniaîncepând cu numărul de caractere care este specificat în parametru Lansare și lungimea transmisă la parametru Slovesmiths.Numerotarea caracterelor în șir începe cu 1. Dacă în parametru Lansare Valoarea este mai mică sau egală cu zero, parametrul ia valoarea 1. Dacă parametrul Nizalimvol. Nu este specificat, atunci simbolurile sunt selectate până la sfârșitul liniei.

Exemplul 8. Să presupunem că, în variabila de șir, pornind de la poziția a nouă, conține codul regiunii, trebuie să-l obțineți și să îl scrieți într-un șir separat.

Linia \u003d "Regiunea: 99 Moscova"; Regiune \u003d Media (șir, 9, 2);

STRNET.

STRNET.<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>) . Căutări pentru substringul specificat în șir, returnează numărul de poziție al primului personaj găsit Substring găsit. Luați în considerare parametrii acestei caracteristici:

  • Linia. Linia sursă;
  • Substream. Substring dorit;
  • Direcţie. Specifică direcția de a căuta substringul în rând. Pot lua valori:
    • Direcţie;
    • Direcţie;
  • Stagnare. Specifică poziția în șirul de la care începe căutarea;
  • Părere. Indică numărul de intrare al substringului dorit în linia sursă.

Exemplul 9. În linia "Bună ziua Lumea!" Determinați poziția ultimei introducere a simbolului "și".

Drize \u003d strnet ("salut mir!", "Și", direcție de la .Conssion); Raport (alimentator);

Rezultatul executării acestui cod va fi emis la numărul de ecran al ultimei introducere a simbolului "și": 9.

Ușoară

VREGA (<Строка>) . Convertește toate caracterele șirului specificat în 1C 8 în registrul de sus.

Exemplul 10. Transformați linia "Hello Mir!" În registrul de sus.

Gamad \u003d LAG ("Bună ziua!"); Raport (canal);

Rezultatul executării acestui cod va fi emis pe ecranul liniei "Hello Peace!"

Nreg.

NREGA (<Строка>) . Convertește toate caracterele șirului specificat în 1c 8 la registrul inferior.

Exemplul 11. Transformați un șir "Hello Mir!" la registrul inferior.

Strochanneg \u003d Nreg ("Bună ziua pipi!"); Raport (canal);

Rezultatul executării acestui cod va fi emis pe ecranul liniei "Hello Peace!"

Treg.

Trega (<Строка>) . Convertește un șir după cum urmează: Primul simbol al fiecărui cuvânt este tradus în majuscule, cuvintele rămase ale cuvântului sunt traduse în registrul inferior.

Exemplul 12. Faceți capetele primelor litere de cuvinte din linia "Bună ziua în lume!".

STINKATEG \u003d TREG ("HELLO PEACE!"); Raport (Stinkateg);

Rezultatul executării acestui cod va fi emis pe ecranul liniei "Bună ziua Lumea!"

Simbol

Simbol(<КодСимвола>) . Primește un simbol pe codul său în codarea Unicod.

Exemplul 13. Adăugați la stânga și spre dreapta la linia "Bună ziua!" Simbol ★.

String Pasaje \u003d Simbol ("9733") + "Bună ziua World!" + Simbol ("9733"); Raport (pasaje de șir);

Rezultatul executării acestui cod va fi afișat pe ecranul șirului "★ HI PEACE! ★"

Kodsimvol.

Codeimvol (<Строка>, <НомерСимвола>) . Obține un cod de simbol în UniCode Codificarea de la un șir de unghi specificat în primul parametru situat în poziția specificată în cel de-al doilea parametru.

Exemplul 14. Aflați codul ultimului simbol din linia "Hi World!".

Rând \u003d "Bună ziua în lume!"; CodeImpol \u003d CodeImpol (șir, Ștergere (șir)); Raport (CodeImpol);

Rezultatul executării acestui cod va fi emis la codul de simbol "!" - 33.

Linia goală

Linie goală (<Строка>) . Verifică dacă șirul este numai de la personaje nesemnificative, adică dacă este gol.

Exemplul 15. Verificați dacă șirul gol este alcătuit din trei spații.

Goală \u003d mutată (""); Raport (gol);

Rezultatul executării acestui cod va fi emis pe ecranul "Da" (expresia șirului de valoare logică Adevărat).

Strună

Strună (<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>) . Se găsește în linia originală toate intrările de substring de căutare și îl înlocuiește cu substituția de substituție.

Exemplul 16. În linia "Bună ziua Lumea!" Înlocuiți cuvântul "lume" pe cuvântul "prieteni".

Row \u003d Rust ("Hello Mir!", "MIR", "Prieteni"); Raport (șir);

Rezultatul executării acestui cod va fi transmis pe ecranul "Bună prieteni!"

Strostroke.ro

Strokelost (<Строка>) . Vă permite să calculați numărul de rânduri dintr-un șir multi-linie. Pentru a merge la un șir nou în 1C 8, se utilizează un simbol. PS. (simbolul de traducere șir).

Exemplul 17. Determinați numărul de rânduri din text:
"Prima linie
Al doilea șir
A treia linie »

Numărul \u003d coșul Subut (primul rând "+ simboluri. PC +" A doua linie "+ caractere. PC +" al treilea șir "); Raport (număr);

Rezultatul executării acestui cod va fi emis la numărul de rânduri din text: 3

Plugulastrik.

Plotchikstka (<Строка>, <НомерСтроки>) . Primește un șir într-un șir multi-linie după numărul său. Numărul de numere a rândului începe cu 1.

Exemplul 18. Obțineți ultimul șir în text:
"Prima linie
Al doilea șir
A treia linie »

Text \u003d "Prima linie" + caractere. PC + "A doua linie" + caractere. FS + "al treilea rând"; Lastastargh \u003d Plisproktriktkkkkk (text, stroking (text)); Raport (ultima dată);

Rezultatul executării acestui cod va fi emis la ecranul liniei "al treilea rând".

Strirling.

Strirling (<Строка>, <ПодстрокаПоиска>) . Returnează numărul de intrări ale substringului specificat în șir. Funcția este sensibilă la registru.

Exemplul 19. Determinați de câte ori intră în șirul din 1c 8.3 și 8.2. Scrisoarea "C", indiferent de registrul său.

Rând \u003d "rânduri în 1c 8.3 și 8.2"; Numere \u003d etichetă (Lag (șir), "C"); Raport (cifre);

Rezultatul executării acestui cod va emite numărul de intrări: 2.

Programată

Rone (<Строка>, <СтрокаПоиска>) . Verifică dacă șirul a trecut în primul parametru, de la rândul din al doilea parametru.

Exemplul 20. Determinați dacă hanul omologului selectat este pornit cu numărul 1. Lăsați în variabila Contrapartidă Contrapartide.

Inn \u003d contrapartită.inn; Începe împreună \u003d rriniat (Inn, "1"); Dacă începe la atunci // sa încheiat codul;

Strazanacivna.

(<Строка>, <СтрокаПоиска>) . Verifică dacă șirul sa încheiat în primul parametru, pe linia din al doilea parametru.

Exemplul 21. Determinați dacă hanul omologului selectat se termină cu figura 2. Lăsați în variabila Contrapartidălink stocat la elementul director Contrapartide.

Inn \u003d contrapartită.inn; Supapele Sfarete \u003d Strasting (Inn, "2"); Dacă îl terminați atunci // codul dvs. sa încheiat;

Curea

Încordare<Строка>, <Разделитель>, <ВключатьПустые>) . Puneți șirul de pe partea în funcție de simbolurile separator specificate și înregistrează corzile rezultate într-o matrice. În primul parametru, linia sursă este stocată, în a doua linie care conține separatorul, în a treia este indicat dacă să înregistreze linii goale la matrice (în mod implicit Adevărat).

Exemplul 22. Să avem un șir care conține numerele separate de simbolul "", să obțină o serie de numere din șir.

Rând \u003d "1; 2; 3"; Array \u003d curea (șir, ";"); Pentru SCH \u003d 0 printr-o matrice. Număr () - 1 încercare de ciclu [SCH] \u003d Număr (Crolp (Array [SCH])); Excepție matrice [SCH] \u003d 0; Endrequency endropset;

Ca rezultat al executării, se va obține o matrice cu numere de la 1 la 3.

Accident vascular cerebral

Stroen.<Строки>, <Разделитель>) . Convertește o serie de rânduri de la primul parametru la șirul care conține toate elementele matricei prin separatorul specificat în al doilea parametru.

Exemplul 23. Folosind o serie de numere din exemplul anterior, pentru a obține șirul original.

Pentru SCH \u003d 0 printr-o matrice. Număr () - 1 Ciclu Array [SCH] \u003d șir (matrice [SCH]); Endcycle; Linia \u003d cursa (matrice, ";");

În acest articol, vă voi spune despre funcția de căutare rapidă 1c Enterprise 8. Ce este o căutare rapidă? Foarte simplu. Căutarea rapidă este una dintre modalitățile de navigare în liste mari de înregistrări 1C. Acestea pot fi liste de documente, directoare, registre sunt tot ceea ce este reprezentat de tabele.

Ce este o căutare rapidă?

Funcția de căutare rapidă din documentele 1c Enterprise este extrem de convenabilă și vă permite să nu derulați prin intermediul unor matrice de date uriașe (de exemplu, utilizând bara de defilare) și accesați imediat locația dorită din listă. Din păcate, utilizatorii de novici de 1C întreprindere 8 (inclusiv 1c contabilitate 8) inițial nu utilizează capacitatea de a căuta rapid, preferând să răsturneze manual listele de documente (și pot fi foarte mare). Acest articol vă va ajuta să vă ocupați de utilizarea unei căutări rapide în 1c.

În primul rând, trebuie remarcat faptul că în configurațiile 1C Enterprise 8 construite pe forme gestionate, căutarea rapidă funcționează altfel decât în \u200b\u200bversiunile anterioare de la 1c. Prin urmare, vom analiza separat utilizarea căutării rapide în forme gestionate și în mod obișnuit.

Căutare rapidă în contabilitatea 1c 8.2

În versiuni ale contabilității 1c de la 8,0 la 8.2 Funcția este destinată tranziție La partea dorită a listei. De exemplu, uitați-vă la fereastra planului de cont afișată în figură.


Fereastra a subliniat un rând. Acordați atenție triunghiului neautorizat de la benzile la care indică săgeata roșie. Ca și în alte programe Windows, unde există liste (de exemplu, în dirijor), poziția acestui marker (triunghi) determină sortarea listei ca întreg - În ce coloană este instalată marcajul, pe aceeași și întreaga listă va fi sortată. În figură, marcajul este în coloana de cod, prin urmare, factura de cont va fi sortată prin cod.

Markerul poate fi mutat de la o coloană la alta, stângace pe coloana dorită ( pe coloana de rubrică!) Șoarece. Dacă marcajul este deja în coloana curentă, atunci clicul va duce la o schimbare în direcția de sortare la opusul (adică, de la mai mult la un mai mic sau invers). Acesta este un comportament standard pentru orice programe Windows. Care este caracteristica acestui marker în întreprinderea 1C și cum este legată de căutarea rapidă?

Căutarea rapidă în listele 1C Enterprise 8 este realizată de coloană în care markerul este în picioare. În acest caz, căutarea rapidă în planul de cont va fi realizată prin codul coloanei.

A existat o parte importantă a articolului, dar fără JavaScript nu este vizibil!

Cum să vă bucurați de căutarea rapidă în 1c? Uşor! Începeți să imprimați ce doriți să găsiți în această coloană.. Unde există un marker. În exemplul, în figura de mai sus, trebuie să introduceți numărul contului. De exemplu, doriți să găsiți un scor de 50 de casier. În acest caz, introduceți ( mouse Faceți clic pe nicăieri!) Numărul 50 de la tastatură și dacă în această coloană există un cont cu același număr (și este, desigur, este), apoi lista derulează la această linie, iar șirul însuși va fi dedicat. Rezultatul este afișat în ecranul planului de cont de mai jos.

site-ul web

Textul pe care indică săgeata, nu trebuie să mă spăl - El va dispărea.

Dacă începeți să introduceți cuvântul "bilet" în exemplul de mai sus, textul din partea de jos a ferestrei va fi introdus și apoi stivuit. Se întâmplă deoarece, de îndată ce start Șirul de căutare rapid introdus încetează să se potrivească cu începutul cel puțin unei linii din această coloană, 1C întreprindere concluzionează că linia dorită nu se găsește și o șterge automat. Cu privire la ar trebui să vă amintiți două reguli.

În 1C Enterprise 8 Căutarea rapidă se face la începutul liniei, adică. Coloana este căutată pentru o coincidență a textului de intrare cu începutul uneia dintre rândurile acestei coloane.
Aceasta implică o recomandare importantă: la introducerea datelor la cărți de referință, apelați elementele astfel încât să fie convenabil să căutați cu Căutare rapidă. De exemplu, numele contrapartidei este mai bine să scrieți ca "NAMEFIRMA LLC" decât "LLC NAMEFIRMA. Și chiar mai mult, nu ar trebui să utilizați citate și alte caractere inutile în nume (vorbim despre umplerea numelui în forme).

Dacă ați început să introduceți text, și este șters - ceea ce căutați lipsesc în această coloană! În acest caz, verificați limba de introducere, precum și coloana în care se efectuează o căutare rapidă. O eroare tipică - nu coloana este selectată. De exemplu, markerul este instalat în coloana de cod, iar căutarea este făcută de numele contului.

Căutare rapidă în 1c Contabilitate 8.3

Acum, să vedem care este diferența dintre o căutare rapidă în versiunea 1c Enterprise 8.3. Utilizarea este în mare parte similară cu versiunea 8.2, dar există o diferență semnificativă care ar trebui să fie amintită.

În contabilitatea 1C 8.3, precum și în orice alte configurații pe formularele gestionate (cea mai nouă interfață) funcționează ca filtru. Pur și simplu puneți, ca urmare a unei funcții de căutare rapidă, o parte a listei ascunzând..

Cum să-l folosești, vă vom da seama cu dvs. acum. Pentru a începe, uitați-vă la captura de ecran a planului de cont Contabilitate 1C 8.3, care este redus mai jos.

site-ul web

După cum puteți vedea, același marker într-una din coloane. Căutarea este de asemenea realizată de coloana în care este instalat markerul. Totul rămâne neschimbat. Cu toate acestea, dacă începeți să introduceți textul (în exemplul, numărul contului), atunci vor apărea următoarele.

site-ul web

După cum puteți vedea, caseta de căutare a fost deschisă automat. Aceeași fereastră se va deschide dacă faceți clic pe butonul de căutare din bara de instrumente Fereastră (în figura este subliniată). Ca rezultat, când faceți clic în fereastra de căutare, găsiți Găsirea (în imagine este ascunsă în spatele meniului derulant) sau trebuie doar să introduceți, apoi obțineți următorul rezultat.

site-ul web

Se pare ca căutarea rapidă în contabilitatea 1c 8.3 Lasă doar partea vizibilă a listei care satisface condițiile de căutare. În acest caz, butonul de căutare dispare și, în schimb, apare o lentilă cu o cruce (în fig. Stresat), când faceți clic pe care lista revine la starea originală (șirul găsit ca rezultat al căutării rapide rămâne evidențiată) .

O altă caracteristică importantă a căutării rapide în contabilitatea 1C 8.3 - Coincidența nu caută în partea de sus a liniei, ca în versiunea 8.2, dar este o căutare pentru o coincidență cu orice parte a rândurilor din coloană. Astfel, dacă contrapartida se numește "Ltd.phirma LLC", și când căutați să începeți să introduceți "NameFirma LLC", atunci va fi încă un șir!

Desăvârșim concluzii

Astfel, o căutare rapidă în contabilitatea 1c 8.2 și versiunile anterioare este destinată să derulați lista pe linia dorită și în contabilitatea 1c 8.3 Căutarea rapidă funcționează ca un filtru obișnuit, ascunzând o parte inutilă a listei.