1C sorğusunda sənəd kimi ifadə etmək 8.3. Mürəkkəb tipin tək tipə çevrilməsi

Bir çox insanlar 1C 8 sorğu dilində EXPRESS funksiyasını tip çeviricisi kimi şərh edirlər, lakin o, ümumiyyətlə bu məqsədlər üçün nəzərdə tutulmayıb. Təfərrüatlar kəsim altında...

Beləliklə, bir çox insanlar səhvən bir sahəni tiplə çevirə biləcəklərinə inanırlar Xətt növü ilə sahədə Nömrə və ya xətt üzrə keçid. Əslində, EXPRESS operatoru aşağıdakıları çevirə bilər:

  • primitiv tip parametrləri;
  • mürəkkəb tipli sahəni tək tipli sahəyə;

Bu hallara daha ətraflı baxaq...

Primitiv Tip Parametrlərinin çevrilməsi

Məlumatları qeyri-məhdud tipli bir sətirlə qruplaşdırmaq istədiyimiz bir vəziyyəti nəzərdən keçirək, məsələn, belə bir sətir tez-tez sənədlərdə bir şərhdir. Bu halda şərhə görə qruplaşdıra bilməyəcəyik; xəta alacağıq. Buna görə də, biz qeyri-məhdud uzunluqlu bir sətri məhdud uzunluqlu sətirə çevirməli və sonra qruplaşdırmalıyıq. Məsələn, eyni şərhləri olan sənədlərin sayını hesablayaq:

SEÇİN
EXPRESS(Qəbul.Şərh KİMİ SƏTİR(300)) Şərh AS,
KƏMİYYƏT(Gələn.Link) Link AS
FROM
Sənədi.Giriş zali AS Giriş zalı

GROUP BY
EXPRESS(Qəbul.ŞƏRH SIRA (300))

Başqa bir vəziyyət, sorğuda hesablamalardan istifadə edildikdə, çıxışda çox sayda onluq yerləri olan bir nömrə əldə edə bilərik (1100.001568794). Sorğu tamamlandıqdan sonra bu nömrəni emal etməmək üçün onu dərhal lazımi uzunluğa kəsə bilərsiniz, lakin nömrənin kəsildiyini və yuvarlaqlaşdırılmadığını başa düşmək vacibdir. Misal:

SEÇİN
Satış.Məhsul,
EXPRESS(Satış.Miqdar * Satış.Qiymət NÖMRƏ(15, 2)) Məbləğ KİMİ
FROM

Mürəkkəb tipin tək tipə çevrilməsi

Qeydiyyat registrləri çox vaxt mürəkkəb tipə malikdir; onu tək tipə çevirmək üçün konstruksiyadan istifadə edin EXPRESS Bununla belə, seçmə mərhələsində icra sənədini qəbz sənədinə çevirməyə cəhd etsəniz, sorğu mütləq səhvlə uğursuz olacaq, buna görə də konvertasiya etməzdən əvvəl linkin növünü yoxlamaq lazımdır. Bu belə cəfəngiyyatdır))) Bütün bunlar niyə lazımdır, soruşursan. Cavab verirəm ki, bu, yazının qısalığı hesabına gizli sorğuların optimallaşdırılması məqamlarından biridir. Bu nöqtənin tətbiqinə bir nümunə ilə baxaq.

Deyək ki, siz RN Sales-dən hər bir qeydiyyatçının nömrəsini almağa getmisiniz. sorğu yazın:

MÜXTƏLİF SEÇİN
Satış.Registrator.Nömrə
FROM
Qeydiyyatdan Akkumulyasiyalar.Satış NECƏ Satış

Əslində, heç bir şey daha sadə ola bilməz. Lakin 1C, icra mərhələsində, bu sorğunu heç bir əlaqə olmadan, mümkün qeydiyyatçılarımız olduğu qədər çox sol əlaqələri olan sorğuya çevirir. Bunlar. bu registrə 20 sənəd yazılsa, biz 20 sol birləşmə ilə SQL sorğusu alacağıq. Bu niyə baş verir? Quraşdırılmış 1C optimallaşdırıcısı nöqtə vasitəsilə alınan sahələri çox yaxşı emal etmədiyindən, bu halda o, Nömrə atributudur. Bunlar tortlardır, əgər biz tez-tez sənəd nömrəsini almaq istəyiriksə, onu reyestr məlumatlarına daxil etmək və ya EXPRESS operatorundan istifadə etmək daha məqsədəuyğundur, lakin qısalıq hesabına:

MÜXTƏLİF SEÇİN
Satış.Registrator.Nömrə,
SEÇİM
ZAMAN Satış.Registrator LINK Sənədi.İstehlak
SONRA EXPRESS(Sənəd KİMİ Satış.Registrator.İstehlak)
BAŞQA SEÇİM
ZAMAN Sales.Registrator LINK Document.Implementation
SONRA İFADƏ EDİN(Satış.Registrator Sənəd KİMİ.Tətbiq)
SON
...
Nömrə KİMİ SON
FROM
Qeydiyyatdan Akkumulyasiyalar.Satış NECƏ Satış

İndi sol birləşmə bir xüsusi cədvəli əhatə edəcək.

Ümumiyyətlə, nöqtə vasitəsilə məlumatlara diqqətlə müraciət etməlisiniz, çünki 1C bu vəziyyətdə SQL sorğusunda performansa əhəmiyyətli dərəcədə təsir göstərə bilən sol birləşmədən istifadə edir. Bu optimallaşdırma nöqtələrindən biridir.

Uyğun olmayan növlər "EXPRESS"- bu mesaj 1C 8.2 və ya 8.3 proqramçısı iki fərqli növü müqayisə etməyə çalışdıqda görünür.

Express() funksiyası 1C sorğu sahəsinin dəyərini müəyyən bir növə çevirməyə imkan verir. Bu iki halda lazım ola bilər:

1. Tələb olunan say tutumunu və ya sətir dəyərinin lazımi sayda simvolunu əldə edin. Limitsiz tipli sahələrdə simvolların sayı müəyyən xüsusiyyətlərə görə məhdudlaşdırılmalıdır.

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

Misal üçün:

EXPRESS(Nomenklatura. STRING KİMİ Şərh(300))
EXPRESS(Nomenklatura.Qiymət NÖMRƏ(15, 2)) Məbləğ KİMİ

2. Mürəkkəb tipli sahəni tək tipli sahəyə çevirin. Bu məqsədlər üçün lazım ola bilər. Yazılan sahədə başqa bir növ dəyər varsa, sistem NULL dəyərini qaytaracaq, ona görə də həmişə "HARADA" bölməsində LINK operatoru ilə məhdudlaşdırmaqla əlavə şərt qoymaq lazımdır.

Misal üçün:

SEÇİN

EXPRESS(Satış.Registrator KİMİ Sənəd.İcra)

FROM

HARADA Satış.Qeydiyyatçı LINK Sənədi.İmplementation

Səhvlərdən necə qaçınmaq olar

Sintaksis səhv istifadə edildikdə "Uyğun olmayan növlər EXPRESS..." kimi xətalar baş verə bilər.

Məsələn, “EXPRESS(“123″ AS NUMBER(5, 2)) AS SUM” konstruksiyası səhv hesab olunur, çünki sorğu standart metodlardan istifadə etməklə bir növdən digərinə çevrilə bilməz.

Əgər siz 1C proqramlaşdırmasını öyrənməyə başlayırsınızsa, biz pulsuz kursumuzu tövsiyə edirik (unutmayın

Diqqət! Bu dərsin giriş versiyasıdır, materialları natamam ola bilər.

Sayta tələbə kimi daxil olun

Məktəb materiallarına daxil olmaq üçün tələbə kimi daxil olun

Başlayan proqramçılar üçün sorğu dili 1C 8.3: növlərlə işləmək üçün funksiyalar və operatorlar (VALUE TYPE, TYPE, REFERENCE, ISNULL, EXPRESS)

Nəzərə alaq ki, kataloqun, sənədin və ya hər hansı digər tətbiq obyektinin hər bir atributunun (xüsusiyyətinin, sahəsinin) öz növü var. Və bu tipə konfiquratorda baxa bilərik:

Sorğu dilində detal növləri ilə işləmək üçün bütün funksiyalar və operatorlar sinfi mövcuddur. Gəlin onlara baxaq.

VALUE TYPE funksiyası

Bu funksiya bir parametr (dəyər) götürür və onun növünü qaytarır. Şəkildə təsvir olunan rekvizitlər üçün (yuxarıda) Dadmaq kataloq Qida aşağıdakılar geri qaytarılacaq:

İndi rekvizitlərə baxaq Fərqli xüsusiyyət kataloqda Şəhərlər:

Siz görürsünüz ki, bu dayaq bir neçə növdən biri ola bilər: Xətt, Directory.Zövqlər, Directory.Rənglər. Bu tip detallara KOMPOZİT deyilir.

1C:Müəssisə rejimində belə bir detalın dəyərini doldurmağa çalışsaq, sistem bizdən hansı növ dəyərin daxil ediləcəyini soruşacaq:

Və yalnız seçimimizdən sonra seçilmiş növün dəyərini daxil etməyə imkan verəcəkdir.

Beləliklə, eyni tipli kataloq elementləri ( Directory.Cities) eyni atributda saxlaya biləcək ( Fərqli xüsusiyyət) müxtəlif növlərin dəyərləri (String, Rənglər və ya Tatlar).

Kataloqun elementlərinə klikləməklə bunu özünüz görə bilərsiniz Şəhərlər 1C: Müəssisə rejimində. Siz dərsin sınaq versiyasını oxuyursunuz, tam dərslər mövcuddur.

Burada fərqləndirici xüsusiyyət dəyəri kataloq elementidir Tatlar:

Budur xətt:

Və burada ümumiyyətlə istinad kitabının bir elementi var Rənglər:

Bunlar kompozit məlumat növünün bizim üçün açdığı imkanlardır!

Maraqlıdır, funksiya necə davranacaq TİP DƏYƏRLƏR rekvizitlər üzərində Fərqli Element, kompozit məlumat növünə malik olan:

Bu artıq çox maraqlıdır. Gəlin hər bir sətirə ayrıca baxaq.

Rusiya elementi üçün fərqli xüsusiyyətin dəyərinin növü bərabərdir SIFIR. Bu tiplə ilk dəfədir qarşılaşırıq. Bu tip dəyərlər verilənlər bazası ilə işləyərkən yalnız itkin dəyəri müəyyən etmək üçün istifadə olunur.

Bu doğrudur, çünki Rusiya elementi adi kataloq elementi deyil, qrupdur Şəhərlər, buna görə də onun sahəsi yoxdur Fərqli xüsusiyyət. Və itkin dəyərin növü, yuxarıda oxuduğumuz kimi, həmişə bərabərdir SIFIR.

Perm üçün fərqli xüsusiyyətin dəyərinin növü bərabərdir Tatlar. Bu doğrudur, çünki Perm şəhəri üçün verilənlər bazasına daxil edilmiş fərqləndirici xüsusiyyətin dəyəri kataloq elementinə keçiddir. Tatlar.

Krasnoyarsk üçün atribut növü bərabərdir Rənglər, çünki verilənlər bazasında seçilmiş dəyər kataloq elementinə keçiddir Rənglər.

Voronej üçün atribut növü bərabərdir Xətt, çünki verilənlər bazasına daxil edilən dəyər adi sətirdir.

Hindistan yenə bir qrupdur, ona görə də heç bir əhəmiyyəti yoxdur. Və itkin dəyərin növü, xatırladığımız kimi, bərabərdir SIFIR.

İş budur. Əgər kataloq elementinə keçsəniz Şəhərlər adı ilə Sao Paulo, o zaman sahənin olduğunu görəcəksiniz Fərqli xüsusiyyətümumiyyətlə doldurulmayıb. Boşdur. A kompozit tipli bütün boş sahələrin xüsusi mənası var QEYD .

İLƏ QEYRİYYƏTLİ biz də ilk dəfədir qarşılaşırıq. Məna QEYRİYYƏTLİ başqa tipə aid olmayan boş qiymətdən istifadə etmək lazım gəldikdə istifadə olunur. Bu, bizim vəziyyətimizdir. Və dəyər növü QEYRİYYƏTLİ, yəqin ki, artıq təxmin etdiyiniz kimi, bərabərdir SIFIR.

Funksiya TYPE

Yalnız bir parametr götürür - primitiv növün adı ( XƏT, NUMBER, TARİX, BULEAN) və ya link növünü almaq istədiyiniz cədvəlin adı.

Bu konstruksiyanın nəticəsi müəyyən edilmiş tip üçün Type tipli qiymət olacaqdır.

Qeyri-müəyyən səslənir, elə deyilmi?

Bu dizaynın tətbiqinə baxaq və hər şey dərhal yerinə düşəcək.

Tutaq ki, bütün kataloq qeydlərini seçməliyik Şəhərlər, kompozit rekvizitləri olan Fərqli xüsusiyyət tip dəyərinə malikdir XƏT:

İndi atribut dəyərləri olan bütün qeydləri seçək Fərqli xüsusiyyət kataloq elementlərinə keçidlərdir Rənglər(cədvəl Directory.Rənglər):

Geri çəkilmək

Yadınızdadırsa, kataloqun bəzi elementləri Şəhərlər rekvizitləri yoxdur Fərqli xüsusiyyət. Funksiya TİP DƏYƏRLƏR belə elementlər üçün istehsal edir SIFIR.

Sorğuda belə elementləri necə seçmək olar? Bunun üçün xüsusi məntiqi operator nəzərdə tutulub NULL IS(funksiya ilə qarışdırılmamalıdır ISNULL, aşağıda baxacağıq). Siz dərsin sınaq versiyasını oxuyursunuz, tam dərslər mövcuddur.

Onun istifadəsinə bir nümunə:

Əla. Amma Sao Paulo, rekvizit dəyər növü heç bir element olduğunu fərq etdiniz Fərqli xüsusiyyət ki, o da verdi SIFIR. Niyə belə oldu?

Ancaq iş ondadır ki, təfərrüatları dolduran qruplar üçün vəziyyət (Rusiya, Hindistan, Braziliya). Fərqli xüsusiyyət prinsipcə qeyri-mümkündür, çünki onlarda ümumiyyətlə yoxdur, rekvizitləri doldurmaq mümkün olan Sao Paulo elementi üçün vəziyyətdən fərqlənir, lakin bu, sadəcə olaraq doldurulmur və xatırladığımız kimi, bir elementə bərabərdir. xüsusi dəyər QEYRİYYƏTLİ.

Tələb olunan bütün qeydləri seçmək üçün Fərqli xüsusiyyət mövcud, lakin doldurulmamış fərqli bir konstruksiya istifadə edilməlidir:

Lakin boş (doldurulmamış) atributları müəyyən etmək üçün UNDEFINED ilə müqayisə yalnız kompozit növlər üçün işləyəcək.

Yeri gəlmişkən, IS NULL məntiqi operatorunun belə görünən inkar forması var:

Məntiqi operator LINK

Məsələn, kataloqdan seçək Şəhərlər yalnız kompozit atributun dəyərinə malik olan qeydlər Fərqli xüsusiyyət kataloq elementinə keçiddir Tatlar:

Xatırladığınız kimi, eyni problemi istifadə edərək həll edə bilərik TİP DƏYƏRLƏRTİP:

ISNULL funksiyası

Funksiya dəyəri əvəz etmək üçün nəzərdə tutulmuşdur SIFIR başqa mənaya.

Mənasını xatırlayırıq SIFIR tələb olunan atribut (sahə, xüsusiyyət) mövcud olmadıqda qaytarılır.

Məsələn, rekvizitlər Fərqli xüsusiyyət kataloq qrupları üçün Şəhərlər:

Funksiya ISNULL bu dəyər bərabər olarsa, bizə fərqli dəyər çıxarmağa kömək edəcək SIFIR. Siz dərsin sınaq versiyasını oxuyursunuz, tam dərslər mövcuddur. Bu vəziyyətdə "Belə bir dayaq yoxdur!" sətri olsun:

Belə çıxır ki, əgər funksiyanın birinci parametri ISNULL bərabər deyil SIFIR, sonra qayıdır. Əgər NULL olarsa, ikinci parametr qaytarılır.

EXPRESS funksiyası

Bu funksiya yalnız kompozit tipli sahələr üçündür. Belə bir sahənin əla nümunəsi əmlakdır Fərqli xüsusiyyət kataloq elementləri üçün Şəhərlər.

Xatırladığımız kimi, kompozit sahələr konfiquratorda göstərilən bir neçə növdən biri ola bilər.

Sahə üçün Fərqli xüsusiyyət belə etibarlı növlərdir XƏT, Directory.RənglərDirectory.Zövqlər.

Bəzən kompozit sahənin dəyərlərini müəyyən bir növə köçürmək lazım olur.

Bütün sahə dəyərlərini sadalayaq Fərqli xüsusiyyət yazmaq İstinad.Rənglər:

Nəticədə, tipli olan bütün element dəyərləri Directory.Rənglər, dolu qaldı və göstərilən növə çevrildi. Digər növlərin bütün dəyərləri ( XƏT, Directory.Zövqlər) indi bərabərdir SIFIR. Bu funksiyadan istifadə edərək tipli tökmənin özəlliyidir EXPRESS.

Siz bir növü ya primitiv tipə ( BULEAN, NUMBER, XƏT, TARİX) və ya istinad növünə. Siz dərsin sınaq versiyasını oxuyursunuz, tam dərslər mövcuddur. Amma çəkilişin aparıldığı növ bu kompozit sahə üçün növlər siyahısına daxil edilməlidir, əks halda sistem xəta atacaq.

Testdən keçin

Testə başlayın

1. Ən düzgün ifadəni seçin

2. Bir neçə növdən birinin qiymətini ala bilən təfərrüatlar deyilir

3. Atribut dəyərinin növünü müəyyən etmək üçün funksiyadan istifadə edin

4. Kompozit tipli boş detallar vacibdir

Bu yazıda biz "Express" funksiyası tərəfindən təmin edilən 1C sorğu dilində növün dəyişdirilməsi imkanlarını təhlil edəcəyik.
Bu funksiyadan istifadə etmək üçün bir neçə varianta baxaq.
Və ilk seçim rəqəmlərin yuvarlaqlaşdırılmasıdır.

Bunun üçün aşağıdakı formatda Express funksiyasından istifadə etməlisiniz:

Ekspres(<Число>Nömrə kimi(<ДлинаЧисла>,<Точность>))

Harada:
Nömrə— yuvarlaqlaşdırılmalı olan sahə
UzunluqNömrələri- maksimum nömrə uzunluğu
Dəqiqlik— ədədin yuvarlaqlaşdırılması dəqiqliyi

Həm uzunluq, həm də dəqiqlik parametrləri müsbət tam ədədlər olmalıdır.
Aşağıdakı şəkildə bu funksiyanın necə işlədiyinə baxın.

İkinci istifadə halı simli tökmədir. Çox vaxt konfiqurasiyalar müəyyən məhdudiyyətlər qoyan qeyri-məhdud uzunluqlu sətirlərdən istifadə edir. Məsələn, biz qeyri-məhdud uzunluqdakı sətirləri müqayisə edə bilmərik.
Aşağıdakı sorğuda TamAd sahəsi qeyri-məhdud uzunluqlu sətir tiplidir və bu sorğu işləməyəcək.

Onun işləməsi üçün qeyri-məhdud uzunluqlu sahəni müəyyən uzunluqlu sətirə çevirmək lazımdır, bu, aşağıdakı formatda Express funksiyasından istifadə etməklə həyata keçirilir:

Ekspres(<Строка>string kimi(<ДлинаСтроки>)

Harada
Xətt Uzunluğu– sətrin qısaldılacağı maksimum uzunluq.
Sorğunu yenidən işləyək: şərti olaraq biz limitsiz sətri müəyyən uzunluqlu sətirə çevirəcəyik. Sonra heç bir səhv olmayacaq.

Onun tətbiqi üçün sonuncu və deyərdim ki, ən vacib variantı nəzərdən keçirək: kompozit tipli sahələrlə işləyərkən.
Aşağıda kompozit sahələrdən istifadə edən iki sorğu var. Birincisi səhv, ikincisi isə düzgündür.

Bunlar. Mürəkkəb tipli bir sahə əldə etmək lazım olduqda, həmişə bu sahənin dəyərini yalnız Express funksiyasından istifadə edərək növü yayımladıqdan sonra əldə edin. Bu halda sənədlər və arayış kitabları aşağıdakı formatda olacaq:

Ekspres(<Документ>Sənəd kimi.<ИмяТаблицы>)
Ekspres(<Справочник>bir kataloq kimi.< ИмяТаблицы >)
.

Harada
Cədvəl Adı— obyektin adı.

Kompozit növlərlə işləyərkən həmişə ekspress funksiyasından istifadə edin, o, sorğunu çox optimallaşdırır.

Əgər siz hələ də sorğu dilinin konstruksiyalarında “üzərsinizsə” və hətta ən sadə sorğular belə sizin üçün çətinlik yaradırsa, onda sizə “1C-də başlanğıcdan peşəkara qədər sorğular” kursumu tövsiyə edirəm. Bu və bir çox digər məsələlərin daha ətraflı müzakirə edildiyi yer.

Bu kursun özəlliyi nədir:
Kurs 1C-də sorğu dili ilə tanış olmayanlar üçün nəzərdə tutulmuşdur;
Tədris materialı yaxşı tərtib edilmişdir və öyrənmək asandır;
Bir neçə onlarla dərs;
Faydalı praktik nümunələr;
Bütün dərslər aydın və sadə dildə təqdim olunur

Oxucularım üçün 25% endirim kuponu: hrW0rl9Nnx

Mən mümkün qədər tez-tez müxtəlif maraqlı pulsuz məqalələr və video dərslər buraxmağa çalışıram. Ona görə də hər hansı məbləği köçürməklə layihəmi dəstəkləsəniz çox şad olaram:

İstənilən məbləği birbaşa köçürə bilərsiniz:
Yandex.Money - 410012882996301
Web Money - R955262494655

Qruplarıma qoşulun.