1c virtual table balanse at turnover. Tab ng Query Batch

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, dapat mo munang i-order ang data nang direkta ayon sa uri ng sanggunian gamit ang "ORDER BY" construction, at pagkatapos ay ang "AUTO ORDER" construction.

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 Software Organizations 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 may 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 talaan lamang para sa mga kliyenteng may bayad 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:

PUMILI NG Clients.Link, Payment.Link FROM Directory.US_Subscribers BILANG US_Subscribers LEFT CONNECTION Document.Payment AS Payment Software (Clients.Link = Payment.Client AT Payment.Client.Name LIKE "Sugar Packet") GROUP NG Clients.Link, Payment. 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. 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 tClients AS tClients LEFT SUMALI 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) ; ////////////////////////////////////////////// ///////////////////////////////////////////////////// PUMILI NG 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 "January" 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 ulitin ang 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 ng tueUsers.Buong pangalan, tueUsers.Petsa ng Kapanganakan MULA sa 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 kundisyon 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."

Kapag nag-aayos ng mga sample sa mga totoong problema, sa karamihan ng mga kaso, ang pagpili ng data ay inayos alinsunod sa ilang pamantayan.

Sa kaso kapag ang pagpili ay ginawa mula sa isang tunay na talahanayan, walang mga paghihirap na lumitaw. Ang data ay naproseso nang walang kabuluhan:

Sa kaso kapag ang pinagmulan sa query ay isang virtual na talahanayan, ang sitwasyon ay nagiging mas kumplikado.


Binibigyang-daan ka ng wika ng query na magpataw ng kundisyon sa isang seleksyon mula sa mga virtual na talahanayan sa dalawang paraan: sa sugnay na WHERE at paggamit ng mga parameter ng virtual na talahanayan. Ang parehong mga pamamaraan ay hahantong sa parehong resulta (maliban sa ilang partikular na kaso), ngunit, gayunpaman, malayo ang mga ito sa katumbas.

Alam na natin na ang mga virtual na talahanayan ay tinatawag na virtual dahil wala sila sa database. Ang mga ito ay nabuo lamang sa sandaling ang isang kahilingan ay ginawa sa kanila. Sa kabila nito, maginhawa para sa amin (iyon ay, ang mga nagsusulat ng query) na isaalang-alang ang mga virtual na talahanayan bilang mga tunay. Ano ang mangyayari sa 1C Enterprise 8 system kapag na-access pa rin ng query na pinagsama-sama namin ang virtual na talahanayan?

Sa unang hakbang, bubuo ang system ng isang virtual na talahanayan. Sa ikalawang hakbang, pipiliin ang mga talaan mula sa resultang talahanayan na tumutugon sa kundisyong tinukoy sa sugnay na WHERE:
Malinaw na nakikita na ang panghuling sample ay hindi isasama ang lahat ng mga tala mula sa virtual na talahanayan (at, samakatuwid, mula sa database), ngunit ang mga lamang na nakakatugon sa ibinigay na kondisyon. At ang natitirang mga tala ay hindi isasama sa resulta.

Kaya, ang sistema ay hindi lamang walang silbi na gawain, ngunit dobleng walang silbi na gawain! Una, gagastusin ang mga mapagkukunan sa pagbuo ng isang virtual na talahanayan batay sa hindi kinakailangang data (sa figure na sila ay minarkahan bilang "mga lugar ng data A at B"), at pagkatapos ay gagawin ang trabaho upang i-filter ang data na ito mula sa huling resulta.

Posible bang agad, sa yugto ng pagbuo ng isang virtual na talahanayan, ihinto ang paggamit ng hindi kinakailangang data? Posible pala. Ito mismo ang idinisenyo para sa mga parameter ng virtual na talahanayan:

Sa pamamagitan ng pag-parameter ng isang virtual na talahanayan, agad naming nililimitahan ang dami ng data na ipoproseso ng query.

Ano ang pagkakaiba sa pagitan ng mga halaga ng parameter ng virtual na talahanayan na "Paraan ng Pagdaragdag"?
Kapag ang Paraan ng Pagdaragdag ay nakatakda sa "mga paggalaw", ang mga panahon lamang kung saan nagkaroon ng mga paggalaw ang ibabalik. Kapag ang "Mga Paggalaw at Hangganan ng Panahon" ay itinakda, pagkatapos ay 2 talaan ang idaragdag sa mga paggalaw sa itaas: mga paggalaw sa simula at katapusan ng panahon na tinukoy sa mga parameter ng VT. Ang field na "Registrar" ay walang laman para sa 2 record na ito.

Ang impormasyon na kinuha mula sa site

Kapag nag-aayos ng mga sample sa mga totoong problema, sa karamihan ng mga kaso, ang pagpili ng data ay inayos alinsunod sa ilang pamantayan.

Sa kaso kapag ang pagpili ay ginawa mula sa isang tunay na talahanayan, walang mga paghihirap na lumitaw. Ang data ay naproseso nang walang kabuluhan:

Sa kaso kapag ang pinagmulan sa query ay isang virtual na talahanayan, ang sitwasyon ay nagiging mas kumplikado.

Binibigyang-daan ka ng wika ng query na magpataw ng kundisyon sa isang seleksyon mula sa mga virtual na talahanayan sa dalawang paraan: sa sugnay na WHERE at paggamit ng mga parameter ng virtual na talahanayan. Ang parehong mga pamamaraan ay hahantong sa parehong resulta (maliban sa ilang partikular na kaso), ngunit, gayunpaman, malayo ang mga ito sa katumbas.

Alam na natin na ang mga virtual na talahanayan ay tinatawag na virtual dahil wala sila sa database. Ang mga ito ay nabuo lamang sa sandaling ang isang kahilingan ay ginawa sa kanila. Sa kabila nito, maginhawa para sa amin (iyon ay, ang mga sumulat ng query) na isaalang-alang ang mga virtual na talahanayan bilang mga tunay. Ano ang mangyayari sa 1C Enterprise 8 system kapag na-access pa rin ng query na pinagsama-sama namin ang virtual na talahanayan?

Sa unang hakbang, bubuo ang system ng isang virtual na talahanayan. Sa ikalawang hakbang, pipiliin ang mga talaan mula sa resultang talahanayan na tumutugon sa kundisyong tinukoy sa sugnay na WHERE:


Malinaw na nakikita na ang panghuling sample ay hindi isasama ang lahat ng mga tala mula sa virtual na talahanayan (at, samakatuwid, mula sa database), ngunit ang mga lamang na nakakatugon sa ibinigay na kondisyon. At ang natitirang mga tala ay hindi isasama sa resulta.

Kaya, ang sistema ay hindi lamang walang silbi na gawain, ngunit dobleng walang silbi na gawain! Una, gagastusin ang mga mapagkukunan sa pagbuo ng isang virtual na talahanayan batay sa hindi kinakailangang data (sa figure na sila ay minarkahan bilang "mga lugar ng data A at B"), at pagkatapos ay gagawin ang trabaho upang i-filter ang data na ito mula sa huling resulta.

Posible bang agad, sa yugto ng pagbuo ng isang virtual na talahanayan, ihinto ang paggamit ng hindi kinakailangang data? Posible pala. Ito mismo ang idinisenyo para sa mga parameter ng virtual na talahanayan:


Sa pamamagitan ng pag-parameter ng isang virtual na talahanayan, agad naming nililimitahan ang dami ng data na ipoproseso ng query.

Ano ang pagkakaiba sa pagitan ng mga halaga ng parameter ng virtual na talahanayan na "Paraan ng Pagdaragdag"?
Kapag ang Paraan ng Pagdaragdag ay nakatakda sa "mga paggalaw", ang mga panahon lamang kung saan nagkaroon ng mga paggalaw ang ibabalik. Kapag ang "Mga Paggalaw at Hangganan ng Panahon" ay itinakda, pagkatapos ay 2 talaan ang idaragdag sa mga paggalaw sa itaas: mga paggalaw sa simula at katapusan ng panahon na tinukoy sa mga parameter ng VT. Ang field na "Registrar" ay walang laman para sa 2 record na ito.

Tawagan natin ang dialog para sa paglalagay ng mga parameter ng PriceSliceLast virtual na talahanayan at ipahiwatig na ang panahon ay ipapasa sa ReportDate na parameter. Upang gawin ito, piliin ang talahanayang ito sa listahan ng Mga Talahanayan at i-click ang pindutan ng Mga Pagpipilian sa Virtual Table. Pagkatapos ay piliin ang mga sumusunod na field mula sa mga talahanayan:

    SprNomenclature. magulang,

    PresyoSlice ng Latest.Price.

Pagsali sa kaliwang mesa

- Sa bookmark Mga koneksyon: sa field na Kondisyon ng Link, na ang halaga ng dimensyon ng Nomenclature ng rehistro ng impormasyon ay dapat na katumbas ng reference sa elemento ng direktoryo ng Nomenclature. At alisan din ng tsek ang All checkbox para sa register table at suriin ito para sa lookup table, at sa gayon ay itatakda ang uri ng koneksyon bilang isang kaliwang koneksyon para sa lookup table:

kanin. 13.15. Relasyon sa pagitan ng mga talahanayan sa isang query

- Sa bookmark Mga kundisyon itakda natin ang kundisyon para sa pagpili ng mga elemento mula sa direktoryo ng Nomenclature - ang mga napiling elemento ay dapat tumutugma sa uri ng nomenclature na ipinasa sa parameter ng kahilingan ng Nomenclature Type:

kanin. 13.16. Mga kondisyon para sa pagpili ng mga elemento

- Sa bookmark Mga Unyon/Alyas: tukuyin ang alias ng field na Parent = Service Group, at ang field na Link = Service. - I-click ang OK–

Pagkatapos nito, kailangan mong i-edit ang scheme ng layout ng data, upang gawin ito sa tab Mga mapagkukunan, i-click ang button idagdag at pumili ng mapagkukunan - Presyo

- Sa bookmark Mga pagpipilian itakda ang halaga ng parameter na Uri ng Nomenclature - Enumeration.Nomenclature Types.Service. Bilang karagdagan, aalisin namin ang paghihigpit sa availability para sa parameter ng ReportDate. Sa field na Uri ng parameter na ito, itakda ang komposisyon ng petsa - Petsa. Para sa parameter na Panahon, sa kabaligtaran, nagtakda kami ng paghihigpit sa availability:

kanin. 13.17. Mga Opsyon sa Layout Scheme

Mga setting

- Pumunta tayo sa bookmark Mga Setting: Gumawa tayo ng pagpapangkat batay sa field ng Service Group, na tumutukoy sa uri ng pagpapangkat na Hierarchy.

Ang mga sumusunod na uri ng hierarchy ay umiiral para sa mga pagpapangkat ng ulat: Nang walang hierarchy - mga hindi hierarchical na tala lamang ang ipinapakita sa pagpapangkat. Hierarchy - parehong hindi hierarchical at hierarchical na mga talaan ay ipinapakita sa pagpapangkat. Hierarchy lamang - ang mga hierarchical (magulang) na talaan lamang ang ipinapakita sa pagpapangkat. Sa loob ng pangkat na ito gagawa kami ng isa pa, nang hindi tinukoy ang field ng grupo. Sa sub-tab Mga napiling field: tukuyin ang mga patlang ng output Serbisyo at Presyo:

kanin. 13.18. Istruktura ng ulat at mga patlang

Sa sub-tab Iba pa mga setting ay gagawin namin ang mga sumusunod na hakbang:

kanin. 13.19. Mga setting para sa pagpapakita ng mga pangkalahatang kabuuan para sa pagpapangkat ng "Pangkat ng Serbisyo."

kanin. 13.20. Pagse-set up at pagpapakita ng mga resulta para sa isang pandaigdigang ulat

Panghuli, isama natin ang parameter ng Report Date sa mga setting ng user at itakda ang Editing Mode nito sa Quick Access. Isara natin ang taga-disenyo ng scheme ng komposisyon ng data at sa window para sa pag-edit ng bagay na Listahan ng Mga Serbisyo, pumunta sa tab na Mga Subsystem. Sa listahan ng mga subsystem ng pagsasaayos, tandaan ang mga subsystem ng Probisyon ng Serbisyo at Accounting.

    Sa 1C: Enterprise mode

Ilunsad natin ang 1C:Enterprise sa debug mode at una sa lahat buksan ang periodic register Prices. Pagkatapos ay susuriin namin ang ulat.

Gamit ang ulat na ito bilang isang halimbawa, pinag-aralan namin kung paano nakukuha ng sistema ng komposisyon ng data ang pinakabagong mga halaga mula sa rehistro ng pana-panahong impormasyon at kung paano ipinapakita ang mga pagpapangkat ayon sa hierarchy ng direktoryo.

Kung ang aking publikasyon ay kapaki-pakinabang sa iyo, huwag kalimutang bigyan ito ng dagdag :-)

Narito ang isang rubricator para sa lahat ng mga gawain sa koleksyon(isang pahina na naglalaman ng mga link sa mga thread ng forum para sa bawat gawain)
http://chistov.spb.ru/forum/16-969-1

Well, ngayon ang aking mga pag-unlad at mga tala na aking ginawa sa panahon ng proseso ng paghahanda.
Susubukan kong ulitin hangga't maaari sa dalawang nabanggit sa itaas huli mga publikasyon.

Kaya magsimula tayo:


Kung dadalhin mo ito nang malayuan, dapat ay mayroon kang dalawang bagay sa iyong desktop sa pagtatapos ng pagsusulit:

1. Panghuling pag-upload ng base ng impormasyon (dt file)
2. Paliwanag na tala

Dapat wala nang iba, walang intermediate na kopya, atbp.

Siguraduhing magsulat ng isang paliwanag na tala!
Sa kaso ng isang malabo na nabalangkas na gawain, siguraduhing isulat doon na eksaktong napili mo ang ganoon at ganoong opsyon sa solusyon.
Gayundin, sa mga pangunahing lugar sa code, mas mahusay na mag-iwan ng mga maikling komento, nang walang panatismo, ngunit kung saan maaaring may mga katanungan ang tagasuri, mas mahusay na magsulat.

Ngunit sasabihin sa iyo ang tungkol dito sa mga tagubilin na ibibigay sa iyo upang basahin bago ang pagsusulit.
Mas mabuting malaman mo nang maaga)


Gamit ang ampersand character sa mga query.

Minsan mas mabilis na mag-type mula sa karagdagang keyboard kaysa ilipat ang layout nang pabalik-balik, na nakakatipid ng oras
& = Alt+38

*************************************************************************************************
Paggamit ng TimePoint() sa Mga Query

Sa mga query sa accumulation at accounting registers, kailangang gamitin hindi ang petsa ng dokumento bilang virtual table (period) na parameter, ngunit ang Moment parameter, na tinukoy sa code bilang mga sumusunod:

Sandali = ?(Passing Mode = Document Posting Mode. Operational, Undefined, Moment of Time());

*************************************************************************************************
Kapag bumubuo ng mga paggalaw ng dokumento sa pamamagitan ng rehistro, sa pinakadulo simula ng proseso ng pagpoproseso ng pag-post, kinakailangan na i-clear ang mga paggalaw ng kasalukuyang dokumento sa pamamagitan ng rehistro.

Ang code ay:

Movement.RegisterName.Write = True; Movements.RegisterName.Clear();

Posible na sa panahon ng proseso ay kakailanganing suriin ang mga talaan mula sa rehistrong ito.
Kaya, upang kapag sinusuri ang kasalukuyang mga tala (mga luma, bago binago ang dokumento) tiyak na hindi sila kasama sa sample, maaari kang magdagdag ng isa pang linya sa dalawang linya sa itaas:

Movement.RegisterName.Write();

O, kapag sinusuri ang mga talaan, tahasang nagpapahiwatig ng hangganan na hindi kasama ang punto sa oras ng kasalukuyang dokumento.

Ngunit kahit saan ay ipinahiwatig ko lamang ang pagtatayo ng tatlong linyang ito:

Movement.RegisterName.Write = True; Movements.RegisterName.Clear(); Movement.RegisterName.Write();

*************************************************************************************************
Mayroong dalawang mga paraan upang harangan ang data, ang pagpili sa pagitan ng mga ito ay depende sa paraan na ginamit - luma o bago:

1) Regular na kinokontrol na pagharang, lumang paraan ng pagpoproseso ng dokumento (Data Blocking object)

Itakda kung ang mga balanse ay unang susuriin at pagkatapos ay ipapawalang-bisa.
Sa kaso kung kailan kailangan nating magkaroon ng ilang impormasyon mula sa rehistro upang bumuo ng isang kilusan.


Halimbawa:

Sa dokumento - dami, sa rehistro - dami at halaga (gastos)
Kaya, alam namin ang dami ng mga kalakal mula sa dokumento - kung magkano ang isinulat namin, ngunit ang gastos - hindi.
Malalaman lamang natin ito mula sa rehistro, ngunit upang matiyak na walang magbabago sa rehistro sa pagitan ng sandali ng pagtanggap ng mga balanse at ang sandali ng pagtatala ng mga paggalaw, kailangan nating i-lock ang rehistro bago pa man basahin ang mga balanse.
Kaya, sa kasong ito, ang Data Locking object ay ginagamit. At kapag nililikha ito, mas tama na ipahiwatig kung anong mga sukat ang hinaharang namin ang rehistro (halimbawa, sa aming kaso - sa pamamagitan lamang ng item na tinukoy sa dokumento) - upang walang mga hindi kinakailangang mga kandado at ang isa pang gumagamit ay maaaring magbenta ng isa pa aytem.


1. Magtakda ng lock gamit ang Data Lock object
2. Basahin ang natitira
3. Sinusuri namin ang posibilidad ng write-off
4. Lumilikha kami ng mga paggalaw, halimbawa, isulat ang mga kalakal
5. Pagkatapos i-post ang dokumento, ang pagharang ay awtomatikong tinanggal (ang pagharang ay may bisa bilang bahagi ng transaksyon sa pag-post at awtomatikong tinanggal ng system). Iyon ay, hindi na kailangang espesyal na i-unlock ang bagay.

2) Bagong pamamaraan para sa pagproseso ng mga dokumento (gamit ang LockForChange property = True)

Ginagamit ito kung hindi namin kailangan ng impormasyon mula sa mga rehistro upang makabuo ng mga paggalaw, at maaari naming suriin kung kami ay naging negatibo kapag isinusulat kung, pagkatapos ng pag-record, tinitingnan namin ang mga balanse sa rehistro at nakita namin na may mga negatibo. . Sa kasong ito, mauunawaan namin na sobra-sobra na ang naisulat namin at kakanselahin ang pagpapatakbo ng write-off.

Halimbawa:
Isaalang-alang natin ang pagpapatakbo ng pagbebenta ng isang produkto.
Sa dokumento - dami, sa rehistro - dami lamang
Kaya, alam namin ang dami ng mga kalakal mula sa dokumento.
Bumubuo kami ng mga paggalaw na may tinukoy na dami sa dokumento at itinatala ang mga ito. Susunod, binabasa namin ang rehistro, tingnan ang mga balanse, at pag-aralan kung mayroong anumang mga negatibo. Kung mayroon, magpakita ng error at itakda ang Refusal = True.

Iyon ay, ang pagkakasunud-sunod ay ganito:
1. Upang lumipat sa rehistro, itakda ang BlockForChange property = True
2. Lumilikha kami ng mga paggalaw - isulat ang mga kalakal
3. Itala ang mga galaw
4. Basahin ang rehistro at siguraduhing walang negatibong balanse. Kung mayroon, pagkatapos ay isinulat nila ang labis, kung hindi, kung gayon ang lahat ay maayos.

Kaya, sa kasong ito, hindi na kailangang ipahiwatig kung aling mga sukat ang kailangan nating harangan ang rehistro.
Itinakda lang namin ang BlockForChange property sa True bago i-record ang aming mga paggalaw, bumuo ng mga paggalaw at i-record.
Ang system mismo ay haharang sa rehistro sa oras ng pag-record ayon sa mga sukat na kinakailangan, na nasuri kung ano ang aming naitala.
Kapag nakumpleto na, ang pagharang ay aalisin.

Ang pagpipiliang ito (ang pangalawa) ay mas simple, ito ay tinatawag na "bagong pamamaraan para sa pagproseso ng mga dokumento" at inirerekomenda ng 1C na gamitin ito kung maaari at ibinabawas ang mga puntos kung ang unang pagpipilian ay ginamit, ngunit sa ilang mga kaso ay hindi ito mailalapat at ang unang pagpipilian ay may ang Data Locking object ay ginagamit (tingnan ang. halimbawa sa itaas).

Pansinin ko rin na anuman ang napiling pamamaraan, ang mga paggalaw ay dapat linisin bago magtrabaho kasama ang mga ito (tingnan ang nakaraang payo)

*************************************************************************************************
Pag-block ng data (paraan ng pagharang No. 1 mula sa paglalarawan sa itaas)

Kinakailangan ang kinokontrol na pag-lock kung saan binabasa ang data at ginagawa ang mga paggalaw batay sa data na ito
Ang pinakamabilis na paraan para makuha ang pinamamahalaang locking code ay ilagay ang “Data Locking”, tawagan ang Syntax Assistant at kopyahin lang ang halimbawang code mula doon. Pagkatapos ay baguhin lamang ito sa pangalan ng iyong rehistro at mga sukat.

Mukhang ganito:

Lock = NewDataLock; Locking Element = Locking.Add("Accumulation Register.GoodsInWarehouses"); LockElement.Mode = DataLockMode.Exclusive; BlockingElement.DataSource = PM; Locking Element.UseFromDataSource("Nomenclature", "Nomenclature"); Lock.Lock();

*************************************************************************************************
Mas mainam na tawagan ang tabular na bahagi ng mga dokumento na simpleng "TC"

Mayroon lamang isang tabular na bahagi sa 99% ng mga dokumento. Ang gayong pinag-isang pangalan para sa mga bahagi ng tabular ay makatutulong na makatipid ng oras, dahil:
1) Napakaikli - mabilis na sumulat
2) Pareho para sa lahat ng mga dokumento, hindi mo kailangang tandaan kung ano ang tawag dito kapag nagsusulat ng code

*************************************************************************************************
Ang resulta ng query ay dapat suriin para sa kawalan ng laman bago kunin o i-upload sa teknikal na detalye.

Sa pangkalahatan, gumamit ako ng sampling sa lahat ng gawain.

Ang sampling ay mas pinakamainam para sa system sa mga tuntunin ng pagganap, dahil ito ay "pinatalas" para lamang sa pagbabasa ng data (hindi tulad ng TK).

Ngunit sa anumang kaso, bago ang Select() na pamamaraan, ito ay mas mahusay na suriin ang resulta ng query para sa kawalan ng laman, ito ay higit pang mabawasan ang pagkarga sa system.

Resulta = Query.Run(); Kung Hindi Result.Empty() Then Select = Result.Select(TravelQueryResult.ByGrouping); ... Tapusin kung;

At kung sakaling kailangan lang nating makakuha ng isang halaga mula sa kahilingan
(halimbawa, ang paraan lamang ng write-off alinsunod sa patakaran sa accounting na itinatag para sa taong ito):

Resulta = Query.Run(); Kung Hindi Result.Empty() Then Select = Result.Select(); Selection.Next(); Cost Write-off Method = Sample.Cost Write-Off Method; tapusin kung;

*************************************************************************************************
Idokumento ang "Operasyon" para sa isang gawain sa accounting

Kinakailangang lumikha ng isang dokumento ng Operasyon para sa mga gawain sa accounting.

Hindi namin pinagana ang pag-post para dito nang buo (sa mga katangian na "Pag-post = Tanggihan"), ipahiwatig na gumagawa ito ng mga paggalaw sa accounting register, at i-drag ang mga paggalaw papunta sa form.

*************************************************************************************************
Mabilis na pagproseso ng mga dokumento:

Dapat kasama:
Sa pagpapatakbo at accounting. dapat paganahin ang accounting para sa mga dokumento (maliban sa dokumentong "Operasyon", tingnan sa ibaba).

Dapat Naka-off:
sa mga gawain sa pagkalkula ay hindi makatuwiran para sa isang dokumento ng payroll.

Para sa dokumentong "Operation", ang pag-post ay dapat na ganap na hindi pinagana (sa mga katangian ng dokumento na "Pag-post = Ipagbawal"),
dahil nagsusulat siya ay nagsusulat lamang ng data nang direkta sa rehistro kapag nagsusulat.

*************************************************************************************************
Kundisyon sa isang kahilingan ng form na "Alinman sa tinukoy na katawagan o anuman, kung hindi tinukoy"

Sa mga query, nakatagpo ang sumusunod na gawain: halimbawa, kailangan mong pumili ng mga dokumento na may tinukoy na katawagan o lahat ng mga dokumento kung hindi tinukoy ang katawagan.
Ito ay malulutas ng sumusunod na kundisyon sa mismong kahilingan:

Nomenclature = &Nomenclature O &Nomenclature = Value(Directory.Nomenclature.EmptyLink)

Ngunit ito ay magiging mas mahusay at tama upang baguhin ang kundisyong ito (salamat yukon):


Request.Text = Request.Text + "WHERE Nomenclature = &Nomenclature";

tapusin kung;

Sa pagdating ng modelo ng query object sa 8.3.5, magiging posible na magdagdag ng kundisyon nang mas secure:

Kung ValueFilled(Nomenclature) Pagkatapos
Query1.Selection.Add("Item = &Nomenclature");
Request.SetParameter("Nomenclature", Nomenclature);
tapusin kung;

*************************************************************************************************
Pagsasama ng mga talahanayan sa mga query:

Ang bilang ng kabuuang mga tala ay hindi nakadepende sa kung ang field ng pinagsamang talahanayan ay ipinapakita, ito ay nakasalalay lamang sa mga naka-configure na relasyon.
Iyon ay, ang field ng nakalakip na talahanayan ay maaaring hindi maipakita.

Kung nais mong ilakip ang isang talahanayan nang walang anumang mga kundisyon, pagkatapos ay sa tab ng mga kundisyon isulat lamang ang kundisyon na "TRUE".
Sa kasong ito, eksaktong isasama ang talahanayan.

*************************************************************************************************
Gamit ang plano ng mga uri ng katangian (PVC):

1. Gamitin bilang isang mekanismo para sa paglalarawan ng mga katangian ng mga bagay.

1.1. Lumilikha kami ng PVC. Ito ay magiging Mga Uri ng Katangian (halimbawa, kulay, laki, max. bilis, atbp.). Sa mga setting, piliin ang lahat ng posibleng uri ng mga halaga ng katangian at, kung kinakailangan, likhain ang bagay mula sa punto 1.2 at ipahiwatig din ito sa mga setting.

1.2. Para sa mga karagdagang halaga ng PVC, lumikha kami ng isang subordinate na direktoryo Mga Karagdagang Halaga ng Mga Katangian (o simpleng Mga Halaga ng Mga Katangian).
Mag-iimbak ito ng mga katangian kung wala sila sa mga kasalukuyang direktoryo. Maaaring hindi namin ito likhain kung ang lahat ng mga katangiang kailangan namin ay nasa mga kasalukuyang direktoryo, o ang mga halagang ito ay maaaring katawanin ng mga elementarya na uri ng data. Sa mga setting ng PVC, ipinapahiwatig namin na ang direktoryo na ito ay gagamitin para sa mga karagdagang layunin. mga halaga ng katangian.

1.3. Lumilikha kami ng isang rehistro ng impormasyon, na aktwal na nag-uugnay sa tatlong bagay:
- Ang bagay kung saan ikinonekta namin ang mekanismo ng mga katangian
- Uri ng Mga Katangian (uri ng PVC)
- Halaga ng mga katangian (uri - katangian, ito ay isang bagong uri na lumitaw sa system pagkatapos ng paglikha ng PVC
at naglalarawan sa lahat ng posibleng uri ng data na maaaring kunin ng isang katangiang halaga).
Sa rehistro ng impormasyon, ipinapahiwatig namin na ang Uri ng Katangian ay ang may-ari para sa Halaga ng Katangian (link sa parameter ng pagpili), pati na rin ang uri ng koneksyon para sa Halaga ng Katangian, muli mula sa Uri ng Katangian.

Ang isa pang tampok ay na para sa bawat nilikha na uri ng katangian, maaari mong tukuyin ang uri ng katangian na halaga, kung hindi mo kailangan ang lahat ng posibleng uri upang ilarawan ang halaga ng katangiang ito.

2. Paggamit ng PVC upang lumikha ng sub-conto na mekanismo para sa accounting register .

2.1. Gumagawa kami ng PVC TypesSubconto.

2.2. Lumilikha kami ng isang subordinate na direktoryo na ValuesSubConto (tulad ng mga katangian, maglalaman ito ng mga halaga ng subconto kung walang ganoon sa ibang mga direktoryo).

2.3. Ginagawa ang komunikasyon gamit ang isang tsart ng mga account.

*************************************************************************************************
Mga mapagkukunan ng rehistro ng accounting:

Halaga - balanse,
Dami - off-balance sheet at nauugnay sa katangian ng accounting Quantitative

*************************************************************************************************
Mga talahanayan ng pagpaparehistro ng virtual accounting:

Turnover: turnover ng isang account
TurnoverDtKt: turnover sa pagitan ng alinmang dalawang account, iyon ay, lahat ng parehong transaksyon para sa panahon.

*************************************************************************************************
Accounting ng pera sa mga rehistro ng accounting - kung paano ipatupad:

Gumagawa kami ng isang accounting attribute na "currency" sa chart ng mga account.
Sa rehistro ng accounting, lumikha din kami ng:
- Dimensyon ng currency (pagbabawal sa mga blangkong halaga, off-balance sheet, accounting attribute - currency)
- resource CurrencyAmount (off-balance sheet, accounting attribute - currency, iimbak nito ang halaga sa currency, iyon ay, $100 halimbawa)
Lahat.

Kaya ang istraktura ng rehistro ay:

Mga sukat:
- Pera
Mga mapagkukunan
- Dami
- Halaga (halaga sa rubles)
- CurrencyAmount (halaga sa pera)

Kaya, ang accounting ng pera ay isang pagpipino lamang ng maginoo na accounting sa Republic of Belarus; hindi nito binabago ang kakanyahan ng, halimbawa, ang halaga ng mapagkukunan.
(doon, gaya ng dati, ang halaga ay nasa rubles, hindi alintana kung ang account ay nasa dayuhang pera o hindi).
At kung ang tampok na accounting ng Currency ay naka-off para sa account, kung gayon ito ang karaniwang istraktura ng Republika ng Belarus (mga mapagkukunan - dami at halaga lamang).

*************************************************************************************************
Kapag nagtatakda ng mga parameter ng isang virtual na talahanayan upang makakuha ng isang slice ng huli, nagpapataw kami ng mga kundisyon sa mga sukat, at hindi sa mga mapagkukunan.

Kung hindi, hindi kami makakakuha ng isang piraso ng mga pinakabagong, ngunit ang huling tala na may tinukoy na halaga ng mapagkukunan - maaaring hindi ito ang huli sa hanay ng mga sukat

*************************************************************************************************
Ang kahulugan ng mapagkukunan at mga detalye sa rehistro ng pagkalkula

Sa mga rehistro ng pagkalkula, ang paglikha ng isang mapagkukunan ay ginagawang posible na matanggap ito kapag kinakalkula ang base gamit ang rehistrong ito.
At kahit na sa proporsyon sa ibinigay na panahon, ang halaga ng mapagkukunan ay muling kakalkulahin (kung ang batayang panahon ay hindi nag-tutugma sa periodicity ng rehistro).

At ang halaga ng katangian ay magagamit lamang sa totoong talahanayan ng rehistro ng pagkalkula; hindi ito magagamit sa mga virtual na talahanayan.

*************************************************************************************************
Checkbox na "Basic" sa mga katangian ng dimensyon ng rehistro ng pagkalkula
Nangangahulugan ito na ang isang base ay makukuha mula sa dimensyong ito sa hinaharap at nagsisilbi para sa karagdagang pag-index ng mga halaga para sa field na ito.

*************************************************************************************************
Ang breakdown ng panahon ng bisa ng bakasyon ayon sa buwan kapag nagre-record ng mga set ng mga entry sa rehistro,
kung ang bakasyon ay tinukoy sa dokumento sa isang linya para sa ilang buwan nang sabay-sabay sa isang linya:

StartDate of CurrentMonth = Start of Month(TexLineMainAccruals.ActionPeriodStart); CurrentMonthEndDate = EndMonth(TexLineMainAccruals.ActionPeriodStart); CurrentMonth = Petsa; WhileDateStartCurrentMonth<= НачалоМесяца(ТекСтрокаОсновныеНачисления.ПериодДействияКонец) Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодДействияНачало = Макс(ДатаНачалаТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияНачало); Движение.ПериодДействияКонец = КонецДня(Мин(ДатаОкончанияТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияКонец)); Движение.ПериодРегистрации = Дата; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаОсновныеНачисления.Подразделение; Движение.Сумма = 0; Движение.КоличествоДней = 0; Движение.График = ТекСтрокаОсновныеНачисления.График; Движение.Параметр = ТекСтрокаОсновныеНачисления.Параметр; Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(Дата, -3)); Движение.БазовыйПериодКонец = КонецДня(КонецМесяца(ДобавитьМесяц(Дата, -1))); ДатаНачалаТекМесяца = НачалоМесяца(ДобавитьМесяц(ДатаНачалаТекМесяца, 1)); ДатаОкончанияТекМесяца = КонецМесяца(ДатаНачалаТекМесяца); КонецЦикла; КонецЕсли;

*************************************************************************************************
Pagbuo ng Gantt Chart:

Naglalagay kami ng elemento ng uri ng "Gantt Chart" sa form, tinawag itong DG, pagkatapos ay lumikha ng command na "Bumuo" at isulat ang sumusunod sa module ng form:

&OnClient Procedure Bumuo(Command) BumuoOnServer(); Katapusan ng Pamamaraan &Sa Server Procedure GenerateOn Server() DG.Clear(); DG.Update = Mali; Kahilingan = Bagong Kahilingan("SELECT |BasicAccrualsActualActionPeriod.Employee, |BasicAccrualsActualActionPeriod.CalculationType, |BasicAccrualsActualActionPeriod.ActionPeriodStart AS ActionPeriodStart, |BasicAccrualsActualActionPeriod.CalculationType, |BasicAccrualsActualActionPeriod.ActionPeriodStart AS ActionPeriodStart, |BasicAccrualsActualActionPeriod. Accruals.ActualPeriodActions AS BasicAccrualsActualPeriodActions |WHERE |BasicAccrualsActualPeriodActions.PeriodActions BETWEEN &StartDate AT &EndDate "); Query.SetParameter("StartDate", Period.StartDate); Request.SetParameter("EndDate", Period.EndDate); Piliin = Query.Run().Select(); Habang Selection.Next() Loop Point = DG.SetPoint(Selection.Employee); Serye = DG.SetSeries(Selection.CalculationType); Halaga = DG.GetValue(Punto, Serye); Interval = Value.Add(); Interval.Start = Sample.PeriodActionStart; Interval.End = Sample.ActionPeriodEnd; EndCycle; DG.Update = True; Katapusan ng Pamamaraan

Sa totoo lang, tanging ang code sa loop ang mahalaga sa amin dito, ang iba pang mga bagay ay auxiliary, ibinigay ko lang ang buong pagpapatupad ng subtask na ito.
Sa kahilingan, mahalaga para sa amin na mayroong empleyado, uri ng pagbabayad, petsa ng pagsisimula at petsa ng pagtatapos ng panahon.
Ang code ay talagang napaka-simple, madaling tandaan, huwag maalarma kung mukhang mahirap

*************************************************************************************************
Pinoproseso ang mga entry na "reversal" sa mga gawain sa pagkalkula:

Sa pamamaraan ng pagproseso ng transaksyon (modul ng object), binubuo namin ang lahat ng mga paggalaw, at pagkatapos ay kung may mga tala sa ibang mga panahon, nakukuha namin ang mga ito tulad nito
(awtomatikong binubuo ng system ang mga ito - tinutulungan kami):

Mga Tala ng Pagdaragdag = Movements.MainAccruals.GetAddition(); // Hindi na kailangang mag-record ng mga paggalaw para makuha ang karagdagan

Para sa Bawat Tech Line Mula sa Record Additions Cycle
Record = Movements.MainAccruals.Add();
FillPropertyValues(Record, TechString);
Record.RegistrationPeriod = TechString.RegistrationPeriodReversal;
Record.ActionPeriodStart = TechString.ActionPeriodStartReverse;
Record.ActionPeriodEnd = TechString.ActionPeriodEndReversal;
Katapusan ng Ikot

At kapag nagkalkula ng mga tala, maglagay ng mga tseke:

Kung TechMotion.Reversal Then
CurrentMovement.Sum = - CurrentMovement.Amount;
tapusin kung;

*************************************************************************************************
Paano matukoy kung ano ang kasama sa mga pangunahing accrual at kung ano ang kasama sa mga karagdagang accrual sa mga gawain sa pagkalkula.

Ngunit hindi ito palaging 100% malinaw; mayroon ding mas kumplikadong mga kaso, bagama't medyo marami sa kanila
(halimbawa, isang bonus na nakasalalay sa bilang ng mga araw ng trabaho sa isang buwan - ito ay SIYA).

Mga pangunahing singil:
Kung ang uri ng pagkalkula ay nakasalalay sa iskedyul (ibig sabihin ay isang rehistro ng impormasyon na may mga petsa sa kalendaryo), kung gayon ito ay tumutukoy sa mga pangunahing singil.

Halimbawa OH:
- Sahod
- Isang bagay na kinakalkula mula sa bilang ng mga araw ng trabaho (at para dito kailangan mong gumamit ng iskedyul): alinman sa panahon ng bisa (tulad ng suweldo) o sa base period

Karagdagang singil:
Ano ang isinasaalang-alang alinman mula sa naipon na halaga, o sa oras na GUMAGANA (at hindi sa karaniwan!), o hindi nakasalalay sa lahat - ito ay karagdagang. mga accrual.

Iyon ay: ang mga accrual para sa pagkalkula kung saan ang pamantayan ng oras ay ginagamit (maaaring isang katotohanan din) ay OH, at kung saan ang aktwal na data o wala sa lahat ay kinakailangan ay DN.

O sa madaling salita:

Kung gumagamit ang VR ng time standard, dapat isama ang validity period para sa VR.

*************************************************************************************************
Idagdag ang kakayahang buksan ang built-in na seksyon ng tulong na "Paggawa gamit ang mga sangguniang aklat" sa form ng listahan ng direktoryo ng "Nomenclature."

Patakbuhin ang utos sa form:

&OnClient
Tulong sa Pamamaraan(Utos)
OpenHelp("v8help://1cv8/EnterprWorkingWithCatalogs");
Katapusan ng Pamamaraan

Tinukoy namin ang linya ng seksyon tulad ng sumusunod:
Pumunta sa impormasyon ng tulong ng object ng pagsasaayos (sa configurator), magsulat ng isang salita, piliin ito, pumunta sa menu ng Mga Elemento/Link at piliin ang nais na seksyon ng 1C Help, pagkatapos nito ay awtomatikong ipinasok ang link. Mukhang kumplikado, ngunit sa pagsasanay ito ay madali.

*************************************************************************************************
Pagpapatupad ng pakikipag-ugnayan sa pagitan ng mga form, halimbawa, pagpili:

1. Mula sa kasalukuyang form, buksan ang ninanais gamit ang "OpenForm()" na paraan, na ipinapasa ang istraktura na may mga parameter bilang pangalawang parameter (kung kinakailangan). Ang ikatlong parameter ay maaaring magpasa ng isang link sa form na ito - ThisForm.

2. Sa binuksan na form, sa "When CreatedOnServer()" handler, maaari nating makuha ang mga parameter na ipinasa sa hakbang 1 sa pamamagitan ng "Mga Parameter.[ParameterName]". Ang form na nagpasimula ng pagbubukas ng form na ito ay maa-access sa pamamagitan ng "May-ari" identifier (kung ito ay, siyempre, tinukoy sa hakbang 1).

At higit sa lahat, magiging available ang mga export function ng form ng may-ari. Iyon ay, maaari naming tawagan ang export function ng source form at ipasa ang isang bagay doon bilang isang parameter upang maproseso ang pagpili. At pupunan na ng function na ito ang kailangan sa orihinal na form. Mayroon lamang isang caveat - hindi ka maaaring magpasa ng isang talahanayan ng mga halaga sa pagitan ng mga pamamaraan ng kliyente, ngunit maaari naming ilagay ito sa pansamantalang imbakan at ipasa lamang ang VX address, at pagkatapos ay kunin ito mula sa VX.

*************************************************************************************************
Lifecycle ng Mga Parameter ng Form

Ang lahat ng mga parameter na inilipat sa form sa oras ng pagbubukas nito ay makikita lamang sa "Kapag CreateOnServer" na pamamaraan.
Kapag nagawa na, masisira ang lahat ng parameter at hindi na available sa form.
Ang exception ay para sa mga parameter na idineklara sa form editor na may attribute na "Key Parameter".
Tinutukoy nila ang pagiging natatangi ng anyo.
Iiral ang parameter na ito hangga't umiiral ang form mismo.

*************************************************************************************************
Gamit ang Taxi interface

Sa panahon ng pag-unlad, maaari mong itakda ang karaniwang pinamamahalaang interface 8.2 sa mga katangian ng pagsasaayos - ginagawa nitong mas compact at pamilyar ang lahat.
Ito ay totoo lalo na kung nagrenta ka nang malayuan - ang resolution ng screen ay napakaliit, at imposibleng gumawa ng anuman sa interface ng "taxi".
Basta huwag kalimutang maglagay muli ng "Taxi" kapag tapos ka na!Kung hindi, ang tagasuri ay magbawas ng mga puntos!

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

PS: E Mayroong hiwalay na mga karaniwang subtask na ginagamit sa lahat ng mga gawain, at ito ang kailangan mong malutas (halimbawa, pagsulat sa pamamagitan ng mga batch, gamit ang PVC (well, ito ay talagang bihira) at iba pa). At sa lahat ng mga gawain sila ay paulit-ulit lamang (sa isang lugar mayroong ilang mga subtasks, sa ibang lugar, sa iba't ibang mga kumbinasyon lamang). Bukod dito, matagal na nilang ipinangako na maglalabas ng isang bagong koleksyon (kung hindi pa nila nagagawa), kung saan dapat magkaroon ng higit pang mga problema, iyon ay, walang punto sa pagsasaulo ng mga solusyon sa mga indibidwal na problema, makatuwirang matutunan kung paano lutasin ang mga indibidwal na karaniwang subtask, pagkatapos ay malulutas mo ang anumang problema.

PSS: Mga kasamahan, kung sinuman ang may iba pang kapaki-pakinabang na impormasyon sa paghahanda para sa pagsusulit at pagpasa nito, mangyaring sumulat sa mga komento at idaragdag namin sa artikulo.