1c kahilingang pumili ng 1 hilera na nakakatugon sa kundisyon. Scheme ng pagtatrabaho sa isang kahilingan

Pansin! Ito ay isang panimulang bersyon ng aralin, na maaaring hindi kumpleto ang mga materyales.

Mag-login sa site bilang isang mag-aaral

Mag-log in bilang isang mag-aaral upang ma-access ang mga materyales sa paaralan

Query language 1C 8.3 para sa mga baguhan na programmer: conditional operator

May kondisyong pahayag sa isang query

Sumulat tayo ng query na kumukuha ng mga pangalan at calorie na nilalaman ng pagkain:

Ngayon, magdagdag tayo ng column sa resulta ng query kung saan ipapakita natin ang fat content ng pagkain ayon sa mga sumusunod na panuntunan:

  • kung ang nilalaman ng calorie ay mas mababa sa 100, kung gayon ang nilalaman ng taba ay mababa;
  • kung ang nilalaman ng calorie ay mula 100 hanggang 200, kung gayon ang nilalaman ng taba ay normal;
  • kung ang nilalaman ng calorie ay higit sa 200, kung gayon ang nilalaman ng taba ay mataas.

Paano ito makakamit, dahil sa talahanayan Direktoryo.Pagkain walang column Laman na taba?

Lumalabas na maaari nating idagdag ang column na ito gamit ang isang conditional operator sa loob ng query:

Tingnan natin ang text ng kahilingan:

Sa seksyon PUMILI Ang mga patlang ng pagpili ay nakalista: Pangalan, Calorie na nilalaman, at pagkatapos ay sa halip na ang ikatlong patlang ay mayroong isang pagtatayo ng isang kondisyon na operator, ang resulta nito ay nahuhulog sa ikatlong hanay.

Mga kondisyon ng operator naproseso nang sunud-sunod. Kung ang isa sa mga ito ay lumabas na totoo, ang katumbas na halaga ay ibabalik bilang resulta. Kung wala sa mga kundisyon ang natutugunan, ibabalik ang halaga mula sa seksyon IBA.

Samakatuwid, ang isang bagong query ay magbabalik ng isang talahanayan tulad nito:

Retreat

Tandaan na ang ikatlong column sa talahanayan na ibinalik ng query ay tinatawag Patlang1. Ang pangalang ito ay awtomatikong nabuo ng system dahil ang ikatlong column ay hindi tumutugma sa anumang totoong field sa talahanayan Direktoryo.Pagkain, kung saan maaaring makuha ang pangalang ito.

Ngunit nasa ating kapangyarihan na ibigay sa kanya ang pangalang ito. Upang gawin ito, kaagad pagkatapos ng paglalarawan ng field kailangan mong magsulat ng isang keyword PAANO, at pagkatapos ay ipahiwatig ang pangalan mismo, na pinaghihiwalay ng isang puwang. Nagbabasa ka ng isang pagsubok na bersyon ng aralin, ang buong mga aralin ay magagamit. Ang pangalang ito ay tatawagin field alias.

Maaaring italaga ang mga alias sa anumang field, kabilang ang mga may pangalan na. Gawa tayo ng nickname Pagkain para sa field Pangalan:

Halimbawa ng paggamit ng function SUBSTRING:

SELECT Name, SELECT WHEN SUBSTRING(Name, 1, 3) = "Ban" THEN "This is a banana" WHEN SUBSTRING(Name, 1, 2) = "Chi" THEN "This is chips" IBA "Something else" END FROM Sanggunian . Pagkain

Mas kumplikadong resulta ng conditional statement

Ang resulta ng isang conditional operator ay maaaring hindi lamang isang string, kundi pati na rin isang numero, petsa, boolean o uri ng sanggunian. Maaari itong maging isang pare-pareho ng mga uri na nakalista sa itaas o isang field ng talahanayan. Nagbabasa ka ng isang pagsubok na bersyon ng aralin, ang buong mga aralin ay magagamit.

Magbibigay ako ng pangkalahatang halimbawa na nagpapakita ng lahat ng mga opsyong ito:

Kumuha ng pagsusulit

Simulan ang pagsubok

1. Pinoproseso ang mga kundisyon ng operator ng pagpili (tulad ng tawag dito).

2. Palaging bumabalik ang conditional operator

3. Kung wala sa mga kundisyon ang natugunan, ibabalik ng piling operator ang halaga

4. Seksyon ELSE sa conditional statement

5. Sa mga kondisyon ng pahayag ng pagpili ay maaaring gamitin

Mga kahilingan ay idinisenyo upang kunin at iproseso ang impormasyon mula sa database upang maibigay ito sa gumagamit sa kinakailangang form. Ang pagpoproseso dito ay nangangahulugan ng pagpapangkat ng mga field, pag-uuri ng mga hilera, pagkalkula ng mga kabuuan, atbp. Hindi mo maaaring baguhin ang data gamit ang mga query sa 1C!

Ang kahilingan ay isinasagawa ayon sa ibinigay na mga tagubilin − humiling ng text. Ang teksto ng kahilingan ay pinagsama-sama alinsunod sa syntax at mga panuntunan wika ng pagtatanong. Ang 1C:Enterprise 8 query language ay batay sa pamantayan SQL, ngunit may ilang pagkakaiba at extension.

Scheme ng pagtatrabaho sa isang kahilingan

Ang pangkalahatang pamamaraan ng pagtatrabaho sa isang kahilingan ay binubuo ng ilang magkakasunod na yugto:

  1. Paglikha ng object ng Kahilingan at pagtatakda ng text ng kahilingan;
  2. Pagtatakda ng mga parameter ng kahilingan;
  3. Pagpapatupad ng kahilingan at pagkuha ng resulta;
  4. Pag-bypass sa resulta ng kahilingan at pagproseso ng natanggap na data.

1. Bagay Hiling may ari-arian Text, kung saan kailangan mong italaga ang text ng kahilingan.

// Pagpipilian 1
Kahilingan = Bagong Kahilingan;
Hiling . Text =
"PUMILI
| Mga rate ng pera. Panahon,
| Mga rate ng pera. Currency,
| Rate ng pera. Rate
|MULA

|SAAN
;

// Opsyon 2
Kahilingan = Bagong Kahilingan("PUMILI
| Mga rate ng pera. Panahon,
| Mga rate ng pera. Currency,
| Rate ng pera. Rate
|MULA
| Register of Information.Currency Rates AS Currency Rates
|SAAN
| Mga rate ng pera.Currency = &Currency");

2. Ang pagtatakda ng mga halaga ng parameter ay isinasagawa gamit ang pamamaraan SetParameter(< Имя>, < Значение>) . Ang mga parameter sa text ng kahilingan ay ipinahiwatig ng simbolong “ & " at kadalasang ginagamit sa mga kundisyon ng pagpili (WHERE section) at sa mga virtual na parameter ng talahanayan.

Hiling);

3. Pagkatapos italaga ang teksto at itakda ang mga parameter, ang kahilingan ay dapat na maisakatuparan at makuha ang resulta ng pagpapatupad. Ang pagpapatupad ay isinasagawa sa pamamagitan ng Execute() na pamamaraan, na nagbabalik ng isang bagay Resulta ng Query. Mula sa resulta ng query maaari mong:

  • kumuha ng seleksyon gamit ang Select method (< ТипОбхода>, < Группировки>, < ГруппировкиДляЗначенийГруппировок>) ;
  • mag-upload ng mga value sa isang value table o value tree gamit ang Upload method (< ТипОбхода>) .

// Tumanggap ng sample

Sample = Resulta ng Query. Pumili();

// Pagkuha ng talahanayan ng mga halaga
RequestResult = Kahilingan. Run();
mesa = Resulta ng Query. Magdiskarga();

4. Maaari mong laktawan ang pagpili ng resulta ng query gamit ang isang loop:

paalam Sample.Next() Loop
Ulat(Selection.Course);
EndCycle;

Ang isang kumpletong halimbawa ng pagtatrabaho sa isang kahilingan ay maaaring magmukhang ganito:

// Stage 1. Paglikha ng kahilingan at pagtatakda ng text ng kahilingan
Kahilingan = Bagong Kahilingan;
Hiling . Text =
"PUMILI
| Mga rate ng pera. Panahon,
| Mga rate ng pera. Currency,
| Rate ng pera. Rate
|MULA
| Register of Information.Currency Rates AS Currency Rates
|SAAN
| Mga rate ng pera.Currency = &Currency";

// Stage 2. Pagtatakda ng mga parameter
Hiling . SetParameter("Currency" , SelectedCurrency);

// Stage 3. Pagpapatupad ng query at pagkuha ng sample
RequestResult = Kahilingan. Run();
Sample = Resulta ng Query. Pumili();

// Binabaybay ang pagpili
paalam Sample.Next() Loop
Ulat(Selection.Course);
EndCycle;

Komposisyon ng teksto ng kahilingan

Ang teksto ng kahilingan ay binubuo ng ilang mga seksyon:

  1. Deskripsyon ng Kahilingan— listahan ng mga mapipiling field at data source;
  2. Pinagsasama-sama ang mga query— mga expression na "MAGKAISA" at "MAGKAISA LAHAT";
  3. Pag-aayos ng mga resulta— ang ekspresyong “ORDER BY...”;
  4. Auto-order— expression na “AUTO ORDERING”;
  5. Paglalarawan ng mga resulta- ang expression na "RESULTS ... BY ...".

Ang unang seksyon lamang ang sapilitan.

Mga pansamantalang talahanayan at mga batch na query

Sinusuportahan ng 1C query language ang paggamit pansamantalang mga talahanayan— mga talahanayan na nakuha bilang isang resulta ng isang query at naka-imbak sa isang pansamantalang batayan.

Madalas kang makatagpo ng isang sitwasyon kung saan kailangan mong gumamit ng hindi mga talahanayan ng database bilang pinagmulan ng isang query, ngunit ang resulta ng pagsasagawa ng isa pang query. Maaaring malutas ang problemang ito gamit ang mga nested query o pansamantalang mga talahanayan. Ang paggamit ng mga pansamantalang talahanayan ay nagbibigay-daan sa iyo upang gawing simple ang teksto ng isang kumplikadong query sa pamamagitan ng paghahati nito sa mga bahaging bahagi nito, at gayundin, sa ilang mga kaso, pabilisin ang pagpapatupad ng query at bawasan ang bilang ng mga lock. Upang gumana sa mga pansamantalang talahanayan, gamitin ang bagay Tagapamahala ng TimeTable. Ang isang pansamantalang talahanayan ay nilikha gamit ang PLACE na keyword na sinusundan ng pangalan ng pansamantalang talahanayan.

ManagerVT = Bagong TemporaryTablesManager;
Kahilingan = Bagong Kahilingan;
Hiling . TemporaryTablesManager = VTManager;

Hiling . Text =
"PUMILI
| Currencies. Code,
| Mga pera.Pangalan
|Lugar sa Mga Pera
|MULA
| Directory.Currencies AS Currencies";

RequestResult = Kahilingan. Ipatupad();

Upang magamit ang pansamantalang talahanayan ng VTVcurrency sa iba pang mga query, kailangan mong magtalaga ng isang karaniwang pansamantalang tagapamahala ng talahanayan sa mga query na ito—VT Manager.

Batch request ay isang kahilingan na naglalaman ng ilang kahilingan na pinaghihiwalay ng karakter na ";". Kapag nagsasagawa ng isang batch na query, ang lahat ng mga query na kasama dito ay isinasagawa nang sunud-sunod, at ang mga resulta ng lahat ng mga pansamantalang talahanayan ay magagamit sa lahat ng kasunod na mga query. Ang tahasang pagtatalaga ng pansamantalang table manager sa mga batch na query ay hindi kinakailangan. Kung ang isang pansamantalang tagapamahala ng talahanayan ay hindi itinalaga, ang lahat ng mga pansamantalang talahanayan ay tatanggalin kaagad pagkatapos maisagawa ang query.

Para sa mga batch na query, available ang ExecuteBatch() method, na nagpapatupad ng lahat ng query at nagbabalik ng hanay ng mga resulta. Ang mga pansamantalang talahanayan sa isang batch na query ay kakatawanin ng isang talahanayan na may isang row at isang column na "Bilang", na nag-iimbak ng bilang ng mga tala. Upang i-debug ang mga kahilingan sa batch, maaari mong gamitin ang paraan Ipatupad ang Batch NA MAY INTERMEDIATE DATA(): Ibinabalik nito ang aktwal na nilalaman ng mga pansamantalang talahanayan, hindi ang bilang ng mga talaan.

// Halimbawa ng pagtatrabaho sa isang batch request
Kahilingan = Bagong Kahilingan;
Hiling . Text =
"PUMILI
| Mga pera.Pangalan
|MULA
| Directory.Currencies AS Currencies
|;
|PUMILI
| Nomenclature.Pangalan
|MULA
| Direktoryo. Nomenclature AS Nomenclature";

Batch Resulta = Kahilingan. ExecuteBatch();

TZCurrencies =PacketResult[ 0 ]. I-unload();
TZNomenclature = Resulta ng Package[ 1 ]. I-unload();

// Isang halimbawa ng paggamit ng mga pansamantalang talahanayan sa isang kahilingan sa batch
Kahilingan = Bagong Kahilingan;
Hiling . Text =
"PUMILI
| Mga Produkto. Link HOW TO Product
|PLACE VTPProducts
|MULA
| Directory.Nomenclature HOW Products
|SAAN
| Mga Produkto.Tagagawa = &Tagagawa
|;
|PUMILI
| VTTProducts.Product,
| Bokasyonal na paaralan. Dami,
| Bokasyonal na paaralan. Presyo,
| Bokasyonal na paaralan.Link AS DocumentReceipts
|MULA
| Mga Produkto ng VT BILANG Mga Produkto ng VT
| LEFT CONNECTION Document. Resibo ng Goods and Services. Goods AS PTU
| Software VTPProducts.Product = PTU.Nomenclature"
;

Hiling . SetParameter( "Tagagawa", Tagagawa);

RequestResult = Kahilingan. Run();
Sample = Resulta ng Query. Pumili();

paalam Sample.Next() Loop

EndCycle;

Mga virtual na talahanayan

Mga virtual na talahanayan- ito ay mga talahanayan na hindi nakaimbak sa database, ngunit nabuo ng platform. Sa kanilang kaibuturan, ito ay mga nested na query laban sa isa o higit pang mga pisikal na talahanayan na pinaandar ng platform. Ang mga virtual na talahanayan ay tumatanggap lamang ng impormasyon mula sa mga rehistro at pangunahing inilaan para sa paglutas ng mga lubhang dalubhasang problema.

Ang mga sumusunod na virtual na talahanayan ay umiiral (mga posibleng parameter ay ipinahiwatig sa mga panaklong):

  • Para sa mga rehistro ng impormasyon:
    • SliceFirst(<Период>, <Условие>) — ang pinakamaagang mga tala para sa tinukoy na petsa;
    • SliceLast(<Период>, <Условие>) — ang pinakabagong mga tala para sa tinukoy na petsa;
  • Para sa mga rehistro ng akumulasyon:
    • Mga natira(<Период>, <Условие>) — mga balanse sa tinukoy na petsa;
    • Mga Rebolusyon(<НачалоПериода>, <КонецПериода>, <Периодичность>, <Условие>) - Mga transaksyon sa panahon;
    • RemainsAndTturnover(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <Условие>) — balanse at turnover para sa panahon;
  • Para sa mga rehistro ng accounting:
    • Mga natira(<Период>, <УсловиеСчета>, <Субконто>, <Условие>) — mga balanse mula sa tinukoy na petsa ayon sa account, mga sukat at mga sub-account;
    • Mga Rebolusyon(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчета>, <Субконто>, <Условие>, <УсловиеКорСчета>, <КорСубконто>) — turnover para sa panahon sa konteksto ng mga account, mga sukat, corr. mga account, subconto, cor. subconto;
    • RemainsAndTturnover(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <УсловиеСчета>, <Субконто>, <Условие>) — mga balanse at turnover sa konteksto ng mga account, mga sukat at mga sub-account;
    • TurnoverDtKt(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчетаДт>, <СубконтоДт>, <УсловиеСчетаКт>, <СубконтоКт>, <Условие>) — turnover para sa panahon sa pamamagitan ng account Dt, account Kt, Subconto Dt, Subconto Kt;
    • MovementsSubconto(<НачалоПериода>, <КонецПериода>, <Условие>, <Порядок>, <Первые>) — mga paggalaw kasama ng mga subconto na halaga;
  • Para sa mga rehistro ng pagkalkula:
    • Base(<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>) - pangunahing data ng rehistro ng pagkalkula;
    • DataGraphics(<Условие>)—data ng graph;
    • ActualActionPeriod(<Условие>) ay ang aktwal na panahon ng bisa.

Kapag nagtatrabaho sa mga virtual na talahanayan, dapat mong ilapat ang mga seleksyon sa mga parameter ng mga virtual na talahanayan, at hindi sa kondisyong WHERE. Ang oras ng pagpapatupad ng query ay lubos na nakasalalay dito.

Tagabuo ng query

Upang mapabilis ang pag-input ng mga teksto ng query, ang platform ay may mga espesyal na tool: Tagabuo ng query At Query constructor na may pagpoproseso ng resulta. Upang tumawag sa mga constructor, kailangan mong i-right-click at piliin ang kinakailangang item:

Ang mga konstruktor ay maaari ding tawagan mula sa pangunahing menu Text.

Gamit ang tagabuo ng query, maaaring interactive na buuin ng programmer ang teksto ng query. Upang gawin ito, piliin ang mga kinakailangang talahanayan at mga patlang gamit ang mouse, magtatag ng mga relasyon, pagpapangkat, kabuuan, atbp. Ang pamamaraang ito ay nakakatipid ng oras at nag-aalis ng mga posibleng pagkakamali. Bilang resulta ng trabaho nito, bumubuo ang query constructor ng query text.

Ang tagabuo ng query na may pagpoproseso ng resulta, bilang karagdagan sa pagbuo ng teksto ng query, ay lumilikha ng isang handa na fragment ng code para sa pagtanggap at pagproseso ng data.

RequestSchema object

Pinapayagan ka ng platform na lumikha at mag-edit ng text ng kahilingan gamit ang object Humiling ng Schema. Ang isang bagay ay may iisang katangian Batch ng mga Kahilingan, kung saan iniimbak ng object ang mga katangian ng lahat ng query na kasalukuyang ini-edit. Sinusuportahan ng object ng RequestSchema ang mga sumusunod na pamamaraan:

  • SetQueryText(< Текст>) — pinupunan ang property ng Query Packet batay sa isinumiteng text ng kahilingan;
  • GetQueryText() - ibinabalik ang teksto ng kahilingan na nabuo batay sa pag-aari ng Request Packet;
  • FindParameters() - ibinabalik ang mga parameter ng kahilingan.

Tingnan natin ang isang halimbawa ng pagtatrabaho sa object ng RequestSchema. Upang mabuo ng programmatically ang text ng kahilingan

PAGSAY-BAYIN NG
Currencies.Code

Maaaring ganito ang hitsura ng naka-embed na code ng wika:

RequestScheme = Bagong RequestScheme;
Package 1 = RequestScheme. RequestBatch[ 0 ];
Operator1 = Package1. Mga Operator[ 0 ];
// pagdaragdag ng pinagmulan
RegisterTable = Operator1. Mga pinagmumulan. Idagdag( "Directory.Currencies", "Mga Pera" );
// pagdaragdag ng mga patlang
FieldLink = Operator1. SelectableFields. Add("Currencies.Link" , 0 );
FieldCode = Operator1. SelectableFields. Add("Currencies.Code", 1);
// pagtukoy ng mga field alias
Package 1 . Mga Hanay[ 0 ]. Alyas = "Currency" ;
Package 1 . Mga Hanay[ 1 ]. Alyas = "Code" ;
// pagdaragdag ng kundisyon
Operator1 . Pagpili. Idagdag( "HINDI FlagDeletion");
// magdagdag ng pag-order
Package 1 . Umorder. Magdagdag(FieldCode);
RequestText = RequestScheme. GetQueryText();

Ang wika ng query ay isa sa mga pangunahing mekanismo ng 1C 8.3 para sa mga developer. Gamit ang mga query, maaari mong mabilis na makuha ang anumang data na nakaimbak sa database. Ang syntax nito ay halos kapareho sa SQL, ngunit may ilang pagkakaiba.

Ang pangunahing bentahe ng 1C 8.3 (8.2) na wika ng query sa SQL:

  • dereferencing reference field (tumutukoy sa isa o higit pang mga punto sa mga detalye ng bagay);
  • ang pagtatrabaho sa mga resulta ay napaka-maginhawa;
  • ang kakayahang lumikha ng mga virtual na talahanayan;
  • ang kahilingan ay maaaring isulat sa parehong Ingles at Ruso;
  • kakayahang harangan ang data upang maiwasan ang mga deadlock.

Mga disadvantages ng query language sa 1C:

  • hindi tulad ng SQL, sa 1C query ay hindi pinapayagan ang pagbabago ng data;
  • kakulangan ng mga nakaimbak na pamamaraan;
  • imposibilidad ng pag-convert ng isang string sa isang numero.

Tingnan natin ang aming mini tutorial sa mga pangunahing construct ng 1C query language.

Dahil sa katotohanan na ang mga query sa 1C ay nagbibigay-daan lamang sa iyo na makatanggap ng data, anumang query ay dapat magsimula sa salitang "PUMILI". Pagkatapos ng utos na ito, ang mga patlang kung saan dapat makuha ang data ay ipinahiwatig. Kung tinukoy mo ang “*”, pipiliin ang lahat ng available na field. Ang lugar kung saan pipiliin ang data (mga dokumento, rehistro, direktoryo, atbp.) ay ipinahiwatig pagkatapos ng salitang "MULA".

Sa halimbawang tinalakay sa ibaba, ang mga pangalan ng buong katawagan ay pinili mula sa direktoryo ng "Nomenclature". Pagkatapos ng salitang "HOW", ang mga alias (pangalan) para sa mga talahanayan at field ay ipinahiwatig.

PUMILI
Nomenclature. Pangalan AS Pangalan ng Nomenclature
MULA SA
Directory.Nomenclature AS Nomenclature

Sa tabi ng command na "PUMILI" maaari mong tukuyin ang mga keyword:

  • IBA-IBA. Pipili lang ang query ng mga row na naiiba sa kahit isang field (nang walang mga duplicate).
  • Unang n, Saan n– ang bilang ng mga hilera mula sa simula ng resulta na kailangang piliin. Kadalasan, ang konstruksiyon na ito ay ginagamit kasabay ng pag-uuri (ORDER BY). Halimbawa, kapag kailangan mong pumili ng isang tiyak na bilang ng mga dokumento na kamakailan lamang ayon sa petsa.
  • PINAYAGAN. Ang disenyong ito ay nagpapahintulot sa iyo na pumili mula sa database lamang ng mga talaan na magagamit ng kasalukuyang gumagamit. Batay sa paggamit ng keyword na ito, makakatanggap ang user ng mensahe ng error kapag sinusubukang i-query ang mga talaan na wala silang access.

Maaaring gamitin ang mga keyword na ito nang magkasama o magkahiwalay.

PARA SA PAGBABAGO

Hinaharang ng panukalang ito ang data para maiwasan ang magkasalungatan. Hindi mababasa ang naka-lock na data mula sa isa pang koneksyon hanggang sa matapos ang transaksyon. Sa sugnay na ito, maaari mong tukuyin ang mga partikular na talahanayan na kailangang i-lock. Kung hindi, lahat ay haharangin. Ang disenyo ay may kaugnayan lamang para sa awtomatikong pag-lock mode.

Kadalasan, ang sugnay na "PARA SA PAGBABAGO" ay ginagamit kapag tumatanggap ng mga balanse. Pagkatapos ng lahat, kapag ang ilang mga gumagamit ay nagtatrabaho sa programa nang sabay-sabay, habang ang isa ay tumatanggap ng mga balanse, ang isa ay maaaring baguhin ang mga ito. Sa kasong ito, ang natitira ay hindi na tama. Kung harangan mo ang data sa panukalang ito, pagkatapos ay hanggang sa matanggap ng unang empleyado ang tamang balanse at maisagawa ang lahat ng kinakailangang manipulasyon dito, ang pangalawang empleyado ay mapipilitang maghintay.

PUMILI
Mutual settlements. Empleyado,
Mutual settlements Halaga ng mutual settlements Balanse
MULA SA
Register of Accumulations. Mutual settlements sa mga empleyado. Balances AS Mutual settlements
PARA SA PAGBABAGO

SAAN

Ang disenyo ay kinakailangan upang magpataw ng ilang uri ng pagpili sa na-upload na data. Sa ilang mga kaso ng pagkuha ng data mula sa mga rehistro, mas makatwirang tukuyin ang mga kondisyon ng pagpili sa mga parameter ng mga virtual na talahanayan. Kapag gumagamit ng "WHERE", ang lahat ng mga tala ay unang kinukuha, at pagkatapos lamang ay inilapat ang pagpili, na makabuluhang nagpapabagal sa query.

Nasa ibaba ang isang halimbawa ng isang kahilingan upang makakuha ng mga contact person para sa isang partikular na posisyon. Ang parameter ng pagpili ay may format na: &ParameterName (ang pangalan ng parameter ay arbitrary).

PAGPILI (KASO)

Ang disenyo ay nagpapahintulot sa iyo na tukuyin ang mga kondisyon nang direkta sa katawan ng kahilingan.

Sa halimbawa sa ibaba, ang "AdditionalField" ay maglalaman ng teksto depende sa kung ang dokumento ay nai-post o hindi:

PUMILI
AdmissionT&U.Link,
PAGPILI
WHEN AdmissionT&U.Isinagawa
TAPOS "Naipasa na ang dokumento!"
IBA "Ang dokumento ay hindi nai-post..."
WAKAS BILANG Karagdagang Larangan
MULA SA
Dokumento. Pagtanggap ng Mga Kalakal at Serbisyo PAANO Pagtanggap ng T&C

SUMALI

Pinagsasama ang link ng dalawang talahanayan batay sa isang partikular na kondisyon ng relasyon.

KALIWA/KANANG KONEKSIYON

Ang kakanyahan ng LEFT join ay ang unang tinukoy na talahanayan ay kinuha sa kabuuan nito at ang pangalawa ay naka-link dito ayon sa kondisyon ng koneksyon. Kung walang mga talaan na tumutugma sa unang talahanayan sa pangalawa, ang NULL ay papalitan bilang kanilang mga halaga. Sa madaling salita, ang pangunahing talahanayan ay ang unang tinukoy na talahanayan at ang data ng pangalawang talahanayan (kung mayroon man) ay pinalitan na para sa data nito.

Halimbawa, kinakailangan upang makakuha ng mga item ng item mula sa mga dokumento ng "Receipt of goods and services" at mga presyo mula sa rehistro ng impormasyon na "Mga presyo ng item". Sa kasong ito, kung ang presyo para sa anumang posisyon ay hindi nahanap, palitan ang NULL sa halip. Ang lahat ng mga item mula sa dokumento ay pipiliin anuman ang mga ito ay may presyo o wala.

PUMILI
Resibo&U.Nomenclature,
Presyo. Presyo
MULA SA
Dokumento. Pagtanggap ng mga Goods at Services. Goods HOW Resibo T&C
INTERNAL JOIN RegisterInformation.PricesNomenclature.SliceLast AS Presyo
Software Receipt&U.Nomenclature = Prices.Nomenclature

SA TAMA ang lahat ay eksaktong kabaligtaran.

FULL CONNECTION

Ang ganitong uri ng koneksyon ay naiiba sa mga nauna na bilang resulta ang lahat ng mga talaan ng parehong unang talahanayan at ang pangalawa ay ibabalik. Kung walang nakitang mga tala sa una o pangalawang talahanayan batay sa tinukoy na kondisyon ng link, NULL ang ibabalik sa halip.

Kapag gumagamit ng buong koneksyon sa nakaraang halimbawa, pipiliin ang lahat ng item ng item mula sa dokumentong "Receipt of Goods and Services" at lahat ng pinakabagong presyo mula sa rehistro ng "Mga Presyo ng Item". Ang mga halaga ng hindi nahanap na mga talaan sa una at pangalawang talahanayan ay magiging katumbas ng NULL.

INNER JOIN

Ang pagkakaiba sa pagitan ng isang INNER JOIN at isang FULL JOIN ay kung ang isang tala ay hindi matatagpuan sa kahit isa sa mga talahanayan, hindi ito ipapakita ng query. Bilang resulta, tanging ang mga item na iyon mula sa dokumentong "Receipt of goods and services" ang pipiliin kung saan mayroong mga tala sa rehistro ng impormasyon na "Mga presyo ng item", kung sa nakaraang halimbawa ay papalitan natin ang "FULL" ng "INTERNAL".

GROUP BY

Ang pagpapangkat sa mga 1C na query ay nagbibigay-daan sa iyo na i-collapse ang mga row ng talahanayan (mga field ng pagpapangkat) ayon sa isang partikular na karaniwang katangian (mga field ng pagpapangkat). Ang mga field ng pagpapangkat ay maaari lamang ipakita gamit ang pinagsama-samang mga function.

Ang resulta ng sumusunod na query ay isang listahan ng mga uri ng produkto na may pinakamataas na presyo para sa mga ito.

PUMILI
,
MAX(Price.Price) AS Presyo
MULA SA

GROUP BY
Presyo.Nomenclature.Uri ng Nomenclature

RESULTA

Hindi tulad ng pagpapangkat, kapag gumagamit ng mga kabuuan, ang lahat ng mga tala ay ipinapakita at ang kabuuang mga hilera ay idinaragdag sa kanila. Ang pagpapangkat ay nagpapakita lamang ng mga pangkalahatang talaan.

Maaaring ibuod ang mga resulta para sa buong talahanayan (gamit ang keyword na “PANGKALAHATANG”), para sa ilang mga patlang, para sa mga patlang na may hierarchical na istraktura (mga keyword na “HIERARCY”, “HIERARCY LANG”). Kapag nagbubuod ng mga resulta, hindi kinakailangang gumamit ng mga pinagsama-samang function.

Tingnan natin ang isang halimbawa na katulad ng halimbawa sa itaas gamit ang pagpapangkat. Sa kasong ito, ibabalik ng resulta ng query hindi lamang ang mga nakagrupong field, kundi pati na rin ang mga detalyadong tala.

PUMILI
Prices.Nomenclature.Uri ng Nomenclature BILANG Uri ng Nomenclature,
Presyo. Presyo AS Presyo
MULA SA
Register of Information. Presyo ng Nomenclature. Snapshot ng Pinakabagong AS Prices
RESULTA
MAXIMUM(Presyo)
NG
TypeNomenclature

NAGKAROON

Ang operator na ito ay katulad ng operator na WHERE, ngunit ginagamit lamang para sa mga pinagsama-samang function. Ang natitirang mga patlang, maliban sa mga ginagamit ng operator na ito, ay dapat igrupo. Ang operator na WHERE ay hindi naaangkop sa pinagsama-samang mga function.

Sa halimbawa sa ibaba, ang mga maximum na presyo ng isang item ay pipiliin kung lumampas sila sa 1000, na nakapangkat ayon sa uri ng item.

PUMILI

MAX(Price.Price) AS Presyo
MULA SA
Register of Information. Presyo ng Nomenclature. Snapshot ng Pinakabagong AS Prices
GROUP BY
Presyo.Nomenclature.Uri ng Nomenclature
NAGKAROON
MAXIMUM(Mga Presyo. Presyo) > 1000

PAGSAY-BAYIN NG

Ang ORDER BY operator ay nag-uuri ng resulta ng isang query. Upang matiyak na ang mga tala ay ipinapakita sa isang pare-parehong pagkakasunud-sunod, ang AUTO ORDER ay ginagamit. Ang mga primitive na uri ay pinagsunod-sunod ayon sa karaniwang mga patakaran. Ang mga uri ng sanggunian ay pinagsunod-sunod ayon sa GUID.

Isang halimbawa ng pagkuha ng listahan ng mga empleyado na pinagsunod-sunod ayon sa pangalan:

PUMILI
Empleyado.Pangalan AS Pangalan
MULA SA
Directory.Employees PAANO Empleyado
PAGSAY-BAYIN NG
Pangalan
AUTO ORDER

Iba pang 1C query language constructs

  • PAGSASAMA– resulta ng dalawang query sa isa.
  • PAGSAMAHIN ANG LAHAT– katulad ng COMBINE, ngunit walang pagpapangkat ng magkatulad na mga hilera.
  • WALANG laman ang TALAAN– minsan ginagamit kapag sumasali sa mga query upang tukuyin ang isang walang laman na nested table.
  • LUGAR– lumilikha ng pansamantalang talahanayan upang i-optimize ang mga kumplikadong 1C na query. Ang mga naturang kahilingan ay tinatawag na batch request.

Mga Tampok ng Query Language

  • SUBSTRING pinuputol ang isang string mula sa isang tinukoy na posisyon patungo sa isang tinukoy na bilang ng mga character.
  • TAON...PANGALAWA nagbibigay-daan sa iyong makuha ang napiling halaga ng isang uri ng numero. Ang input parameter ay ang petsa.
  • SIMULA NG PERIOD at END OF PERIOD ginagamit kapag nagtatrabaho sa mga petsa. Ang uri ng panahon (DAY, MONTH, YEAR, atbp.) ay ipinahiwatig bilang karagdagang parameter.
  • ADDKDATE nagbibigay-daan sa iyo na magdagdag o magbawas ng isang tiyak na oras ng isang tiyak na uri mula sa isang petsa (PANGALAWANG, MINUTO, ARAW, atbp.).
  • DIFFERENCEDATE tinutukoy ang pagkakaiba sa pagitan ng dalawang petsa, na nagsasaad ng uri ng halaga ng output (DAY, YEAR, MONTH, atbp.).
  • AY WALANG BISA pinapalitan ang nawawalang halaga ng tinukoy na expression.
  • REPRESENTATION at REPRESENTATIONLINKS kumuha ng string na representasyon ng tinukoy na field. Ilapat sa anumang mga halaga at mga reference na halaga lamang, ayon sa pagkakabanggit.
  • TYPE, TYPE VALUES ay ginagamit upang matukoy ang uri ng input parameter.
  • LINK ay isang lohikal na paghahambing na operator para sa uri ng halaga ng katangian.
  • Ipahayag ginagamit upang i-convert ang isang halaga sa nais na uri.
  • DATE ORAS nakakakuha ng halaga ng uri na "Petsa" mula sa mga numerong halaga (Taon, Buwan, Araw, Oras, Minuto, Pangalawa).
  • KAHULUGAN sa isang kahilingan sa 1C ito ay ginagamit upang ipahiwatig ang mga paunang natukoy na halaga - mga direktoryo, enumerasyon, mga plano para sa mga uri ng mga katangian. Halimbawa ng paggamit: " Kung saan Legal na Indibidwal = Halaga(Enumeration. Legal na Indibidwal. Indibidwal)«.

Tagabuo ng Query

Upang lumikha ng mga query na may 1C mayroong isang napaka-maginhawang built-in na mekanismo - ang taga-disenyo ng query. Naglalaman ito ng mga sumusunod na pangunahing tab:

  • "Mga Talahanayan at Mga Patlang" - naglalaman ng mga patlang na kailangang mapili at ang mga pinagmulan ng mga ito.
  • "Mga Koneksyon" - inilalarawan ang mga kondisyon para sa istraktura ng CONNECTION.
  • "Pagpapangkat"—naglalaman ng paglalarawan ng mga istruktura ng pagpapangkat at mga summed field batay sa mga ito.
  • "Mga Kundisyon" - responsable para sa pagpili ng data sa kahilingan.
  • “Advanced”—mga karagdagang parameter ng query, gaya ng mga keyword para sa command na “SELECT”, atbp.
  • "Mga Pagsali/Alyas" - ang mga posibilidad ng pagsali sa mga talahanayan ay ipinahiwatig at ang mga alias ay tinukoy (ang "HOW" construct).
  • Ang "Order" ay responsable para sa pag-uuri ng resulta ng mga query.
  • "Mga Kabuuan" - katulad ng tab na "Pagpapangkat", ngunit ginagamit para sa pagbuo ng "TOTALS".

Ang teksto ng kahilingan mismo ay maaaring matingnan sa pamamagitan ng pag-click sa pindutang "Humiling" sa ibabang kaliwang sulok. Sa form na ito, maaari itong iwasto nang manu-mano o kopyahin.


Humiling ng Console

Upang mabilis na tingnan ang resulta ng isang query sa Enterprise mode, o i-debug ang mga kumplikadong query, gamitin ang . Naglalaman ito ng teksto ng kahilingan, nagtatakda ng mga parameter, at ipinapakita ang resulta.

Maaari mong i-download ang query console sa ITS disk, o sa pamamagitan ng .

Ang 1C 8 query language ay isang kailangang-kailangan na tool para sa isang 1C programmer; pinapayagan ka nitong magsulat ng mas maigsi, simple, nauunawaan na code, at gumamit ng mas kaunting mapagkukunan ng system kapag nagtatrabaho sa data. Ang artikulong ito ay nagbubukas ng isang serye ng mga aralin na nakatuon sa 1C 8 query language. Sa unang aralin titingnan natin ang istruktura ng pangunahing operator ng wikang ito - PUMILI. Gamit ang operator na ito, maaari kang lumikha ng mga seleksyon mula sa mga talahanayan ng database. Maaaring pagbukud-bukurin ang mga napiling data ng talahanayan, ilagay ang mga kundisyon dito, i-link at isama sa data mula sa iba pang mga talahanayan, pinagsama ayon sa iba't ibang field, at marami pang iba.

Query language 1C enterprise 8 - Operator structure SELECT

Tingnan natin ang istraktura ng SELECT operator (mga opsyonal na bahagi ng operator ay ipinahiwatig sa mga square bracket). Nagbibigay ang 1C query language ng malawak na hanay ng mga tool para sa paglikha ng mga sample ng data.

PILIIN ang [PINAPAHAYAG] [IBA] [UNA A] [Field1] [AS Alias1], [Field2] [AS Alias2], ... [FieldM] [AS AliasB] [PUT TemporaryTableName] [FROM Table1 AS AliasTableTable1 [[INNER JOIN] ][LEFT JOIN][FULL JOIN] Table2 AS Alias ​​​​Table2 [[INNER JOIN][LEFT JOIN][FULL JOIN] TableC AS Alias ​​​​TablesC BY Expression1 [And Expression2]...[At ExpressionD]] .. . ... NG Expression1 [At Expression2]...[At ExpressionE]] ... [TableF AS TableF Alias] ... ] [GROUP BY GroupingField1[,] ... [GroupingFieldG]] [WHERE Expression1 [AT Expression2] ... [AT ExpressionH]] [PAGKAISA ANG LAHAT...] [; ...] [INDEX NG Alyas1 ... AliasB] [TOTALS [AggregationFunction(Field1)][,] [AggregationFunction(Field2)][,] ... [AggregationFunction(FieldI)] NG [GENERAL][,] [ GroupingField1][,] ... [GroupingFieldj]]

Mga keyword at block para sa pagtatrabaho sa mga field

  • PUMILI— isang keyword na nagpapahiwatig ng simula ng operator;
  • PINAYAGAN ay nagpapahiwatig na ang pagpili ay dapat magsama ng mga talaan ng talahanayan na may read access para sa ibinigay na user;
  • IBA-IBA ay nagpapahiwatig na ang sample ay dapat magsama lamang ng iba't ibang (sa lahat ng mga field) na daloy. Sa madaling salita, ang mga duplicate na row ay hindi isasama sa sample;
  • UNANG A kung tinukoy mo ang keyword na ito, ang unang A lang ng mga row na pinili ng query ang isasama sa pagpili, kung saan ang A ay isang natural na numero;
  • Field block— ang bloke na ito ay nagpapahiwatig ng mga patlang na kailangang isama sa pagpili. Pipiliin ang mga field na ito ng mga column. Sa pinakasimpleng kaso, ganito ang hitsura ng field: Table Alias.TableFieldName AS Field Alias

    Sa ganitong paraan, ipinapahiwatig namin kung saang talahanayan kami kumukuha ng field na ito. Binibigyang-daan ka ng 1C query language na tumukoy ng anumang mga alias, ngunit hindi dapat ulitin ang mga ito sa parehong SELECT statement. Maaaring maging mas kumplikado ang isang field, na binubuo ng iba't ibang kumbinasyon ng mga field ng talahanayan, mga function ng wika ng query, at pinagsama-samang mga function, ngunit hindi namin sasaklawin ang mga kasong iyon sa tutorial na ito;

Mga keyword at block para sa pagtatrabaho sa mga talahanayan

  • ILAGAY ang TemporaryTableName- keyword LUGAR ay nilayon na lumikha ng pansamantalang talahanayan na may partikular na pangalan, na maiimbak sa RAM sa isang ibinigay na 1C 8 session hanggang sa matapos ito o hanggang sa masira ang pansamantalang talahanayan. Dapat tandaan na ang mga pangalan ng pansamantalang mga talahanayan sa isang 1C 8 session ay hindi dapat ulitin;
  • Block ng mga talahanayan at mga relasyon— ang block ay nagpapahiwatig ng lahat ng mga talahanayan na ginamit sa query na ito, pati na rin ang mga relasyon sa pagitan ng mga ito. Nagsisimula ang block sa isang keyword MULA, sinusundan ng pangalan at alyas ng unang talahanayan. Kung ang talahanayang ito ay nauugnay sa iba pang mga talahanayan, kung gayon ang mga relasyon ay ipinahiwatig. Ang 1C query language ay naglalaman ng sumusunod na hanay ng mga uri ng koneksyon:
    • INNER JOIN— Ang isang tala mula sa kaliwang talahanayan ay isasama sa pagpili lamang kung ang kundisyon ng koneksyon ay natugunan, ang isang talaan mula sa kanang talahanayan ay isasama sa pagpili lamang kung ang kundisyon ng koneksyon ay natutugunan;
    • LEFT CONNECTION— Ang isang talaan mula sa kaliwang talahanayan ay isasama sa pagpili sa anumang kaso, ang isang talaan mula sa kanang talahanayan ay isasama sa pagpili lamang kung ang kundisyon ng koneksyon ay natutugunan;
    • FULL CONNECTION— Ang isang talaan mula sa kaliwang talahanayan ay isasama muna sa pagpili sa anumang kaso, pagkatapos lamang kung ang kundisyon ng koneksyon ay natutugunan, ang isang talaan mula sa kanang talahanayan ay isasama muna sa pagpili sa anumang kaso, pagkatapos lamang kung ang kundisyon ng koneksyon ay nakilala. Sa kasong ito, ang mga nagreresultang duplicate na row ay hindi kasama sa sample.

    Pagkatapos ng uri ng koneksyon, ang pangalan at alyas ng pangalawang talahanayan ay ipinahiwatig. Susunod ang keyword NG, na sinusundan ng mga kondisyon ng komunikasyon na konektado sa bawat isa ng mga lohikal na operator AT, O. Ang bawat expression sa kundisyon ay dapat magbalik ng Boolean value (True, False). Kung ang unang talahanayan ay konektado sa ilang mga talahanayan maliban sa pangalawa, pagkatapos ay ang uri ng koneksyon ay muling ipinahiwatig, at iba pa. Ang bawat isa sa mga talahanayan na nakikilahok sa koneksyon, sa turn, ay maaaring konektado sa iba pang mga talahanayan, ito ay ipinapakita sa diagram ng istraktura ng query. Kung ang talahanayan ay hindi nauugnay sa una, pagkatapos ito ay ipinahiwatig nang walang uri ng koneksyon, kung gayon ang mga koneksyon nito ay maaaring sundin, at iba pa;

Mga bloke ng conversion ng mga keyword at data

  • Block ng grupo— ang bloke na ito ay ginagamit upang pangkatin ang mga hilera ng talahanayan. Ang mga hilera ay pinagsama sa isa kung ang mga halaga ng mga patlang ay tinukoy pagkatapos ng keyword GROUP BY lumabas na pareho. Sa kasong ito, ang lahat ng iba pang mga patlang ay summed, na-average, na-maximize, o pinaliit gamit ang pinagsama-samang mga function. Ang mga pinagsama-samang function ay ginagamit sa isang field block. Halimbawa: Maximum(TableAlias.TableFieldName) AS FieldAlias
  • Kondisyon bloke- sa block na ito pagkatapos ng keyword SAAN Ang mga kondisyong expression na pinaghihiwalay ng mga lohikal na operator ay ipinahiwatig AT, O, para maisama sa sample ang alinman sa mga napiling row, kailangang may value ang lahat ng kundisyon sa pinagsama-samang totoo.
  • PAGSAMAHIN ANG LAHAT— ang keyword na ito ay ginagamit upang pagsamahin ang mga query (mga operator PUMILI). Ang 1C query language ay nagpapahintulot sa iyo na pagsamahin ang ilang mga query sa isa. Upang maisama ang mga query, dapat ay mayroon silang parehong hanay ng mga field;
  • «;» - Ang mga semicolon ay ginagamit upang paghiwalayin ang mga pahayag na independyente sa bawat isa PUMILI;
  • INDEX NI— ang keyword ay ginagamit upang i-index ang mga patlang na tinukoy pagkatapos nito;
  • Summary block— ginagamit upang bumuo ng mga sample na tulad ng puno. Para sa bawat isa sa mga field ng pagpapangkat na tinukoy pagkatapos ng keyword NG, isang hiwalay na hilera ang gagawin sa pagpili. Sa linyang ito, gamit ang mga pinagsama-samang function, ang kabuuang halaga ng mga field na tinukoy pagkatapos ng keyword ay kakalkulahin RESULTA.

Gusto mo bang magpatuloy sa pag-aaral ng 1C 8 query language? Pagkatapos ay basahin ang susunod na artikulo.

Nagpasya akong gawin ang aking kontribusyon at ilarawan ang mga katangian ng wikang hindi tinalakay sa mga artikulo sa itaas. Ang artikulo ay naglalayong sa mga nagsisimulang developer.

1. "IZ" na disenyo.

Upang makakuha ng data mula sa database, hindi kinakailangan na gamitin ang "FROM" construction.
Halimbawa: Kailangan naming piliin ang lahat ng impormasyon tungkol sa mga bangko mula sa direktoryo ng mga bangko.
Hiling:

SELECT Directory.Bank.*

Pinipili ang lahat ng mga field mula sa direktoryo ng Banks. At katulad ng kahilingan:

PUMILI NG Mga Bangko.* MULA SA Direktoryo.Mga Bangko BILANG Mga Bangko

2. Pag-order ng data sa pamamagitan ng reference field

Kapag kailangan nating ayusin ang data ng query ayon sa mga primitive na uri: "String", "Number", "Petsa", atbp., pagkatapos ay ang lahat ay malulutas sa pamamagitan ng paggamit ng "ORDER BY" construct kung kailangan mong mag-order ng data sa pamamagitan ng isang reference field? Ang reference field ay isang link, isang natatanging identifier, i.e. Sa halos pagsasalita, ang ilang arbitrary na hanay ng mga character at ordinaryong pag-order ay maaaring magdulot ng resulta na hindi lubos na inaasahan. Upang mag-order ng mga patlang ng sanggunian, ang pagbuo ng "AUTO ORDER" ay ginagamit. Upang gawin ito, kailangan mo munang mag-order ng data nang direkta ayon sa uri ng sanggunian gamit ang "ORDER BY" construct, at pagkatapos ay ang "AUTO ORDER" construct.

Sa kasong ito, para sa mga dokumento ang pag-order ay magaganap sa pagkakasunud-sunod na "Petsa->Numer", para sa mga reference na aklat sa "Main View". Kung ang pag-order ay hindi nangyari sa pamamagitan ng mga reference na field, hindi inirerekomenda ang paggamit ng "AUTO ORDER" na pagbuo.

Sa ilang mga kaso, ang pagbuo ng "AUTO ORDER" ay maaaring makapagpabagal sa proseso ng pagpili. Katulad nito, maaari kang muling magsulat nang walang awtomatikong pag-order para sa mga dokumento:

3.Pagkuha ng representasyon ng teksto ng isang uri ng sanggunian. "PRESENTASYON" na disenyo.

Kapag kailangan mong magpakita ng field ng isang uri ng sanggunian, halimbawa, ang field na "Bank", na isang link sa isang elemento ng direktoryo ng "Mga Bangko", kailangan mong maunawaan na kapag ipinapakita ang field na ito, isang subquery sa " Ang direktoryo ng Banks" ay awtomatikong isasagawa upang makakuha ng view ng direktoryo. Ito ay magpapabagal sa output ng data. Upang maiwasan ito, kailangan mong gamitin ang pagbuo ng "PRESENTASYON" sa kahilingan upang agad na makakuha ng representasyon ng bagay at pagkatapos ay ipakita ito para sa pagtingin.

Sa sistema ng komposisyon ng data, ginagamit ang mekanismong ito bilang default, ngunit kapag lumilikha ng mga layout sa mga cell, dapat mong tukuyin ang representasyon ng field ng sanggunian, at, halimbawa, ilagay ang link mismo sa transcript.

4. Kundisyon para sa sampling data ayon sa isang template.

Halimbawa, kailangan mong kumuha ng mga mobile phone ng mga empleyado ng form (8 -123- 456-78-912). Upang gawin ito, kailangan mong itakda ang sumusunod na kundisyon sa kahilingan:

PUMILI Employee.Pangalan, Empleyado.Telepono BILANG Telepono MULA sa Direktoryo.Mga Empleyado BILANG Empleyado SAAN Telepono TULAD ng "_-___-___-__-__"

Ang character na "_" ay isang service character at pinapalitan ang anumang character.

5. Sabay-sabay na paggamit ng mga kabuuan at pagpapangkat.


Ang mga kabuuan ay kadalasang ginagamit kasabay ng mga pagpapangkat; sa kasong ito, maaaring hindi tukuyin ang mga pinagsama-samang function sa mga kabuuan.

SELECT Provision of Services.Organization AS Organization, Provision of Services.Nomenclature AS Nomenclature, SUM(Provision of Services.Amount of Document) AS Sum of Document FROM Document.Provision of Services AS Provision of Services GROUP BY Provision of Services.Organization, Provision of Services.Nomenclature RESULTS BY GENERAL, Organization, Nomen klatura

Sa kasong ito, babalik ang query sa halos kapareho ng sumusunod na query:

SELECT Provision of Services.Organization AS Organization, Provision of Services.Nomenclature AS Nomenclature, Provision of Services.Halaga ng Dokumento BILANG Halaga ng Dokumento MULA sa Dokumento.Provision of Services AS Provision of Services RESULTS AMOUNT (Amount of Document) BY GENERAL, Organization, Nomenclature

Ang unang query lang ang magko-collapse ng mga record na may parehong nomenclature.

6. Dereferencing field.

Ang pagtukoy sa mga field sa pamamagitan ng isang tuldok ay tinatawag na reference field dereferencing operation. Halimbawa Pagbabayad.Organisasyon.Administrative Unit. Sa kasong ito, sa reference na field na "Organization" ng "Payment" na dokumento, ito ay tumutukoy sa isa pang table na "Organizations", kung saan makukuha ang value ng "Administrative Unit" attribute. Mahalagang maunawaan na kapag nag-a-access ng mga patlang sa pamamagitan ng isang tuldok, ang platform ay tahasang gumagawa ng isang subquery at sumasali sa mga talahanayang ito.

Hiling:

Maaaring katawanin bilang:

PUMILI Payment.Link, Payment.Organization, Payment.Organization, Organizations. AdministrativeUnit FROM Document.Payment AS Payment LEFT JOIN Directory.Organizations AS Organizations Software Payment.Organization = Organizations.Link

Kapag binabanggit ang mga reference na field ng isang pinagsama-samang uri, sinusubukan ng framework na lumikha ng mga implicit na pagsasama sa lahat ng mga talahanayan na bahagi ng uri ng field na iyon. Sa kasong ito, hindi magiging optimal ang query. Kung malinaw na alam kung anong uri ng field ito, kinakailangang limitahan ang mga naturang field ayon sa uri na may construct EXPRESS().

Halimbawa, mayroong isang rehistro ng akumulasyon na "Mga hindi nababahaging pagbabayad", kung saan maraming mga dokumento ang maaaring kumilos bilang isang rehistro. Sa kasong ito, hindi tama na makuha ang mga halaga ng mga detalye ng registrar sa ganitong paraan:

SELECT UnallocatedPayments.Register.Date, ..... FROM RegisterAccumulation.UnallocatedPayments BILANG UnallocatedPayments

dapat mong paghigpitan ang uri ng pinagsama-samang field sa pag-log:

SELECT EXPRESS(UnallocatedPayments.Register AS Document.Payment).Petsa, ..... FROM RegisterAccumulation.UnallocatedPayments BILANG UnallocatedPayments

7. Konstruksyon "SAAN"

Sa kaliwang pagdurugtong ng dalawang talahanayan, kapag nagpataw ka ng kundisyon na "WHERE" sa kanang talahanayan, makakakuha tayo ng resulta na katulad ng resulta na may panloob na pagsasama ng mga talahanayan.

Halimbawa. Kinakailangang piliin ang lahat ng Kliyente mula sa Direktoryo ng Mga Kliyente at para sa mga kliyenteng mayroong dokumento sa pagbabayad na may halaga ng katangiang "Organisasyon" = &Organisasyon, ipakita ang dokumentong "Pagbabayad", para sa mga hindi, huwag itong ipakita.

Ang resulta ng query ay magbabalik ng mga tala para lang sa mga kliyenteng iyon na may pagbabayad ayon sa organisasyon sa parameter, at magpi-filter ng iba pang mga kliyente. Samakatuwid, kailangan mo munang matanggap ang lahat ng mga pagbabayad para sa "ganyan at ganyan" na organisasyon sa isang pansamantalang talahanayan, at pagkatapos ay ikonekta ito sa direktoryo ng "Mga Kliyente" gamit ang kaliwang pagsali.

SELECT Payment.Link AS Payment, Payment.Shareholder AS Client PLACE toPayments FROM Document.Payment AS Payment WHERE Payment.Branch = &Branch; ////////////////////////////////////////////// /////////////////////////// SELECT Clients.Link AS Client, ISNULL(tPayment.Payment, "") BILANG Pagbabayad MULA SA Directory .Clients AS Ang mga Kliyente ay UMALIS sa KONEKSYON sa mga pagbabayad BILANG sa mga pagbabayad SOFTWARE Mga Kliyente. Link = sa mga pagbabayad. Kliyente

Maaari mong lampasan ang kundisyong ito sa ibang paraan. Kinakailangang magpataw ng kondisyong "WHERE" nang direkta sa relasyon sa pagitan ng dalawang talahanayan. Halimbawa:

SELECT Clients.Link, Payment.Link FROM Directory.US_Subscribers AS US_Subscribers LEFT CONNECTION Document.Payment AS Payment Software (Clients.Link = Payment.Client AT Payment.Client.Name LIKE "Sugar Packet") GROUP NG Clients.Link, Pagbabayad. Link

8. Sumasali sa Nested at Virtual Tables

Mga Nested Query madalas na kinakailangan upang mabawi ang data batay sa ilang kundisyon. Kung gagamitin mo ang mga ito kasabay ng iba pang mga talahanayan, maaari nitong kritikal na pabagalin ang pagpapatupad ng query.

Halimbawa, kailangan nating kunin ang Halaga ng Balanse sa kasalukuyang petsa para sa ilang kliyente.

SELECT UnallocatedPaymentsRemains.Customer, UnallocatedPaymentsRemains.AmountRemaining FROM (SELECT Clients.Link AS Link FROM Directory.Client AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQuery LEFT SUMALI RegisterAccumulations.UnallocatedPayments.Balances Requests.UnallocatedPayments.BalancesPalances ASPayments.Balances Customer

Kapag nagsasagawa ng ganoong query, maaaring magkamali ang DBMS optimizer kapag pumipili ng plano, na hahantong sa suboptimal na pagpapatupad ng query. Kapag sumasali sa dalawang talahanayan, pipili ang DBMS optimizer ng algorithm sa pagsali sa talahanayan batay sa bilang ng mga tala sa parehong mga talahanayan. Kung mayroong nested query, napakahirap matukoy ang bilang ng mga record na ibabalik ng nested query. Samakatuwid, dapat mong palaging gumamit ng mga pansamantalang talahanayan sa halip na mga nested na query. Kaya't muli nating isulat ang kahilingan.

SELECT Clients.Link BILANG Link LUGAR tClients MULA sa Directory.Client AS Clients WHERE
Clients.Link B (&Mga Kliyente) ; ////////////////////////////////////////////// ////////////////////////// PUMILI ng tClients.Link, UnallocatedPaymentsRemains.AmountRemaining, MULA sa mga tClient AS TUMALIWAN ANG mga tClient SUMALI sa RegisterAccumulations.UnallocatedPayments.Balances (, Client SA (PUMILI ng tClients.Link MULA sa tClients)) BILANG UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

Sa kasong ito, matutukoy ng optimizer kung gaano karaming mga tala ang ginagamit ng mga pansamantalang talahanayan na tClient at makakapili ng pinakamainam na algorithm para sa pagsali sa mga talahanayan.

Mga virtual na talahanayan , nagbibigay-daan sa iyo na makakuha ng halos handa na data para sa karamihan ng mga inilapat na gawain. (Slice of the First, Slice of the Last, Remains, Turnovers, Remains at Turnovers) Ang pangunahing salita dito ay virtual. Ang mga talahanayan na ito ay hindi pisikal, ngunit pinagsama-sama ng system on the fly, i.e. Kapag tumatanggap ng data mula sa mga virtual na talahanayan, kinokolekta ng system ang data mula sa mga talahanayan ng panghuling rehistro, nagtitipon, nagpangkat at naglalabas nito sa user.

Yung. Kapag kumokonekta sa isang virtual na talahanayan, isang koneksyon ay ginawa sa isang subquery. Sa kasong ito, ang DBMS optimizer ay maaari ding pumili ng hindi pinakamainam na plano ng koneksyon. Kung ang query ay hindi mabilis na nabuo at ang query ay gumagamit ng mga pagsali sa mga virtual na talahanayan, pagkatapos ay inirerekomenda na ilipat ang pag-access sa mga virtual na talahanayan sa isang pansamantalang talahanayan, at pagkatapos ay gumawa ng isang pagsasama sa pagitan ng dalawang pansamantalang mga talahanayan. Isulat muli natin ang nakaraang kahilingan.

SELECT Clients.Link BILANG Link LUGAR tClients MULA SA Directory.Clients BILANG Clients INDEX BY Link WHERE
Clients.Link B (&Mga Kliyente) ; ////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// SELECT UnallocatedPayments.AmountBalance, UnallocatedPayments.Client AS Client PLACE mga balanse MULA sa RegisterAccumulations.UnallocatedPayments.Balances(, Client B ( PUMILI ng mga tClient. I-link MULA sa mga tClient)) BILANG Mga Hindi Naisasaalang-alang naBalanse; ////////////////////////////////////////////// //////////////////////////////El = tRemainings.Client

9. Sinusuri ang resulta ng kahilingan.

Maaaring walang laman ang resulta ng query; upang suriin ang mga walang laman na value, gamitin ang sumusunod na construct:

ResRequest = Request.Execute(); Kung resQuery.Empty() Then Return; tapusin kung;

Pamamaraan Walang laman() dapat gamitin bago ang mga pamamaraan Pumili () o I-unload(), dahil ang pagkuha ng koleksyon ay nangangailangan ng oras.

Ito ay hindi isang paghahayag sa sinuman na ito ay lubhang hindi kanais-nais na gumamit ng mga query sa isang loop. Ito ay maaaring kritikal na makaapekto sa oras ng pagpapatakbo ng isang partikular na function. Lubhang kanais-nais na matanggap ang lahat ng data sa kahilingan at pagkatapos ay iproseso ang data sa isang loop. Ngunit kung minsan may mga kaso kapag naging imposible na ilipat ang kahilingan sa labas ng loop. Sa kasong ito, para sa pag-optimize, maaari mong ilipat ang paglikha ng query sa labas ng loop, at sa loop, palitan ang mga kinakailangang parameter at isagawa ang query.

Kahilingan = Bagong Kahilingan; Query.Text = "PUMILI | Clients.Link, | Clients.Birthdate |FROM | Directory.Client AS Clients |WHERE | Clients.Link = &Client"; Para sa Bawat Hilera MULA sa TableClients Loop Query.SetParameter("Client", Client); QueryResult = Query.Execute().Select(); EndCycle;

Ise-save nito ang system mula sa pagsusuri ng syntax sa kahilingan sa isang loop.

11. Construction "HAVING".

Isang disenyo na medyo bihira sa mga kahilingan. Binibigyang-daan kang magpataw ng mga kundisyon sa mga halaga ng pinagsama-samang pag-andar (SUM, MINIMUM, AVERAGE, atbp.). Halimbawa, kailangan mong piliin lamang ang mga kliyente na ang halaga ng pagbabayad noong Setyembre ay higit sa 13,000 rubles. Kung gagamitin mo ang kundisyong "WHERE", kailangan mo munang gumawa ng pansamantalang talahanayan o isang nested na query, pangkatin ang mga tala doon ayon sa halaga ng pagbabayad at pagkatapos ay ilapat ang kundisyon. Ang "HAVING" construction ay makakatulong na maiwasan ito.

PILIIN ang Payment.Customer, HALAGA(Payment.Amount) BILANG Halaga MULA sa Dokumento.Payment BILANG Pagbabayad SAAN BUWAN(Payment.Date) = 9 GROUP BY Payment.Customer NA MAY HALAGA(Payment.Amount) > 13000

Sa constructor, para gawin ito, pumunta lang sa tab na "Mga Kundisyon", magdagdag ng bagong kundisyon at lagyan ng check ang checkbox na "Custom". Tapos magsulat ka na lang Halaga(Payment.Amount) > 13000


12. NULL na halaga

Hindi ko ilalarawan dito ang mga prinsipyo ng three-valued logic sa database; maraming artikulo sa paksang ito. Maikling tungkol sa kung paano WALA maaaring makaapekto sa resulta ng query. Ang halagang NULL ay hindi talaga isang halaga, at ang katotohanan na ang halaga ay hindi natukoy ay hindi alam. Samakatuwid, ang anumang operasyon na may NULL ay nagbabalik ng NULL, maging ito ay karagdagan, pagbabawas, paghahati o paghahambing. Ang isang NULL na halaga ay hindi maikukumpara sa isang NULL na halaga dahil hindi natin alam kung ano ang ihahambing. Yung. pareho ng mga paghahambing na ito ay: NULL = NULL, NULL<>Ang NULL ay hindi True o False, ito ay hindi alam.

Tingnan natin ang isang halimbawa.

Para sa mga kliyenteng walang mga pagbabayad, kailangan naming ipakita ang field na "Mag-sign" na may halagang "Walang mga pagbabayad". Bukod dito, alam naming sigurado na mayroon kaming mga ganoong kliyente. At upang maipakita ang kakanyahan ng isinulat ko sa itaas, gawin natin ito sa ganitong paraan.

PILIIN ang "Walang mga pagbabayad" BILANG Katangian, NULL BILANG LUGAR ng Dokumento sa mga pagbabayad; ////////////////////////////////////////////// //////////////////////////////// Piliin ang mga kliyente.Link bilang kliyente, pagbabayad.Link kung paano ang pagbabayad ay naglalagay ng tclientpayment mula sa direktoryo.clients bilang mga kliyente na naiwan ng dokumento ng koneksyon. Payment AS Payment Software Clients.Link = Payment.Shareholder; ////////////////////////////////////////////// /////////////////////////// PILIIN ang tClientPayment.Client MULA sa tClientPayment BILANG tClientPayment INTERNAL SUMALI tPayment BILANG tBabayaran NG tClientPayment.Payment = tPayment. Dokumento

Bigyang-pansin ang pangalawang pansamantalang talahanayan na tClientPayment. Sa kaliwang pagsali, pipiliin ko ang lahat ng kliyente at lahat ng pagbabayad para sa mga kliyenteng ito. Para sa mga kliyenteng walang mga pagbabayad, ang field na "Pagbabayad" ay magiging NULL. Kasunod ng lohika, sa unang pansamantalang talahanayan na "tPayments" ay itinalaga ko ang 2 mga patlang, isa sa mga ito NULL, ang pangalawang linya na "Walang mga pagbabayad". Sa ikatlong talahanayan, ikinonekta ko ang mga talahanayang “tClientPayment” at “tPayment” gamit ang mga field na “Payment” at “Document” na may panloob na pagsali. Alam namin na sa unang talahanayan ang field na "Dokumento" ay NULL, at sa pangalawang talahanayan, ang mga walang bayad sa field na "Pagbabayad" ay NULL din. Ano ang babalik sa atin ng gayong koneksyon? Ngunit wala itong ibabalik. Dahil ang paghahambing na NULL = NULL ay hindi nagsusuri sa True.

Upang maibalik ng kahilingan ang inaasahang resulta, muling isulat natin ito:

PILIIN ang "Walang mga pagbabayad" BILANG Katangian, VALUE(Document.Payment.EmptyLink) BILANG LUGAR ng Dokumento sa Mga Pagbabayad; ////////////////////////////////////////////// /////////////////////////// PUMILI NG Mga Kliyente. Link BILANG Kliyente, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink )) PAANO Pagbabayad ILAGAY ang tClientPayment MULA sa Directory.Mga Kliyente BILANG Kliyente NANG KALIWANG KONEKSYON Dokumento.Pagbabayad BILANG Pagbabayad NG Clients.Link = Payment.Shareholder; ////////////////////////////////////////////// /////////////////////////// PILIIN ang tClientPayment.Client MULA sa tClientPayment BILANG tClientPayment INTERNAL SUMALI tPayment BILANG tBabayaran NG tClientPayment.Payment = tPayment. Dokumento

Ngayon, sa pangalawang pansamantalang talahanayan, ipinahiwatig namin na kung ang field na "Pagbabayad" ay NULL, kung gayon ang field na ito ay isang walang laman na link sa dokumento ng pagbabayad. Sa Unang talahanayan pinalitan din namin ang NULL ng isang walang laman na sanggunian. Ngayon ang koneksyon ay nagsasangkot ng mga non-NULL na patlang at ibabalik ng kahilingan ang inaasahang resulta.

Ang lahat ng mga kahilingan na nakapaloob sa artikulo ay sumasalamin sa mga sitwasyon na nais kong isaalang-alang at wala nang iba pa. TUNGKOL SA Maaaring hindi sila delusional o suboptimal, ang pangunahing bagay ay sinasalamin nila ang kakanyahan ng halimbawa.

13. Isang undocumented feature ng "CHOICE WHEN...THEN...END" na disenyo.

Sa kaso kung kailan kinakailangan upang ilarawan ang pagbuo ng "Mga Kundisyon" sa kahilingan, ginagamit namin ang karaniwang syntax:

SELECT SELECTION WHEN Users.Name = "Vasya Pupkin" THEN "Our favorite employee" IBA "Hindi namin alam ito" END AS Field1 FROM Directory.Users AS Users

Ngunit paano kung, halimbawa, kailangan nating makuha ang pangalan ng buwan sa isang kahilingan? Ang pagsusulat ng malaking construction sa isang kahilingan ay pangit at nakakaubos ng oras, kaya ang paraan ng pagsulat sa itaas ay makakatulong sa atin na:

PUMILI NG BUWAN(US_CalculationConsumption_ScheduleTurnover.CalculationPeriod) WHEN 1 THEN "Enero" WHEN 2 THEN "February" WHEN 3 THEN "March" WHEN 4 THEN "April" WHEN 5 THEN "May" WHEN 6 THEN "June" THEN "June" WHEN 8 THEN "August" WHEN 9 THEN "September" KAPAG 10 THEN "October" KAPAG 11 THEN "November" WHEN 12 THEN "December" END AS A Month

Ngayon ang disenyo ay mukhang hindi gaanong masalimuot at madaling maunawaan.

14. Batch query execution.


Upang hindi dumami ang mga kahilingan, maaari kang lumikha ng isang malaking kahilingan, hatiin ito sa mga pakete at magtrabaho kasama nito.
Halimbawa, kailangan kong makuha ang mga sumusunod na field mula sa direktoryo ng "Mga User": "Petsa ng Kapanganakan" at ang mga available na tungkulin para sa bawat user. i-upload ito sa iba't ibang bahagi ng tabular sa form. Siyempre, magagawa mo ito sa isang kahilingan, pagkatapos ay kailangan mong umulit sa mga talaan o i-collapse ang mga ito, o magagawa mo ito:

SELECT Users.Link AS Buong Pangalan, Users.Date of Birth, Users.Role PUT vtUsers FROM Directory.Users BILANG Users; ////////////////////////////////////////////// /////////////////////////// PUMILI tueUsers.Buong pangalan, tueUsers.Petsa ng Kapanganakan MULA tueUsers BILANG tueUsers GROUP NG tueUsers.buong pangalan, tueUsers . Araw ng kapanganakan; ////////////////////////////////////////////// /////////////////////////// PUMILI NG wUsers.Full Name, wUsers.Role MULA SA wUsers AS wUsers GROUP BY wUsers.Full Name, wUsers. Petsa ng Kapanganakan

tPackage = Request.ExecutePackage();

TP_BirthDate = tPackage.Upload();
TP_Roles = tPackage.Unload();

Tulad ng nakikita natin, ang query ay maaaring isagawa sa isang batch at ang resulta ay maaaring iproseso bilang isang array. Sa ilang mga kaso ito ay napaka-maginhawa.

15. Mga kondisyon sa isang batch na kahilingan

Halimbawa, mayroon kaming isang batch na kahilingan, kung saan unang nakuha namin ang mga field: "Pangalan, Petsa ng Kapanganakan, Code" mula sa direktoryo ng "Mga Gumagamit" at nais na makakuha ng mga talaan na may mga kundisyon para sa mga field na ito mula sa direktoryo ng "Mga Indibidwal."

SELECT Users.Individual.Name AS Name, Users.Individual.Date of Birth AS Date of Birth, Users.Individual.Code AS Code PLACE vtUsers FROM Directory.Users AS Users; ////////////////////////////////////////////// ////////////////////////// PUMILI NG Mga Indibidwal. I-link BILANG Indibidwal MULA SA Direktoryo. Mga Indibidwal BILANG Indibidwal

Maaari kang magpataw ng mga kundisyon tulad nito:

WHERE Individuals.Code IN (SELECT vtUsers.Code FROM vtUsers) AT Individuals.Name IN (SELECT vtUsers.Code FROM vtUsers) AT Individuals.BirthDate IN (SELECT vtUsers.DateBirth FROM tvUsers)

At magagawa mo ito tulad nito:

WHERE (Individuals.Code, Individuals.Name, Individuals.Date of Birth) IN (SELECT tueUsers.Code, tueUsers.Name, tueUsers.Date of Birth MULA sa tueUsers)

Bukod dito, ito ay kinakailangan upang mapanatili ang kaayusan.

16. Pagtawag sa tagabuo ng query para sa "kondisyon" sa isang batch na kahilingan

Kapag kinakailangan na magpataw ng isang kondisyon, tulad ng sa halimbawa sa itaas, maaari mong kalimutan kung paano ito o ang field na iyon ay tinatawag sa virtual na talahanayan.
Halimbawa, kailangan mong magpataw ng kundisyon sa field na "Petsa ng Kapanganakan", at sa virtual na talahanayan ang patlang na ito ay tinatawag na "Petsa ng Kapanganakan ng Debtor", at kung nakalimutan mo ang pangalan, kakailanganin mong lumabas sa pag-edit ng kundisyon nang hindi pag-save at tingnan ang pangalan ng field. Upang maiwasan ito, maaari mong gamitin ang sumusunod na pamamaraan.

Kinakailangang maglagay ng mga bracket pagkatapos ng Construction "B" at mag-iwan ng bakanteng espasyo (espasyo) sa pagitan ng mga bracket, piliin ang puwang na ito at tawagan ang tagabuo ng query. Ang taga-disenyo ay magkakaroon ng access sa lahat ng mga talahanayan ng batch query. Gumagana ang pamamaraan sa parehong mga virtual na talahanayan ng rehistro at sa tab na "Mga Kundisyon". Sa huling kaso, kailangan mong suriin ang kahon na "P (arbitrary na kondisyon)" at ipasok ang mode ng pag-edit na "F4".

Ang mga query ay madalas na ginawa sa mabilisang at ang mga ito ay nagsisilbi lamang upang ilarawan ang "mga diskarte" na aking isinasaalang-alang.

Nais kong tingnan ang paggamit ng mga index sa mga query, ngunit ito ay isang napakalawak na paksa. Ilalagay ko ito sa isang hiwalay na artikulo, o idagdag dito mamaya.

upd1. Puntos 11,12
upd2. Puntos 13,14,15,16

Mga Ginamit na Aklat:
Wika ng query "1C:Enterprise 8" - E.Yu. Khrustaleva
Propesyonal na pag-unlad sa 1C:Enterprise 8 system."