Hiyerarşik dizinlerle çalışmaya yönelik sorgu örnekleri. İstek 1 satırındaki 1c grup isteğinde "hiyerarşide" operatör

  • 04.02.2024

1C dizinleri, statik referans bilgilerini depolamaya yarayan özel bir meta veri ağacı nesnesidir. Örneğin, tipik yapılandırmalarda şu görünümleri görebilirsiniz: , İsimlendirme, Çalışanlar, Duran Varlıklar vb. Dizinlerdeki bilgiler kural olarak sık sık değişmez. Dizinler daha sonra hemen hemen tüm muhasebe nesnelerinde bir muhasebe bölümü veya referans bilgisi olarak kullanılır.

Aşağıda örnek olarak “Nomenklatür” dizinini kullanarak yapılandırıcıdan bir dizin oluşturmaya ve tasarlamaya bakacağız.

Temel Sekme

“Temel” sekmesi amacın adını, eşanlamlısını, nesne temsilini ve açıklamasını belirtir.

“Dizin Hiyerarşisi” sekmesi

Burada dizinin hiyerarşisi oluşturulur.

1C 8.3'teki hiyerarşi iki türdendir - “ gruplar ve unsurlar" Ve " elementler". İlk durumda, yalnızca bir klasörün (grup) üst (klasör) olabilmesi ve ikinci durumda bir öğenin de üst öğe olabilmesi açısından farklılık gösterir.

“Grupları en üste yerleştir” - bayrak, grupların liste biçiminde görüntülenmesinden sorumludur.

Ayrıca ayarlarda, uygun ayarı kullanarak dizin hiyerarşisindeki grup sayısını sınırlayabilirsiniz.

Sahipler Sekmesi

Bir dizin başka bir dizine bağlı olabilir. 1C 8.3'ün yapılandırılması açısından bu, alt öğe için "Sahip" niteliğinin zorunlu hale geldiği anlamına gelir. Standart konfigürasyonlardaki “İsimlendirme - Ölçü Birimleri”, “Karşı Taraflar - Yüklenicilerin Sözleşmeleri” dizinleri arasındaki böyle bir bağlantının bir örneği.

Dizin sahibi ayrıca şu meta veri nesneleri de olabilir: , .

Veri Sekmesi

1C'de 267 video dersini ücretsiz alın:

Bir programcının bakış açısından en önemli sekme. Dizin ayrıntılarını içerir.

Dizin, 1C 8.2 programcısı tarafından düzenlenmeyen bir dizi standart ayrıntıya sahiptir; bunların bir listesi "Standart Ayrıntılar" düğmesine tıklanarak görülebilir:

Her biri üzerinde daha ayrıntılı olarak duracağım:

  • Bu grup— Boolean tipinde bir nitelik olup, bunun bir grup mu yoksa bir öğe mi olduğunu gösterir. Yalnızca hiyerarşik dizinde kullanılabilir. Not, bu özelliğin değeri 1C: Kurumsal modda değiştirilemez.
  • Kod— props, type number veya string (genellikle bir string). Sistem tarafından otomatik olarak atanan bir numara. Tipik olarak (önceki kod + 1) şeklinde hesaplanır. Sayısal değerleri sıralamak beklendiği gibi çalışmadığından string tipini kullanmanızı öneririm. Bir listede ve giriş alanlarında dizin sunumu olarak kullanılabilir. Genellikle bir dize girerken bir öğeyi aramak için kullanılır. Kod alanını kaldırmanız gerekiyorsa satır uzunluğuna sıfır girin.
  • İsim— zorunlu ayrıntılar, dize türü. Maksimum satır uzunluğu 150 karakterdir. Bir listede ve giriş alanlarında dizin sunumu olarak kullanılabilir. Genellikle bir dize girerken bir öğeyi aramak için kullanılır. Ad alanını kaldırmanız gerekiyorsa satır uzunluğuna sıfır girin.
  • Ebeveyn— DirectoryLink türünün bir özelliği.<ИмяТекущегоСправочника>. Yalnızca hiyerarşik dizinde kullanılabilir. Hiyerarşideki üstün ebeveyne işaret eder. Öğe veya Grup dizinin kökündeyse Dizin değeri belirtilir.<ИмяТекущегоСправочника>.Boş Bağlantı.
  • Mal sahibi— geçerli dizin öğesinin (grup) sahip öğesine bağlantı. Mevcut yalnızca alt 1C dizininde.
  • Bayrak Silme— Boolean tipindeki aksesuarlar. Sistemde “silme işaretinin” görüntülenmesinden sorumludur. Silinmek üzere işaretlenen öğenin kullanılamaz olduğu kabul edilir, ancak eski belge hareketleri üzerinde kalabilir.
  • Bağlantı— dize türünün alanı. Bu öznitelik benzersiz bir nesne tanımlayıcısını (GUID) saklar. Sistemde “link” adı verilen görsel bir gösterimde gördüğümüz, yalnızca nesnenin temsilidir. Değiştirilemez.
  • Önceden tanımlanmış— boolean türü, öğenin önceden tanımlı olup olmadığını görüntüler, buna daha sonra değineceğiz. Değiştirilemez.

“Veri” sekmesi aynı zamanda dizinin sistemdeki gösterimini de gösterir; 8.2.16 sürümünden önce gösterim yalnızca Kod veya Ad olabilirdi. Platformun son sürümlerinde (8.3'ten başlayarak), görünüm, "ViewReceivingProcessing" işleyicisi kullanılarak yönetici modülünde bağımsız olarak tanımlanabilir.

Numaralandırma sekmesi

Burada rehberin numaralandırmaya ilişkin ayarlarını belirleyebilirsiniz. Otomatik numaralandırmanın kullanılması önerilir. Benzersizlik kontrolü, gerekirse kodu benzersiz hale getirmeye yardımcı olan bir işarettir. Bayrak ayarlıyken benzersiz olmayan bir koda sahip bir dizin öğesi yazmaya çalışırsanız, 1C'de "Dizin kodu benzersiz olmadı" mesajını alırsınız.

Kod serisi - dizinin nasıl numaralandırılacağını belirler; dizinin numaralandırmasını sahibine göre girebilirsiniz. Örneğin, "Boynuzlar ve Toynakların" karşı tarafının kendi sözleşme numaralandırması olacaktır - "1, 2, 3" vb.

Formlar Sekmesi

Dizinin formları burada açıklanmaktadır. Yapılandırma hem normal hem de yönetilen modlarda başlatılırsa, varsayılan olarak iki formlu sekme olacaktır: "ana" ve "gelişmiş" - normal ve yönetilen uygulamalar için farklıdır.

Bu sayfa dizinin önemli bir özelliğine sahiptir - ““. Bu, 1C 8'in çok kullanışlı bir işlevidir; giriş alanındaki verileri doldururken dizine gitmemenizi, adını, kodunu vb. yazmanızı sağlar. ve açılır listeden istediğiniz öğeyi seçin. Şuna benziyor:

Diğer Sekmesi

Sekmede dizinin ana modüllerine (nesne modülü ve yönetici modülü) hızlı erişim sağlayabilirsiniz.

Ayrıca sayfada önceden tanımlanmış dizin öğelerinin bir listesini de tanımlayabilirsiniz. Bunlar Kurumsal Modda silinemeyen öğelerdir. Önceden tanımlanmış öğelere doğrudan yapılandırıcıdan adlarına göre erişilebilir, örneğin: Directoryies.Nomenclature.Service.

Bu sekme aynı zamanda engelleme modunu da belirler (otomatik veya kontrollü). 1C: Enterprise modunda tam metin aramasının yanı sıra dizinle ilgili referans bilgilerinin kullanılması.

Bu bölümde hiyerarşik dizinlerle çalışırken karşılaşılan tipik sorunların çözümüne ilişkin örnekler gösterilmektedir.

Belirli bir gruba bağlı olan hiyerarşik bir dizinin öğelerini elde etme

Hiyerarşik bir dizinin alt öğelerini elde etmek için sorgu dili IN HIERARCHY yapısını sağlar. HİYERARŞİDE kullanım örneği:


SEÇMEK
Adlandırma.Kod,
İsimlendirme.Satın Alma Fiyatı
İTİBAREN

Bu örnekte &Grup grubunda yer alan Nomenklatür dizininin kendisi, alt grupları ve alt gruplara ait öğeler dahil tüm kayıtları elde edilecektir.

Yalnızca doğrudan belirli bir grupta bulunan öğeler ve gruplarla ilgileniyorsak, bu tür öğeleri Parent alanında bir koşul belirleyerek elde edebiliriz. Örnek:


SEÇMEK
Adlandırma.Kod,
İsimlendirme İsim AS İsim,
İsimlendirme.Satın Alma Fiyatı
İTİBAREN
Dizin.Adlandırma AS Adlandırma

NEREDE
Nomenclature.Parent = &Grup

Bu sorgu, &Grup bağlantısına sahip gruba bağlı grupları ve öğeleri seçecektir.

Bir dizin öğesinin alt öğelerinin varlığının kontrol edilmesi

Bir dizin öğesinin alt kayıtlarının varlığını kontrol etmek için sunulan sorguya benzer bir sorgu kullanabilirsiniz:

Bu örnekte, alt öğelerini kontrol etmek istediğiniz öğenin referansı Ana sorgu parametresine yazılmıştır. Böyle bir sorguyu yürüttükten sonra, sonucun boşluk olup olmadığını kontrol etmeniz gerekir. Sonuç boş değilse alt kayıtlar vardır. Aksi takdirde - hayır. Örnek:


If request.Execute().Empty() Sonra
Rapor("Giriş yok");
Aksi takdirde
Rapor("Kayıt mevcut");
endIf;

Bir öğenin tüm ebeveynlerini alma

Sorgu dili, bir öğenin tüm ebeveynlerini almak için herhangi bir özel araç sağlamaz. Görevi tamamlamak için hiyerarşik toplamları kullanabilirsiniz ancak hiyerarşik toplamların elde edilmesi, çok sayıda kayıt için toplamların oluşturulması için optimize edilmiştir ve tek bir öğenin üst öğelerinin elde edilmesinde tamamen etkili değildir. Bir öğenin tüm üst kayıtlarını daha verimli bir şekilde almak için, üst öğeleri arasında küçük porsiyonlar halinde döngü yapılması önerilir. Örnek:


CurrentItemItem = ÖğeÖğesi;

Sorgu = Yeni Sorgu("SELECT
| Adlandırma.Ebeveyn,
| Adlandırma.Ebeveyn.Ebeveyn,
| Adlandırma.Ebeveyn.Ebeveyn.Ebeveyn,
| Adlandırma.Ebeveyn.Ebeveyn.Ebeveyn.Ebeveyn,
| Adlandırma.Ebeveyn.Ebeveyn.Ebeveyn.Ebeveyn.Ebeveyn
|DAN
| Dizin.Adlandırma AS Adlandırma
|NEREDE
| Nomenclature.Link = &CurrentNomenclatureElement";

Hakikat Döngüsü devam ederken
request.SetParameter("CurrentItemItem", CurrentItemItem);
Sonuç = Query.Run();
Eğer Result.Empty() ise
İptal;
endIf;
Seçim = Sonuç.Select();
Selection.Next();
ColumnNumber için = 0 Result.Columns.Quantity()'ye göre - 1 Döngü
CurrentItemItem = Seçim[SütunNumarası];
İptal;
Aksi takdirde
Rapor(CurrentItemItem);
endIf;
EndCycle;

CurrentItemItem = Directoryes.Nomenclature.EmptyLink() ise O zaman
İptal;
endIf;
EndCycle;

Bu örnekte, ElementNomenclature değişkeninde kaydedilen bağlantının tüm üst öğeleri hizmet mesajı penceresinde görüntülenir. Döngüde 5 bağlantı ebeveyni seçilir.

Dizindeki seviye sayısı sınırlı ve azsa, döngü olmadan tek bir istekle tüm ebeveynleri elde etmek mümkündür.

Bir raporda hiyerarşik bir dizini görüntüleme

Hiyerarşiyi korurken bir raporda hiyerarşik bir dizini görüntülemek için aşağıdakine benzer bir sorgu kullanmanız gerekir:


SEÇMEK
Adlandırma.Kod,
İsimlendirme İsim AS İsim,
İsimlendirme.Satın Alma Fiyatı
İTİBAREN
Dizin.Adlandırma AS Adlandırma
GÖRE SIRALA
İsim HİYERARŞİ

Bu sorgu dizindeki tüm kayıtları seçer ve bunları hiyerarşiye göre düzenler. Sonuç, hiyerarşi dikkate alınarak ada göre sıralanacaktır.

Dizin gruplarının elemanların üzerine yerleştirilebilmesi için bu istekteki ORDER BY deyiminin aşağıdaki ile değiştirilmesi gerekmektedir:


GÖRE SIRALA
Adlandırma.Bu Grup HİYERARŞİSİDİR,
İsim

Sonuç hâlâ hiyerarşik olarak sıralanacak ancak gruplar öğelerin üzerinde görünecek.

ORDER BY teklifini AUTO ORDER seçeneğiyle değiştirmek de mümkündür. Bu durumda sonuç dizinin ayarlarına göre sıralanacaktır; dizin, grupların öğelerin üzerinde yer alması gerektiğini belirtiyorsa, o zaman onlar yukarıda yer alacaktır.

Ayrıca sonuçları kullanarak dizinin hiyerarşik yapısını elde etmek de mümkündür.


SEÇMEK
Adlandırma.Kod,
İsimlendirme İsim AS İsim,
İsimlendirme.Satın Alma Fiyatı

FROM Dizin.Adlandırma AS Adlandırma

NEREDE
(Adlandırma.BuGrup = YANLIŞ)

İsme Göre SİPARİŞ

Toplamları hiyerarşiye göre alma

Bir sorguda toplamları hiyerarşiye göre elde etmek için, toplamların hesaplanacağı alanı belirledikten sonra YAZILIM TOPLAM deyiminde HİYERARŞİ anahtar kelimesini belirtmeniz gerekir. Toplamların hiyerarşiye göre elde edildiği bir "Ürün cirosu" raporu örneği:


SEÇMEK

İTİBAREN

Adlandırma HİYERARŞİSİ

Bu talep sonucunda sadece her bir kalem için değil, şu veya bu maddenin ait olduğu gruplar için de toplamlar hesaplanacaktır.

Elemanlar için toplamlara ihtiyaç duymadığımız, yalnızca gruplar için toplamlara ihtiyaç duyduğumuz durumda, toplamlarda HİYERARŞİ YALNIZCA yapısını kullanmamız gerekir. Örnek:


SEÇMEK
İsimlendirme Ciro Muhasebesi. İsimlendirme AS İsimlendirme,
İsimlendirme Ciro Muhasebesi İsimlendirme.Sunum,
İsimlendirme Ciro Muhasebesi. Adet Ciro AS Adet Ciro
İTİBAREN
Birikim Kaydı.Nomenklatür Muhasebesi.Ciro NASIL Nominal MuhasebeCiro
SONUÇ MİKTARI (Miktar Ciro) PO
Adlandırma YALNIZCA HİYERARŞİ

Bu sorgunun sonucu yalnızca madde grupları için toplam kayıt olacaktır.

1C 8'deki sorgu dili, iyi bilinen "yapılandırılmış programlama dilinin" (daha çok SQL olarak adlandırıldığı gibi) basitleştirilmiş bir analogudur. Ancak 1C'de yalnızca verileri okumak için kullanılır; verileri değiştirmek için bir nesne veri modeli kullanılır.

Bir başka ilginç fark da Rusça sözdizimidir. Aslında İngilizce yapıları kullanabilirsiniz.

Örnek istek:

SEÇMEK
Bankalar.Adı,
Bankalar.CorrHesabı
İTİBAREN
Dizin.Bankalar NASIL Bankalar

Bu istek, veri tabanında bulunan tüm bankaların isim ve muhabir hesap bilgilerini görmemizi sağlayacaktır.

Sorgu dili bilgiye ulaşmanın en basit ve etkili yoludur. Yukarıdaki örnekte görülebileceği gibi, sorgu dilinde meta veri adlarını kullanmanız gerekir (bu, yapılandırmayı oluşturan sistem nesnelerinin bir listesidir, yani dizinler, belgeler, kayıtlar vb.).

Sorgu dili yapılarının açıklaması

Sorgu yapısı

Veri elde etmek için “SELECT” ve “FROM” yapılarını kullanmak yeterlidir. En basit istek şuna benzer:

Dizinlerden * SEÇİN.

Burada “*” tablonun tüm alanlarının seçilmesi anlamına gelir ve Dizinler.Nomenklatür – tablonun veritabanındaki adıdır.

Daha karmaşık ve genel bir örneğe bakalım:

SEÇMEK
<ИмяПоля1>NASIL<ПредставлениеПоля1>,
Toplam(<ИмяПоля2>) NASIL<ПредставлениеПоля2>
İTİBAREN
<ИмяТаблицы1>NASIL<ПредставлениеТаблицы1>
<ТипСоединения>BİRLEŞTİRMEK<ИмяТаблицы2>NASIL<ПредставлениеТаблицы2>
İLE<УсловиеСоединениеТаблиц>

NEREDE
<УсловиеОтбораДанных>

GRUPLANDIRMA ŞEKLİ
<ИмяПоля1>

GÖRE SIRALA
<ИмяПоля1>

SONUÇLAR
<ИмяПоля2>
İLE
<ИмяПоля1>

Bu sorguda “TableName1” ve “TableName” tablolarından “FieldName1” ve “FieldName1” alanlarına ait verileri seçip, “HOW” operatörünü kullanarak alanlara eş anlamlılar atayıp, bunları belirli bir “TableConnectionCondition” koşulunu kullanarak birbirine bağlıyoruz. ”.

Alınan verilerden “NERE” “Veri Seçim Koşulu”ndan sadece koşulu karşılayan verileri seçiyoruz. Daha sonra “Alan Adı2”yi toplayarak isteği “Alan Adı1” alanına göre gruplandırıyoruz. Alan için toplamlar oluşturuyoruz. “Alan Adı1” ve son alan “Alan Adı2”.

Son adım, ORDER BY yapısını kullanarak isteği sıralamaktır.

Genel tasarımlar

1C 8.2 sorgu dilinin genel yapılarına bakalım.

BİRİNCİN

Bu operatörü kullanarak ilk kayıtların n sayısını alabilirsiniz. Kayıtların sırası sorgudaki sıraya göre belirlenir.

İLK 100'Ü SEÇİN
Bankalar.Adı,
Bankalar Kodu AS BIC
İTİBAREN
Dizin.Bankalar NASIL Bankalar
GÖRE SIRALA
Bankalar.Adı

İstek, “Bankalar” dizininin alfabetik olarak sıralanmış ilk 100 girişini alacaktır.

İZİN VERİLMİŞ

Bu tasarım mekanizmayla çalışmakla ilgilidir. Mekanizmanın özü, tablonun tamamını değil, veritabanı tablosundaki belirli kayıtların okunmasını (ve diğer eylemleri) kullanıcılarla sınırlamaktır.

Kullanıcı, erişemediği kayıtları okumak için bir sorgu kullanmaya çalışırsa bir hata mesajı alır. Bunu önlemek için "İZİN VERİLEN" yapıyı kullanmalısınız, yani istek yalnızca kendisine izin verilen kayıtları okuyacaktır.

İZİN VERİLENLERİ SEÇİN
Ek Bilgi Havuzu.
İTİBAREN
Dizin.Ek Bilgi Havuzu

ÇEŞİTLİ

“FARKLI” kullanılması, yinelenen satırların 1C sorgu sonucuna girmesini önleyecektir. Çoğaltma, tüm istek alanlarının eşleştiği anlamına gelir.

İLK 100'Ü SEÇİN
Bankalar.Adı,
Bankalar Kodu AS BIC
İTİBAREN
Dizin.Bankalar NASIL Bankalar

BoşTablo

Bu yapı, sorguları birleştirmek için çok nadiren kullanılır. Katılırken tablolardan birinde boş bir iç içe tablo belirtmeniz gerekebilir. “EmptyTable” operatörü bunun için tam uygun.

1C 8 yardımından örnek:

Kompozisyon OLARAK Bağlantı No., BOŞ TABLO.(No., Ürün, Adet) SEÇİN
Belgeden.Gider Faturası
HER ŞEYİ BİRLEŞTİRİN
Bağlantı Numarasını, İçeriği (Satır Numarası, Ürün, Adet) SEÇİN
FROM Document.Fatura Document.Invoice.Composition.*

BOŞ

Birçok hatadan kaçınmanızı sağlayan çok kullanışlı bir özellik. YesNULL(), NULL değerini istediğiniz değerle değiştirmenize olanak sağlar. Birleştirilmiş tablolarda bir değerin varlığının kontrol edilmesinde sıklıkla kullanılır, örneğin:

SEÇMEK
İsimlendirme Referans Bağlantısı,
IsNULL(Kalan Öğe.Kalan Miktar,0) AS Kalan Miktar
İTİBAREN


Başka şekillerde de kullanılabilir. Örneğin, her satır için değerin hangi tabloda mevcut olduğu bilinmiyorsa:

ISNULL(FaturaAlındı.Tarih, FaturaVerilen.Tarih)

HOW, bir tabloya veya alana bir ad (eşanlamlı) atamamızı sağlayan bir operatördür. Yukarıda bir kullanım örneğini gördük.

Bu yapılar birbirine çok benzer; istenen değerin dize gösterimini elde etmenize olanak tanır. Tek fark REPRESENTATION'ın herhangi bir değeri string türüne dönüştürmesi, REPRESENTATIONREF'in ise yalnızca referans değerlerini dönüştürmesidir. REFERANS GÖSTERİMİNİN, elbette referans veri alanının seçimlerde kullanılması planlanmadığı sürece, optimizasyon için veri kompozisyon sistemi sorgularında kullanılması tavsiye edilir.

SEÇMEK
Görünüm(Bağlantı), //dize, örneğin “10/10/2015 tarihli 123 numaralı ön rapor
View(DeletionMark) AS SilMarkText, //string, “Evet” veya “Hayır”
ViewReferences(DeletionMark) AS SilMarkBoolean //boolean, Doğru veya Yanlış
İTİBAREN
Document.Gelişmiş Rapor

İFADE ETMEK

Express, alan değerlerini istediğiniz veri türüne dönüştürmenize olanak tanır. Bir değeri temel türe veya referans türüne dönüştürebilirsiniz.

Referans türü için ifade, karmaşık türdeki alanlarda istenen veri türlerini kısıtlamak için kullanılır ve genellikle sistem performansını optimize etmek için kullanılır. Örnek:

EXPRESS(TableCost.Subconto1 AS Directory.Cost Items).Faaliyet TürüForTaxAccountingCosts

İlkel türler için bu işlev genellikle sınırsız uzunluktaki alanlardaki karakter sayısını sınırlamak için kullanılır (bu tür alanlarla karşılaştırılamaz). Hatayı önlemek için" Karşılaştırma işleminde geçersiz parametreler. Alanları karşılaştıramazsınız
sınırsız uzunluk ve uyumsuz türlerin alanları
", bu tür alanları aşağıdaki gibi ifade etmeniz gerekir:

EXPRESS(Satırda Yorum OLARAK(150))

FARKTARİH

1C'de 267 video dersini ücretsiz alın:

1C isteğinde IS NULL kullanımına bir örnek:

İÇİNDEN SEÇMEK
Referans
SOL BAĞLANTI KayıtBirikimler.DepolardakiÜrünler.Kalan AS Ürün Kalan
Yazılım İsimlendirmesiRef.Link = Satılan MallarKomitelerKalanlar.İsimlendirme
NEREDE KALAN ÜRÜNLER KALAN MİKTAR BOŞ

Bir sorgudaki veri türü, TYPE() ve VALUETYPE() işlevleri veya mantıksal REFERENCE operatörü kullanılarak belirlenebilir. İki fonksiyon benzerdir.

Önceden tanımlanmış değerler

1C sorgu dilindeki sorgularda iletilen parametreleri kullanmanın yanı sıra, önceden tanımlanmış değerleri veya . Örneğin transferler, önceden tanımlanmış dizinler, hesap planları vb. Bunun için “Value()” yapısı kullanılır.

Kullanım örneği:

NEREDE Adlandırma. Adlandırma Türü = Değer (Dizin. Adlandırma Türleri. Ürün)

NEREDE Karşı Taraflar.İletişim Bilgisi Türü = Değer(Numaralandırma.İletişim Bilgisi Türleri.Telefon)

NEREDE Hesap Bakiyeleri. Muhasebe Hesabı = Değer (Hesap Planı. Kâr. Kâr Zararı)

Bağlantılar

4 tür bağlantı vardır: SOL, SAĞ, KOMPLE, İÇ.

SOL ve SAĞ BAĞLANTI

Birleştirmeler, belirli bir koşula göre iki tabloyu birbirine bağlamak için kullanılır. Özellik ne zaman SOL YÖNDEN KATILIM belirtilen ilk tabloyu bütünüyle almamız ve ikinci tabloyu koşullu olarak bağlamamızdır. İkinci tablonun koşulla bağlanamayan alanları şu değerle doldurulur: HÜKÜMSÜZ.

Örneğin:

Karşı Taraflar tablosunun tamamını döndürecek ve "Banka" alanını yalnızca "Karşı Taraflar.Adı = Bankalar.Adı" koşulunun karşılanacağı yerlerde dolduracaktır. Koşul karşılanmazsa Banka alanı şu şekilde ayarlanacaktır: HÜKÜMSÜZ.

1C dilinde SAĞDAN KATIL kesinlikle benzer SOL bağlantı tek bir fark dışında - BAĞLANTI HAKKI“Ana” tablo ikincidir, ilk değil.

TAM BAĞLANTI

TAM BAĞLANTI iki tablodaki tüm kayıtları göstermesi ve yalnızca koşula göre bağlanabildiği kayıtları bağlaması bakımından soldan ve sağdan farklıdır.

Örneğin:

İTİBAREN

TAM BAĞLANTI
Dizin.Bankalar NASIL Bankalar

İLE

Sorgu dili, yalnızca kayıtları birleştirme koşulu karşılandığında her iki tabloyu da tamamen döndürecektir. Sol/sağ birleşiminden farklı olarak NULL'un iki alanda görünmesi mümkündür.

İÇ BİRLEŞİM

İÇ BİRLEŞİM yalnızca belirli bir duruma göre bağlanabilecek kayıtları göstermesi bakımından tam olandan farklıdır.

Örneğin:

İTİBAREN
Dizin. Karşı Taraflar AS Müşteriler

İÇ BİRLEŞİM
Dizin.Bankalar NASIL Bankalar

İLE
Clients.Name = Banks.Name

Bu sorgu yalnızca bankanın ve karşı tarafın aynı ada sahip olduğu satırları döndürür.

Dernekler

JOIN ve JOIN ALL yapıları iki sonucu tek bir sonuçta birleştirir. Onlar. iki işlemin sonucu tek, ortak bir sonuçla "birleştirilecektir".

Yani sistem, yalnızca geçici bir tablo için normal olanlarla tamamen aynı şekilde çalışır.

INDEX BY nasıl kullanılır?

Ancak bir noktayı dikkate almak gerekir. Geçici bir tablo üzerinde dizin oluşturmanın tamamlanması da zaman alır. Bu nedenle geçici tabloda 1-2'den fazla kayıt olacağı kesin olarak biliniyorsa " " yapısının kullanılması tavsiye edilir. Aksi takdirde etki tam tersi olabilir; indekslenmiş alanların performansı indeksi oluşturmak için gereken süreyi telafi etmez.

SEÇMEK
Döviz kurları En son kesit Para Birimi AS Para Birimi,
Döviz kurları En son kesit.
PUT Döviz Kurları
İTİBAREN
Bilgi Kaydı.Döviz Kurları.Son Dilim(&Dönem,) AS Döviz KurlarıSon Dilim
DİZİN:
Para birimi
;
SEÇMEK
Fiyatlar İsimlendirme. İsimlendirme,
Fiyatlarİsimler.Fiyat,
FiyatlarAdlandırmalar.Para Birimi,
Döviz kurları.Kur
İTİBAREN
Bilgi Kaydı.İsimlendirme Fiyatları.Son Dilim(&Dönem,
İsimlendirme B (&İsimlendirme) VE FiyatTürü = &FiyatTürü) OLARAK FiyatNomenklatür
LEFT JOIN Döviz Kurları AS Döviz Kurları
Yazılım FiyatlarıNomenklatürler.Para Birimi = Döviz Kurları.Para Birimi

Gruplama

1C sorgu dili, sorgu sonuçlarını gruplandırırken özel toplama işlevlerini kullanmanıza olanak tanır. Gruplama, kopyaları "ortadan kaldırmak" için toplama işlevleri olmadan da kullanılabilir.

Aşağıdaki işlevler mevcuttur:

Tutar, Adet, Farklı Sayı, Maksimum, Minimum, Ortalama.

Örnek 1:

SEÇMEK
Mal ve Hizmet Mallarının Satışı, İsimlendirme,
SUM(MalHizmetMal.Miktar Satışı) OLARAK Miktar,
SUM(MalHizmetMal Satışı.Tutar) OLARAK Tutar
İTİBAREN

GRUPLANDIRMA ŞEKLİ
Mal ve Hizmet Mallarının Satışı.

Talep, malların bulunduğu tüm satırları alır ve bunları miktara ve maddeye göre tutarlara göre özetler.

Örnek No.2

SEÇMEK
Bankalar.Kodu,
MİKTAR(FARKLI Bankalar.Link) Kopya Sayısı Olarak
İTİBAREN
Dizin.Bankalar NASIL Bankalar
GRUPLANDIRMA ŞEKLİ
Bankalar.Kod

Bu örnek, "Bankalar" dizinindeki BIC'lerin bir listesini gösterecek ve her biri için kaç tane kopya bulunduğunu gösterecektir.

Sonuçlar

Sonuçlar hiyerarşik yapıya sahip bir sistemden veri elde etmenin bir yoludur. Toplama işlevleri, gruplamalarda olduğu gibi özet alanları için de kullanılabilir.

Sonuçları pratikte kullanmanın en popüler yollarından biri, malların toplu olarak silinmesidir.

SEÇMEK




İTİBAREN
Belge Mal ve Hizmet Satışı Mallar Mal ve Hizmet Satışı NASIL Yapılır
GÖRE SIRALA

SONUÇLAR
TOPLA(Miktar),
TOPLAM(Toplam)
İLE
İsimlendirme

Sorgunun sonucu aşağıdaki hiyerarşik olacaktır:

Genel sonuçlar

Tüm "toplamlar" için toplam almanız gerekiyorsa "GENEL" operatörünü kullanın.

SEÇMEK
Mal ve Hizmet Mallarının Satışı, İsimlendirme AS İsimlendirme,
Mal ve Hizmet Mal Satışı Link AS Belgesi,
Mal ve Hizmet Mallarının Satışı Miktar AS Miktar,
Mal ve Hizmet Mallarının Satışı Tutar OLARAK Tutar
İTİBAREN
Belge Mal ve Hizmet Satışı Mallar Mal ve Hizmet Satışı NASIL Yapılır
GÖRE SIRALA
Mal ve Hizmet Mallarının Satışı Bağlantı Tarihi
SONUÇLAR
TOPLA(Miktar),
TOPLAM(Toplam)
İLE
ORTAKTIR,
İsimlendirme

İsteğin yerine getirilmesi sonucunda aşağıdaki sonucu elde ederiz:

1. düzey gruplandırmada gerekli tüm alanların toplanması söz konusudur.

Düzenleme

ORDER BY operatörü sorgu sonuçlarını sıralamak için kullanılır.

İlkel türler (dize, sayı, boolean) için sıralama olağan kurallara göre yapılır. Referans türü alanlar için sıralama, kod veya referans gösterimi yerine bağlantının dahili temsiline (benzersiz tanımlayıcı) göre gerçekleşir.

SEÇMEK

İTİBAREN
Dizin.Adlandırma AS Adlandırma
GÖRE SIRALA
İsim

İstek, terminoloji dizinindeki adların alfabetik olarak sıralanmış bir listesini görüntüler.

Otomatik sipariş

Sıralama yapılmadan yapılan bir sorgunun sonucu, düzensiz bir şekilde sunulan bir satır kümesidir. 1C platformu geliştiricileri, aynı sorgular yürütülürken satırların aynı sırayla çıkarılacağını garanti etmez.

Tablo kayıtlarını sabit bir sırada görüntülemeniz gerekiyorsa Otomatik Sıralama yapısını kullanmanız gerekir.

SEÇMEK
İsimlendirme.İsim AS İsim
İTİBAREN
Dizin.Adlandırma AS Adlandırma
OTOMATİK SİPARİŞ

Sanal tablolar

1C'deki sanal tablolar, 1C sorgu dilinin diğer benzer sözdizimlerinde bulunmayan benzersiz bir özelliğidir. Sanal tablo, kayıtlardan profil bilgilerini almanın hızlı bir yoludur.

Her kayıt tipinin, kayıt ayarlarına bağlı olarak farklılık gösterebilecek kendi sanal tablo seti vardır.

  • ilkinin kesimi;
  • ikincisinin kesilmesi.
  • kalanlar;
  • devrimler;
  • bakiyeler ve ciro.
  • alt kontodan hareketler;
  • devrimler;
  • hız Dt Kt;
  • kalanlar;
  • bakiyeler ve ciro
  • alt konto.
  • temel;
  • grafik verileri;
  • fiili geçerlilik süresi.

Çözüm geliştiricisi için veriler bir (sanal) tablodan alınır, ancak aslında 1C platformu birçok tablodan alarak bunları gerekli forma dönüştürür.

SEÇMEK
Depolardaki Ürünler Kalıntıları ve Devirleri.
ÜrünlerDepolardaKalanVeCiro.MiktarBaşlangıçKalan,
ÜrünlerDepolardaKalanlarVeCiro.MiktarCiro,
Depolardaki MallarKalanlarVeCiro.MiktarGelen,
Depolardaki MallarKalanlarVeCiro.MiktarTüketim,
ÜrünlerDepolardaKalanlarVeCiro.MiktarFinalKalan
İTİBAREN
KaydetBirikimler.Depolardaki Mallar.KalanlarVe Ciro AS MallarDepolarda KalanlarVe Ciro

Bu sorgu, büyük miktarda veriyi hızlı bir şekilde almanızı sağlar.

Sanal Tablo Seçenekleri

Sanal tablolarla çalışmanın çok önemli bir yönü parametrelerin kullanılmasıdır. Sanal tablo parametreleri, seçim ve yapılandırmaya yönelik özel parametrelerdir.

Bu tür tablolar için “NEREDE” yapısında seçim kullanılması yanlış kabul edilir. Sorgunun optimumun altına düşmesinin yanı sıra yanlış veri alınması da mümkündür.

Bu parametrelerin kullanımına bir örnek:

Biriktirme Kaydı, Depolardaki Mallar, Bakiyeler ve Cirolar (& Dönem Başı & Dönem Sonu, Ay, Dönem Hareketleri ve Sınırları, İsimlendirme = & Gerekli İsimlendirme)

Sanal tablolar için algoritma

Örneğin, "Kalanlar" türündeki en çok kullanılan sanal tablo, iki fiziksel tablodan (dengeler ve hareketler) verileri depolar.

Sanal bir tablo kullanırken sistem aşağıdaki işlemleri gerçekleştirir:

  1. Toplamlar tablosunda tarih ve ölçü bazında hesaplanan en yakın değeri elde ediyoruz.
  2. Hareket tablosundaki tutarı toplamlar tablosundaki tutara “ekliyoruz”.


Bu tür basit eylemler, bir bütün olarak sistemin performansını önemli ölçüde artırabilir.

Sorgu Oluşturucuyu Kullanma

Sorgu oluşturucu– veritabanı sorgularının geliştirilmesini büyük ölçüde kolaylaştıran, 1C Enterprise sistemine yerleşik bir araç.

Sorgu oluşturucunun oldukça basit ve sezgisel bir arayüzü var. Yine de sorgu yapıcının kullanımına daha detaylı bakalım.

Sorgu metni yapıcısı, program kodunda istenen yerde içerik menüsünden (sağ fare tuşu) başlatılır.

1C istek yapıcısının açıklaması

Tasarımcının her sekmesine daha ayrıntılı olarak bakalım. Bunun istisnası, başka bir tartışmanın konusu olan Oluşturucu sekmesidir.

Tablolar ve Alanlar sekmesi

Bu sekme, raporda görüntülenmesi gereken veri kaynağını ve alanları belirtir. Temelde SELECT.. FROM yapıları burada açıklanmaktadır.

Kaynak, fiziksel bir veritabanı tablosu, sanal bir kayıt tablosu, geçici tablolar, iç içe geçmiş sorgular vb. olabilir.

Sanal tabloların içerik menüsünde sanal tablo parametrelerini ayarlayabilirsiniz:

Bağlantılar sekmesi

Sekme, birden fazla tablonun bağlantılarını tanımlamak için kullanılır ve CONNECTION kelimesiyle yapılar oluşturur.

Gruplandırma sekmesi

Bu sekmede sistem, tablo sonucunun gerekli alanlarını gruplandırmanıza ve özetlemenize olanak tanır. GRUP BY, TOPLAM, MİNİMUM, ORTALAMA, MAKSİMUM, MİKTAR, FARKLI SAYISI yapıların kullanımını açıklar.

Koşullar sekmesi

WHERE yapısından sonra istek metninde gelen her şeyden, yani alınan verilere uygulanan tüm koşullardan sorumludur.

Gelişmiş sekme

Sekme bunlara ek olarakçok önemli olan her türlü parametreyle doludur. Her bir özelliğe bakalım.

Gruplama Kayıtları seçme:

  • İlk N– sorguya yalnızca N kayıt döndüren bir parametre (FIRST operatörü)
  • Kopya yok– alınan kayıtların benzersizliğini sağlar (FARKLI operatör)
  • İzin verilmiş– yalnızca sistemin dikkate alarak seçmenize izin verdiği kayıtları seçmenize olanak tanır (İZİN VERİLEN inşaat)

Gruplama İstek Türü isteğin ne tür olacağını belirler: veri alma, geçici tablo oluşturma veya geçici tablonun imha edilmesi.

Aşağıda bir bayrak var Alınan verileri daha sonra değiştirilmek üzere kilitle. Verilerin okunduğu andan değiştirildiği ana kadar güvenliğini sağlayan veri kilitlemeyi ayarlama yeteneğini etkinleştirmenize olanak tanır (yalnızca Otomatik kilitleme modu için geçerlidir, DEĞİŞİM İÇİN tasarım).

Birleşimler/Takma Adlar Sekmesi

Sorgu tasarımcısının bu sekmesinde, farklı tabloları ve takma adları (HOW yapısı) birleştirme yeteneğini ayarlayabilirsiniz. Tablolar sol tarafta gösterilmektedir. Bayrakları tablonun karşısına koyarsanız UNITE yapısı kullanılacaktır, aksi takdirde - UNITE ALL (iki yöntem arasındaki farklar). Sağ tarafta farklı tablolardaki alanların yazışmaları gösterilir; eğer uygunluk belirtilmezse sorgu NULL değerini döndürür.

Sipariş sekmesi

Bu, değerlerin sıralanma sırasını (ORDER BY) - azalan (DESC) veya artan (ASC) belirtir.

İlginç bir bayrak da var. Otomatik sipariş(talepte - OTOMATİK SİPARİŞ). Varsayılan olarak, 1C sistemi verileri "kaotik" bir sırayla görüntüler. Bu bayrağı ayarlarsanız sistem, verileri dahili verilere göre sıralayacaktır.

Toplu Sorgulama sekmesi

Sorgu tasarımcısı sekmesinde yenilerini oluşturabilir ve bunu gezinme olarak da kullanabilirsiniz. İstek metninde paketler “;” (virgül) simgesiyle ayrılır.

Sorgu tasarımcısındaki "Sorgu" düğmesi

İstek tasarımcısının sol alt köşesinde, istek metnini istediğiniz zaman görüntüleyebileceğiniz bir İstek düğmesi bulunur:

Bu pencerede istek üzerinde ayarlamalar yapabilir ve onu çalıştırabilirsiniz.


Sorgu Konsolunu Kullanma

Sorgu Konsolu, karmaşık sorgularda hata ayıklamanın ve bilgileri hızlı bir şekilde elde etmenin basit ve kullanışlı bir yoludur. Bu yazımda Query Console'un nasıl kullanılacağını anlatmaya çalışacağım ve Query Console'u indirmek için bir link vermeye çalışacağım.

Bu araca daha yakından bakalım.

1C sorgu konsolunu indirin

Öncelikle sorgu konsoluyla çalışmaya başlamak için onu bir yerden indirmeniz gerekiyor. Tedaviler genellikle iki türe ayrılır: kontrollü formlar ve geleneksel olanlar (veya bazen 8.1 ve 8.2/8.3 olarak da adlandırılırlar).

Bu iki görünümü tek bir işlemde birleştirmeye çalıştım - istenen form istenen çalışma modunda açılıyor (yönetilen modda konsol yalnızca kalın modda çalışıyor).

1C sorgu konsolunun açıklaması

Ana işleme panelinin açıklamasıyla sorgu konsoluna bakmaya başlayalım:

Sorgu konsolu başlığında son sorgunun yürütme süresini milisaniyelik doğrulukla görebilirsiniz, bu da farklı tasarımları performans açısından karşılaştırmanıza olanak tanır.

Komut çubuğundaki ilk düğme grubu, geçerli sorguların harici bir dosyaya kaydedilmesinden sorumludur. Bu çok kullanışlıdır; her zaman karmaşık bir istek yazmaya geri dönebilirsiniz. Veya örneğin belirli tasarımların tipik örneklerinin bir listesini saklayın.

Sol taraftaki “İstek” alanında yeni istekler oluşturabilir ve bunları ağaç yapısında kaydedebilirsiniz. İkinci düğme grubu, istek listesinin yönetilmesinden sorumludur. Bunu kullanarak bir isteği oluşturabilir, kopyalayabilir, silebilir ve taşıyabilirsiniz.

  • Uygulamakrica etmek– basit uygulama ve sonuçlar
  • Paketi yürüt– bir sorgu kümesindeki tüm ara sorguları görüntülemenize olanak tanır
  • Geçici tabloları görüntüleme– geçici sorguların bir tabloda döndürdüğü sonuçları görmenizi sağlar

İstek parametreleri:

İstek için geçerli parametreleri ayarlamanıza olanak tanır.

Sorgu parametreleri penceresinde aşağıdakiler ilginçtir:

  • Düğme İstekten al geliştiricinin rahatlığı için istekteki tüm parametreleri otomatik olarak bulur.
  • Bayrak Tüm istekler için ortak parametreler– kurulduğunda, genel istek listesinde istekten isteğe geçerken işlenmesi parametreleri temizlemez.

Değer listesiyle bir parametre ayarlayınÇok basit, sadece bir parametre değeri seçerken, değeri temizle düğmesine (çapraz) tıklayın, sistem sizden “Değer Listesi” seçmeniz gereken veri tipini seçmenizi isteyecektir:

Ayrıca üst panelde sorgu konsolu ayarlarını çağırmak için bir düğme bulunur:

Burada otomatik kaydetme sorguları ve sorgu yürütme parametreleri için parametreler belirleyebilirsiniz.

Konsol istek alanına istek metni girilir. Bu, yalnızca bir sorgu testi yazarak veya özel bir araç olan sorgu tasarımcısını çağırarak yapılabilir.

1C 8 sorgu tasarımcısı, giriş alanına tıkladığınızda bağlam menüsünden (sağ fare düğmesi) çağrılır:

Ayrıca bu menüde isteğe satır sonlarını (“|”) temizlemek veya eklemek veya istek kodunu bu kullanışlı biçimde almak gibi yararlı işlevler vardır:

Talep = Yeni Talep;
İstek.Text = ”
|SEÇ
| Para Birimleri.Link
|DAN
| Dizin.Para Birimleri AS Para Birimleri”;
requestResult = request.Execute();

Sorgu konsolunun alt alanı sorgu sonuç alanını görüntüler; bu işlem bu nedenle oluşturulmuştur:



Ayrıca sorgu konsolu, listeye ek olarak, toplamları içeren sorgular için verileri bir ağaç biçiminde görüntüleyebilir.

Sorgu optimizasyonu

1C işletme 8.3'ün verimliliğini artırmanın en önemli noktalarından biri optimizasyonistekler. Bu nokta aynı zamanda çok önemlidir. sertifikayı geçmek. Aşağıda optimum olmayan sorgu performansı ve optimizasyon yöntemlerinin tipik nedenlerinden bahsedeceğiz.

WHERE yapısını kullanan sanal tablodaki seçimler

Sanal tablo detaylarına filtrelerin sadece VT parametreleri üzerinden uygulanması gerekmektedir. Hiçbir durumda sanal tablodaki seçim için WHERE yapısını kullanmamalısınız; bu, optimizasyon açısından ciddi bir hatadır. WHERE kullanılarak seçim yapılması durumunda, aslında sistem TÜM kayıtları alacak ve ancak bundan sonra gerekli olanları seçecektir.

SAĞ:

SEÇMEK

İTİBAREN
Birikimlerin Kaydı Organizasyon Katılımcıları ile karşılıklı anlaşmalar Bakiyeler (
,
Kuruluş = &Kuruluş
VE Bireysel = &Bireysel) NASIL Organizasyon Katılımcıları ile karşılıklı anlaşmalar Dengeler

YANLIŞ:

SEÇMEK
Kuruluşların Katılımcılarıyla Karşılıklı Anlaşmalar Bakiyeler Tutar Bakiyesi
İTİBAREN
Birikim Kaydı Organizasyon Katılımcıları ile Karşılıklı Mutabakat Bakiyeler (,) NASIL Organizasyon Katılımcıları ile Karşılıklı Mutabakat Bakiyeler
NEREDE
Organizasyon Katılımcıları ile Karşılıklı Anlaşmalar Dengeler Organizasyon = & Organizasyon
VE Organizasyon Katılımcıları ile karşılıklı anlaşmalar Dengeler Bireysel = &Bireysel

Nokta kullanarak karmaşık türdeki bir alanın değerini alma

Bir nokta aracılığıyla bir sorguda karmaşık türde veri alındığında, sistem, karmaşık tür alanında mümkün olan tür sayısı kadar tabloya sol birleştirmeyle bağlanır.

Örneğin, optimizasyon için kayıt kayıt alanına (kayıt şirketi) erişmek son derece istenmeyen bir durumdur. Kayıt şirketi, aralarında kayda veri yazabilen tüm olası belge türlerinin de bulunduğu bileşik bir veri türüne sahiptir.

YANLIŞ:

SEÇMEK
Kayıt Ayarı.Kaydedici.Tarih,
RecordSet.Quantity
İTİBAREN
KayıtBirikimler.ÜrünlerOrganizasyonlar AS SetRecords

Yani aslında böyle bir sorgu bir tabloya değil 22 veritabanı tablosuna erişecektir (bu kayıtta 21 kayıt şirketi türü vardır).

SAĞ:

SEÇMEK
SEÇENEK
WHEN ÜrünlerOrg.Registrar LINK Belgesi.Ürün ve Hizmet Satışı
SONRA EXPRESS(ÜrünlerOrganizasyon.Kayıt Şirketi AS Belgesi.Mal SatışlarıHizmetler).Tarih
NE ZAMAN MalOrg.Kayıt Şirketi BAĞLANTISI Belgesi.Mal Hizmetlerinin Alınması
SONRA EXPRESS(GoodsOrg.Registrar AS Document.Mal Hizmetlerinin Alınması).Tarih
TARİH OLARAK BİTİŞ,
ÜrünlerOrg.Adedi
İTİBAREN
Kayıt OlBirikimler.ÜrünlerOrganizasyonlar AS ÜrünlerOrganizasyon

Veya ikinci seçenek, bu tür bilgileri ayrıntılara eklemek, örneğin bizim durumumuzda tarih eklemek.

SAĞ:

SEÇMEK
ÜrünlerOrganizasyonlar.Tarih,
ÜrünlerOrganizasyonlar.Miktar
İTİBAREN
Birikim Kaydı Kuruluşların Malları AS Kuruluşların Malları

Birleştirme koşulundaki alt sorgular

Optimizasyon açısından, birleştirme koşullarında alt sorguların kullanılması kabul edilemez; bu, sorguyu önemli ölçüde yavaşlatır. Bu gibi durumlarda VT kullanılması tavsiye edilir. Bağlanmak için, daha önce bağlantı alanlarına göre indekslemiş olduğunuz yalnızca meta verileri ve VT nesnelerini kullanmanız gerekir.

YANLIŞ:

SEÇMEK …

SOL YÖNDEN KATILIM (
RegisterInformation.Limits'TAN SEÇİN
NEREDE …
GRUPLAMAYA GÖRE...
) İLE …

SAĞ:

SEÇMEK …
PUT Limitleri
Bilgi Kaydı'ndan.Limitler
NEREDE …
GRUPLAMAYA GÖRE...
DİZİN ŞEKLİ...;

SEÇMEK …
Belgeden Mal ve Hizmet Satışı
LEFT JOIN Sınırları
İLE …;

Kayıtları Sanal Tablolarla Birleştirme

Sanal bir masayı başkalarına bağlarken sistemin en iyi şekilde çalışmadığı durumlar vardır. Bu durumda, sorgunun performansını optimize etmek için, geçici tablo sorgusunda birleştirilmiş alanları dizine eklemeyi unutmadan, sanal tabloyu geçici bir tabloya yerleştirmeyi deneyebilirsiniz. Bunun nedeni, VT'lerin genellikle birkaç fiziksel DBMS tablosunda bulunmasıdır; sonuç olarak, bunları seçmek için bir alt sorgu derlenir ve sorunun önceki noktaya benzer olduğu ortaya çıkar.

Dizine eklenmemiş alanlara dayalı seçimleri kullanma

Sorgu yazarken en yaygın hatalardan biri, dizine eklenmemiş alanlardaki koşulları kullanmaktır; bu durum, sorgu optimizasyon kuralları. Sorgu, indekslenemeyen alanlarda seçim içeriyorsa, DBMS bir sorguyu en iyi şekilde yürütemez. Geçici bir tablo alırsanız bağlantı alanlarını da indekslemeniz gerekir.

Her koşul için uygun bir indeks bulunmalıdır. Uygun bir indeks aşağıdaki gereksinimleri karşılayan indekstir:

  1. Dizin, koşulda listelenen tüm alanları içerir.
  2. Bu alanlar endeksin en başında yer alır.
  3. Bu seçimler ardışıktır, yani sorgu koşuluna dahil olmayan değerler aralarına "sıkışmaz".

DBMS doğru dizinleri seçmezse tablonun tamamı taranacaktır; bu, performans üzerinde çok olumsuz bir etkiye sahip olacaktır ve tüm kayıt kümesinin uzun süre engellenmesine yol açabilir.

Koşullarda mantıksal VEYA kullanma

Hepsi bu kadar, bu makale her 1C uzmanının bilmesi gereken sorgu optimizasyonunun temel yönlerini kapsıyordu.

Sorgu geliştirme ve optimizasyon konusunda çok faydalı bir ücretsiz video kursu, Şiddetle tavsiye ederim yeni başlayanlar ve daha fazlası için!

Bu yazımızda sizinle her şeyi tartışmak istiyoruz 1C sorgu dili işlevleri, Ve sorgu dili yapıları. İşlev ve tasarım arasındaki fark nedir? Fonksiyon parantezlerle ve olası parametrelerle çağrılır ve yapı parantezsiz yazılır. şüphesiz 1C sorgu dilinin tüm yapıları ve işlevleri Veri toplama sürecini esnek ve çok işlevli hale getirin. Bu işlevler ve yapılar sorgu alanlarına uygulanır ve bazıları koşullar için de geçerlidir.

1C Sorgu Dili İşlevleri

Çünkü net bir açıklama 1C sorgu dili işlevleri yapıların tanımlarından çok daha az yaygın olduğundan, işlevlere bakmaya karar verdik. Şimdi her birine ayrı ayrı bakalım, amacını, sözdizimini ve kullanım örneğini açıklayalım:

1. İşlev TARİH SAAT- bu işlev "Tarih" türünde sabit bir alan oluşturur.

Sözdizimi: TARİH SAAT(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Kullanım örneği:

2. TARİH FARKI işlevi- boyutlardan birinde (yıl, ay, gün, saat, dakika, saniye) iki tarih arasındaki farkı döndürür. Ölçüm parametre olarak iletilir.

Sözdizimi: FARKTARİH(<Дата1>, <Дата2>, <Тип>)

Kullanım örneği:

Query.Text = "SELECT | DIFFERENCEDATE(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS Gün Sayısı";

3. İşlev VALUE- veritabanından önceden tanımlanmış bir kayıt içeren sabit bir alan ayarlar; ayrıca herhangi bir türden boş bir bağlantı da alabilirsiniz.

Sözdizimi: VALUE(<Имя>)

Kullanım örneği:

request.Text = "SELECT //önceden tanımlanmış öğe | VALUE(Directory.Curregency.Dollar) AS Dolar, //boş bağlantı | VALUE(Document.Mal ve Hizmetlerin Alınması.EmptyLink) AS Makbuzu, //transfer değeri | VALUE(Transfer) . Yasal Bireysel. Bireysel) AS Bireysel, //önceden tanımlanmış hesap | VALUE(Hesap Planı. Kendi kendini destekleyen. Malzemeler) AS Account_10" ;

4. SEÇ işlevi- önümüzde kodda kullanılan IF yapısının bir analogu var, yalnızca bu 1C sorgularında kullanılıyor.

Sözdizimi: SEÇİM NE ZAMAN<Выражение>DAHA SONRA<Выражение>AKSİ TAKDİRDE<Выражение>SON

Kullanım örneği:

request.Text = //eğer miktar 7500'den fazlaysa, o zaman 300 rublelik bir indirim olmalıdır, //yani eğer koşul tetiklenirse fonksiyon // Tutar - 300'ü döndürür //aksi halde istek sadece Tutar'ı döndürür "SEÇ | SEÇ | NE ZAMAN TCRmakbuz.Tutar > 7500 | SONRA TCRmakbuz.Tutar - 300 | DİĞER TCRmakbuz.Tutar | TutarWithİndirim Olarak SON |FROM | Belge.MalHizmet Makbuzu.Mallar TCRmakbuzları OLARAK";

5. EKSPRES işlevi- sabit bir alanı belirli bir türle ifade etmenizi sağlar.

Sözdizimi: EXPRESS(AlanAdı AS TürAdı)

Kullanım örneği:

Query.Text = "ÇEŞİTLİ SEÇ | Satış.Kayıt Şirketi.Number, | SEÇ | NE ZAMAN Satış.Kayıt Şirketi BAĞLANTISI Belge.Gider | THEN EXPRESS(Sales.Kayıt Şirketi AS Belge.Gider) | BAŞKA SEÇ | NE ZAMAN Satış.Kayıt Şirketi BAĞLANTISI Belge.Uygulama | THEN EXPRESS(Satış.Kayıt AS Belgesi.Uygulama) | SON | ... | SON AS Numarası | FROM | KayıtBirikimler.Satın Almalar AS Satın Almalar";

EXPRESS işlevini karma türlerin olduğu alanlarda kullanmak için başka bir seçenek var mı, bunlar nerede ortaya çıkıyor? En basit örnek, herhangi bir kayıt için “Kayıt Şirketi”dir. Peki neden türü kayıt şirketinde nitelendirmemiz gerekebilir? Kayıt şirketinden "Numara" alanını seçtiğimizde durumu ele alalım, numara hangi tablodan seçilecek? Hepsinin doğru cevabı! Bu nedenle sorgumuzun hızlı çalışması için EXPRESS fonksiyonunu kullanarak açık bir tür belirtmeliyiz.

Kullanım örneği:

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

6. ISNULL işlevi(alternatif yazım ISNULL) - alan NULL türündeyse, işlevin ikinci parametresiyle değiştirilir.

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

Kullanım örneği:

Ayrıca HER ZAMAN NULL tipini bir değerle değiştirmeniz tavsiye edilir, çünkü NULL türüyle karşılaştırma, NULL'u NULL ile karşılaştırsanız bile her zaman FALSE değerini döndürür. Çoğu zaman, NULL değerleri tabloların birleştirilmesi (dahili olanlar hariç her türlü birleştirme) sonucunda oluşur.

Query.Text = //Maddenin tamamını ve bakiyelerini seçin //eğer bazı eşyalarda bakiye yoksa, o zaman //NULL alanı olacaktır ve bu alan 0 "SELECT | No. Link, | ISNULL değeriyle değiştirilecektir. (ProductsInStockRemains.InStockRemaining, 0) AS Kalan | FROM | Directory.Nomenclature AS No. | SOL BAĞLANTI Birikimleri Kaydet. GoodsInWarehouses. Remainings AS GoodsInWarehousesRemains | ON (GoodsInWarehousesRemains. Nomenclature = No. Bağlantı)";

7. TEMSİL işlevi- istek alanının bir temsilini almanızı sağlar.

Sözdizimi: VERİM(<НаименованиеПоля>)

Kullanım örneği:

Query.Text = "SELECT | TEMSİL(FreeRemainingRemains.Nomenclature) AS Adlandırması, | TEMSİL(FreeRemainingRemaining.Warehouse) AS Warehouse, | FreeRemainingRemaining.InStockRemaining |FROM |Birikim Kaydı.FreeRemaining.Remaining AS FreeRemainingRemaining";

1C sorgu dilinde yapılar

Sizinle yukarıda tartıştık 1C sorgu dili işlevleri, şimdi düşünmenin zamanı geldi 1C sorgu dilindeki yapılar, daha az önemli ve faydalı değiller, hadi başlayalım.

1. İnşaat BAĞLANTISI- bir referans tipini kontrol etmek için kullanılan mantıksal bir operatördür. En sık, karmaşık türdeki bir alanı belirli bir türe göre kontrol ederken karşılaşılır. Sözdizimi: BAĞLANTI<Имя таблицы>

Kullanım örneği:

request.Text = //kayıt cihazının değer türü belge makbuzu ise, //bu durumda sorgu "Mal alımı", aksi takdirde "Mal satışı" "SELECT | SELECT | WHEN Remainings.Registrar LINK Document.Receipt of Mal ve Hizmetler | SONRA ""Makbuz"" | ELSE ""Tüketim"" | SON AS Hareket Türü | FROM | Biriktirme Kaydı. Depolarda Kalan Ürünler AS Kaldı" ;

2. ARASINDAKİ Tasarım- bu operatör değerin belirtilen aralıkta olup olmadığını kontrol eder.

Sözdizimi: ARASINDA<Выражение>VE<Выражение>

Kullanım örneği:

request.Text = //kodu 1 ila 100 aralığında olan terminolojinin tamamını alın "SELECT | Nomenclature.Link |FROM | Directory.Nomenclature AS Nomenclature |NEREDE | Nomenclature.Code 1 VE 100 ARASINDA" ;

3. Yapı B ve B HİYERARŞİSİ- değerin aktarılan listede olup olmadığını kontrol edin (diziler, değer tabloları vb. liste olarak aktarılabilir). IN HİYERARŞİ operatörü hiyerarşiyi görüntülemenize olanak tanır (Hesap Planının kullanımına bir örnek).

Sözdizimi: İÇİNDE(<СписокЗначений>), HİYERARŞİDE(<СписокЗначений>)

Kullanım örneği:

request.Text = //hesabın tüm alt hesaplarını seç "SELECT | Kendi kendini destekleyen. AS Hesabını Bağla | FROM | Hesap Planı. Kendi kendini destekleyen AS Kendi kendini destekleyen | NEREDE | Kendi kendini destekleyen. HİYERARŞİ DEĞERİNDE Bağlantı (Grafik) Hesaplar. Kendi kendine yeten. Mallar)";

4. BENZER Tasarım- Bu işlev bir dizeyi bir dize deseniyle karşılaştırmamıza olanak tanır.

Sözdizimi: BEĞENMEK "<ТекстШаблона>"

Satır deseni seçenekleri:

% - herhangi bir sayıda rastgele karakter içeren bir dizi.

Rastgele bir karakter.

[...] - köşeli parantez içinde listelenen herhangi bir tek karakter veya karakter dizisi. Numaralandırma, aralığın uçları da dahil olmak üzere aralığa dahil edilen isteğe bağlı bir karakter anlamına gelen a-z gibi aralıkları belirtebilir.

[^...] - olumsuzluk işaretinden sonra listelenenler hariç, köşeli parantez içinde listelenen herhangi bir tek karakter veya karakter dizisi.

Kullanım örneği:

Query.Text = //TABUR kökünü içeren ve //küçük veya büyük harfle başlayan isimlendirmenin tamamını bulun t "SELECT | İsimlendirme. Bağlantı | FROM | Dizin. İsimlendirme AS İsimlendirme | NEREDE | Ürünler. İsim GİBİ "" [Tt ]abur%""" ;

5. Tasarıma İZİN VERİLİR- bu operatör yalnızca arayanın okuma iznine sahip olduğu veritabanından kayıtları seçmenize olanak tanır. Bu haklar kayıt düzeyinde (RLS) yapılandırılır.

Sözdizimi: SELECT anahtar sözcüğünden sonra ALLOWED yazılır

Kullanım örneği:

request.Text = "İZİN VERİLENLERİ SEÇİN | Karşı Taraflar. Bağlantı | FROM | Dizin. Karşı Taraflar OLARAK Karşı Taraflar";

6. Tasarım ÇEŞİTLİ- yinelenen kayıt bulunmayan kayıtları seçmenize olanak tanır.

Sözdizimi: SELECT anahtar sözcüğünden sonra VARIOUS yazılır

Kullanım örneği:

request.Text = //okuyucunun haklarına sahip olduğu kayıtları seçer "ÇEŞİTLİ SEÇ | Karşı Taraflar.Ad |FROM | Dizin. Karşı Taraflar AS Karşı Taraflar" ;

Ayrıca, ÇEŞİTLİ yapı İZİN VERİLEN operatör ve diğer operatörlerle birlikte kullanılabilir.

Kullanım örneği:

request.Text = //okuyucunun haklarına sahip olduğu çeşitli kayıtları seçer "İZİN VERİLEN ÇEŞİTLİLERİ SEÇİN | Karşı Taraflar.Ad |FROM | Dizin. Karşı Taraflar Karşı Taraflar OLARAK";

7. İLK Tasarım- sorgu sonucundan parametrede belirtilen kayıt sayısını seçer.

Sözdizimi: İLK<число>

Kullanım örneği:

request.Text = //"İLK 4 | CCD Numaralarını SEÇİN. Bağlantı | FROM | Dizin. CCD Numaraları AS CCD Numaraları" dizininden ilk 4 CCD numarasını seçin;

8. DEĞİŞİM İÇİN TASARIM- bir tabloyu kilitlemenizi sağlar, yalnızca işlemlerde çalışır (yalnızca otomatik kilitlemelerle ilgilidir).

Sözdizimi: DEGİSİM İCİN<НаименованиеТаблицы>

Kullanım örneği:

Query.Text = "SELECT | Serbest Kalanlar. Adlandırma, | Serbest Kalanlar. Depo, | Serbest Kalanlar Kalanlar. Stokta Kalan | FROM | Biriktirme Kaydı. Serbest Kalanlar. Kalanlar Serbest Kalan Kalanlar OLARAK | DEĞİŞİM İÇİN | Biriktirmeler Kaydı . Serbest Kalanlar. Kalanlar";

9. Tasarım SİPARİŞ VEREN- verileri belirli bir alana göre düzenler. Alan bir bağlantı ise, bayrağı ayarlarken OTOMATİK SİPARİŞ Sıralama, bağlantı temsiline göre gerçekleşir; bayrak kapatılırsa bağlantılar, bağlantı adresinin bellekteki kıdemine göre sıralanır.

Sözdizimi: GÖRE SIRALA<НаименованиеПоля>OTOMATİK SİPARİŞ

Kullanım örneği:

Query.Text = "SELECT | Serbest Kalanlar. İsimlendirme AS Adlandırma, | Serbest Kalanlar. Depo AS Depo, | Serbest Kalanlar. Stokta Kalan | FROM | Birikimleri Kaydet. Serbest Kalanlar. Kalanlar AS Serbest Kalanlar | | SİPARİŞ VER | İsimlendirme | OTOMATİK SİPARİŞ VANIE";

10. GRUPLAMAYA GÖRE Tasarım- sorgu dizelerini belirli alanlara göre gruplandırmak için kullanılır. Sayısal alanlar herhangi bir toplama işleviyle kullanılmalıdır.

Sözdizimi: GRUPLANDIRMA ŞEKLİ<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Kullanım örneği:

Query.Text = "SELECT | ItemsInWarehouses.Nomenclature AS Adlandırma, | ItemsInWarehouses.Warehouse, | SUM(ItemsInWarehouses.InStock) AS INSTOCK |FROM | RegisterAccumulations.ItemsInWarehouses AS ItemsInWarehouses | |GRUPLA | ItemsInWarehouses.Nomenclature, | ItemsAtWarehouse ah.Warehouse " ;

11. Tasarım- WHERE yapısına benzer şekilde bir veri seçim koşuluna bir toplama işlevi uygulamanıza olanak tanır.

Sözdizimi: SAHİP OLMAK<агрегатная функция с условием>

Kullanım örneği:

Query.Text = //InStock alanının 3'ten büyük olduğu gruplanmış kayıtları seçer "SELECT | ItemsInStocks.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) AS INSTOCK |FROM | RegisterAccumulations.ItemsInStocks AS ItemsInStocks | | GRUPLAMAYA GÖRE | Depolardaki Ürünler.İsimlendirme, | Depolardaki Ürünler.Depo | |MEVCUT | AMOUNT(Depolardaki Ürünler.Stoktaki Ürünler) > 3" ;

12. İnşaat İNDEKSİ- sorgu alanını indekslemek için kullanılır. Dizin oluşturmalı bir sorgunun tamamlanması daha uzun sürer ancak dizine eklenen alanlarda aramayı hızlandırır. Yalnızca sanal tablolarda kullanılabilir.

Sözdizimi: DİZİN:<Поле1, ... , ПолеN>

Kullanım örneği:

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. Tasarım NEREDE- herhangi bir seçim alanına koşul uygulamanıza olanak tanır. Sonuç yalnızca koşulu karşılayan kayıtları içerecektir.

Sözdizimi: NEREDE<Условие1 ОператорЛогСоединения УсловиеN>

Kullanım örneği:

Query.Text = //CompensationRemaining olan tüm kayıtlar seçildi<>0 ve //AmountForCalcCompRemaining > 100 "SELECT | CompensationRPORemains.Counterparty, |CompensationRPORemains.Child, | CompensationRPORemains.CompensationRemaining, | CompensationRPORemains.AmountForCalcCompRemains |Verileri Yerleştir |FROM | Biriktirme Kaydı.CompensationRP.Remains AS TazminatRPKalan | WHERE |TazminatRPORayan.TazminatKalan<>0 | Ve TazminatRPORemains.AmountForCalcCompRemaining> 100" ;

14. Tasarım SONUÇLARI... GENEL- toplamları hesaplamak için kullanılır; tasarım, toplamların hesaplanacağı alanları ve toplam alanlara uygulanan toplama işlevlerini belirtir. TOPLAM yapısını takip eden her alan için toplamlar kullanıldığında veriler gruplanır. İsteğe bağlı bir GENERAL yapısı vardır; kullanımı ayrıca ek gruplama sağlar. Aşağıda istek sonucunun bir örneğini göreceksiniz.

Sözdizimi: SONUÇLAR<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>İLE<ОБЩИЕ> <Поле1, ... , ПолеN>

Kullanım örneği:

request.Text = "SELECT | Hesaplamalar. Karşı Taraf Anlaşması. Anlaşma Türü AS Sözleşme Türü, | Hesaplamalar. Karşı Taraf Anlaşması AS Sözleşmesi, | Hesaplamalar. Karşı Taraf, | Hesaplamalar. Karşılıklı Uzlaşma Tutarı Bakiye AS Bakiyesi | FROM | Biriktirme Kaydı. Karşılıklı Karşı Taraflarla Takas. AS Bakiyeleri Hesaplamaları | TOPLAM | AMOUNT (Bakiye) |Yazılım | GENEL, | Anlaşma Türü";

Şekilde talebin yerine getirilmesi sırasında oluşturulan gruplamalar özetlenmektedir; en üstteki gruplama GENEL bölümünü, ikincisi ise Karşı Taraf SözleşmesiSözleşme Türü alanını ifade etmektedir.

1C dizini nedir ve neden gereklidir? Dizin, koşullu olarak kalıcı bilgileri saklar; Uzun bir süre boyunca neredeyse hiç değişmeden kalan bilgiler. Örneğin, “İsimlendirme” dizini satılan veya üretilen malların bir listesini içerir. Ayrıca bir dizin, bir dizin öğesini tanımlayan birçok özellik içerebilir.

Karşılaştırma için bir kişinin cinsiyetini alırsak, liste sınırlıdır ve değiştirilmez, dolayısıyla bir numaralandırma buna daha uygundur.

Yeni bir dizin oluşturduğumuzda aşağıdaki resmi göreceğiz.

Tüm yer işaretlerine bakalım.

Temel

Burada ad (veritabanındaki tanımlayıcı) ve eş anlamlı (dizinin kullanıcı adı) belirtilir. İsteğe bağlı bir yorum, dizinin amacını açıklayabilen veya özelliklerini açıklayabilen bir yorumdur.

Hiyerarşi

Bu sekmede dizin öğelerinin iç içe geçme derinliğini yapılandırabilirsiniz. Bu ayarı kullanarak öğeleri bazı kriterlere göre farklılaştırmak ve detaylandırmak uygundur. Örneğin “Dolaplar” ürünleri bir grupta, “Masalar” ürünleri ise başka bir grupta yer almaktadır. Varsayılan olarak, oluşturulduğunda dizin şunları sunar: elemanların listesi. Hiyerarşik dizin onay kutusunu işaretlerseniz, her öğe başka bir öğeye (gruba) bağlı olabilir. Aşağıda bu yer imini özelleştirmeye ve özel modda ekranı değiştirmeye yönelik seçenekler bulunmaktadır.

Hiyerarşi türü:

Grupların ve öğelerin hiyerarşisi

Bu ayarla, öğeler yalnızca gruplara (klasörlere) yerleştirilebilir.

Burada görebileceğiniz gibi tüm öğeler ve gruplar aynı simgelere sahiptir ve herhangi bir öğe iç içe yerleştirilebilir.

Grupları en üste yerleştirin

Bu onay kutusu işaretlendiğinde, gruplar her zaman en üstte olacaktır; aksi takdirde, örneğin şu şekilde sıralama düzenine göre düzenleneceklerdir:

Hiyerarşi düzeylerinin sayısını sınırlama

Burada onay kutusu işaretlenmezse, iç içe geçme sınırsızdır.

Onay kutusu işaretliyse aşağıda düzey sayısını belirtebilirsiniz.

Sahipler

Yer işaretinde sahipleri bunun bağlı olduğu diğer dizinler belirtilebilir. Alt dizinlerin ilişki diyagramı hiyerarşik bir dizinin ilişki diyagramına benzer, yalnızca burada başka bir dizin üst öğe olarak hareket eder ve sahip olarak adlandırılır. Tipik konfigürasyonlarda "Sözleşmeler" dizininin "Karşı Taraflar" dizinine tabi tutulması buna iyi bir örnektir, çünkü Herhangi bir karşı tarafa ait olmayan bir sözleşme olamaz.

"Dizin Sahipleri Listesi" alanı, bu dizinin öğelerine sahip olan dizinlerin listesini belirtir.

Aşağıda “Bağlılık kullanımı” alanında bu dizinin öğelerinin neye bağlı olacağı belirtilmektedir.

Bir dizinin hiyerarşik olup olmadığını programlı olarak nasıl öğrenebilirim?

Bunu yapmak için meta verilere başvurmanız gerekir.

Bu, HierarchicalDirectory = Metadata.Directories.Counterparties.Hierarchical;

Devam edecek...