1s 8 paketni zahtjev. Grupni zahtjevi za lutke

Pogledajmo kako je sintaksa tekstova upita promijenjena (ili bolje rečeno dopunjena) koristeći jednostavan primjer: Dokument se obrađuje Expendable koji se nalaze u tabelarnom delu Roba spisak prodate robe i količina. Prilikom izrade takvog dokumenta potrebno je osigurati kontrolu negativnih stanja pohranjenih u registru akumulacije stanja Preostala roba.

Struktura konfiguracije prikazana je na slici.

(16,22 kilobajta) Broj preuzimanja: 64

Kreirajmo upit za tabelarni dio dokumenta i virtuelnu tabelu Ostaci registar akumulacije. Uzmimo u obzir moguće duple redove u dokumentu; da bismo to uradili, grupiraćemo zapise.

Zahtjev = Novi zahtjev;
Request.Text = "
|ODABIR
| Doc Nomenklatura,
| SUM(Doc.Quantity) AS Doc_Quantity,
| MINIMUM(ISNULL(Reg.QuantityRemaining,0)) AS Reg_Quantity
|OD
| Document.Consumables.Roods AS Doc
| LIJEVA KONEKCIJA
| RegisterAccumulations.RemainingProducts.Remaining() AS Reg
| BY
| Dok.Nomenklatura = Reg.Nomenklatura
|WHERE
| Veza = &Veza
|GRUPA PO Doc.Nomenklatura";

//Prolaz po registru

EndCycle;

Kraj procedure

Naravno, gornji upit apsolutno nije optimalan. Koristeći ugniježđene upite, optimizovaćemo ga: grupisaćemo tabelarni deo dokumenta pre nego što ga povežemo sa tabelom stanja; prosledićemo listu robe parametrima virtuelne tabele kao vrednost uslova za izračunavanje stanja . Kao rezultat toga, naš zahtjev će imati sljedeći oblik:

|ODABIR
| Doc Nomenklatura,

|OD
| (IZABIR

| OD
| Dokument.Potrošni materijal.Roba
| GDJE
| Veza = &Veza
| GRUPA PO Nomenklaturi) AS Doc
| LIJEVA KONEKCIJA
Nomenklatura B
| (IZABIR RAZLIČITIH
| Nomenklatura
| OD
| Dokument.Potrošni materijal.Roba
| GDJE
| Link = &Link)) AS Reg
| BY

Ako bi upit bio potreban za dobivanje podataka iz ostatka različitih registara, tada bi se vrijednost filtera, a samim tim i naš drugi ugniježđeni upit, ponovio u svim parametrima virtualnih tabela. Naravno, sa svakim ugniježđenim upitom, sistem ponovo pristupa bazi podataka. za dobijanje podataka.

Privremeni stolovi

Ne sjećam se iz kojeg izdanja je postalo moguće koristiti privremene tablice u upitima. Da biste to učinili, koristite objekt Temporary Table Manager. U suštini, upravitelj privremenih tablica opisuje imenski prostor privremenih tabela i odgovoran je za njihovo kreiranje i uništavanje u bazi podataka.

Same privremene tabele su zapravo fizički kreirane u bazi podataka, pa prema njima treba postupati oprezno, jer je diskovni podsistem trenutno najsporija tehnologija, a brzina kreiranja i uništavanja tabela direktno zavisi od toga.

Hajde da ponovo napišemo upit da koristimo privremene tabele. U privremene tabele postavićemo grupirani tabelarni deo dokumenta i listu proizvoda za filter virtuelne tabele:

ProcessingProcedure(Failure, Mode)

MVT = Novi TemporaryTableManager;

Zahtjev = Novi zahtjev;
Request.Text = "
|ODABIR
| Nomenklatura, SUM(Količina) AS količina
|Postavite DocTCH
|OD
| Dokument.Potrošni materijal.Roba
|WHERE
| Veza = &Veza
|GRUPA PO Nomenklaturi";

Zahtjev = Novi zahtjev;
Query.TemporaryTableManager = MVT;
Query.Text = "ODABIR RAZLIČITIH
| Nomenklatura
|Postavite listu proizvoda
|OD
| Dokument.Potrošni materijal.Roba
|WHERE
| Veza = &Link";

Zahtjev = Novi zahtjev;
Query.TemporaryTableManager = MVT;
Request.Text = "
|ODABIR
| Doc Nomenklatura,
| Doc.Quantity AS Doc_Quantity,
| ISNULL(reg.preostala količina,0) AS Reg_količina
|OD
| DocTCH AS Doc
| LIJEVA KONEKCIJA
| RegisterAkumulacije.Ostaci robe.Ostaci(,
| Nomenklatura
| OD
| BY
| Doc.Nomenclature = Reg.Nomenclature";

RequestResult = Request.Execute();
Odabir = QueryResult.Select();

Dok Select.Next() petlja

//Provjera negativnih stanja

//Prolaz po registru

EndCycle;

Kraj procedure

Kada koristite privremene tabele, izraz se koristi u tekstu upita Mjesto da kreirate novu privremenu tabelu, u ovom slučaju sistem ne prenosi sadržaj ove tabele u rezultat upita (pogledajte napomenu 1 i napomenu 2 u tekstu iznad), već broj zapisa smeštenih u privremenu tabelu; ako ako želite, ne možete prihvatiti ovu vrijednost.

Također je moguće koristiti upute Uništiti u ovom slučaju privremena tabela se uništava, u suprotnom se privremene tabele uništavaju zajedno sa privremenim objektom upravitelja tablice.

U našem glavnom upitu koristio sam nazive privremenih tabela kao indikaciju izvora podataka (mora im biti dodijeljen sinonim, što vidimo u tekstu). Možete koristiti privremene tablice kao izvor više puta, što će vam, ako se vješto koristi, omogućiti da skratite tekst upita (poboljšate čitljivost složenih upita) i povećate brzinu (kada koristite privremene tablične podatke na nekoliko mjesta u upitu) .

Grupni zahtjevi

Grupni upiti logično dopunjuju funkcionalnost privremenih tabela i pružaju više opcija pri radu s upitima.

U grupnom upitu možete zapravo opisati nekoliko upita, međusobno povezanih korištenjem privremenih tabela i nepovezanih (moguće je, ali nije jasno zašto?). Kao rezultat, možete izvršavati sve zahtjeve uzastopno i kao rezultat primiti ili niz s rezultatima svakog zahtjeva, ili rezultat posljednjeg. Da biste dobili niz s rezultatima upita, koristite metodu ExecuteBatch() objekt zahtjeva i da dobijete rezultat posljednjeg zahtjeva RunQuery().

U tekstu zahtjeva, zahtjevi za paket su odvojeni simbolom “;” (tačka-zarez). Postoji samo jedan prostor imena za virtuelne tabele po paketnom zahtevu. Korištenje privremenog upravitelja tablica nije potrebno, ali je moguće ako želite proslijediti privremene tablice iz jednog skupnog upita u drugi.

Prepišimo proceduru za korištenje paketnih zahtjeva:

ProcessingProcedure(Failure, Mode)

Zahtjev = Novi zahtjev;
Request.Text = "
|ODABIR
| Nomenklatura, SUM(Količina) AS količina
|Postavite DocTCH
|OD
| Dokument.Potrošni materijal.Roba
|WHERE
| Veza = &Veza
|GRUPA PO Nomenklaturi
|;
|ODABIR RAZLIČITIH
| Nomenklatura
|Postavite listu proizvoda
|OD
| Dokument.Potrošni materijal.Roba
|WHERE
| Veza = &Veza
|;
|ODABIR
| Doc Nomenklatura,
| Doc.Quantity AS Doc_Quantity,
| ISNULL(reg.preostala količina,0) AS Reg_količina
|OD
| DocTCH AS Doc
| LIJEVA KONEKCIJA
| RegisterAkumulacije.Ostaci robe.Ostaci(,
| Nomenklatura B(ODABIR RAZLIČITI
| Nomenklatura
| OD
| Lista proizvoda AS Lista proizvoda)) AS Reg
| BY
| Doc.Nomenclature = Reg.Nomenclature";

Dok Select.Next() petlja

//Provjera negativnih stanja

//Prolaz po registru

EndCycle;

Kraj procedure

U stvari, uklonio sam definiciju objekta upita i upotrebu privremenog upravitelja tablice, kombinirao tekstove upita (obratite pažnju na separator “;” između tekstova). Kao rezultat toga, tekst upita je postao čitljiviji (a kada se koristi alat za pravljenje upita, čitljivost upita je znatno povećana).

Nakon izvršenja upita u varijablu ArrayResults imaćemo 3 elementa. Prva dva će sadržati broj koji karakteriše broj zapisa smeštenih u privremene tabele DocTC I Lista proizvoda, a treći će sadržavati izbor sa poljima Nomenklatura, Doc_ Količina i Reg_ Količina.

Na varijablu Rezultat upita ući će samo uzorak.

Pa, to je sve za paketne zahtjeve. Vrlo zgodan mehanizam kako sa stanovišta pisanja upita tako i sa stanovišta čitanja složenih upita.

Blog kompanije 1C GOODWILL

Platforma 1C Enterprise vam omogućava da izvršite nekoliko upita uzastopno. U 1C to se zove paket zahtjeva. Unutar jednog paketa svaki zahtjev je odvojen tačkom i zarezom.

Da bi se postiglo postupno izvršavanje upita u paketu, po pravilu se inicijalno kreiraju privremene tabele, a zatim se formiraju uslovi za njihovo deljenje, kao što su filteri, spajanja i spajanja. Zahvaljujući tome, postignut je konačni rezultat. Privremene tablice dobivene kao rezultat bilo kojeg upita u grupi nastavljaju postojati do kraja serije kao cjeline ili dok se ne izvrši upit koji uništava privremene tablice.

Osim toga, korištenje skupnih upita i privremenih tabela značajno povećava čitljivost cijelog segmenta ovog koda. Složene upite koji također sadrže ugniježđene upite može biti vrlo teško razumjeti. Međutim, ako razbijete dugi složeni upit na nekoliko, pa čak i koristite privremene tablice, to ne samo da će poboljšati percepciju, već će u većini slučajeva dovesti do povećanja performansi.

Još jedan važan detalj u korist grupnih upita u 1C je da, za razliku od ugniježđenih upita, možemo zasebno dobiti rezultat svakog upita u grupi.

Primjer kreiranja paketa zahtjeva na 1C jeziku

Da bismo vidjeli primjer kako kreirati paket upita, koristit ćemo dizajner upita, koji ćemo pozvati, radi jasnoće, iz konzole upita. Tako možemo odmah vidjeti rezultat izvršavanja paketa.

Kreirajmo jednostavan paketni zahtjev. Predlažem da odmah zalijepite tekst zahtjeva u konzolu, a zatim otvorite konstruktor i vidite kako se formira paket zahtjeva. Dodajte novi zahtjev na konzolu i zalijepite sljedeći tekst:

Roditelj,

Kod,

Samonosivi. Brzi izbor koda,

Ime,

Samonosivi.Tip,

Samonosivi vanbilansni,

Kvantitativno,

Kontni plan Samonosivi AS Samonosivi

////////////////////////////////////////////////////////////////////////////////

Samonosivi tipoviSubconto.Line Number AS Broj linije,

Samonosivi tipovi Subconto.ViewSubconto AS TypeSubconto,

SamonosiviTypesSubconto.TypeSubconto.Name AS Naziv,

SamonosiviTypesSubconto.TypeSubconto.ValueType ASValueType,

SamonosiviTypesSubconto.OnlyTurnover AS OnlyTurnover,

Self-supportingTypesSubconto.Summary AS Summative

Kontni plan Samonosivi Vrste podračuna AS Samoračunovodstvo Vrste podkonto

SORT BY

Samonosivi TypesSubconto.NumberLines

Za mene to izgleda ovako:

Sada idemo na dizajner upita. Ovdje će nas zanimati kartica "Zahtjev paket":

Kao što vidite, imamo paket od dva zahtjeva. Dvoklikom na bilo koju od njih možete nastaviti sa uređivanjem:

Kliknite na dugme „U redu“ i pokušajte da vidite rezultat paketnog zahteva.

Postavimo parametar "Račun". Možete odabrati bilo koji račun iz kontnog plana. Kao što ste vjerovatno već pretpostavili, ovaj paket zahtjeva mora primiti svojstva naloga. Kliknite na "Run" i pogledajte rezultat:

Metode Run() i RunBatch()

Pored metode Execute() koja će jedan po jedan izvršavati sve zahtjeve u grupi i vraćati rezultat posljednjeg zahtjeva, u 1C postoji metoda ExecuteBatch(). Vraća niz uzoraka svakog zahtjeva u grupi. U gornjem primjeru, ovo je upravo metoda.

ArrayResults = Query.ExecuteBatch();

Selection1 = ArrayResults.Select();

Ako Select1.Next() Onda

//Radnje sa odabirom 1

endIf;

SelectionViewsSubconto = ArrayResults.Select();

Objava Rad sa batch zahtjevima u 1C 8.3 i 8.2 prvi put se pojavila na blogu kompanije 1C GOODWILL.

Jednostavni upiti

Razmotrite kako je sintaksa upita promijenjena (tačnije, dopunjena) na sljedećem primjeru: Objavljen je dokument Potrošni materijal, koji u tabeli Proizvodi sadrži listu prodatih proizvoda i njihovu količinu. Za sprovođenje ovog dokumenta potrebno je kontrolisati negativna stanja evidentirana u registru akumulacije stanja ostataka robe.

Slika prikazuje strukturu konfiguracije.

Napravimo upit za virtuelnu tabelu Ostaci registra akumulacije i tabelarni deo dokumenta. Da bismo uzeli u obzir moguća ponavljanja redova u dokumentu, grupisaćemo zapise.

Naravno, gornji upit nije dovoljno optimalan. Optimizirajmo ga pomoću ugniježđenih upita: grupiramo tabelarni dio prije nego što ga povežemo sa tabelom stanja dokumenata, prosledimo listu jedinica proizvoda parametrima virtuelne tabele kao uslov za izračunavanje stanja. Rezultirajući upit će izgledati ovako:


Ako upit zahtijeva dobivanje podataka iz ostatka različitih registara, tada će se vrijednost filtera i drugi potupit ponoviti u svakom parametru virtuelnih tabela, a sistem će kontaktirati infobazu da dobije podatke sa svakim podupitom.

Privremeni stolovi

Već neko vrijeme postalo je moguće koristiti privremene tablice u upitima, za koje se koristi objekat „Temporary Table Manager“. U suštini, upravitelj privremenih tablica sadrži opis imenskog prostora privremenih tabela i osigurava da se kreiraju i izbrišu iz baze podataka.

Privremene tabele su fizički pohranjene u bazi podataka, pa ih treba pažljivo koristiti, jer Diskovni podsistem je dio tehnologije sa najslabijim performansama, a brzina kreiranja i brisanja tabela direktno zavisi od njega.

Promijenimo upit da uzmemo u obzir korištenje privremenih tabela. Privremene tabele će sadržati tabelarni deo dokumenta u grupisanom obliku i listu proizvoda za filtriranje virtuelnih tabela:

Korišćenje privremenih tabela u upitu zahteva korišćenje naredbe Place za formiranje nove privremene tabele, a rezultat upita nije sadržaj tabele, već broj zapisa koji su smešteni u privremenu tabelu.

Osim toga, možete koristiti instrukciju Destroy - u ovom slučaju se privremena tablica briše, inače će privremene tablice biti uništene od strane objekta privremenog upravitelja tablice zajedno sa tabelama.

U glavnom upitu, imena privremenih tabela su korištena kao indikacija izvora podataka (treba im dodijeliti sinonim). Možete koristiti privremene tabele kao izvor više puta, što vam, ako se pravilno koristi, omogućava da skratite tekst upita i povećate brzinu (kada koristite privremenu tabelu na različitim mestima u upitu).

Grupni zahtjevi

Grupni upiti značajno proširuju funkcionalnost privremenih tabela i pružaju nove mogućnosti pri radu sa upitima.

Zapravo, skupni upit može opisati nekoliko upita, međusobno povezanih kroz privremene tablice i nezavisne. Kao rezultat toga, čini se da izvršava sve upite uzastopno i završava s nizom rezultata iz svakog upita ili rezultatom samo posljednjeg. Niz rezultata upita dobija se korišćenjem metode ExecutePackage() objekta zahteva, a da biste dobili rezultat samo poslednjeg zahteva, koristite metodu ExecuteQuery().

Grupni zahtjevi u tekstu zahtjeva moraju biti odvojeni znakom “;”. Jedan paketni zahtjev ima jedan prostor imena za virtualne tablice. Korištenje privremenog upravitelja tablica nije potrebno, ali je moguće ako trebate proslijediti privremene tablice u drugi skupni upit.

Promijenimo proceduru uzimajući u obzir zahtjeve serije:

U stvari, definicija objekta upita je obrisana i privremeni upravitelj tablice nije korišten, tekstovi upita su spojeni. Kao rezultat toga, tekst zahtjeva postao je čitljiviji.

Nakon izvršenja zahtjeva, varijabla Result Array će sadržavati 3 elementa. Prva dva su broj zapisa DocTCH i Liste proizvoda koji se nalaze u privremenim tabelama; treći će sadržati izbor sa poljima Doc_Quantity, Nomenclature i Reg_Quantity.

Varijabla rezultata upita sadrži samo odabir.

Dakle, skupni upiti su vrlo zgodan alat za pisanje i čitanje složenih upita.

Platforma 1C Enterprise vam omogućava da izvršite nekoliko upita uzastopno. U 1C to se zove paket zahtjeva. Unutar jednog paketa svaki zahtjev je odvojen tačkom i zarezom.

Da bi se postiglo postupno izvršavanje upita u paketu, po pravilu se inicijalno kreiraju privremene tabele, a zatim se formiraju uslovi za njihovo deljenje, kao što su filteri, spajanja i spajanja. Zahvaljujući tome, postignut je konačni rezultat. Privremene tablice dobivene kao rezultat bilo kojeg upita u grupi nastavljaju postojati do kraja serije kao cjeline ili dok se ne izvrši upit koji uništava privremene tablice.

Osim toga, korištenje skupnih upita i privremenih tabela značajno povećava čitljivost cijelog segmenta ovog koda. Složene upite koji također sadrže ugniježđene upite može biti vrlo teško razumjeti. Međutim, ako razbijete dugi složeni upit na nekoliko, pa čak i koristite privremene tablice, to ne samo da će poboljšati percepciju, već će u većini slučajeva dovesti do povećanja performansi.

Još jedan važan detalj u prilog grupnim upitima u 1C je da, za razliku od toga, možemo zasebno dobiti rezultat svakog upita u grupi.

Primjer kreiranja paketa zahtjeva na 1C jeziku

Da bismo vidjeli primjer kako kreirati paket upita, koristit ćemo dizajner upita, koji ćemo pozvati radi jasnoće iz konzole upita. Tako možemo odmah vidjeti rezultat izvršavanja paketa.

Kreirajmo jednostavan paketni zahtjev. Predlažem da odmah ubacite tekst zahtjeva u , a zatim ga otvorite i vidite kako se formira paket zahtjeva. Dodajte novi zahtjev na konzolu i zalijepite sljedeći tekst:

Nabavite 267 video lekcija na 1C besplatno:

samonosivi. Link,
Roditelj,
Kod,
Samonosivi. Brzi izbor koda,
Ime,
Samonosivi.Tip,
Samonosivi vanbilansni,
Kvantitativno,
OD
Kontni plan Samonosivi AS Samonosivi
GDJE
Samopodrživi.Link = &Račun
;
////////////////////////////////////////////////////////////////////////////////

ODABIR
Samonosivi tipoviSubconto.Line Number AS Broj linije,
Samonosivi tipovi Subconto.ViewSubconto AS TypeSubconto,
SamonosiviTypesSubconto.TypeSubconto.Name AS Naziv,
SamonosiviTypesSubconto.TypeSubconto.ValueType ASValueType,
SamonosiviTypesSubconto.OnlyTurnover AS OnlyTurnover,
Self-supportingTypesSubconto.Summary AS Summative
OD
Kontni plan Samonosivi Vrste podračuna AS Samoračunovodstvo Vrste podkonto
GDJE
Self-supportingTypesSubaccount.Link = &Račun
SORT BY
Samonosivi TypesSubconto.NumberLines

Za mene to izgleda ovako:

Sada idemo na dizajner upita. Ovdje će nas zanimati kartica "Zahtjev paket":

Kao što vidite, imamo paket od dva zahtjeva. Dvoklikom na bilo koju od njih možete nastaviti sa uređivanjem:

Kliknite na dugme „U redu“ i pokušajte da vidite rezultat paketnog zahteva.

Postavimo parametar "Račun". Možete odabrati bilo koji račun iz kontnog plana. Kao što ste verovatno već pretpostavili, ovaj paket zahteva treba da dobije svojstva naloga. Kliknite na "Run" i pogledajte rezultat:

Metode Run() i RunBatch()

Kada je moj upit postao toliko složen da je prevazišao granice mog razumijevanja, odlučio sam koristiti grupne upite.

Ali ja sam se suočio sa činjenicom da o njima ne znam ništa. Ispostavilo se da je sve vrlo jednostavno. Za 5 minuta moći ćete koristiti grupne upite. Počni čitati.

Kako se ispostavilo, sve je vrlo jednostavno. Potrebno je samo da napišete nekoliko upita odvojenih tačkom i zarezom. Rezultat će biti vraćen u posljednjem zahtjevu.

Batch zahtjevi pojavili su se samo u verziji 8.1.11.67.4.

Evo teksta zahtjeva:

ODABERITE T1.Zn POSTAVITE VTBlettere IZ (IZABIR "A" KAO Zn KOMBINI SVE ODABERITE "B") KAO T1;

ODABERITE T1.ZN POSTAVITE VTCIRFE IZ (IZABIR "1" KAO VN KOMBINI SVE ODABERITE "2") KAO T1;

ODABERITE TB.Zn, TC.Zn, TB.Zn+TC.Zn IZ VTB slova AS TB, VTC brojeva AS TC

Grupni upiti su podržani u bilo kojoj regularnoj konzoli za upite.

Slika prikazuje primjer izvršenja zahtjeva:

A sada malo iz iskustva. Zašto su nam potrebni paketni zahtjevi?

Činjenica je da možete staviti neku vrstu međurezultata u privremenu tabelu, koja može biti potrebna u nekoliko narednih upita.

Ranije, kada nije bilo privremenih tabela, tekst upita je morao biti dupliran.

Možete, naravno, bez grupnog upita uzastopnim izvršavanjem nekoliko upita i manipuliranjem ugniježđenim tabelama. Ali to je zgodnije sa paketnim zahtjevima. Vi samo napišete upit i ne razmišljate o postavljanju privremenih tabela. Sve se dešava samo od sebe.

Osim toga, ako se koristi sistem za sastavljanje podataka (DCS), on inteligentno bira potrebna polja i minimizira cijeli paket upita.

Ako zahtjevi imaju metodu Request.Run() onda sada postoji metoda Request.ExecuteBatch(), koji vraća sve tabele iz paketa, kao niz.

Najava paketnih zahtjeva na web stranici 1c je ovdje: http://v8.1c.ru/overview/release_8_1_11/#Functional

Životna priča

Dozvolite mi da objasnim šta me je navelo da pokrenem paketne zahtjeve.

Dakle, zamislite da postoji dokument, on ima tabelarni dio. u koloni" Greška» označava da li je došlo do greške prilikom popunjavanja dokumenta. u koloni" TextErrors» može postojati jedna ili više rečenica sa tekstovima grešaka. Vrste grešaka sadržanih u rečenicama su unaprijed poznate.

Dakle, stavili smo listu svih grešaka u tabelu Kodovi grešaka- sadrži šifru greške i podniz za pretraživanje.

Dobijamo jednu, dvije ili više grešaka za svaki red. Jer U jednom redu može biti nekoliko grešaka.

Ali greška se možda neće prepoznati, tj. zastava " Greška" stoji, ali tekst greške nam nije dao šifru greške.

Napravimo lijevo spajanje, gdje je kod greške NULL, dajemo kod greške “ Druge greške» .

Ali problem je bio u tome što je bilo oko 200 kodova grešaka, tako da je lijeva veza radila jako dugo. Morao sam ga zamijeniti unutrašnjom vezom koja je letjela. Ali istovremeno su izgubljene linije za koje nije pronađena greška. Još uvijek nisam mogao shvatiti kako da ubacim ove redove u rezultat.

Zahtjev je napisan za sistem rasporeda, tj. U principu, ne mogu se koristiti tablice vrijednosti ili privremene tablice. Ovdje su paketni upiti korisni.

Jednostavno sam još jednom povezao sve linije sa greškama sa svim linijama za koje su pronađene greške, a ipak sam dodao tip greške “Druge greške”.

mob_info