Sorğuların yaradılması və onlarla işləmək (yeni başlayanlar üçün). Sorğuların yaradılması və onlarla işləmək (yeni başlayanlar üçün) şərti ilə 1c sorğu nəticələri

Sorğu dili tərtibatçılar üçün 1C 8.3-ün əsas mexanizmlərindən biridir. Sorğulardan istifadə edərək verilənlər bazasında saxlanılan istənilən məlumatı tez bir zamanda əldə edə bilərsiniz. Onun sintaksisi SQL-ə çox bənzəyir, lakin bəzi fərqlər var.

1C 8.3 (8.2) sorğu dilinin SQL-dən əsas üstünlükləri:

  • istinad sahələrinə istinadın ləğvi (obyekt təfərrüatlarına bir və ya bir neçə nöqtənin istinad edilməsi);
  • nəticələrlə işləmək çox rahatdır;
  • virtual masalar yaratmaq imkanı;
  • sorğu həm ingilis, həm də rus dillərində yazıla bilər;
  • kilidlərin qarşısını almaq üçün məlumatları bloklamaq imkanı.

1C-də sorğu dilinin çatışmazlıqları:

  • SQL-dən fərqli olaraq, 1C sorğularında məlumatların dəyişdirilməsinə icazə verilmir;
  • saxlanılan prosedurların olmaması;
  • sətri nömrəyə çevirməyin mümkünsüzlüyü.

Gəlin 1C sorğu dilinin əsas konstruksiyalarına dair mini dərsliyimizə nəzər salaq.

1C-də sorğuların yalnız məlumat almağa imkan verdiyinə görə, istənilən sorğu “SEÇ” sözü ilə başlamalıdır. Bu əmrdən sonra verilənlərin əldə edilməli olduğu sahələr göstərilir. Əgər “*” göstərsəniz, bütün mövcud sahələr seçiləcək. “FROM” sözündən sonra verilənlərin seçiləcəyi yer (sənədlər, registrlər, kataloqlar və s.) göstərilir.

Aşağıda müzakirə edilən nümunədə bütün nomenklaturanın adları “Nomenklatura” kataloqundan seçilir. “NECƏ” sözündən sonra cədvəllər və sahələr üçün ləqəblər (adlar) göstərilir.

SEÇİN
Nomenklatura Adı AS Nomenklaturanın adı
FROM
Kataloq.Nomenklatura AS Nomenklatura

"SEÇ" əmrinin yanında açar sözləri təyin edə bilərsiniz:

  • MÜXTƏLİF. Sorğu yalnız ən azı bir sahədə (dublikatlar olmadan) fərqlənən sətirləri seçəcək.
  • İLK n, Harada n– nəticənin əvvəlindən seçilməli olan sətirlərin sayı. Çox vaxt bu konstruksiya çeşidləmə (SİPARİŞ BY) ilə birlikdə istifadə olunur. Məsələn, tarixə görə yeni olan müəyyən sayda sənədləri seçmək lazım olduqda.
  • İCAZƏ VERİLİR. Bu dizayn verilənlər bazasından yalnız cari istifadəçi üçün mövcud olan qeydləri seçməyə imkan verir. Bu açar sözün istifadəsinə əsasən, istifadəçi girişi olmayan qeydləri sorğulamağa cəhd edərkən xəta mesajı alacaq.

Bu açar sözlər birlikdə və ya ayrıca istifadə edilə bilər.

DƏYİŞİM ÜÇÜN

Bu təklif qarşılıqlı münaqişələrin qarşısını almaq üçün məlumatları bloklayır. Tranzaksiya bitənə qədər kilidlənmiş məlumatlar başqa bir əlaqədən oxunmayacaq. Bu bənddə siz kilidlənməsi lazım olan xüsusi cədvəlləri təyin edə bilərsiniz. Əks halda hamı bloklanacaq. Dizayn yalnız avtomatik kilidləmə rejiminə aiddir.

Çox vaxt qalıqlar alınarkən “DƏYİŞMƏK ÜÇÜN” bəndindən istifadə olunur. Axı, bir neçə istifadəçi eyni vaxtda proqramda işlədikdə, biri balans alarkən, digəri onları dəyişə bilər. Bu halda, yaranan qalıq artıq düzgün olmayacaq. Bu təkliflə məlumatları bloklasanız, birinci işçi düzgün balansı alana və onunla bütün lazımi manipulyasiyaları yerinə yetirənə qədər ikinci işçi gözləmək məcburiyyətində qalacaq.

SEÇİN
Qarşılıqlı hesablaşmalar,
Qarşılıqlı hesablaşmaların məbləği Balans
FROM
İşçilərlə qarşılıqlı hesablaşmaların reyestri Qarşılıqlı hesablaşmalar
DƏYİŞİM ÜÇÜN

HARADA

Yüklənmiş məlumatlara bir növ seçim tətbiq etmək üçün dizayn lazımdır. Registrlərdən məlumatların alınmasının bəzi hallarda virtual cədvəllərin parametrlərində seçim şərtlərini müəyyən etmək daha məqsədəuyğundur. "HARADA" istifadə edərkən əvvəlcə bütün qeydlər alınır və yalnız bundan sonra seçim tətbiq edilir ki, bu da sorğunu əhəmiyyətli dərəcədə yavaşlatır.

Aşağıda müəyyən bir vəzifə üçün əlaqə adamlarının əldə edilməsi sorğusunun nümunəsi verilmişdir. Seçim parametrinin formatı var: &ParameterName (parametr adı ixtiyaridir).

SEÇİM (İŞİ)

Dizayn birbaşa sorğunun mətnində şərtləri təyin etməyə imkan verir.

Aşağıdakı nümunədə "Əlavə Sahə" sənədin yerləşdirilib-yerləşdirilməməsindən asılı olaraq mətndən ibarət olacaq:

SEÇİN
Qəbul TiU.Link,
SEÇİM
QəbuluT&U.Yerinə ETMƏNDƏ
SONRA "Sənəd qəbul olundu!"
YAXŞI "Sənəd yerləşdirilməyib..."
Əlavə Sahə KİMİ SON EDİN
FROM
Sənəd Malların və Xidmətlərin Qəbulu NECƏ T&C

QOŞULUN

Müəyyən bir əlaqə şərtinə əsaslanan iki cədvəli əlaqələndirir.

SOL/SAĞ BAĞLANTI

SOL birləşmənin mahiyyəti ondan ibarətdir ki, ilk göstərilən cədvəl tam şəkildə götürülür və ikincisi əlaqə şərtinə uyğun olaraq onunla əlaqələndirilir. İkinci cədvəldə birinci cədvələ uyğun heç bir qeyd yoxdursa, onda NULL onların dəyərləri kimi əvəz olunur. Sadəcə olaraq, əsas cədvəl ilk göstərilən cədvəldir və ikinci cədvəlin məlumatları (əgər varsa) artıq onun məlumatları ilə əvəz edilmişdir.

Məsələn, “Malların və xidmətlərin qəbulu” sənədlərindən mal maddələri və “Malların qiymətləri” məlumat reyestrindən qiymətlər əldə etmək lazımdır. Bu halda, hər hansı mövqe üçün qiymət tapılmazsa, əvəzinə NULL-u əvəz edin. Sənəddəki bütün əşyalar qiymətinin olub-olmamasından asılı olmayaraq seçiləcək.

SEÇİN
Qəbz və U.Nomenklatura,
Qiymətlər.Qiymət
FROM
Malların və xidmətlərin qəbulu NECƏ T&C
DAXİLİ QOŞULUN Qeydiyyatdan keçinMəlumat.QiymətlərNomenklatura.SliceSon AS Qiymətlər
Proqram Qəbzi&U.Nomenklatura = Qiymətlər.Nomenklatura

DOĞRUDA hər şey tam tərsinədir.

TAM ƏLAQƏ

Bu əlaqə növü əvvəlkilərdən onunla fərqlənir ki, nəticədə həm birinci cədvəlin, həm də ikincinin bütün qeydləri geri qaytarılacaq. Göstərilən keçid şərtinə əsasən birinci və ya ikinci cədvəldə heç bir qeyd tapılmazsa, bunun əvəzinə NULL qaytarılacaq.

Əvvəlki nümunədə tam əlaqədən istifadə edərkən, "Malların və xidmətlərin qəbulu" sənədindəki bütün maddələr və "Əşya qiymətləri" reyestrindən ən son qiymətlər seçiləcəkdir. Həm birinci, həm də ikinci cədvəllərdə tapılmayan qeydlərin dəyərləri NULL-ə bərabər olacaqdır.

DAXİLİ QOŞULUN

INNER JOIN ilə FULL JOIN arasındakı fərq ondadır ki, ən azı cədvəllərdən birində qeyd tapılmasa, sorğu onu ümumiyyətlə göstərməyəcək. Nəticədə, əvvəlki nümunədə “TAM”ı “DAXİLİ” ilə əvəz etsək, “Malların və xidmətlərin qəbulu” sənədindən yalnız “Malların qiymətləri” məlumat reyestrində qeydlər olan bənd bəndləri seçiləcək.

GROUP BY

1C sorğularında qruplaşdırma müəyyən bir ümumi xüsusiyyətə (sahələrin qruplaşdırılması) uyğun olaraq cədvəl sətirlərini (qruplaşma sahələrini) yığışdırmağa imkan verir. Qruplaşdırma sahələri yalnız ümumi funksiyalardan istifadə etməklə göstərilə bilər.

Aşağıdakı sorğunun nəticəsi maksimum qiymətləri olan məhsul növlərinin siyahısı olacaq.

SEÇİN
,
MAX(Qiymət.Qiymət) Qiymət kimi
FROM

GROUP BY
Qiymətlər.Nomenklatura.Nomenklaturanın növü

NƏTİCƏLƏR

Qruplaşdırmadan fərqli olaraq, cəmlərdən istifadə edərkən bütün qeydlər göstərilir və onlara ümumi sətirlər əlavə edilir. Qruplaşdırma yalnız ümumiləşdirilmiş qeydləri göstərir.

Nəticələr bütün cədvəl üzrə (“GENERAL” açar sözündən istifadə etməklə), bir neçə sahə üçün, iyerarxik strukturu olan sahələr üçün (“HİERARXİYA”, “YALNIZ HİERARXİYA” açar sözləri) ümumiləşdirilə bilər. Nəticələri ümumiləşdirərkən ümumi funksiyalardan istifadə etmək lazım deyil.

Qruplaşdırmadan istifadə edərək yuxarıdakı nümunəyə bənzər bir nümunəyə baxaq. Bu halda, sorğunun nəticəsi yalnız qruplaşdırılmış sahələri deyil, həm də ətraflı qeydləri qaytaracaqdır.

SEÇİN
Qiymətlər.Nomenklatura.Nomenklaturanın Növü AS Nomenklaturanın Növü,
Qiymətlər.Qiymət kimi
FROM
Ən Son AS Qiymətlərinin Snapshot Qiymətləri
NƏTİCƏLƏR
MAKSİMUM(Qiymət)
BY
TipNomenklatura

OLMAQ

Bu operator WHERE operatoruna bənzəyir, lakin yalnız ümumi funksiyalar üçün istifadə olunur. Bu operatorun istifadə etdiyi sahələr istisna olmaqla, qalan sahələr qruplaşdırılmalıdır. WHERE operatoru ümumi funksiyalar üçün uyğun deyil.

Aşağıdakı misalda, maddə növünə görə qruplaşdırılaraq, 1000-dən çox olan bir maddənin maksimum qiymətləri seçilir.

SEÇİN

MAX(Qiymət.Qiymət) Qiymət kimi
FROM
Ən Son AS Qiymətlərinin Snapshot Qiymətləri
GROUP BY
Qiymətlər.Nomenklatura.Nomenklaturanın növü
OLMAQ
MAKSİMUM(Qiymətlər.Qiymət) > 1000

SORT BY

ORDER BY operatoru sorğunun nəticəsini çeşidləyir. Qeydlərin ardıcıl ardıcıllıqla göstərilməsini təmin etmək üçün AUTO ORDER istifadə olunur. İbtidai növlər adi qaydalara uyğun olaraq sıralanır. İstinad növləri GUID-ə görə sıralanır.

Ada görə sıralanmış işçilərin siyahısını əldə etmək üçün bir nümunə:

SEÇİN
İşçilər.Adı AS Adı
FROM
Directory.Employees NECƏ İşçilər
SORT BY
ad
AVTO SİFARİŞ

Digər 1C sorğu dili konstruksiyaları

  • BİRLEŞTİRİN– iki sorğunun nəticələri birində.
  • HƏR ŞEYİ QARŞI VERİN– COMBINE-ə bənzəyir, lakin eyni cərgələri qruplaşdırmadan.
  • BOŞ MASA– bəzən boş iç-içə cədvəli təyin etmək üçün qoşulma sorğularında istifadə olunur.
  • YER– mürəkkəb 1C sorğularını optimallaşdırmaq üçün müvəqqəti cədvəl yaradır. Belə sorğulara toplu sorğular deyilir.

Sorğu Dili Xüsusiyyətləri

  • SUBSTRING sətri müəyyən mövqedən müəyyən edilmiş simvol sayına qədər kəsir.
  • İL...İKİNCİədədi növün seçilmiş dəyərini əldə etməyə imkan verir. Giriş parametri tarixdir.
  • DÖVRÜN BAŞLIĞI və DÖVRÜN SONU tarixlərlə işləyərkən istifadə olunur. Əlavə parametr kimi dövrün növü (GÜN, AY, İL və s.) göstərilir.
  • ADDKDATE tarixdən müəyyən növdə müəyyən edilmiş vaxtı əlavə etməyə və ya çıxarmağa imkan verir (İKİNCİ, DƏQİQƏ, GÜN və s.).
  • FƏRQLİ TARİXçıxış dəyərinin növünü (GÜN, İL, AY və s.) göstərməklə iki tarix arasındakı fərqi müəyyən edir.
  • ISNULL itkin dəyəri göstərilən ifadə ilə əvəz edir.
  • NÜMAYƏNDƏ VƏ NÜMAYƏNDƏ LİNKLƏR göstərilən sahənin simli təsvirini əldə edin. Müvafiq olaraq istənilən dəyərə və yalnız istinad dəyərlərinə müraciət edin.
  • TİP, TİP QİYMƏTLƏRİ giriş parametrinin növünü təyin etmək üçün istifadə olunur.
  • LINK atribut dəyər növü üçün məntiqi müqayisə operatorudur.
  • EXPRESS dəyəri istədiyiniz tipə çevirmək üçün istifadə olunur.
  • TARİX VAXTədədi dəyərlərdən (İl, Ay, Gün, Saat, Dəqiqə, Saniye) "Tarix" tipli bir dəyər alır.
  • MƏNA 1C sorğusunda əvvəlcədən təyin edilmiş dəyərləri - kataloqlar, siyahılar, xüsusiyyət növləri üçün planları göstərmək üçün istifadə olunur. İstifadə nümunəsi: " Harada Hüquqi Fərdi = Dəyər (Saya. Hüquqi Fərdi. Fərdi)«.

Sorğu qurucusu

1C ilə sorğu yaratmaq üçün çox rahat daxili mexanizm var - sorğu dizayneri. O, aşağıdakı əsas nişanları ehtiva edir:

  • "Cədvəllər və Sahələr" - seçilməli olan sahələri və onların mənbələrini ehtiva edir.
  • "Əlaqələr" - BAĞLANTI strukturu üçün şərtləri təsvir edir.
  • "Qruplaşdırma" - qruplaşdırma strukturlarının və onlara əsaslanan ümumi sahələrin təsvirini ehtiva edir.
  • "Şərtlər" - sorğuda məlumatların seçilməsinə cavabdehdir.
  • "Qabaqcıl" - əlavə sorğu parametrləri, məsələn, "SEÇ" əmri üçün açar sözlər və s.
  • “Qoşulmalar/ləqəblər” - cədvəllərin qoşulma imkanları göstərilir və ləqəblər göstərilir (“NECƏ” konstruksiya).
  • "Sifariş" sorğuların nəticəsinin çeşidlənməsinə cavabdehdir.
  • "Cəmi" - "Qruplaşdırma" tabına bənzəyir, lakin "CƏMİ" konstruksiyası üçün istifadə olunur.

Sorğunun mətninə aşağı sol küncdəki “Sorğu” düyməsini sıxmaqla baxmaq olar. Bu formada əl ilə düzəldilə və ya kopyalana bilər.


Sorğu Konsolu

Müəssisə rejimində sorğunun nəticəsini tez görmək və ya mürəkkəb sorğuları aradan qaldırmaq üçün istifadə edin. O, sorğunun mətnini ehtiva edir, parametrləri təyin edir və nəticəni göstərir.

Sorğu konsolunu ITS diskinə və ya vasitəsilə yükləyə bilərsiniz.

Mən öz töhfəmi vermək və yuxarıdakı məqalələrdə müzakirə olunmayan dilin xüsusiyyətlərini təsvir etmək qərarına gəldim. Məqalə yeni başlayan tərtibatçılar üçün nəzərdə tutulub.

1. “IZ” dizaynı.

Verilənlər bazasından məlumat əldə etmək üçün “FROM” konstruksiyasından istifadə etmək heç də lazım deyil.
Misal: Biz banklar kataloqundan banklar haqqında bütün məlumatları seçməliyik.
Sorğu:

Directory.Banks.* SEÇİN

Banklar kataloqundan bütün sahələri seçir. Və sorğuya bənzəyir:

Bankları SEÇİN.* Directory.Banks AS Banks

2. Məlumatların istinad sahəsi üzrə sifariş edilməsi

Sorğu məlumatlarını primitiv tiplər üzrə təşkil etməli olduğumuz zaman: "String", "Nömrə", "Tarix" və s. İstinad sahəsi bir keçiddir, unikal identifikatordur, yəni. Təxminən desək, bəzi ixtiyari simvol dəsti və adi sıralama tamamilə gözlənilməyən bir nəticə verə bilər. İstinad sahələrini sifariş etmək üçün "AVTO SİFARİŞ" konstruksiyası istifadə olunur. Bunu etmək üçün əvvəlcə "SİFARİŞ BY" konstruksiyasından, sonra isə "AVTO SİFARİŞ" konstruksiyasından istifadə edərək məlumatları birbaşa istinad növü üzrə sifariş etməlisiniz.

Bu halda, sənədlər üçün sifariş "Tarix->Nömrə", istinad kitabları üçün "Əsas Görünüş" sırasında həyata keçirilir. Əgər sifariş istinad sahələrində baş vermirsə, onda "AVTO SİFARİŞ" konstruksiyasından istifadə etmək tövsiyə edilmir.

Bəzi hallarda "AVTO SİFARİŞ" konstruksiyası seçim prosesini ləngidə bilər. Eyni şəkildə, sənədlər üçün avtomatik sifariş vermədən yenidən yaza bilərsiniz:

3. İstinad tipinin mətn təsvirinin əldə edilməsi. "TƏQDİMAT" dizaynı.

İstinad tipli bir sahəni, məsələn, "Banklar" kataloqunun bir elementinə keçid olan "Bank" sahəsini göstərmək lazım olduqda, bu sahəni göstərərkən "Bank" alt sorğusunun olduğunu başa düşməlisiniz. Banklar" kataloqu kataloqun görünüşünü əldə etmək üçün avtomatik olaraq icra ediləcək. Bu, məlumat çıxışını yavaşlatacaq. Bunun qarşısını almaq üçün dərhal obyektin təsvirini əldə etmək və sonra onu baxmaq üçün göstərmək üçün sorğuda “TƏQDİMAT” konstruksiyasından istifadə etməlisiniz.

Məlumatların kompozisiya sistemində bu mexanizm standart olaraq istifadə olunur, lakin hüceyrələrdə tərtibatlar yaratarkən istinad sahəsinin təsvirini təyin etməlisiniz və məsələn, keçidin özünü transkriptdə yerləşdirməlisiniz.

4. Şablon üzrə məlumatların seçilməsi şərti.

Məsələn, (8 -123- 456-78-912) formasının əməkdaşlarının mobil telefonlarını əldə etməlisiniz. Bunu etmək üçün sorğuda aşağıdakı şərti təyin etməlisiniz:

İşçi.Ad,İşçi.Telefon KİMİ MƏLUMATDAN Telefon KİMİ SEÇİN.İşçilər "_-___-___-__-__" kimi telefon

"_" simvolu xidmət simvoludur və istənilən simvolu əvəz edir.

5. Cəmi və qruplaşmaların eyni vaxtda istifadəsi.


Ümumilər çox vaxt qruplaşmalarla birlikdə istifadə olunur, bu halda ümumi funksiyalar cəmlərdə göstərilməyə bilər;

Xidmətlərin Təminatı SEÇİN. Təşkilat AS Təşkilat, Xidmətlərin Təminatı. Nomenklatura AS Nomenklatura, SUM(Xidmətlərin Göstərilməsi. Sənədin Məbləği) Sənəddən Sənədin Məcmuəsi KİMİ. Xidmətlərin Təminatı KİMİ XİDMƏTLƏRİN GÖRÜŞÜLMƏSİ QRUPU Xidmətlərin göstərilməsi. Təşkilat, təminat Xidmətlərin.Nomenklatura ÜMUMİ NƏTİCƏLƏR, Təşkilat, nomenklatura

Bu halda, sorğu demək olar ki, aşağıdakı sorğu ilə eyni şəkildə qayıdacaq:

Xidmətlərin Təminatı SEÇİN.Təşkilat AS Təşkilat, Xidmətlərin Təminatı.Nomenklatura AS Nomenklatura, Xidmətlərin Təminatı.Sənədin Məbləği Sənəddən Sənədin Məbləği.Xidmətlərin Göstərilməsi KİMİ NƏTİCƏLƏR (Sənəd Məbləği) ÜMUMİ, Təşkilat, Nomenklatura

Yalnız birinci sorğu eyni nomenklaturaya malik qeydləri yığışdıracaq.

6. Sahələrə istinadın ləğvi.

Nöqtə vasitəsilə sahələrə istinad etmək istinad sahəsinə istinadın ləğvi əməliyyatı adlanır. Misal üçün Ödəniş.Təşkilat.İnzibati Vahid. Bu halda, "Ödəniş" sənədinin "Təşkilat" arayış sahəsində "İnzibati Vahid" atributunun dəyərinin alınacağı digər "Təşkilatlar" cədvəlinə istinad edilir. Anlamaq lazımdır ki, sahələrə nöqtə vasitəsilə daxil olarkən platforma gizli şəkildə alt sorğu yaradır və bu cədvəllərə qoşulur.

Sorğu:

Aşağıdakı kimi təmsil oluna bilər:

Ödəniş.Link, Ödəniş.Təşkilat, Ödəniş.Təşkilat, Təşkilatları SEÇİN. Sənəddən İnzibati Vahid. Ödəniş KİMİ Ödəniş QOŞULUN Directory.Organizations AS Software Organizations Payment.Organization = Organizations.Link

Mürəkkəb tipli istinad sahələrinə istinadı ləğv edərkən çərçivə həmin sahənin növünün bir hissəsi olan bütün cədvəllərə gizli birləşmələr yaratmağa çalışır. Bu halda sorğu optimal olmayacaqsa, onun hansı sahə növü olduğu aydındırsa, konstruksiya ilə belə sahələrin növlərinə görə məhdudlaşdırmaq lazımdır EXPRESS().

Məsələn, bir neçə sənədin qeydiyyatçı kimi çıxış edə biləcəyi "Bölüşdürülməmiş ödənişlər" yığım reyestri var. Bu halda, registrator təfərrüatlarının dəyərlərini bu şəkildə əldə etmək düzgün deyil:

Bölünməmiş Ödənişləri.Qeydiyyat.Tarix, ..... QEYDİYYATDAN Yığım.Bölüşdürülməmiş Ödənişləri Bölünməmiş Ödənişlər KİMİ SEÇİN

logger üçün kompozit sahənin növünü məhdudlaşdırmalısınız:

EXPRESS SEÇİN(Bölüşdürülməmiş Ödənişlər. Sənəd KİMİ QEYDİYYAT. Ödəniş).Tarix, ..... Qeydiyyatdan Yığım.Bölünməmiş Ödənişlər Bölünməmiş Ödənişlər KİMİ

7. "HARADA" tikinti

İki cədvəlin sola birləşməsi ilə, sağ cədvələ “HARADA” şərtini qoyduğunuzda, cədvəllərin daxili birləşməsi ilə nəticəyə oxşar nəticə əldə edəcəyik.

Misal. Müştərilər Kataloqundan bütün Müştəriləri seçmək lazımdır və "Təşkilat" = &Təşkilat atributunun dəyəri ilə ödəniş sənədi olan müştərilər üçün "Ödəniş" sənədini göstərin, olmayanlar üçün göstərməyin.

Sorğunun nəticəsi yalnız parametrdə təşkilat tərəfindən ödəniş etmiş müştərilər üçün qeydləri qaytaracaq və digər müştəriləri süzəcək. Buna görə də, əvvəlcə "belə və belə" təşkilat üçün bütün ödənişləri müvəqqəti cədvəldə almalı və sonra sol birləşmədən istifadə edərək onu "Müştərilər" qovluğuna qoşmalısınız.

Ödənişi SEÇİN. Ödəniş, Ödəniş. Müştəri KİMİ Səhmdar Sənəddən Ödənişlərə Müştəri YERİ. Ödəniş KİMİ Ödəniş HARADA Ödəniş. Filial = &Branch; /////////////////////////////////////////////// /////////////////////////// Müştəriləri SEÇİN.Link Müştəri, ISNULL(tPayment.Payment, "") Kataloqdan Ödəniş AS .Clients AS Müştərilər BAĞLANTILI ÖDƏNİŞLƏRİ ÖDƏNİŞLƏR KİMİ SOFTWARE Clients.Link = topayments.Client

Bu vəziyyətdən başqa bir şəkildə keçə bilərsiniz. İki cədvəl arasındakı əlaqəyə birbaşa “HARADA” şərtini qoymaq lazımdır. Misal:

Clients.Link, Payment.Link FROM Directory.US_Subscribers KİMİ SEÇİN BAĞLANTI SƏNƏDİNİ ABŞ_Abunəçiləri KİMİ SAL.Ödənişi Ödəniş Proqramı KİMİ (Clients.Link = Payment.Client AND Payment.Client.Ad "Şəkər Paketi" KİMİ) Ödəniş QRUPU, BLLYk. Link

8. İç içə və Virtual Cədvəllərlə birləşir

İç-içə sorğular tez-tez bəzi şərtlərə əsaslanaraq məlumatları əldə etmək lazımdır. Əgər siz onları digər cədvəllərlə birlikdə istifadə etsəniz, bu, sorğunun icrasını kəskin şəkildə yavaşlata bilər.

Məsələn, bəzi müştərilər üçün cari tarixə balans məbləğini almalıyıq.

Bölünməmiş Ödəniş Balanslarını SEÇİN. Müştəri, Bölünməmiş Ödəniş Balansları. Məbləğ Balansı (Müştəriləri SEÇİN. Rehberdən Link KİMİ. Müştərilər Clients.Link IN(&Clients)) JOStedINQuery Regulations.Pay.Pay. Nested nyRequest.Link BY Bölünməmiş Ödənişlər = Ayrılmamış Ödənişlər Balanslar. Müştəri

Belə bir sorğunu yerinə yetirərkən DBMS optimallaşdırıcısı plan seçərkən səhvlərə yol verə bilər ki, bu da sorğunun suboptimal icrasına gətirib çıxaracaq. İki cədvəli birləşdirən zaman DBMS optimallaşdırıcısı hər iki cədvəldəki qeydlərin sayına əsasən cədvəl birləşmə alqoritmini seçir. İç-içə sorğu varsa, iç-içə sorğunun qaytaracağı qeydlərin sayını müəyyən etmək olduqca çətindir. Buna görə də, iç içə sorğular əvəzinə həmişə müvəqqəti cədvəllərdən istifadə etməlisiniz. Beləliklə, sorğunu yenidən yazaq.

Müştəriləri.Link KİMİ SEÇİN Link YERİ tMüştəriləri Directory.Clients-DƏN MÜŞTƏRİ KİMİ HARADA
Clients.Link B (&Clients); /////////////////////////////////////////////// /////////////////////////// tMüştəriləri SEÇİN.Link,BölünməmişÖdənişlərQalan.Məbləğ,tMüştərilərdən tMüştərilər KİMİ QOŞULMAQ QEYDİYYƏT Yığımları.BölüşdürülməmişÖdənişlər. IN (SEÇİN tClients.Link FROM tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

Bu halda, optimallaşdırıcı tClients müvəqqəti cədvəlinin neçə qeyddən istifadə etdiyini müəyyən edə biləcək və cədvəllərə qoşulmaq üçün optimal alqoritmi seçə biləcək.

Virtual masalar , sizə ən çox tətbiq olunan tapşırıqlar üçün praktiki olaraq hazır məlumatları əldə etməyə imkan verir (Slice of the First, Slice of the Last, Remains, Turovers, Remains and Turnors) Burada əsas söz virtualdır. Bu cədvəllər fiziki deyil, lakin sistem tərəfindən tez bir zamanda tərtib edilir, yəni. Virtual cədvəllərdən verilənləri qəbul edərkən sistem yekun registr cədvəllərindən məlumatları toplayır, toplayır, qruplaşdırır və istifadəçiyə verir.

Bunlar. Virtual cədvələ qoşulduqda alt sorğu ilə əlaqə qurulur. Bu halda, DBMS optimallaşdırıcısı qeyri-optimal əlaqə planını da seçə bilər. Əgər sorğu kifayət qədər tez yaradılmırsa və sorğu virtual cədvəllərdə birləşmələrdən istifadə edirsə, onda virtual cədvəllərə girişi müvəqqəti cədvələ köçürmək və sonra iki müvəqqəti cədvəl arasında birləşmə etmək tövsiyə olunur. Əvvəlki sorğunu yenidən yazaq.

Müştəriləri.Link KİMİ SEÇİN tMüştəriləri Directory.Clients-DƏN MÜŞTƏRİ KİMİ LİNK İLƏ İNDEKSİ HARADA
Clients.Link B (&Clients); /////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SEÇİN Bölüşdürülməmiş Ödənişlər.Məbləğ,Bölüşdürülməmiş Ödənişlər.Müştəri KİMİ RegisterAccumulations.BölüşdürülməmişÖdənişlər.Balanslar(, Müştəri B () tClients-dən Link SEÇİN)) Bölünməmiş Ödənişlər Balansları; /////////////////////////////////////////////// ////////////////////////////////////////// tClients.Link, to Remainders.TClients-dən Qalan Məbləğ KİMİ SEÇİN tClients KİMİ tClients.Lk.-də Qalanlar KİMİ SALDI. = tRemainings.Client

9. Sorğunun nəticəsinin yoxlanılması.

Sorğunun nəticəsi boş ola bilər, boş dəyərləri yoxlamaq üçün aşağıdakı konstruksiyadan istifadə edin:

ResRequest = Request.Execute(); Əgər resQuery.Empty() varsa, Qayıdın; endIf;

Metod Boş()üsullardan əvvəl istifadə edilməlidir seçin() və ya Boşaltma(), çünki kolleksiyanın bərpası vaxt aparır.

Döngədə sorğulardan istifadə etməyin son dərəcə arzuolunmaz olduğu heç kimə açıqlanmır. Bu, müəyyən bir funksiyanın işləmə müddətinə kritik təsir göstərə bilər. Sorğudakı bütün məlumatları qəbul etmək və sonra məlumatları bir dövrədə emal etmək çox arzu edilir. Ancaq bəzən sorğunu loopdan kənara çıxarmaq mümkün olmadığı hallar olur. Bu halda, optimallaşdırma üçün, sorğunun yaradılmasını döngədən kənara köçürə və dövrədə lazımi parametrləri əvəz edə və sorğunu yerinə yetirə bilərsiniz.

Sorğu = Yeni Sorğu; Query.Text = "SEÇ | Müştərilər.Link, | Müştərilər.Doğum tarixi |FROM | Directory.Clients AS Clients |HARA | Clients.Link = &Client"; Cədvəl Müştərilərindən Hər Sətir üçün Loop Query.SetParameter("Müştəri", Müştəri); QueryResult = Query.Execute().Select(); EndCycle;

Bu, sistemi bir döngədə sorğunun yoxlanılmasından xilas edəcək.

11. Tikinti "HAVING".

İstəklərdə olduqca nadir olan bir dizayn. Məcmu funksiyaların dəyərlərinə (SUM, MINIMUM, AVERAGE və s.) şərtlər qoymağa imkan verir. Məsələn, yalnız sentyabr ayında ödəniş məbləği 13.000 rubldan çox olan müştəriləri seçməlisiniz. “HARADA” şərtindən istifadə etsəniz, əvvəlcə müvəqqəti cədvəl və ya iç-içə sorğu yaratmalı, oradakı qeydləri ödəniş məbləğinə görə qruplaşdırıb sonra şərti tətbiq etməli olacaqsınız. “HAVING” konstruksiyası bunun qarşısını almağa kömək edəcək.

Ödəniş.Müştəri, Sənəddən Məbləğ KİMİ MƏBLƏĞİ(Ödəniş.Məbləğ) SEÇİN. Ödəniş KİMİ AY (Ödəniş.Tarix) = 9 ÖDƏNİŞƏ GÖRƏ QRUP. MƏBLƏĞİ OLAN MÜŞTƏRİ(Ödəniş.Məbləğ) > 13000

Konstruktorda bunu etmək üçün sadəcə "Şərtlər" sekmesine keçin, yeni bir şərt əlavə edin və "Xüsusi" onay qutusunu yoxlayın. Sonra sadəcə yazın Məbləğ(Ödəniş.Məbləğ) > 13000


12. NULL dəyəri

Mən burada üç dəyərli məntiqin prinsiplərini təsvir etməyəcəyəm, bu mövzuda çoxlu məqalələr var; Necə haqqında qısaca SIFIR sorğunun nəticəsinə təsir edə bilər. NULL dəyəri əslində dəyər deyil və dəyərin qeyri-müəyyən olması məlum deyil. Buna görə də, NULL ilə istənilən əməliyyat, istər əlavə, çıxma, bölmə və ya müqayisə olsun, NULL qaytarır. NULL dəyəri NULL dəyəri ilə müqayisə edilə bilməz, çünki nəyi müqayisə edəcəyimizi bilmirik. Bunlar. bu müqayisələrin hər ikisi belədir: NULL = NULL, NULL<>NULL doğru və ya yanlış deyil, bilinmir.

Bir nümunəyə baxaq.

Ödənişləri olmayan müştərilər üçün “İmza” sahəsini “Ödəniş yoxdur” dəyəri ilə göstərməliyik. Üstəlik, belə müştərilərimizin olduğunu dəqiq bilirik. Və yuxarıda yazdıqlarımın mahiyyətini əks etdirmək üçün bunu belə edək.

Atribut KİMİ "Ödəniş yoxdur" SEÇİN, Ödəmələrin SƏNƏD YERİ KİMİ NULL; /////////////////////////////////////////////// //////////////////////////////////////// Müştəriləri SEÇİN.Link AS Müştəri, Ödəniş.Link Ödəniş tClientPayment-i Directory.Clients-DƏN NECƏ QOYUR. Ödəniş AS Ödəniş Proqramı Müştəriləri.Link = Ödəniş.Səhmdar; /////////////////////////////////////////////// ///////////////////////// tClientPayment.Client FROM tClientPayment AS DAXİLİ QOŞULUN tPayment KİMİ tClientPayment.Ödəniş = t

tClientPayment-in ikinci müvəqqəti cədvəlinə diqqət yetirin. Sol qoşulma ilə mən bütün müştəriləri və bu müştərilər üçün bütün ödənişləri seçirəm. Ödənişləri olmayan müştərilər üçün “Ödəniş” sahəsi NULL olacaq. Məntiqə əməl edərək, birinci müvəqqəti cədvəldə “tPayments” 2 sahəni təyin etdim, onlardan biri NULL, ikinci sətir “Ödənişləri yoxdur”. Üçüncü cədvəldə "Ödəniş" və "Sənəd" sahələrindən istifadə edərək "tClientPayment" və "tPayment" cədvəllərini daxili birləşmə ilə birləşdirirəm. Bilirik ki, birinci cədvəldə “Sənəd” sahəsi NULL, ikinci cədvəldə isə “Ödəniş” sahəsində ödənişləri olmayanlar da NULL-dur. Belə bir əlaqə bizə nə qaytaracaq? Amma heç nə qaytarmayacaq. Çünki NULL = NULL müqayisəsi True olaraq qiymətləndirilmir.

Sorğunun gözlənilən nəticəni qaytarması üçün onu yenidən yazaq:

"Ödəniş yoxdur" Atribut, VALUE(Document.Payment.EmptyLink) Ödənişlərə Sənəd YERİ KİMİ SEÇİN; /////////////////////////////////////////////// /////////////////////////// Müştəriləri SEÇİN.Link Müştəri, ISNULL(Ödəmə.Link, DƏYƏR(Sənəd.Ödəniş.BoşLink )) NECƏ Ödəniş tMüştəri Ödənişini Directory.Clients FROM FROM.Clients KİMİ SOLD BAĞLANTI Sənədi.Ödəniş Müştərilərin Ödənişi KİMİ.Link = Payment.Shareholder; /////////////////////////////////////////////// ///////////////////////// tClientPayment.Client FROM tClientPayment AS DAXİLİ QOŞULUN tPayment KİMİ tClientPayment.Ödəniş = t

İndi ikinci müvəqqəti cədvəldə qeyd etdik ki, “Ödəniş” sahəsi NULL-dursa, bu sahə = ödəniş sənədinə boş bir keçiddir. Birinci cədvəldə biz də NULL-u boş istinadla əvəz etdik. İndi əlaqə NULL olmayan sahələri əhatə edir və sorğu gözlənilən nəticəni qaytaracaq.

Məqalədə olan bütün sorğular nəzərdən keçirmək istədiyim vəziyyətləri əks etdirir və başqa heç nə yoxdur. HAQQINDA Onlar xəyalpərəst və ya suboptimal olmaya bilər, əsas odur ki, nümunənin mahiyyətini əks etdirsinlər.

13. "SEÇİM ZAMAN... SONRA... SON" dizaynının sənədsiz xüsusiyyəti.

Sorğuda "Şərtlər" konstruksiyasını təsvir etmək lazım olduqda, standart sintaksisdən istifadə edirik:

Users.Name = "Vasya Pupkin" SONRA "Sevimli işçimiz" SEÇİN ZAMAN "Biz bunu bilmirik" Kataloqdan Sahə 1 KİMİ SON EDİN. İstifadəçilər İstifadəçilər AS

Bəs, məsələn, sorğuda ayın adını almalıyıqsa? Müraciətdə nəhəng bir tikinti yazmaq çirkin və vaxt aparan işdir, ona görə də yuxarıdakı yazının bu forması bizə kömək edə bilər:

AYI SEÇİN(ABŞ_CalculationConsumption_TurnoverSchedule.CalculationPeriod) 1 NƏ ZAMAN "YANVAR" DA 2 SONRA "Fevral" DA 3 NƏ ZAMAN SONRA "Mart" 4 NƏ ZAMAN SONRA "Aprel" AYIN 5 ZAMAN SONRA "May" SONRA "NHJ77" ZAMAN 8 SONRA "Avqust" 9 NAXCƏ SONRA "Sentyabr" 10 NAXCƏ SONRA "Oktyabr" 11 ZAMAN SONRA "Noyabr" 12 NƏ ZAMAN SONRA "Dekabr" AY BİTİR

İndi dizayn daha az çətin görünür və başa düşmək asandır.

14. Toplu sorğunun icrası.


Sorğuları çoxaltmamaq üçün bir böyük sorğu yarada, onu paketlərə ayıra və onunla işləyə bilərsiniz.
Məsələn, "İstifadəçilər" kataloqundan aşağıdakı sahələri almalıyam: "Doğum tarixi" və hər bir istifadəçi üçün mövcud rollar. bunu formada müxtəlif cədvəl hissələrinə yükləyin. Əlbəttə ki, bunu bir sorğuda edə bilərsiniz, sonra qeydləri təkrarlamalı və ya onları yığışdırmalı olacaqsınız və ya bunu edə bilərsiniz:

İstifadəçilər.Link KİMİ SEÇİN Tam Ad, İstifadəçilər.Doğum Tarixi, İstifadəçilər.Rol vtİstifadəçiləri Directory.İstifadəçilər AS İstifadəçilər KİMİ QOYUN; /////////////////////////////////////////////// ////////////////////////// SEÇİN tueUsers.Tam adı, tueUsers.Doğum tarixi tueUsers AS tueUsers QRUPLA tueUsers.tam ad, tueUsers . Doğum tarixi; /////////////////////////////////////////////// ///////////////////////// wUsers.Tam adı, wUsers.Role FROM wUsers BY WROUP BY wUsers.Tam Name, WUsers doğum

tPackage = Request.ExecutePackage();

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

Gördüyümüz kimi, sorğu toplu şəklində yerinə yetirilə bilər və nəticə massiv kimi işlənə bilər. Bəzi hallarda çox rahatdır.

15. Toplu sorğuda şərtlər

Məsələn, toplu sorğumuz var, burada əvvəlcə "İstifadəçilər" kataloqundan "Ad, Doğum tarixi, Kod" sahələrini alırıq və "Şəxslər" kataloqundan bu sahələr üçün şərtləri olan qeydləri almaq istəyirik.

İstifadəçilər.Fərdi.Ad AS Ad, İstifadəçilər.Fərdi.Doğum Tarixi, Doğum Tarixi AS, İstifadəçilər.Fərdi.Kod SEÇİN. /////////////////////////////////////////////// /////////////////////// Fərdi şəxslər AS Directory

Bu kimi şərtlər qoya bilərsiniz:

WHERE Individuals.Code IN (select tueUsers.Code F FROM tueUsers) VƏ Fərdilər.Name IN (TueUsers.Kod SEÇİN tueUsers) VƏ Şəxslər.Doğum Tarixi GİRİŞ (TueUsers.DateDateDate FROM SEÇİN)

Və bunu belə edə bilərsiniz:

HARADA (Şəxslər.Kodu, Fərdilər.Ad, Fərdilər.Doğum Tarixi) IN (SEÇİN tueUsers.Code, tueUsers.Name, tueUsers.Doğum tarixi tueUsers)

Üstəlik, asayişi qorumaq lazımdır.

16. Toplu sorğuda “şərt” üçün sorğu qurucusunun çağırılması

Şərt qoymaq lazım gəldikdə, yuxarıdakı nümunədə olduğu kimi, virtual cədvəldə bu və ya digər sahənin necə çağırıldığını unuda bilərsiniz.
Məsələn, "Doğum tarixi" sahəsinə şərt qoymalısınız və virtual cədvəldə bu sahə "Borclunun doğum tarixi" adlanır və adı unutsanız, şərti redaktə etmədən çıxmalı olacaqsınız. qənaət edin və sahənin adına baxın. Bunun qarşısını almaq üçün aşağıdakı texnikadan istifadə edə bilərsiniz.

“B” konstruksiyasından sonra mötərizələr qoymaq və mötərizələr arasında boşluq (boşluq) qoymaq, bu boşluğu seçmək və sorğu konstruktorunu çağırmaq lazımdır. Dizayner toplu sorğunun bütün cədvəllərinə çıxış əldə edəcək. Texnika həm virtual registr cədvəllərində, həm də "Şərtlər" sekmesinde işləyir. Sonuncu halda, "P (ixtiyari şərt)" qutusunu yoxlamaq və "F4" redaktə rejiminə daxil olmaq lazımdır.

Sorğular tez-tez tez hazırlanır və onlar sadəcə nəzərdən keçirdiyim “texnikaları” təsvir etməyə xidmət edir.

Sorğularda indekslərin istifadəsinə baxmaq istədim, lakin bu çox geniş mövzudur. Ayrı bir məqalədə yerləşdirəcəyəm və ya sonra bura əlavə edəcəyəm.

upd1. 11,12 nöqtələri
upd2. 13,14,15,16-cı nöqtələr

İstifadə olunmuş Kitablar:
Sorğu dili "1C:Enterprise 8" - E.Yu. Xrustaleva
1C: Enterprise 8 sistemində peşəkar inkişaf."

1C sorğu dili 7.7 və 8 versiyaları arasındakı əsas fərqlərdən biridir. 1C proqramlaşdırmasını öyrənməkdə ən vacib məqamlardan biri sorğu dilidir. 1C 8.3-də sorğular məlumat əldə etmək üçün ən güclü və effektiv vasitədir. Sorğu dili məlumat bazasından məlumatları rahat şəkildə əldə etməyə imkan verir.

Sintaksis özü klassik T-SQL-i çox xatırladır, istisna olmaqla, 1C-də sorğu dilindən istifadə edərək, yalnız Select konstruksiyasından istifadə edərək məlumatları qəbul edə bilərsiniz. Dil daha mürəkkəb konstruksiyaları da dəstəkləyir, məsələn, (sorğu daxilində sorğu). 1C 8-də sorğular həm kiril, həm də latın dilində yazıla bilər.

Bu yazıda 1C sorğu dilində əsas açar sözlər haqqında danışmağa çalışacağam:

  • seçin
  • icazə verilir
  • müxtəlif
  • ifadə
  • birinci
  • dəyişiklik üçün
  • məna
  • dəyər növü (və REFERENCE operatoru)
  • seçim
  • tərəfindən qruplaşdırılır
  • olan
  • ISNULL
  • Bəli NULL
  • əlaqələr - sağ, sol, daxili, dolu.

Həm də 1C dilinin bəzi kiçik fəndləri, onlardan istifadə edərək sorğu mətnini optimal şəkildə qura bilərsiniz.

1C 8.2 sistemində sorğuları aradan qaldırmaq üçün xüsusi bir vasitə - sorğu konsolu təqdim olunur. Təsvirə baxa və linkdən istifadə edərək yükləyə bilərsiniz -.

1C sorğu dilinin ən vacib və maraqlı operatorlarına baxaq.

SEÇİN

1C Enterprise 8 sorğu dilində istənilən sorğu açar sözlə başlayır SEÇİN. 1C dilində UPDATE, DELETE, CREATE TABLE, INSERT konstruksiyaları yoxdur, bu manipulyasiyalar obyekt texnologiyasında həyata keçirilir. Onun məqsədi yalnız məlumatları oxumaqdır.

Misal üçün:

SEÇİN
Cari Directory.Name
FROM
Directory.Nomenklatura AS Cari Kataloq

Sorğu element adları olan cədvəli qaytaracaq.

Quruluşun yaxınlığında SEÇİN açar sözlər tapa bilərsiniz DƏYİŞİM ÜÇÜN, İCAZƏ VERİLİR, MÜXTƏLİF, İLK

İCAZƏ VERİLİR— cədvəldən yalnız cari istifadəçinin hüququ olan qeydləri seçir.

MÜXTƏLİF— o deməkdir ki, nəticədə dublikat sətirlər olmayacaq.

SEÇİM (İŞİ)

Çox vaxt bu dizayn proqramçılar tərəfindən qiymətləndirilmir. Onun istifadəsinə bir nümunə:

Cari Directory.Name,

Mövcud Directory.Service SONRA

"Xidmət"

NECƏ GÖRÜŞÜNƏ BAXIN Nomenklatura

Directory.Nomenklatura AS Cari Kataloq

Nümunə "Məhsul növü" sahəsində mətn dəyərini qaytaracaq - "Məhsul" və ya "Xidmət".

HARADA

Alınan məlumatlara seçim qoymağa imkan verən 1C sorğu dilinin dizaynı. Nəzərə alın ki, sistem bütün məlumatları serverdən alır və yalnız bundan sonra bu parametr əsasında seçilir.

SEÇİN
Directory.Name
FROM
Cari Directory.Nomenklatura AS Cari Kataloq
HARADA CurrentDirectory.Service = DOĞRU

Nümunədə "Xidmət" atributunun dəyərinin "Doğru" olaraq təyin olunduğu qeydləri seçirik. Bu misalda biz aşağıdakı şərtləri yerinə yetirə bilərik:

"XİDMƏT HARƏDƏDİR"

Əsasən, biz açar sözdən sonrakı ifadənin "Doğru"ya bərabər olduğu sətirləri seçirik.

İfadələrdə birbaşa şərtlərdən istifadə edə bilərsiniz:

HARADA Kodu = "005215"

Şərtlərdə “VALUE()” operatorundan istifadə edərək, 1C sorğusunda əvvəlcədən təyin edilmiş elementlərə və siyahılara girişdən istifadə edin:

HARADA Element Növü = Dəyər(Saya.Məhsul Növləri.Məhsul)

Vaxt dəyərləri aşağıdakı kimi təyin edilə bilər:

HARA Qəbul Tarixi > DATETIME(2012,01,01):

Çox vaxt şərtlər sorğuya ötürülən parametrlər kimi göstərilir:

1C-də 267 video dərsi pulsuz əldə edin:

WHERE Nomenklatura Qrupu= &Nomenklatura Qrupu

Atribut tipinə şərt qoyula bilər, əgər o, kompozit tiplidir:

Dəyərlər siyahısından və ya massivdən seçimi məhdudlaşdırmaq lazımdırsa, aşağıdakıları edə bilərsiniz:

Yığım Reyestri B (&Seçim üçün Sənədlərin Siyahısı) HARADA.

Vəziyyət də bir neçə şərtdən ibarət mürəkkəb ola bilər:

HARA Qəbul Tarixi > DATETIME(2012,01,01) VƏ Nomenklatura Qrupu= &Nomenklatura Qrupu və Xidmət DEYİL

GROUP BY

Nəticəni qruplaşdırmaq üçün istifadə edilən 1C 8.2 sorğu dilinin dizaynı.

Misal üçün:

SEÇİN
Malların və xidmətlərin qəbulu Mallar,.
SUM(Malların qəbuluXidmətlərMalların.Quantity) Kəmiyyət AS,
SUM(Malların qəbuluXidmətlərMalların.Məbləği) Məbləğ AS
FROM
Malların və xidmətlərin qəbulu. Malların və xidmətlərin alınması

GROUP BY
Malların qəbuluXidmətlərMallar.Mallar

Bu sorğu bütün qəbzləri məbləğə və miqdarlara görə ümumiləşdirəcək.

Açar sözdən başqa SUM Digər məcmu funksiyalardan istifadə edə bilərsiniz: KƏMİYYƏ, FƏRQLİ SAYI, MAKSİMUM, MİNİMUM, ORTA.

OLMAQ

Tez-tez unudulan, lakin çox vacib və faydalı bir dizayn. Seçimi ümumi funksiya şəklində təyin etməyə imkan verir, bu dizaynda edilə bilməz HARADA.

1C sorğusunda HAVING-dən istifadə nümunəsi:

SEÇİN
Malların və xidmətlərin qəbulu Mallar,.
SUM(Malların qəbuluXidmətlərMalların.Quantity) Kəmiyyət AS,
SUM(Malların qəbuluXidmətlərMalların.Məbləği) Məbləğ AS
FROM
Malların və xidmətlərin qəbulu. Malların və xidmətlərin alınması

GROUP BY
Malların və xidmətlərin qəbulu Mallar

SUM(Malların qəbuluXidmətlərMallar.Kəmiyyət) > 5

Beləliklə, 5 ədəddən çox gələn məhsulların sayını seçəcəyik.

MƏNA()

Misal üçün:

WHERE Bank = Dəyər(Directory.Banks.EmptyLink)

HARADA Nomenklatura Növü = Dəyər(Kataloq.Nomenklatura Növləri.Məhsul)

HARADA Element Növü = Dəyər (Saya. Element Növləri. Xidmət)

Sorğuda TYPE

Məlumat növü TYPE() və VALUETYPE() funksiyalarından istifadə etməklə və ya məntiqi REFERENCE operatorundan istifadə etməklə yoxlanıla bilər.

EXPRESS()

1C sorğularında Express operatoru məlumat növlərini çevirmək üçün istifadə olunur.

Sintaksis: EXPRESS(<Выражение>NECƏ<Тип значения>)

Bundan istifadə edərək, sətir dəyərlərini tarixə və ya istinad dəyərlərini sətir məlumatlarına çevirə bilərsiniz və s.

Praktik tətbiqlərdə Express() operatoru çox vaxt qeyri-məhdud uzunluqlu sahələri çevirmək üçün istifadə olunur, çünki məhdudiyyətsiz uzunluqlu sahələri seçmək, qruplaşdırmaq və s. Belə sahələr çevrilməsə, səhv alacaqsınız Siz limitsiz uzunluqlu sahələri və uyğun olmayan növlərin sahələrini müqayisə edə bilməzsiniz.

SEÇİN
Əlaqə Məlumatı.Obyekt,
EXPRESS(ContactInfo.View AS SATIR(150)) Görünüş KİMİ
FROM
Əlaqə Məlumatı NECƏ Əlaqə Məlumatı

GROUP BY
EXPRESS(ContactInfo.Nümayəndəlik SƏRƏ(150)),
Əlaqə Məlumatı.Obyekt

ISNULL (ISNULL)

1C sorğu dilinin kifayət qədər faydalı funksiyası, qeyddəki dəyəri yoxlayır və bərabərdirsə SIFIR, Bu, onu öz dəyərinizlə əvəz etməyə imkan verir. Ən çox gizlətmək üçün qalıqların və dövriyyənin virtual cədvəllərini əldə edərkən istifadə olunur SIFIR və aydın 0 (sıfır) qoyun.

ISNULL(Aydan Qabaq Vergilər. Tətbiq olunan FSS Müavinəti, 0)

ISNULL 1C sorğu dilinin belə bir funksiyası heç bir dəyər olmadıqda sıfırı qaytaracaq və bu, səhvdən qaçınacaqdır.

QOŞULUN

4 növ əlaqə var: SOL, SAĞ, TAM, DAXİLİ.

SOL və SAĞ ƏLAQƏ

Müəyyən bir şərtə əsaslanan iki cədvəli əlaqələndirmək üçün birləşmələr istifadə olunur. Xüsusiyyət zaman SOL QOŞULUN ilk göstərilən cədvəli bütövlükdə götürüb ikinci cədvəli şərti olaraq bağlayırıq. İkinci cədvəlin şərtlə bağlana bilməyən sahələri dəyərlə doldurulur SIFIR.

1C sorğusunda sola qoşulma nümunəsi:

O, bütün cədvəli qaytaracaq və yalnız “Qarşı tərəflər.Adı = Banklar.Adı” şərtinin yerinə yetirildiyi yerlərdə “Bank” sahəsini dolduracaq. Şərt yerinə yetirilməzsə, Bank sahəsi olaraq təyin ediləcək SIFIR.

1C 8.3 dilində RIGHT JOIN tamamilə oxşar SOL əlaqə, bir fərq istisna olmaqla: in QOŞULMA HÜQUQU"Əsas" cədvəl birinci deyil, ikincidir.

TAM ƏLAQƏ

TAM ƏLAQƏ soldan və sağdan fərqlənir ki, o, iki cədvəldən bütün qeydləri göstərir və yalnız şərtlə birləşdirə bildiyi məlumatları birləşdirir.

Misal üçün:

TAM ƏLAQƏ
Directory.Banks NECƏ Banklar

BY

Sorğu dili yalnız qeydlərə qoşulma şərti yerinə yetirildikdə hər iki cədvəli tamamilə qaytaracaq. Sol/sağ birləşmədən fərqli olaraq, NULL-un iki sahədə görünməsi mümkündür.

DAXİLİ QOŞULUN

DAXİLİ QOŞULUN tamdan onunla fərqlənir ki, o, yalnız verilmiş şərtə uyğun olaraq qoşula bilən qeydləri göstərir.

Misal üçün:

FROM
Müştərilər AS

DAXİLİ QOŞULUN
Directory.Banks NECƏ Banklar

BY
Clients.Name = Banks.Name

Bu sorğu yalnız bankın və qarşı tərəfin eyni ada malik olduğu sətirləri qaytaracaq.

Nəticə

Bu, 1C 8 sorğu dilindən sintaksisin yalnız kiçik bir hissəsidir; gələcəkdə bəzi məqamları daha ətraflı nəzərdən keçirməyə, göstərməyə və daha çox şeyə çalışacağam!

1C 8 sorğu dili 1C proqramçısı üçün əvəzolunmaz vasitədir, o, daha qısa, sadə, başa düşülən kod yazmağa və verilənlərlə işləyərkən daha az sistem resurslarından istifadə etməyə imkan verir; Bu məqalə 1C 8 sorğu dilinə həsr olunmuş bir sıra dərsləri açır. Birinci dərsdə bu dilin əsas operatorunun strukturuna baxacağıq. SEÇİN. Bu operatordan istifadə edərək verilənlər bazası cədvəllərindən seçimlər yarada bilərsiniz. Seçilmiş cədvəl məlumatları çeşidlənə, şərtləri ona yerləşdirə, digər cədvəllərin verilənləri ilə əlaqələndirə və birləşdirə, müxtəlif sahələr üzrə qruplaşdırıla və s.

Sorğu dili 1C müəssisəsi 8 - Operator strukturu SELECT

SELECT operatorunun strukturuna baxaq (operatorun isteğe bağlı hissələri kvadrat mötərizədə göstərilmişdir). 1C sorğu dili məlumat nümunələrinin yaradılması üçün geniş alətlər təqdim edir.

SEÇİN [İCAZƏ VERİLİR] [FƏRQLİ] [İLK A] [Sahə1] [Ləqəb1 AS], [Sahə2] [Əlaad2], ... [FieldM] [Əl AdB] [Müvəqqəti CədvəlAdı QOYUN] [Cədvəl1-DƏN AliasTableTable1 AS [[DAXİLİ QOŞULUN ][SOL QOŞULUN][TAM QOŞULUN] Cədvəl2 Ləqəb Cədvəl 2 [[DAXİLİ QOŞULUN][SOL QOŞULUN][TAM QOŞULUN] CədvəlC Ləqəb Cədvəlləri C İfadə 1 [Və İfadə2]...[Və İfadəD]] .. ... İfadə1 İLƏ [Və İfadə2]...[Və İfadəE]] ... [CədvəlF CədvəlF ləqəbinə görə] ... ] [Qruplaşdırma Sahəsi1 BY [,] ... [QruplaşdırmaSahəsi]] [HARƏDƏ İfadə1 [VƏ] İfadə2] ... [VƏ İfadəH]] [HAMINI BİRLEŞTİRİN...] [; ...] [Ləqəb1 İLƏ İNDEKSİ ... AliasB] [CƏMİ [AggregationFunction(Field1)][,] [AggregationFunction(Field2)][,] ... [AggregationFunction(FieldI)] BY BY [GENERAL][,] [ GroupingField1][,] ... [GroupingFieldj]]

Sahələrlə işləmək üçün açar sözlər və bloklar

  • SEÇİN— operatorun başlanğıcını göstərən açar söz;
  • İCAZƏ VERİLİR seçimə verilən istifadəçi üçün oxumaq imkanı olan cədvəl qeydlərinin daxil edilməli olduğunu göstərir;
  • MÜXTƏLİF göstərir ki, nümunə yalnız müxtəlif (bütün sahələr üzrə) axınları əhatə etməlidir. Başqa sözlə, dublikat sətirlər nümunədən çıxarılacaq;
  • İLK Ə bu açar sözü qeyd etsəniz, o zaman sorğu ilə seçilmiş sətirlərin yalnız birinci A-sı seçimə daxil ediləcək, burada A natural ədəddir;
  • Sahə bloku— bu blok seçimə daxil edilməli olan sahələri göstərir. Bu sahələr seçilmiş sütunlar olacaq. Ən sadə halda sahə belə görünür: Cədvəl Alias.TableFieldName AS Field Alias

    Beləliklə, bu sahəni hansı cədvəldən götürməyimizi göstəririk. 1C sorğu dili sizə hər hansı ləqəbləri təyin etməyə imkan verir, lakin onlar eyni SELECT ifadəsində təkrarlanmamalıdır. Sahə cədvəl sahələrinin, sorğu dili funksiyalarının və ümumi funksiyaların müxtəlif kombinasiyalarından ibarət daha mürəkkəb ola bilər, lakin biz bu dərslikdə həmin halları əhatə etməyəcəyik;

Cədvəllərlə işləmək üçün açar sözlər və bloklar

  • Müvəqqəti CədvəlAdı QOYUN- açar söz YER müəyyən bir adla müvəqqəti cədvəl yaratmaq üçün nəzərdə tutulmuşdur ki, o, bitənə qədər və ya müvəqqəti cədvəl məhv edilənə qədər verilmiş 1C 8 seansında RAM-da saxlanılacaqdır. Qeyd etmək lazımdır ki, bir 1C 8 seansında müvəqqəti cədvəllərin adları təkrarlanmamalıdır;
  • Cədvəllər və əlaqələr bloku— blok bu sorğuda istifadə olunan bütün cədvəlləri, eləcə də onlar arasındakı əlaqələri göstərir. Blok açar sözlə başlayır FROM, ardınca birinci cədvəlin adı və ləqəbi. Əgər bu cədvəl digər cədvəllərə aiddirsə, onda əlaqələr göstərilir. 1C sorğu dili aşağıdakı əlaqə növləri dəstini ehtiva edir:
    • DAXİLİ QOŞULUN— sol cədvəldən olan qeyd yalnız əlaqə şərti yerinə yetirildikdə seçimə daxil ediləcək, sağdakı cədvəldən qeyd yalnız əlaqə şərti təmin edildikdə seçimə daxil ediləcək;
    • SOL ƏLAQƏ— istənilən halda sol cədvəldən olan qeyd seçimə daxil ediləcək, sağdakı cədvəldən qeyd yalnız əlaqə şərti yerinə yetirildikdə seçimə daxil ediləcək;
    • TAM ƏLAQƏ— istənilən halda seçimə əvvəlcə soldakı cədvəldən qeyd daxil ediləcək, sonra yalnız əlaqə şərti yerinə yetirildikdə, istənilən halda ilk növbədə sağdakı cədvəldən qeyd seçimə daxil ediləcək, sonra isə yalnız əlaqə şərti qarşılanır. Bu halda, yaranan dublikat sətirlər nümunədən çıxarılır.

    Bağlantı növündən sonra ikinci cədvəlin adı və ləqəbi göstərilir. Sonra açar söz gəlir BY, sonra məntiqi operatorlar tərəfindən bir-biri ilə əlaqəli rabitə şərtləri VƏ, YA.Şərtdəki hər bir ifadə Boolean dəyərini qaytarmalıdır (True, False). Əgər birinci cədvəl ikincidən başqa bəzi cədvəllərə qoşulubsa, onda əlaqə növü yenidən göstərilir və s. Bağlantıda iştirak edən cədvəllərin hər biri öz növbəsində digər cədvəllərə qoşula bilər, bu sorğu strukturu diaqramında göstərilir. Cədvəl birinciyə aid deyilsə, o zaman əlaqə növü olmadan göstərilir, onda onun əlaqələri izləyə bilər və s;

Açar sözlər və məlumatların çevrilməsi blokları

  • Qruplaşdırma bloku— bu blok cədvəl sətirlərini qruplaşdırmaq üçün istifadə olunur. Açar sözdən sonra göstərilən sahələrin dəyərləri varsa, satırlar birinə birləşdirilir GROUP BY eyni olduğu ortaya çıxır. Bu halda, bütün digər sahələr cəmlənir, orta ölçülür, maksimumlaşdırılır və ya ümumi funksiyalardan istifadə edərək minimuma endirilir. Toplama funksiyaları sahə blokunda istifadə olunur. Nümunə: Maksimum(TableAlias.TableFieldName) AS FieldAlias
  • Vəziyyət bloku- bu blokda açar sözdən sonra HARADA məntiqi operatorlarla ayrılmış şərti ifadələr göstərilir VƏ, YA, seçilmiş cərgələrdən hər hansı birinin nümunəyə daxil edilməsi üçün məcmudakı bütün şərtlərin dəyəri olmalıdır Doğru.
  • HƏR ŞEYİ QARŞI VERİN— bu açar söz sorğuları birləşdirmək üçün istifadə olunur (operatorlar SEÇİN). 1C sorğu dili bir neçə sorğunu birinə birləşdirməyə imkan verir. Sorğuların birləşdirilməsi üçün onların eyni sahələr dəsti olmalıdır;
  • «;» - bir-birindən asılı olmayan ifadələri ayırmaq üçün nöqtəli vergüllərdən istifadə olunur SEÇİN;
  • İNDEKSİ BY— açar söz özündən sonra göstərilən sahələri indeksləşdirmək üçün istifadə olunur;
  • Xülasə bloku— ağaca bənzər nümunələr yaratmaq üçün istifadə olunur. Açar sözdən sonra göstərilən qruplaşdırma sahələrinin hər biri üçün BY, seçimdə ayrıca sıra yaradılacaq. Bu sətirdə ümumi funksiyalardan istifadə edərək açar sözdən sonra göstərilən sahələrin ümumi dəyərləri hesablanacaq. NƏTİCƏLƏR.

1C 8 sorğu dilini öyrənməyə davam etmək istəyirsiniz? Sonra növbəti məqaləni oxuyun.

Sənəd növünə görə seçimi necə təyin etmək olar?
Qeyri-müəyyən dəyərin seçilməsi üçün şərti necə təyin etmək olar?
1C sorğu dilində boş dəyəri necə seçmək olar?
Doldurulmamış sahələr üzrə süzgəcdən keçmək lazım olduqda “HARADA” açar sözündən sonra sorğuda hansı şərt göstərilməlidir?

Kod 1C v 8.x Sorğu. Mətn =
"SEÇİN
| StorageUnits.Link
|FROM
| Directory.usStorageUnits "userStorageUnits" AS

// Nümunə 1: boş boolean dəyəri ilə müqayisə:
|HARADA
| StorageUnits.AllowSelectionFromReserveZone = Yanlış

// Nümunə 2. lakin bu Boolean müəyyən edilibsə, belə daha yaxşıdır: // mənfi Boolean üçün şərt:
|HARADA
| Saxlama Vahidləri Ehtiyat Zonasından Seçməyə İcazə Vermir

// Nümunə 3. “müəyyən bir növün kataloqu” tipinə malik boş sahənin şərti əsasında seçim
|HARADA
| StorageUnits.ActiveSelectionArea = DƏYƏR(Directory.usSelectionArea.EmptyRef)

// Misal 3a. "müəyyən bir növün sənədi" tipinə malik boş sahənin vəziyyətinə əsaslanan seçim
|HARADA
| BizimMəlumatQeydiyyatı.Sənəd = DƏYƏR(Sənəd.Bizim Sənədimiz.BoşLink)

// Misal 3b. “müxtəlif tipli sənədlər” tipinə malik boş sahənin vəziyyətinə əsaslanan seçim (kompozit sahə)
|HARADA
| (BizimMəlumatQeydiyyatı.Sənəd = DƏYƏR(Sənəd.Bizim Sənədimiz1.Boş Link)
| VEYA BizimMəlumatQeydiyyatı.Sənəd = DƏYƏR(Sənəd.OurSənəd2.BoşLink)
| OR...(və s. - biz ardıcıl olaraq bu kompozit sahənin bütün mümkün növləri üçün şərtləri sadalayırıq))

// Nümunə 4. və ya əksinə, "sətir" tipli doldurulmuş dəyəri seçmək lazımdırsa, şərt kömək edəcək:
|HARADA
| Saxlama Vahidi. Adı > """"

// Nümunə 5. Mürəkkəb məlumat növü olan müəyyən bir növ sənədləri seçmək lazımdırsa, məsələn, "RunningTasks" reyestrində, "Tapşırıq" resursunda dəyərləri arasında olan kompozit tip var. "Seçim" sənədi mümkündür
|HARADA
| EXPRESS(Məlumat Registerİcra olunanTasks.Task AS Document.Selection) LINK Sənəd.Seçim

// Misal 5a. Müəyyən bir növ sənədləri seçmək lazım olduqda başqa bir oxşar nümunə
| SEÇİM
| NƏ ZAMAN İFADƏ EDİLMƏLİ (ag Sənədlərin Yazışmaları. SənədBU AS Sənəd. Malların və Xidmətlərin Qəbulu) BAĞLANTI Sənədi
| SONRA ""Malların və xidmətlərin qəbulu""
| NƏ ZAMAN İFADƏ EDİLMƏLİ (ag Sənədlərin Yazışmaları. SənədBU AS Sənəd. Malların və Xidmətlərin Satışı) BAĞLANTI Sənədi Malların və xidmətlərin satışı
| SONRA ""Malların və xidmətlərin satışı""
| ƏSQSƏ """"
| Sənəd Görünüşü KİMİ SON EDİN

// Nümunə 6. Müəyyən edilməmiş qiymət şərti ilə seçim:
|HARADA
| SavedSettings.User = QEYD

// Nümunə 7. Yığım registrinin "Giriş", "Xərc" hərəkət növü üzrə seçim - oxşar şəkildə):
|HARADA
| RegProductsInRetail.MovementType = DƏYƏR(Hərəkət TipiYığım.Gələn)

// Nümunə 8. Sorğunun yerinə yetirilməsinə ehtiyac olmadığını sorğuda necə göstərmək olar (məsələn, bəzi hallardan asılı olaraq bu, proqram baxımından lazımdır.
// boş sorğu nəticəsini qaytarmaq üçün şərtlər -
// Query.Text = StrReplace(Query.Text, "WHERE Doc.Link = &DocumentLink", "WHERE IS FALSE");).
// Bunun üçün sadəcə olaraq “Yalan haradadır” şərtini əlavə etmək kifayətdir.
// Yeri gəlmişkən, nümunədə tələb olunan məlumatların həcmindən asılı olmayaraq, belə bir sorğu dərhal yerinə yetiriləcəkdir.
|YALAN HARADA

// Nümunə 9. Sorğu nəticəsində verilənlərin olub-olmadığını yoxlamaq:
Əgər DEYİL Query.Execute().Empty() Sonra

// Nümunə 10. boş tarixə əsaslanan seçim:
|HARADA
| tbStrings.CancellationDate = DATETIME(1, 1, 1)