So'rovlarni yaratish va ular bilan ishlash (yangi boshlanuvchilar uchun). So'rovlarni yaratish va ular bilan ishlash (yangi boshlanuvchilar uchun) 1s 8.3 Agar so'rov bo'lsa

1C dasturlash shunchaki dastur yozishdan ko'proq narsani o'z ichiga oladi. 1C - bu foydalanuvchi harakatlari va u ishlaydigan ma'lumotlarning ingotidir.

Ma'lumotlar ma'lumotlar bazasida saqlanadi. 1C so'rovlari ma'lumotlar bazasidan ma'lumotlarni foydalanuvchiga shaklda ko'rsatish yoki qayta ishlash uchun olish usulidir.

Hisobotning asosiy qismi 1C so'rovidir. Hisobotda ACS hisobotning eng katta qismidir.

O'tir. Bir nafas oling. Tinchlaning. Endi men sizga yangiliklarni aytib beraman.

1C da dasturlash uchun 1C dasturlash tilini bilish yetarli emas. Shuningdek, siz 1C so'rovlar tilini bilishingiz kerak.

1C so'rovlar tili - bu ma'lumotlar bazasidan qanday ma'lumotlarni olishimiz kerakligini belgilashga imkon beruvchi mutlaqo alohida til.

U ham ikki tilli - ya'ni rus yoki ingliz tillarida yozishingiz mumkin. Bu SQL so'rovlar tiliga juda o'xshaydi va uni biladiganlar dam olishlari mumkin.

1C so'rovlaridan qanday foydalaniladi

Foydalanuvchi 1C ni Enterprise rejimida ishga tushirganda, ishlaydigan mijozda bir gramm ma'lumot yo'q. Shuning uchun, siz katalogni ochishingiz kerak bo'lganda, 1C ma'lumotlar bazasidan ma'lumotlarni so'raydi, ya'ni 1C so'rovini beradi.

1C so'rovlari quyidagilardir:

  • Avtomatik so'rovlar 1C
    Tizim tomonidan avtomatik ravishda yaratiladi. Siz hujjatlar ro'yxati shaklini yaratdingiz. Ustun qo'shildi. Bu shuni anglatadiki, siz ushbu shaklni Enterprise rejimida ochganingizda, so'rov paydo bo'ladi va ushbu ustun uchun ma'lumotlar so'raladi.
  • Yarim avtomatik so'rovlar 1C
    1C tilida ko'plab usullar (funktsiyalar) mavjud, ularga kirishda ma'lumotlar bazasiga so'rov yuboriladi. Masalan.GetObject()
  • Qo'lda 1C so'rovlari (dasturchi tomonidan maxsus so'rov sifatida yozilgan)
    Siz 1C so'rovini o'zingiz kodda yozishingiz va uni bajarishingiz mumkin.

1C so'rovlarini yaratish va bajarish

1C so'rovi 1C so'rovi tilida so'rovning haqiqiy matnidir.
Matn qalam bilan yozilishi mumkin. Ya'ni, uni oling va yozing (agar siz bu tilni bilsangiz).

1C ko'p yoki deyarli hamma narsani qo'lda kod yozmasdan bajarish mumkin bo'lgan vizual dasturlash kontseptsiyasini targ'ib qilganligi sababli, so'rovlar tilini bilmasdan so'rov matnini chizish imkonini beruvchi maxsus Query Constructor ob'ekti mavjud. Biroq, mo''jizalar sodir bo'lmaydi - buning uchun siz konstruktor bilan qanday ishlashni bilishingiz kerak.

1C so'rovining matni tayyor bo'lgach, uni bajarish kerak. Buning uchun 1C kodida Request() ob'ekti mavjud. Mana bir misol:

So'rov = Yangi so'rov();
Query.Text = "Tanlash
| Nomenklatura. Havola
|FROM
| Katalog.Nomenklatura AS Nomenklaturasi
|QAYERDA
| Nomenklatura.Xizmat”;
Select = Query.Run().Select();

Hisobot (Selection.Link);
EndCycle;

Misolda ko'rib turganingizdek, 1C so'rovini bajargandan so'ng, natija bizga keladi va biz uni qayta ishlashimiz kerak. Natijada jadvalning bir yoki bir nechta satri (maxsus shaklda).

Natijani oddiy jadvalga yuklash mumkin:
Fetch = Query.Run().Unload(); //Natija – qiymatlar jadvali

Yoki shunchaki satr bo'ylab aylanib chiqing.
Select = Query.Run().Select();
While Select.Next() tsikli
//So'rov natijalari bilan biror narsa qiling
EndCycle;

1C so'rovlari bilan ishlash

1C so'rovlarining asosiy tamoyillari

1C so'rovini yaratishning asosiy tamoyillari -
Jadval Sarlavhasidan JOYLAR RO'YXATI QAYoDA Shartlar

Bunday 1C so'rovini yaratishga misol:

TANLANG
//tanlash uchun maydonlar ro'yxati
havola,
ism,
Kod
FROM
// biz ma'lumotlarni tanlaydigan jadval nomi
//jadvallar ro'yxati - konfigurator oynasidagi ob'ektlar ro'yxati
Katalog.Nomenklatura
QAYERDA
//tanlovni ko'rsating
Mahsulot turi = &Xizmat //tashqi qiymat bo'yicha tanlash
Yoki Xizmat // Boolean tipidagi “Xizmat” atributi, qiymati bo‘yicha tanlash True
SARALASH TURI
//Tartiblash
Ism

1C jadvallar ro'yxati

Jadval nomlarini konfigurator oynasida ko'rishingiz mumkin. Siz shunchaki "Kataloglar" o'rniga "Katalog" yozishingiz kerak, masalan, "Katalog. Nomenklatura" yoki "Hujjat. Tovar va xizmatlarni sotish" yoki "Jamlash. Sotish reestri".

Yakuniy raqamlarni olish imkonini beruvchi registrlar uchun qo'shimcha jadvallar (virtual) mavjud.

Axborot registri.RegisterName.Oxirgi boʻlak(&Sana) – maʼlumotlar reestridan 1C soʻrovi, agar davriy boʻlsa, maʼlum bir sana uchun

Jamg'arish reestri. Ro'yxatdan o'tish nomi. Balanslar(&Sana) - ma'lum bir sana uchun qoldiqlar reestridan 1C so'rovi

Jamg'arish registri.Registr nomi.Oborot (&Boshlanish sanasi, &tugash sanasi) - aylanmalar reestridan 1C so'rovi boshlang'ich sanadan tugash sanasigacha.

Qo'shimcha printsiplar

Ba'zi ma'lumotlar ro'yxatini so'raganimizda, asosiy tamoyillar ishlaydi. Lekin biz raqamlarni ham so'rashimiz mumkin va so'rov ularni biz uchun hisoblashi mumkin (masalan, ularni qo'shing).

TANLANG
//Quantity(FieldName) – miqdorni hisoblaydi
//Field AS OtherName – maydon nomini o‘zgartiradi
Miqdori (havola) AS. E'lon qilingan hujjatlar miqdori
FROM

QAYERDA
O'tkazilgan

Ushbu 1C so'rovi bizga hujjatlarning umumiy sonini qaytaradi. Biroq, har bir hujjatda Tashkilot maydoni mavjud. Aytaylik, biz 1C so'rovi yordamida har bir tashkilot uchun hujjatlar sonini hisoblamoqchimiz.

TANLANG
//faqat hujjat maydoni
Tashkilot,
// miqdorini hisoblash
Tashkilotlar bo'yicha miqdor (havola) AS
FROM
Hujjat.Tovar va xizmatlarni sotish
QAYERDA
O'tkazilgan
GURUH BO'YICHA

Tashkilot

Ushbu 1C so'rovi bizga har bir tashkilot uchun hujjatlar sonini (shuningdek, "tashkilot tomonidan" deb ataladi) qaytaradi.

Keling, 1C so'rovi yordamida ushbu hujjatlar miqdorini qo'shimcha ravishda hisoblaylik:

TANLANG
//faqat hujjat maydoni
Tashkilot,
// miqdorini hisoblash

// miqdorini hisoblang

FROM
Hujjat.Tovar va xizmatlarni sotish
QAYERDA
O'tkazilgan
GURUH BO'YICHA
//agar maydonlar ro'yxatida bir vaqtning o'zida count() funksiyasi va bir yoki bir nechta maydon bo'lsa, foydalanish kerak - u holda siz ushbu maydonlar bo'yicha guruhlashingiz kerak
Tashkilot

Ushbu 1C so'rovi bizga hujjatlar miqdorini ham qaytaradi.

TANLANG
//faqat hujjat maydoni
Tashkilot,
// miqdorini hisoblash
Tashkilotlar bo'yicha miqdor (havola) AS,
// miqdorini hisoblang
Miqdori (Hujjat summasi) AS miqdori
FROM
Hujjat.Tovar va xizmatlarni sotish
QAYERDA
O'tkazilgan
GURUH BO'YICHA
//agar maydonlar ro'yxatida bir vaqtning o'zida count() funksiyasi va bir yoki bir nechta maydon bo'lsa, foydalanish kerak - u holda siz ushbu maydonlar bo'yicha guruhlashingiz kerak
Tashkilot
PO NATIJALARI Umumiy

1C so'rovlar tili keng va murakkab va biz uning barcha imkoniyatlarini bitta darsda ko'rib chiqmaymiz - keyingi darslarimizni o'qing.

1C so'rovlar tilining qo'shimcha xususiyatlari haqida qisqacha:

  • Bir nechta jadvallardan ma'lumotlarni birlashtirish
  • Ichki so'rovlar
  • To'plam so'rovi
  • O'zingizning virtual jadvallaringizni yaratish
  • Qiymatlar jadvalidan so'rov
  • Qiymatlarni olish va manipulyatsiya qilish uchun o'rnatilgan funktsiyalardan foydalanish.

1C so'rovlar yaratuvchisi

So'rov matnini qo'lda yozmaslik uchun 1C so'rov dizayneri mavjud. Modulning istalgan joyini o'ng tugmasini bosing va 1C Query Designer-ni tanlang.

1C so'rovlar dizaynerida chapdagi kerakli jadvalni tanlang va uni o'ngga torting.

1C so'rovlar dizayneridagi jadvaldan kerakli maydonlarni tanlang va o'ngga torting. Agar siz nafaqat maydonni tanlashni, balki unga qandaydir yig'ish funksiyasini qo'llashni xohlasangiz, sudrab borganingizdan so'ng, sichqoncha bilan ikki marta bosing. Guruhlash yorlig'ida siz guruhlash uchun kerakli maydonlarni tanlashingiz (surang) qilishingiz kerak bo'ladi.

1C so'rovlar dizayneridagi "Shartlar" yorlig'ida siz xuddi shu tarzda kerakli tanlovlarni tanlashingiz mumkin (tanlovni amalga oshiradigan maydonlarni sudrab). To'g'ri shartni tanlashga ishonch hosil qiling.

Buyurtma yorlig'ida saralash ko'rsatilgan. Natijalar yorlig'ida - natijalarni sarhisob qilish.

1C so'rovlar dizayneridan foydalanib, siz har qanday mavjud so'rovni o'rganishingiz mumkin. Buning uchun mavjud so'rov matnini sichqonchaning o'ng tugmasi bilan bosing va shuningdek, 1C so'rovlar dizaynerini tanlang - va so'rov 1C so'rovlar dizaynerida ochiladi.

1C 8 so'rovlar tili 1C dasturchisi uchun ajralmas vosita bo'lib, u sizga ixcham, sodda, tushunarli kod yozish va ma'lumotlar bilan ishlashda kamroq tizim resurslaridan foydalanish imkonini beradi. Ushbu maqola 1C 8 so'rovlar tiliga bag'ishlangan bir qator darslarni ochadi.Birinchi darsda biz ushbu tilning asosiy operatorining tuzilishini ko'rib chiqamiz - TANLANG. Ushbu operator yordamida siz ma'lumotlar bazasi jadvallaridan tanlovlar yaratishingiz mumkin. Jadvalning tanlangan ma'lumotlarini saralash, unga shartlar qo'yish, boshqa jadvallar ma'lumotlari bilan bog'lash va birlashtirish, turli maydonlar bo'yicha guruhlash va boshqalar.

So'rovlar tili 1C korxonasi 8 - Operator tuzilishi SELECT

SELECT operatorining tuzilishini ko'rib chiqamiz (operatorning ixtiyoriy qismlari kvadrat qavs ichida ko'rsatilgan). 1C so'rovlar tili ma'lumotlar namunalarini yaratish uchun keng ko'lamli vositalarni taqdim etadi.

[RUXSAT BERILGAN] [TURLI] [BIRINCHI A] [Maydon1] [Taxallus1 AS], [Maydon2] [Taxallus2 AS], ... [FieldM] [TaxallusB AS] [Vaqtinchalik jadval nomini qoʻying] [1-JADvalDAN AliasTableTable1 AS [[INNER JOIN] ][LEFT JOIN][FULL JOIN] 2-jadval taxallus sifatida 2-jadval [[INNER JOIN][LEFT JOIN][FULL JOIN] TableC AS taxallus TablesC BY Ifod1 [Va Expression2]...[Va IfodasiD]] .. ... 1-Ifoda [Va Ifoda2]...[Va IfodasiE]] ... [JadvalF AS TableF taxallus] ... ] [GroupingField1 BOʻYICHA GURUHLASH[,] ... [GroupingFieldG]] [QAYERDA Ifoda1 [VA] Ifoda2] ... [VA IfodaH]] [HAMMANI BIRLASH...] [; ...] [AggregationFunction(Field1)][,] [AggregationFunction(Field2)][,] ... [AggregationFunction(FieldI)] [UMUMIY] BOʻYICHA [AggregationFunction(FieldI)] [AggregationFunction(Field1)][,] [JAMISI [AggregationFunction(Field1)][,] [ GroupingField1][,] ... [GroupingFieldj]]

Maydonlar bilan ishlash uchun kalit so'zlar va bloklar

  • TANLANG— operatorning boshlanishini ko'rsatuvchi kalit so'z;
  • RUXSAT BERILGAN tanlov berilgan foydalanuvchi uchun o'qish huquqiga ega bo'lgan jadval yozuvlarini o'z ichiga olishi kerakligini ko'rsatadi;
  • TURLI namuna faqat turli (barcha sohalar bo'yicha) oqimlarni o'z ichiga olishi kerakligini ko'rsatadi. Boshqacha qilib aytganda, takroriy qatorlar namunadan chiqarib tashlanadi;
  • BIRINCHI A agar siz ushbu kalit so'zni ko'rsatsangiz, u holda so'rov bo'yicha tanlangan qatorlarning faqat birinchi A qismi tanlovga kiritiladi, bu erda A - natural son;
  • Maydon bloki— bu blok tanlovga kiritilishi kerak bo‘lgan maydonlarni ko‘rsatadi. Bu maydonlar tanlangan ustunlar bo'ladi. Eng oddiy holatda, maydon quyidagicha ko'rinadi: Table Alias.TableFieldName AS Field Alias

    Shu tarzda biz ushbu maydonni qaysi jadvaldan olganimizni ko'rsatamiz. 1C so'rovlar tili har qanday taxalluslarni ko'rsatishga imkon beradi, lekin ular bir xil SELECT bayonotida takrorlanmasligi kerak. Maydon murakkabroq bo'lishi mumkin, u jadval maydonlarining turli kombinatsiyalaridan, so'rovlar tili funktsiyalaridan va yig'ish funktsiyalaridan iborat bo'lishi mumkin, ammo biz ushbu qo'llanmada bunday holatlarni ko'rib chiqmaymiz;

Jadvallar bilan ishlash uchun kalit so'zlar va bloklar

  • Vaqtinchalik jadval nomini qo'ying- kalit so'z JOY ma'lum bir nomga ega bo'lgan vaqtinchalik jadval yaratish uchun mo'ljallangan bo'lib, u 1C 8 ma'lum bir seansda u tugaguncha yoki vaqtinchalik jadval yo'q qilinmaguncha operativ xotirada saqlanadi. Shuni ta'kidlash kerakki, bitta 1C 8 sessiyasida vaqtinchalik jadvallarning nomlari takrorlanmasligi kerak;
  • Jadvallar va munosabatlar bloki— blok ushbu so‘rovda foydalanilgan barcha jadvallarni hamda ular orasidagi munosabatlarni ko‘rsatadi. Blok kalit so'z bilan boshlanadi FROM, keyin birinchi jadvalning nomi va taxalluslari. Agar ushbu jadval boshqa jadvallar bilan bog'liq bo'lsa, unda munosabatlar ko'rsatiladi. 1C so'rovlar tilida quyidagi ulanish turlari to'plami mavjud:
    • ICHKI QO‘SHILMA— chap jadvaldagi yozuv faqat ulanish sharti bajarilgan taqdirdagina tanlovga kiritiladi, o‘ngdagi jadvaldagi yozuv faqat ulanish sharti bajarilgan taqdirdagina tanlovga kiritiladi;
    • CHap ULANISH— chapdagi jadvaldagi yozuv har qanday holatda tanlovga kiritiladi, o‘ngdagi jadvaldagi yozuv faqat ulanish sharti bajarilgan taqdirdagina tanlovga kiritiladi;
    • TO'LIQ ULANISH— tanlovga har qanday holatda birinchi navbatda chap jadvaldagi yozuv kiritiladi, keyin faqat ulanish sharti bajarilgan taqdirda, o‘ng jadvaldagi yozuv har qanday holatda birinchi navbatda tanlovga kiritiladi, keyin faqat ulanish sharti uchrashadi. Bunday holda, olingan ikki nusxadagi qatorlar namunadan chiqarib tashlanadi.

    Ulanish turidan keyin ikkinchi jadvalning nomi va taxalluslari ko'rsatiladi. Keyin kalit so'z keladi BY, undan keyin mantiqiy operatorlar tomonidan bir-biri bilan bog'langan aloqa shartlari VA, YOKI. Shartdagi har bir ifoda mantiqiy qiymatni qaytarishi kerak (True, False). Agar birinchi jadval ikkinchidan boshqa jadvallarga ulangan bo'lsa, u holda ulanish turi yana ko'rsatiladi va hokazo. Ulanishda ishtirok etuvchi jadvallarning har biri, o'z navbatida, boshqa jadvallarga ulanishi mumkin, bu so'rovlar tuzilishi diagrammasida ko'rsatilgan. Agar jadval birinchisiga aloqador bo'lmasa, u holda ulanish turisiz ko'rsatiladi, keyin uning ulanishlari kelishi mumkin va hokazo;

Kalit so'zlar va ma'lumotlarni o'zgartirish bloklari

  • Guruh bloki— bu blok jadval qatorlarini guruhlash uchun ishlatiladi. Agar kalit so'zdan keyin ko'rsatilgan maydonlarning qiymatlari bo'lsa, qatorlar bittaga birlashtiriladi GURUH BO'YICHA bir xil bo'lib chiqadi. Bunday holda, boshqa barcha maydonlar yig'indisi, o'rtacha, maksimal yoki agregat funktsiyalari yordamida minimallashtiriladi. Agregat funktsiyalari maydon blokida ishlatiladi. Misol: Maksimal(TableAlias.TableFieldName) AS FieldAlias
  • Vaziyat bloki- kalit so'zdan keyin ushbu blokda QAYERDA mantiqiy operatorlar bilan ajratilgan shartli ifodalar ko'rsatilgan VA, YOKI, tanlangan qatorlardan birortasi namunaga kiritilishi uchun agregatdagi barcha shartlar qiymatga ega bo'lishi kerak To'g'ri.
  • HAMMANI BIRLASHTIRISH— bu kalit soʻz soʻrovlarni birlashtirish uchun ishlatiladi (operatorlar TANLASH). 1C so'rovlar tili bir nechta so'rovlarni birlashtirishga imkon beradi. So'rovlar birlashtirilishi uchun ular bir xil maydonlar to'plamiga ega bo'lishi kerak;
  • «;» - nuqta-vergul bir-biridan mustaqil bo'lgan gaplarni ajratish uchun ishlatiladi TANLASH;
  • INDEX BY— kalit so‘z o‘zidan keyin ko‘rsatilgan maydonlarni indekslash uchun ishlatiladi;
  • Xulosa bloki- daraxtga o'xshash namunalarni qurish uchun ishlatiladi. Kalit so'zdan keyin ko'rsatilgan guruhlash maydonlarining har biri uchun BY, tanlashda alohida qator yaratiladi. Ushbu qatorda agregat funktsiyalardan foydalangan holda kalit so'zdan keyin ko'rsatilgan maydonlarning umumiy qiymatlari hisoblanadi. NATIJALAR.

1C 8 so'rovlar tilini o'rganishni davom ettirmoqchimisiz? Keyin keyingi maqolani o'qing.

So'rov . Matn = "TANLANG | StorageUnits.Link |FROM | Directory.usStorageUnitsStorageUnits QANDAY foydalanish // 1-misol: bo'sh mantiqiy qiymat bilan taqqoslash: |QAYERDA | StorageUnits.AllowSelectionFromReserveZone = False // 2-misol. lekin agar bu mantiqiy aniqlangan bo'lsa, u holda shunday bo'ladi: // manfiy mantiqiy shart: |QAYERDA | Saqlash birliklari EMAS. Zaxira zonasidan tanlashga ruxsat bering // 3-misol. "Muayyan turdagi katalog" turiga ega bo'sh maydonning sharti asosida tanlash |QAYERDA | StorageUnits.ActiveSelectionArea = VALUE(Directory.usSelectionArea.EmptyRef) // 3a-misol. "muayyan turdagi hujjat" turiga ega bo'lgan bo'sh maydonning holatiga qarab tanlash |QAYERDA | OurInformationRegister.Document = VALUE(Document.OurDocument.EmptyLink) // 3b-misol. "har xil turdagi hujjatlar" turiga ega bo'sh maydonning holatiga qarab tanlash ( kompozit maydon) |QAYERDA | (OurInformationRegister.Document = VALUE(Document.OurDocument1.EmptyLink) | YOKI OurInformationRegister.Document = VALUE(Document.OurDocument2.EmptyLink) | OR... (va hokazo - biz ushbu kompo-saytning barcha mumkin boʻlgan turlari uchun shartlarni ketma-ket sanab oʻtamiz) ) // Misol 4. yoki aksincha, agar siz "string" turidagi to'ldirilgan qiymatni tanlashingiz kerak bo'lsa, unda shart yordam beradi: |QAYERDA | Saqlash birligi.Nomi > """" // 5-misol. Agar siz kompozit ma'lumotlar turiga ega bo'lgan ma'lum turdagi hujjatlarni tanlashingiz kerak bo'lsa, masalan, "RunningTasks" registrida "Vazifa" resursi kompozit turga ega, uning qiymatlari orasida "Tanlash" hujjati mumkin |QAYERDA | EXPRESS(Information RegisterExecutedTasks.Task AS Document.Selection) LINK Document.Selection // 5a-misol. Muayyan turdagi hujjatlarni tanlash kerak bo'lganda yana bir shunga o'xshash misol | TANLOV | QACHON IZOH QILISH (ag Hujjatlarning Muvofiqligi. DocumentBU AS Hujjat. Tovar va xizmatlarni qabul qilish) LINK Hujjat. Tovar va xizmatlarni qabul qilish | KEYIN ""Tovar va xizmatlarni qabul qilish"" | QAChON FIRSAT QILISh (ag Hujjatlarning Muvofiqligi. DocumentBU AS Hujjat. Tovar va xizmatlarni sotish) LINK Hujjat. Tovar va xizmatlarni sotish | KEYIN ""Tovar va xizmatlarni sotish"" | BOSHQA """" | Hujjat ko'rinishi sifatida tugaydi // 6-misol. Aniqlanmagan qiymat sharti bo'yicha tanlash: |QAYERDA | SavedSettings.User = UNDEFINED // Misol 7. yig'ish registrining "Kirish" harakati turi bo'yicha tanlash, "Xarajat" - xuddi shunday): |QAYERDA | RegProductsInRetail.MovementType = VALUE(MovementTypeAccumulation.Incoming) // 8-misol. So'rovda so'rovni bajarishning hojati yo'qligini qanday ko'rsatish kerak (masalan, biron bir shartga qarab, dasturiy jihatdan bo'sh so'rov natijasini qaytarishingiz kerak - Request.Text = StrReplace(Request.Text, "QAYERDA Doc.Link = &DocumentLink" , "YOLG'ON QERDA");). Buning uchun "Qaerda noto'g'ri" shartini qo'shing. Aytgancha, namunada so'ralgan ma'lumotlar hajmidan qat'i nazar, bunday so'rov bir zumda amalga oshiriladi. |YOLG'ON QAYERDA // Misol 9. So'rov natijasi ma'lumotlarni o'z ichiga olganligini tekshirish: Agar unday bo'lmasaSo'rov.Bajarish().Bo'sh() Keyin // 10-misol. bo'sh sanaga asoslangan tanlov: |QAYERDA | tbStrings.CancellationDate = DATETIME(1, 1, 1)

Ushbu maqolada biz siz bilan hamma narsani muhokama qilmoqchimiz 1C so'rovlar tilining funktsiyalari, shuningdek so'rovlar tili konstruktsiyalari. Funktsiya va dizayn o'rtasidagi farq nima? Funktsiya qavslar va ulardagi mumkin bo'lgan parametrlar bilan chaqiriladi va konstruktsiya qavssiz yoziladi. Shubhasiz 1C so'rovlar tilining barcha tuzilmalari va funktsiyalari ma'lumotlarni yig'ish jarayonini moslashuvchan va ko'p funktsiyali qilish. Bu funksiyalar va konstruksiyalar so‘rov maydonlariga, ba’zilari esa shartlarga ham tegishli.

1C Query tili funksiyalari

Chunki aniq tavsif 1C so'rovlar tilining funktsiyalari tuzilmalarning tavsiflariga qaraganda ancha kam uchraydi, biz funktsiyalarni ko'rib chiqishga qaror qildik. Endi keling, ularning har birini alohida ko'rib chiqamiz, uning maqsadi, sintaksisi va foydalanish misolini tavsiflaymiz, shuning uchun:

1. Funktsiya DATE VAQT- bu funksiya “Sana” turi bilan doimiy maydon hosil qiladi.

Sintaksis: DATE VAQT(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Foydalanish misoli:

2. DATE FARQI funksiyasi- o'lchovlardan birida (yil, oy, kun, soat, daqiqa, soniya) ikkita sana o'rtasidagi farqni qaytaradi. O'lchov parametr sifatida o'tkaziladi.

Sintaksis: DIFFERENCE DATE(<Дата1>, <Дата2>, <Тип>)

Foydalanish misoli:

Query.Text = "TANLASH | DIFFERENCEDATE(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | Miqdor kunlar AS";

3. VALUE funksiyasi- ma'lumotlar bazasidan oldindan belgilangan yozuv bilan doimiy maydonni o'rnatadi, shuningdek, istalgan turdagi bo'sh havolani olishingiz mumkin.

Sintaksis: VALUE(<Имя>)

Foydalanish misoli:

Request.Text = "SELECT //oldindan belgilangan element | VALUE(Directory.Currencies.Dollar) AS Dollar, //boʻsh havola | VALUE(Hujjat.Tovar va xizmatlarni qabul qilish.EmptyLink) AS Kvitansiya, //oʻtkazish qiymati | VALUE(Transfer) . Yuridik Jismoniy shaxs. Jismoniy shaxs) AS Jismoniy shaxs, //oldindan belgilangan hisob | VALUE(Hisoblar rejasi. Oʻz-oʻzini qoʻllab-quvvatlovchi. Materiallar) AS Hisob_10" ;

4. SELECT funksiyasi- bizning oldimizda kodda ishlatiladigan IF konstruktsiyasining analogi mavjud, faqat bu 1C so'rovlarida qo'llaniladi.

Sintaksis: QACHON TANLASH<Выражение>KEYIN<Выражение>BOSHQA<Выражение>OXIRI

Foydalanish misoli:

Request.Text = //agar summa 7500 dan ortiq bo'lsa, unda 300 rubl chegirma bo'lishi kerak, // shuning uchun agar shart ishga tushirilsa, funktsiya // Sumni qaytaradi - 300 //aks holda so'rov shunchaki Sumni qaytaradi. "TANLASH | TANLASH | QACHON TCReceipts.Sumi > 7500 | KEYIN TCReceipts.Amount - 300 | BOSHQA TCReceipts.Sumagʻi | CHEKIRILGAN YUQORI |DAN | Hujjat.TovarlarXizmatlari.Tovarlarni TCReceipts AS QABULLANISh";

5. EXPRESS funksiyasi- doimiy maydonni ma'lum bir tip bilan ifodalash imkonini beradi.

Sintaksis: EXPRESS(FieldName AS TypeName)

Foydalanish misoli:

Query.Text = "TURLI TANGLA | Sotish.Registrator.Number, | TANLANG | QAChON Sotish.Registrator LINK Hujjati.Iste'mol qilinadigan | KEYIN EXPRESS (Sotuv.Registrator Hujjat.Iste'mol qilinadigan) | BOSHQA TANLASH | Qachon Sotish.Registrator LINK hujjati |. KEYIN EXPRESS(Sotish.Registrator AS Hujjat.Implementation) | OXIRISh | ... | Raqam sifatida END | FROM | Jamgʻarmalarni roʻyxatdan oʻtkazish.Xaridlarni xaridlar sifatida”;

EXPRESS funksiyasidan aralash turdagi sohalarda foydalanishning boshqa varianti bormi, ular qayerda uchraydi? Eng oddiy misol - har qanday registr uchun "Registrator". Xo'sh, nega biz registratorda turni belgilashimiz kerak bo'lishi mumkin? Keling, registratordan "Raqam" maydonini tanlaganimizda vaziyatni ko'rib chiqaylik, raqam qaysi jadvaldan tanlanadi? Hammaga to'g'ri javob! Shuning uchun, so'rovimiz tez ishlashi uchun biz EXPRESS funksiyasidan foydalanib, aniq turni belgilashimiz kerak

Foydalanish misoli:

Query.Text = "SELECT | EXPRESS(Nomenclature.Comment AS Line(300)) AS Comment, | EXPRESS(Nomenclature.Sum AS Number(15,2)) AS Sum |FROM | Directory.Nomenklatura AS Nomenklatura";

6. ISNULL funktsiyasi(muqobil imlo ISNULL) - agar maydon NULL tipida bo'lsa, u holda u funktsiyaning ikkinchi parametri bilan almashtiriladi.

Sintaksis: ISNULL(<Поле>, <ПодставляемоеЗначение>)

Foydalanish misoli:

Shuni ham yodda tutingki, DOIMO NULL turini qandaydir qiymat bilan almashtirish tavsiya etiladi, chunki NULL turi bilan taqqoslash, NULLni NULL bilan solishtirsangiz ham, har doim FALSE qiymatini qaytaradi. Ko'pincha NULL qiymatlar jadvallarni birlashtirish natijasida hosil bo'ladi (ichkidan tashqari barcha turdagi birlashmalar).

Query.Text = //To'liq elementni va uning balanslarini tanlang //agar ba'zi elementda balans bo'lmasa, //NULL maydoni bo'ladi, u 0 qiymati bilan almashtiriladi "SELECT | No. Link, | ISNULL" (MahsulotlarStockInStockRemains.InStockRemaining, 0) AS Qoldiq | FROM | Katalog.Nomenklatura AS № | CHAP BOG'LANISH To'planishlarni ro'yxatdan o'tkazish. Omborlardagi tovarlar. Qolganlar AS TovarlarIchki omborlarda qoldiqlari | ON (TovarlarInStockda Qolganlar; Havola No.)

7. VAKILISH funksiyasi- so'rov maydonining ko'rinishini olish imkonini beradi.

Sintaksis: PERFORMANS(<НаименованиеПоля>)

Foydalanish misoli:

Query.Text = "TANLAMA | TANLASH

1C so'rovlar tilida tuziladi

Biz siz bilan yuqorida muhokama qildik 1C so'rovlar tilining funktsiyalari, endi o'ylash vaqti keldi 1C so'rovlar tilida konstruktsiyalar, ular kamroq muhim va foydali emas, keling, boshlaylik.

1. Qurilish LINK- mos yozuvlar turini tekshirish uchun mantiqiy operator. Ko'pincha murakkab turdagi maydonni ma'lum bir turga nisbatan tekshirishda uchraydi. Sintaksis: LINK<Имя таблицы>

Foydalanish misoli:

Request.Text = //agar yozuvchi qiymat turi hujjat qabuli bo'lsa, //keyin so'rov "Tovarlarni qabul qilish" ni qaytaradi, aks holda "Tovarlarni sotish" "TANLASH | TANLASH | QAChON Qolganlar.Registrator LINK Document.Tovarlarni qabul qilish va Xizmatlar | KEYIN ""Qabul qilish"" | BOSHQA ""Iste'mol"" | Harakat turi sifatida tugaydi | FROM | Jamg'arma reestri. Omborlarda qolgan mahsulotlar AS qoldi" ;

2. Orasida dizayn- bu operator qiymat belgilangan diapazonda yoki yo'qligini tekshiradi.

Sintaksis: ORASIDA<Выражение>VA<Выражение>

Foydalanish misoli:

Request.Text = //kodi 1 dan 100 gacha bo'lgan oraliqda bo'lgan butun nomenklaturani oling "SELECT | Nomenklatura.Link |FROM | Directory.Nomenklatura AS Nomenklatura |QAYERDA | Nomenklatura.Kod 1 dan 100 gacha" ;

3. Qurilish B va B IEARXIYASI- qiymat o'tkazilgan ro'yxatda mavjudligini tekshiring (massivlar, qiymatlar jadvallari va boshqalarni ro'yxat sifatida o'tkazish mumkin). IN HIERARCHY operatori ierarxiyani ko'rish imkonini beradi (Hisoblar rejasidan foydalanish misoli).

Sintaksis: IN(<СписокЗначений>), IERARXİYADA(<СписокЗначений>)

Foydalanish misoli:

Request.Text = //hisobning barcha sub-hisoblarini tanlang "TANLASH | O'z-o'zini qo'llab-quvvatlovchi. Hisob AS bog'lanishi | FROM | Hisoblar jadvali. O'z-o'zini qo'llab-quvvatlovchi AS O'z-o'zini qo'llab-quvvatlovchi | QAYER | O'z-o'zini qo'llab-quvvatlovchi. IEARXIYA QIYMATIDAGI bog'lanish (Chart of the Diagram). Hisob-kitoblar. O‘zini-o‘zi ta’minlovchi. Tovarlar)”;

4. O'xshash dizayn- Bu funksiya satrni string naqsh bilan solishtirish imkonini beradi.

Sintaksis: LIKE "<ТекстШаблона>"

Qator naqsh variantlari:

% - ixtiyoriy belgilarning istalgan sonini o'z ichiga olgan ketma-ketlik.

Bitta ixtiyoriy belgi.

[...] - kvadrat qavslar ichida keltirilgan har qanday bitta belgi yoki belgilar ketma-ketligi. Ro'yxatga olish diapazonlarni belgilashi mumkin, masalan, a-z, ya'ni diapazonga kiritilgan ixtiyoriy belgi, jumladan, diapazon oxirlari.

[^...] - kvadrat qavslar ichida sanab o'tilgan har qanday bitta belgi yoki belgilar ketma-ketligi, inkor belgisidan keyin sanab o'tilganlardan tashqari.

Foydalanish misoli:

Query.Text = //TABUR ildizini o'z ichiga olgan va //yoki kichik yoki bosh harf t bilan boshlanadigan butun nomenklaturani toping "TANLAMA | Nomenklatura. Havola | FROM | Katalog. Nomenklatura AS Nomenklatura | QAYER | Mahsulotlar. Nomenklatura. LIKE "" [Tt ]abur%""" ;

5. Dizayn RUXSAT BERILGAN- bu operator ma'lumotlar bazasidan faqat qo'ng'iroq qiluvchining o'qish ruxsatiga ega bo'lgan yozuvlarni tanlash imkonini beradi. Ushbu huquqlar rekord darajada (RLS) tuzilgan.

Sintaksis: ALLOWED SELECT kalit so'zidan keyin yoziladi

Foydalanish misoli:

Request.Text = "RUXSAT BERILGAN | Qarama-qarshi tomonlar. Havola | FROM | Katalog. Qarama-qarshi tomonlar kontragent sifatida";

6. TURLI dizayn- takroriy yozuvlar mavjud bo'lmagan yozuvlarni tanlash imkonini beradi.

Sintaksis: VARIOUS SELECT kalit soʻzidan keyin yoziladi

Foydalanish misoli:

Request.Text = //o'quvchi huquqlarga ega bo'lgan yozuvlarni tanlaydi "TURLI TANGLA | Counterparties.Name |FROM | Directory. Kontragentlar kontragent sifatida" ;

Shuningdek, TURLI konstruksiyadan RUXSAT BERILGAN operator va boshqa operatorlar bilan foydalanish mumkin.

Foydalanish misoli:

Request.Text = //o'quvchi huquqlariga ega bo'lgan turli yozuvlarni tanlaydi "TANLASH RUXSAT BERILGAN TURLI | Counterparties.Name |FROM | Directory. Kontragentlar kontragent sifatida";

7. BIRINCHI dizayn- so'rov natijasidan parametrda ko'rsatilgan yozuvlar sonini tanlaydi.

Sintaksis: FIRST<число>

Foydalanish misoli:

Request.Text = //"FIRST 4 | CCD raqamlarini tanlang. Havola | FROM | Katalog. CCD raqamlari AS CCD raqamlari" katalogidan dastlabki 4 ta CCD raqamini tanlang;

8. O'ZGARISH UCHUN dizayn- jadvalni blokirovka qilishga imkon beradi, faqat tranzaktsiyalarda ishlaydi (faqat avtomatik qulflar uchun tegishli).

Sintaksis: O'ZGARISH UCHUN<НаименованиеТаблицы>

Foydalanish misoli:

Query.Text = "TANLAMA | Bo'sh qolgan qoldiqlar. Nomenklatura, | Bo'sh qolgan qoldiqlar. Ombor, | Bo'sh qolgan qoldiqlar. Zaxirada qolgan | FROM | Jamg'armalar reestri. Bo'sh qoldiqlar. Qolganlar Erkin qolganlar Qolganlar AS | O'ZGARTIRISH | . Erkin qoldiqlar. Qolganlar";

9. Dizayn BUYURUM BO'YICHA- ma'lumotlarni ma'lum bir soha bo'yicha tartibga soladi. Agar maydon havola bo'lsa, u holda bayroqni o'rnatishda AVTO Buyurtma Saralash havolani ko'rsatish bo'yicha amalga oshiriladi; agar bayroq o'chirilgan bo'lsa, havolalar xotiradagi havola manzilining kattaligi bo'yicha saralanadi.

Sintaksis: SARALASH TURI<НаименованиеПоля>AVTO Buyurtma

Foydalanish misoli:

Query.Text = "TANLASH | Boʻsh qolgan qoldiqlar. Nomenklatura AS Nomenklatura, | Boʻsh qolgan qoldiqlar. Ombor AS Ombor, | Boʻsh qolgan qoldiqlar. Zaxirada qolgan | FROM | Jamgʻarmalarni roʻyxatdan oʻtkazing. Boʻsh qolgan. | Nomenklatura | Buyurtmani AVTO QAYTALASH”;

10. Dizayn GROUP BY- so'rovlar qatorlarini ma'lum maydonlar bo'yicha guruhlash uchun ishlatiladi. Raqamli maydonlar har qanday agregat funksiyasi bilan ishlatilishi kerak.

Sintaksis: GURUH BO'YICHA<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Foydalanish misoli:

Query.Text = "TANLASH | Omborlardagi mahsulotlar.Nomenklatura AS Nomenklaturasi, | Omborlardagi mahsulotlar.Omborda, | SUM(Ombordagi tovarlar.Stock) AS |FROM | RegisterTo'planishlar.MahsulotlarOmborlarda ASUP | ature, | Omborlardagi mahsulotlar.Ombor" ;

11. Dizayn EGA- WHERE konstruktsiyasiga o'xshash ma'lumotlarni tanlash shartiga agregat funksiyasini qo'llash imkonini beradi.

Sintaksis: EGA<агрегатная функция с условием>

Foydalanish misoli:

Query.Text = //InStock maydoni 3 "tanlash GURUH BO'YICHA | Omborlardagi mahsulotlar.Nomenklatura, | Omborlardagi mahsulotlar.Omborda | |MAVJUD | MUMKIN (Ombordagi mahsulotlar. InStock) > 3" ;

12. Qurilish INDEX BY- so'rov maydonini indekslash uchun ishlatiladi. Indekslash bilan so'rovni bajarish uchun ko'proq vaqt ketadi, lekin indekslangan maydonlar bo'ylab qidirishni tezlashtiradi. Faqat virtual jadvallarda foydalanish mumkin.

Sintaksis: INDEX BY<Поле1, ... , ПолеN>

Foydalanish misoli:

Query.Text = "SELECT | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | PLACE DataTs | FROM | &Ts AS Ts | | INDEX BY | Ts.NameOS, | Ts .CodeOS";

13. Dizayn QAYERDA- har qanday tanlov maydonlariga shart qo'yish imkonini beradi. Natija faqat shartni qondiradigan yozuvlarni o'z ichiga oladi.

Sintaksis: QAYERDA<Условие1 ОператорЛогСоединения УсловиеN>

Foydalanish misoli:

Query.Text = //Kompensatsiya Qolgan barcha yozuvlar tanlangan<>0 va //AmountForCalcCompRemaining > 100 "SELECT | CompensationRPORemains.Counterparty, |CompensationRPORemains.Child, | CompensationRPORemains.CompensationRemaining, | CompensationRPORemains.AmountForCalcCompRemains |Place DataTzForCalcCompRemaining.Place DataTz stat ki |QAYERDA |KompensatsiyaRPORqolgan.KompensatsiyaQolgan<>0 | Va CompensationRPORemains.AmountForCalcCompRemaining> 100" ;

14. Dizayn NATIJALARI... UMUMIY- jamilarni hisoblash uchun ishlatiladi; dizayn jamilar hisoblab chiqiladigan maydonlarni va jami maydonlarga qo'llaniladigan agregat funktsiyalarni belgilaydi. TOTAL qurilishidan keyin har bir maydon uchun jamilardan foydalanilganda ma'lumotlar guruhlanadi. Ixtiyoriy GENERAL konstruksiya mavjud; undan foydalanish qoʻshimcha guruhlashni ham taʼminlaydi. Quyida so'rov natijasining namunasini ko'rasiz.

Sintaksis: NATIJALAR<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>BY<ОБЩИЕ> <Поле1, ... , ПолеN>

Foydalanish misoli:

Request.Text = "TANLA | Hisob-kitoblar. Kontraparta shartnomasi. Shartnoma turi AS Shartnoma turi, | Hisob-kitoblar. Kontraparta shartnomasi AS Shartnoma, | Hisob-kitoblar. Qarama-qarshi tomon, | Hisob-kitoblar. Balans AS o‘zaro hisob-kitob balansi summasi | FROM | Jamg‘armalar reestri. Mut. Qarama-qarshi tomonlar bilan hisob-kitob. Balanslar AS Hisob-kitoblar | JAMI | SUMUMI (balans) |Dastur ta’minoti | UMUMI, | Shartnoma turi”;

Rasmda so'rovni bajarish jarayonida shakllangan guruhlar ko'rsatilgan, yuqoridagisi UMUMIY bo'limga, ikkinchisi esa kontragent shartnomasining kelishuv turi maydoniga tegishli.

Ushbu maqolada biz 1C so'rovlar tilida joylashtirilgan jadvallar mavzusini ko'rib chiqamiz.

So'rovlarni tanlash maydonlarida ichki so'rovlar manba jadvalidan foydalanishingiz mumkin. Masalan, "Xizmatlarni ko'rsatish" hujjatida "Xizmatlar" ning jadval qismi mavjud va shuning uchun ushbu jadval qismi tanlov maydonida ham ko'rsatilishi mumkin. Endi buni qanday amalga oshirish mumkinligini ko'rasiz.

O'quv ma'lumotlar bazasida men so'rovlar konsolini ishga tushiraman, so'rovlar dizaynerini ochaman va "Xizmatlarni taqdim etish" jadvalini tanlayman.

Keling, ushbu jadvalni kengaytiramiz

Va unda biz "Xizmatlar" jadval qismini ko'ramiz.

Keling, ushbu jadval qismini to'liq tanlaymiz.

Ko'rib turganingizdek, xizmatning barcha jadval qismi butunlay maydonlarga o'tdi.

E'tibor bering, jadval qismi, aslida, "Xizmatlar" deb nomlangan alohida maydon sifatida keladi va uning turi "So'rov natijasi" bo'ladi. Keling, so'rovda ichki jadvaldan qanday foydalanishni bilib olaylik.

Keling, o'rnatilgan jadvalning uchta maydonini qoldiramiz va hujjat sarlavhasidan ba'zi maydonlarni qo'shamiz.

Keling, dizaynerda OK tugmasini bosamiz va so'rovimiz qanday ko'rinishini ko'ramiz.

Ko'rib turganingizdek, so'rovda "Xizmatlar" maydonidan keyin nuqta bor va tanlangan maydonlar undan keyin qavs ichida keltirilgan.

Keling, iltimosni bajaraylik.

Rasmda biz hujjatning jadval qismidagi barcha tanlangan maydonlar "Xizmatlar" maydonida vergul bilan ajratilganligini ko'ramiz. Barcha so'rovlar konsollari yuqoridagi rasmdagi kabi displeyga ega emas; ba'zida u shunchaki "" deb aytishi mumkin.

Yana bir qiziq nuqta: ichki o'rnatilgan jadvalda maydonlar o'rniga yulduzcha qo'yishingiz mumkin, keyin jadval qismining barcha maydonlari paydo bo'ladi. Buni konstruktorda amalga oshirish mumkin emas, faqat so'rovda qo'lda. So'rov quyidagi shaklda bo'ladi:

Keling, bunday so'rov qanday bajarilishini ko'rib chiqaylik.

Bitta narsa shundaki, agar biz so'rovlar konstruktorini ochsak, bu yulduzcha saqlanmaydi.

Biz konsolda o'rnatilgan jadval bilan so'rovni qanday qilishni o'rgandik, endi tanlovda ichki jadvaldan qanday foydalanishni o'rganamiz.

Aslida, so'rovni qayta ishlashda ichki jadvalga kirish unchalik qiyin emas. Siz shunchaki jadvalingiz nomi bo'yicha tanlovga kirasiz va "So'rov natijasi" turiga ega o'zgaruvchini olasiz. Va keyin siz uni oddiy so'rov natijasi sifatida qayta ishlaysiz: agar xohlasangiz, namuna oling, agar xohlasangiz, yuklang.

Quyida ichki jadval bilan ishlaydigan kodning kichik namunasi keltirilgan:


&Serverda
FillOnServer() protsedurasi
So'rov = Yangi so'rov;
So'rov. Matn = "TANLANG
| Mahsulotni sotish. Havola,
| Mahsulotlarni sotish.
| mahsulot,
| Miqdori
|FROM
| Hujjat. Mahsulotlarni sotish Mahsulotlarni QANDAY SOTISH”
;
Qabul qilish = So'rov. Run(). Choose();
Salom tanlov. Keyingi() tsikli
Daraxtning TopLine = Mahsulotlarni sotish. GetItems();
NewRow = TopRowTree. Qo'shish ();
Yangi qator. Havola = Tanlov. Havola;
TableProducts = Tanlash. Tovarlar;
SelectionProducts = TableProducts. Choose();
Mahsulotlarni tanlashda. Keyingi() tsikli
TreeChildRow = NewRow. GetItems();
ProductRow = ChildTreeRow. Qo'shish ();
ProductString. Havola = Mahsulot tanlash. Mahsulot;
ProductString. Miqdor = Namuna elementlari. Miqdori ;
EndCycle;
EndCycle;
Jarayonning oxiri

Yuqoridagi kodni tushuntirib beraman.

Avvalo, biz chiziqli tanlovni oldik va biz ushbu tanlovni tsiklda o'tkazamiz, unda biz qiymatlar daraxtining yuqori chizig'ini yaratamiz (u shaklda) va unda hujjatimizga havola yozamiz.

Va keyin eng qiziq narsa, hatto tuzatuvchida keyinroq o'zingiz ham ko'rishingiz mumkin, biz Mahsulotlarni tanlash maydoniga murojaat qilamiz va qulaylik uchun ushbu maydonni TableProducts-da alohida o'zgaruvchiga yozamiz. Ushbu o'zgaruvchi "So'rov natijasi" turiga kiradi. Va bu natijaning namunasini osongina olishingiz mumkin. Biz shunday qilamiz. Keyingi funksiya va while tsikli yordamida ushbu tanlovni chetlab o'tish qoladi.

Va bu tsikl ichida biz tanlov maydonlarini ichki jadval maydonlari deb nomlaymiz va ularni shakldan daraxtning pastki qatorlariga yozamiz.

Bu kod qaytariladigan natijadir

Hali ham savollaringiz bormi?

"Yangi boshlanuvchilar uchun 1C so'rovlari" kursimni o'rganganingizda ularga o'zingiz javob berasiz. Qaerda bu va boshqa ko'plab masalalar batafsilroq muhokama qilinadi. Barcha ma'lumotlar sodda va tushunarli shaklda berilgan va hatto 1C da dasturlashni yaxshi bilmaydiganlar uchun ham tushunarli.

20% chegirma uchun promo-kod: hrW0rl9Nnx

Har qanday miqdorda xayriya qilish orqali loyihamni qo'llab-quvvatlang

Mening guruhlarimga qo'shiling.