İnternet pencereler Android

Belge türüne göre 1 saniye sorgu sıralaması. Büyük isteklerin küçük hileleri

1C platformunda veritabanı tablolarına sorgular oluşturmak ve yürütmek için özel bir programlama dili nesnesi kullanılır. Rica etmek. Bu nesne, yapı çağrılarak oluşturulur. Yeni istek. Gerekirse gruplandırılmış ve sıralanmış karmaşık bir veri seçimi almanız gerektiğinde bir sorgu kullanmak uygundur. Sorgu kullanmanın klasik bir örneği, belirli bir zaman noktasındaki birikim kaydının durumunun bir özetini almaktır. Ayrıca sorgulama mekanizması farklı zaman dilimlerinde bilgi almayı kolaylaştırmaktadır.

İstek metni, isteğin yürütülmesi gereken talimattır. İsteğin gövdesi şunları açıklar:

  • sorgu veri kaynakları olarak kullanılan bilgi tabanı tabloları;
  • sorguda işlenmesi gereken tablo alanları;
  • gruplama kuralları;
  • sıralama sonuçları;
  • vesaire.
Talimat özel bir dilde derlenmiştir - sorgulama dili ve ayrı bölümlerden oluşur - bölümler, cümleler, anahtar sözcükler, işlevler, aritmetik ve mantıksal operatörler, yorumlar, sabitler ve parametreler.

1C platformunun sorgulama dili, diğer SQL dillerinin sözdizimine çok benzer, ancak farklılıklar vardır. Yerleşik sorgu dilinin ana avantajları şunlardır: alan referanslarını kaldırma, sanal tablolar, toplamlarla rahat çalışma, sorgularda yazılmamış alanlar.

  • enum değerleri;
  • önceden tanımlanmış veriler:
  • dizinler;
  • özellik türlerinin planları;
  • hesap çizelgeleri;
  • hesaplama türleri için planlar;
  • boş bağlantılar;
  • iş süreçlerinin yol noktalarının değerleri.
Ayrıca, istek metni, veritabanı tablolarındaki alanlara atanabilecek sistem numaralandırma değerleri içerebilir: AccumulationMotionType, AccountType ve AccountingMovementType. İstekler, bir işlev türü hazır bilgisi kullanan önceden tanımlanmış yapılandırma verilerine ve sistem numaralandırma değerlerine atıfta bulunur ANLAM. Bu hazır bilgi, sorgunun okunabilirliğini artırır ve sorgu parametrelerinin sayısını azaltır.

Değişmez harf kullanımına bir örnek ANLAM:
WHERE Şehir = VALUE(Directory.Cities.Moscow)
WHERE Şehir = VALUE(Reference.Cities.EmptyReference)
WHEREItemType = VALUE(Enumeration.ProductTypes.Service)
WHEREMovementType = VALUE(MovementTypeAccumulation.Gelir)
WHERE RoutePoint = DEĞER(BusinessProcess.BusinessProcess1.RoutePoint.Action1

2) Kullanım talimatları OTO SİPARİŞ bir sorguda sorgu yürütme süresi çok yüksek olabilir, bu nedenle sıralama gerekmiyorsa hiç kullanmamak daha iyidir. Çoğu durumda, sıralamayı uygulamanın en iyi yolu deyimdir. GÖRE SIRALA.

Otomatik düzenleme aşağıdaki ilkelere göre çalışır:

  • Sorguda ORDER BY yan tümcesi belirtilmişse, bu yan tümcedeki tabloya yapılan her başvuru, tablonun varsayılan olarak sıralandığı alanlarla değiştirilecektir (dizinler için bu kod veya addır, belgeler için tarih belgenin). Sıralama alanı hiyerarşik bir dizine başvuruyorsa, bu dizine göre hiyerarşik sıralama uygulanacaktır.
  • Sorguda ORDER BY yan tümcesi yoksa, ancak bir TOTALS yan tümcesi varsa, sorgu sonucu BY anahtar sözcüğünden sonra RESULTS yan tümcesinde bulunan alanlara göre aynı sırayla ve toplamlar şuna göre hesaplandıysa sıralanır: alanlar - bağlantılar, ardından varsayılan olarak başvurulan tabloların sıralama alanlarına göre.
  • Sorguda ORDER BY ve TOTAL yan tümceleri yoksa ancak bir GROUP BY yan tümcesi varsa, o zaman sorgu sonucu tümcede aynı sırada bulunan alanlara göre sıralanır ve gruplama alanlara göre yapılmışsa - bağlantılar, ardından varsayılan olarak başvurulan alan tablolarını sıralar.
  • Sorgu yan tümceleri ve ORDER BY, TOTAL ve GROUP BY içermiyorsa, sonuç, sorguda göründükleri sırayla, verilerin seçildiği tablolar için varsayılan sıralama alanlarına göre sıralanır.

Sorgu TOTAL yan tümcesini içeriyorsa, her toplam düzeyi ayrı ayrı sıralanır.

3) Kullanıcıya sorgu sonucunu görüntülerken (örneğin, bir sorgu oluştururken veya bir elektronik tablo belgesi kullanarak sorgu sonucunu görüntülerken) veritabanını yeniden sorgulamaktan kaçınmak için yönergeyi kullanmak yararlıdır. SUNUMBAĞLANTILARI Bir referans değerinin temsilini almanızı sağlayan A.

Talimatı kullanmak da mümkündür VERİM- rasgele bir türdeki bir değerin dize temsilini elde etmek için tasarlanmıştır. Bu komutlar arasındaki fark, ilk durumda komutlar bir bağlantı iletirse sonucun bir dizi olması, diğer durumlarda ise sonucun iletilen parametrenin değeri olmasıdır. İkinci durumda, talimatın sonucu her zaman bir dizi olacaktır!

4) Sorgu bileşik tipte bir alan içeriyorsa, bu tür alanlar için talimatı kullanarak alan değerlerinin belirli bir tipe dönüştürülmesi gerekli hale gelir. İFADE ETMEK, gereksiz tabloları bileşik veri türündeki bir alanla sol bağlantıdan kaldırmanıza ve sorguyu hızlandırmanıza olanak tanır.

Örnek:
Mal Kalıntılarının biriktirilmesi için, Tescil Ettiren alanının bileşik bir türe sahip olduğu bir kayıt vardır. Talepte Mal Fişi Evrak Tarih ve Numarası seçili iken Sicil alanından evrak detayına girildiğinde birikim sicil tablosunun sicil evrak tabloları ile bağlantısının çok fazla bırakılmasına neden olmamaktadır.

SEÇMEK
EXPRESS(Mal Kalıntıları.Kayıt Şirketi AS Belgesi.Mal Fişi).Numara AS Fiş Numarası,
EXPRESS(Malların Kalıntıları.Kayıt Şirketi AS Belgesi.Malların Alındısı).Tarih AS Alınma Tarihi
İTİBAREN
Biriktirme Kaydı. Mal Kalıntısı AS Mal Kalıntısı

Eğer type cast uygun görülmezse, type cast'in sonucu NULL olacaktır.

5) Talimatları unutmayın İZİN VERİLMİŞ, bu, sorgunun yalnızca geçerli kullanıcının izinlerine sahip olduğu kayıtları seçeceği anlamına gelir. Bu kelime belirtilmezse, sorgunun kullanıcının haklarına sahip olmadığı kayıtları seçmesi durumunda, sorgu bir hatayla çalışacaktır.

6) Sorgu bir birleşim kullanıyorsa ve birliğin bazı bölümlerinde iç içe geçmiş tablolar (tablolu kısmı olan bir belge) varsa ve bazılarında seçim listesini alanlarla tamamlamaya gerek yoktur - boş iç içe tablolar. Bu, anahtar kelime kullanılarak yapılır. BOŞ TABLO, bundan sonra iç içe tablonun oluşacağı alanların takma adları parantez içinde belirtilir.

Örnek:
// Sayı ve Kompozisyon alanlarını seçin
// Document.Invoice sanal tablosundan
KOMPOZİSYON OLARAK Reference.Number, EMPTYTABLE.(Nom, Tov, Adet) SEÇİN
Document.Invoice'dan
TÜMÜNÜ BİRLEŞTİRİN
SEÇ Bağlantı.Numarası, Kompozisyon.(SatırNumarası, Ürün, Miktar)
Document.Invoice Document.Invoice.Composition.* FROM
7) Sorgu sonucunda tekrarlanan satırlardan kaçınmak için talimatı kullanmalısınız. ÇEŞİTLİ, çünkü daha açık ve net ve talimat GRUPLANDIRMAYA GÖRE toplama işlevlerini kullanarak gruplandırmak için kullanılır. Bu arada, toplama işlevleri kullanılırken cümle GRUPLANDIRMAYA GÖRE tüm sorgu sonuçları tek bir satırda gruplandırılırken hiç belirtilmeyebilir.

Örnek:
// Hangi karşı tarafları bulmak gerekiyor
// mallar dönem için sevk edildi.
Çeşitli Seç
Belge.Fatura.Yüklenici

8) Talimat GRUPLANDIRMAYA GÖRE iç içe geçmiş bir tablonun alanlarına toplama işlevleri uygulanmışsa, sonuçları bu alanlara göre gruplandırmadan üst düzey alanlara erişmenizi sağlar. 1C yardımında yazılmasına rağmen, sorgu sonuçlarını gruplandırırken, seçim alanları listesinde toplama işlevleri belirtilmelidir ve toplama işlevlerine ek olarak, seçim listesinde yalnızca gruplandırmanın yapıldığı alanlar belirtilebilir. alanlar.

Örnek:
SEÇMEK
Mal ve Hizmet Girişi Mallar (SUM (Miktar), Sınıflandırma),
Mal ve Hizmetin Alınması Bağlantı,
Mal ve Hizmetlerin Alınması Karşı Taraf
İTİBAREN
Belge.Mal ve Hizmetlerin Alındığı Mal ve Hizmetlerin Alındığı OLARAK
GRUPLANDIRMAYA GÖRE
Mal ve Hizmetlerin Kabulü Mallar (Terminoloji)

9) Talimat ISNULL NULL değerini başka bir değerle değiştirmek amaçlanmıştır, ancak ilk parametrenin türü bir dize veya sayı ise ikinci parametrenin birincinin türüne dönüştürüleceğini unutmayın.

10) Ana tabloya atıfta bulunurken, koşuldaki alt tablonun verilerine başvurabilirsiniz. Bu özelliğe bir alt tablonun alanlarının başvurusunun kaldırılması denir.

Örnek (tablo bölümünde belirli bir ürünü içeren belgeleri arayın):
SEÇMEK
Giriş.Bağlantı
İTİBAREN
Document.Incoming Burada Incoming.Mal.Nomenclature = &Nomenclature.

Bu sorgunun Incoming.Products alt tablosundaki sorguya göre avantajı, belgelerde yinelenenler varsa, sorgu sonucunun anahtar kelimeyi kullanmadan yalnızca benzersiz belgeleri döndürmesidir. ÇEŞİTLİ.

11) İlginç bir operatör seçeneği İÇİNDE(Alan1, Alan2, ... , AlanN) In (Alan1, Alan2, ... , AlanN) gibi kümelerin kümesinde sıralı bir kümenin oluşumunun kontrolüdür.

Örnek:
SEÇMEK
Müteahhitler.Link
NEREDE
(Yükleniciler.Link, Ürünler.Link)
(Satış.Müşteri, Satış.Ürün SEÇİN
Birikim Kaydı'ndan Satış AS Satış)
İTİBAREN
Dizin.Karşı taraflar,
Dizin.Ürünler

12) Mümkün olduğunda, kullanın sanal tablolar istekler. Bir sorgu oluştururken, sistem veri kaynakları olarak bir dizi sanal tablo sağlar - bunlar aynı zamanda ilgili kod bölümünün yürütülmesi sırasında sistemin oluşturduğu bir sorgunun sonucu olan tablolardır.

Geliştirici, sistemin kendisine sanal tablolar olarak sağladığı verileri bağımsız olarak elde edebilir, ancak bu verileri elde etmek için algoritma optimize edilmeyecektir, çünkü:

  • Tüm sanal tablolar parametrelendirilir, yani geliştiriciye, sanal tablo oluşturmak için bir istek oluştururken sistemin kullanacağı bazı parametreleri ayarlama fırsatı verilir. Geliştirici tarafından hangi sanal tablo parametrelerinin belirtildiğine bağlı olarak, sistem aynı sanal tabloyu elde etmek için FARKLI sorgular oluşturabilir ve bunlar, geçirilen parametreler açısından optimize edilir.
  • Bir geliştiricinin, sistemin erişebildiği verilere erişmesi her zaman mümkün değildir.
13) İstemci-sunucu çalışma modunda, işlev ALT DİZGİ() SUBSTRING() işlevinin sonuç türünü, parametrelerinin türüne ve değerlerine bağlı olarak karmaşık kurallara göre hesaplayan SQL Server veritabanı sunucusuna iletilen ilgili SQL ifadesinin SUBSTRING() işlevi kullanılarak gerçekleştirilir. kullanıldığı bağlama göre değişir. Çoğu durumda, bu kurallar bir sorgunun yürütülmesini etkilemez, ancak SQL Server tarafından hesaplanan sonuç dizesinin maksimum uzunluğunun sorgu yürütülmesi için gerekli olduğu durumlar vardır. Bazı bağlamlarda SUBSTRING() işlevini kullanırken, sonucunun maksimum uzunluğunun, SQL Server'da 4000 karakter olan sınırlı uzunlukta bir dizenin maksimum uzunluğuna eşit olabileceğini akılda tutmak önemlidir. Bu, sorgu yürütmede beklenmeyen bir çökmeye neden olabilir:
SQL Server için Microsoft OLE DB Sağlayıcısı: Uyarı: GROUP BY veya ORDER BY yan tümcesindeki tüm sütunların toplam uzunluğu 8000 baytı aştığı için, sorgu işlemcisi optimize ediciden bir sorgu planı üretemedi.
HRESULT=80040E14, SQLSTATE=42000, yerel=8618
Bu hatayı önlemek için, sınırsız uzunluktaki dizileri sınırlı uzunluktaki dizilere dönüştürmek için SUBSTRING() işlevinin kullanılması önerilmez. Bunun yerine, EXPRESS() atama operatörünü kullanmak daha iyidir.

14) Dikkatli kullanın VEYA WHERE yapısında, OR ile bir koşulun kullanılması sorguyu önemli ölçüde "ağırlaştırabilir". CONNECT ALL yapısı ile sorunu çözebilirsiniz.

Örnek:
SEÇMEK

İTİBAREN

NEREDE
_DemoContractors.Link = &Link1

TÜMÜNÜ BİRLEŞTİRİN

SEÇMEK
_Demo Karşı Taraflar.AdTam
İTİBAREN
Directory._DemoContractors NASIL _DemoContractors
NEREDE
_DemoContractors.Link = &Link2

15) Durum DEĞİL WHERE yapısında, bir tür NOT (OR1 OR2 ... ORn) olduğu için sorgunun yürütme süresini artırır, bu nedenle büyük tablolar için IS NULL koşuluyla bir LEFT JOIN kullanmayı deneyin.

Örnek:
SEÇMEK
_DemoContractors.Link
İTİBAREN
Directory._DemoContractors NASIL _DemoContractors
SOL KATIL Document._DemoBuyerOrder AS _DemoBuyerOrder
Yazılım _DemoContractors.Link = _BuyerDemoOrder.Contractor
NEREDE
_Alıcının DemoOrder.Karşı Tarafı BOŞ

15) Kullanırken Geçici tablolar koşulu indekslemeniz ve bu tablolardaki alanları birleştirmeniz gerekir, ANCAK indeksleri kullanırken sorgu daha da yavaş çalışabilir. Bu nedenle, indeksli ve indekssiz her sorguyu analiz etmek, sorgu yürütme hızını ölçmek ve nihai bir karar vermek gerekir.
Verileri başlangıçta bazı alanlarda indekslenen geçici bir tabloya yerleştirirseniz, geçici tabloda artık bu alanlarda bir indeks olmayacaktır.

16) Eğer kullanmıyorsanız Geçici tablo yöneticisi, o zaman geçici tabloyu açıkça silmeye gerek yoktur, toplu sorgu tamamlandıktan sonra silinecektir, aksi takdirde geçici tablo aşağıdaki yollardan biriyle silinmelidir: sorguda DELETE komutunu kullanarak, TemporaryTable'ı çağırın Manager.Close() yöntemi.

Sorgu dili, geliştiriciler için 1C 8.3'ün temel mekanizmalarından biridir. Sorguların yardımıyla, veritabanında depolanan herhangi bir veriyi hızlı bir şekilde alabilirsiniz. Sözdizimi SQL'e çok benzer, ancak bazı farklılıklar vardır.

1C 8.3 (8.2) sorgulama dilinin SQL'e göre başlıca avantajları:

  • referans alanlarının referanslarının kaldırılması (bir veya daha fazla noktanın nesne niteliklerine dönüştürülmesi);
  • sonuçlarla çalışmak çok uygundur;
  • sanal tablolar oluşturma yeteneği;
  • istek hem İngilizce hem de Rusça olarak yazılabilir;
  • kilitlenmeleri önlemek için verileri engelleme yeteneği.

1C'de sorgu dilinin dezavantajları:

  • SQL'den farklı olarak, 1C sorgularında verileri değiştirmenize izin verilmez;
  • saklı yordamların eksikliği;
  • bir diziyi bir sayıya dönüştürmenin imkansızlığı.

1C sorgulama dilinin temel yapıları hakkındaki mini eğitimimizi inceleyin.

1C'deki isteklerin yalnızca veri almanıza izin vermesi nedeniyle, herhangi bir istek "SEÇ" kelimesiyle başlamalıdır. Bu komuttan sonra veri almak istediğiniz alanlar belirtilir. "*" belirtirseniz, mevcut tüm alanlar seçilecektir. "FROM" kelimesinden sonra verilerin seçileceği yer (belgeler, kayıtlar, dizinler vb.) belirtilir.

Aşağıdaki örnekte, tüm terminolojinin adları "The Nomenclature" referans kitabından seçilmiştir. “NASIL” kelimesinden sonra tablolar ve alanlar için takma adlar (isimler) belirtilir.

SEÇMEK
Terminoloji.Ad AS AdNomenklatür
İTİBAREN
Dizin İsimlendirme AS İsimlendirme

"SELECT" komutunun yanında anahtar kelimeler belirleyebilirsiniz:

  • ÇEŞİTLİ. Sorgu, yalnızca en az bir alanda farklılık gösteren (yinelenenler olmadan) satırları seçecektir.
  • İLK n, Nerede N– seçilecek sonucun başından itibaren satır sayısı. Çoğu zaman, bu yapı sıralama (ORDER BY) ile birlikte kullanılır. Örneğin, tarihe göre belirli sayıda en son belgeyi seçmeniz gerektiğinde.
  • İZİN VERİLMİŞ. Bu tasarım, veritabanından yalnızca geçerli kullanıcı tarafından kullanılabilen kayıtları seçmenize olanak tanır. Bu anahtar kelime kullanılırsa, kullanıcı erişimi olmayan kayıtları sorgulamaya çalıştığında bir hata mesajı alır.

Bu anahtar kelimeler hep birlikte veya ayrı ayrı kullanılabilir.

DEGİSİM İCİN

Bu madde, çakışmaları önlemek için verileri kilitler. Kilitli veriler, işlem bitene kadar başka bir bağlantıdan okunmayacaktır. Bu yan tümcede, kilitlemek istediğiniz belirli tabloları belirtebilirsiniz. Aksi takdirde, tümü engellenecektir. Tasarım yalnızca otomatik engelleme moduyla ilgilidir.

Çoğu zaman, bakiye alırken "DEĞİŞİM İÇİN" maddesi kullanılır. Nitekim programda aynı anda birkaç kullanıcı çalıştığında biri bakiyeleri alırken diğeri bunları değiştirebilir. Bu durumda, ortaya çıkan bakiye artık doğru olmayacaktır. Verileri bu teklifle bloke ederseniz, ilk çalışan doğru bakiyeyi alana ve onunla gerekli tüm manipülasyonları yapana kadar, ikinci çalışanın beklemesi gerekecektir.

SEÇMEK
Karşılıklı yerleşim Çalışan,
Karşılıklı ödemeler Tutar Karşılıklı ödemeler Bakiye
İTİBAREN
Birikim Kaydı Çalışanlar İLE Karşılıklı Yerleştirmeler Karşılıklı Yerleştirme OLARAK Bakiyeler
DEGİSİM İCİN

NEREDE

Yüklenmemiş verilere herhangi bir seçim uygulamak için yapılandırma gereklidir. Kayıtlardan veri almanın bazı durumlarında, sanal tabloların parametrelerinde seçim koşullarını belirtmek daha mantıklıdır. "WHERE" kullanılırken, önce tüm kayıtlar alınır ve ancak o zaman seçim uygulanır, bu da sorguyu önemli ölçüde yavaşlatır.

Aşağıda, belirli bir pozisyona sahip irtibat kişilerini bulma talebine bir örnek verilmiştir. Seçim parametresi şu formata sahiptir: &ParameterName (parametre adı isteğe bağlıdır).

SEÇİM (VAKA)

Yapı, koşulları doğrudan istek gövdesinde belirtmenize olanak tanır.

Aşağıdaki örnekte, "AdditionalField", belgenin gönderilip gönderilmemesine bağlı olarak metin içerecektir:

SEÇMEK
KabulT&U.Link,
SEÇENEK
NE ZAMAN
SONRA "Belge gönderildi!"
BAŞKA "Belge gönderilmedi..."
EkAlan OLARAK SONLANDIRIN
İTİBAREN
Belge.Malın FişiHizmet Olarak FişT&C

KATILMAK

Birleştirmeler, iki tabloyu belirli bir bağlantı koşuluyla bağlar.

SOL/SAĞ BİRLEŞTİRME

LEFT birleştirmenin özü, belirtilen ilk tablonun tamamen alınması ve ikincisinin bağlantının durumuna göre ona eklenmesidir. İkinci tablodaki ilk tabloya karşılık gelen kayıt yoksa, değerleri NULL ile değiştirilir. Basitçe söylemek gerekirse, ana tablo belirtilen ilk tablodur ve ikinci tablonun verileri (varsa) verilerinin yerine zaten konulmuştur.

Örneğin, kalem kalemlerini "Mal ve hizmet girişi" belgelerinden ve fiyatları bilgi kaydından "Ürün fiyatları" almanız gerekir. Bu durumda, herhangi bir pozisyonun fiyatı bulunamazsa, bunun yerine NULL yazın. Belgedeki tüm kalemler, fiyatları olup olmadığına bakılmaksızın seçilecektir.

SEÇMEK
T&U Nomenklatür makbuzu,
Fiyatlar.Fiyat
İTİBAREN
Belge.Malların FişiHizmetlerin.Malların Fiş Olarak KabulüT&C
İÇ BİRLEŞİM
ON Soru-Cevap Nomenklatürünün Alınması = Fiyatlar.Nomenklatür

RIGHT'ta her şey tam tersidir.

TAM BAĞLANTI

Bu tür birleştirme, sonuç olarak hem birinci tablonun hem de ikinci tablonun tüm kayıtlarının döndürülmesi bakımından öncekilerden farklıdır. Belirtilen bağlantı koşulu için birinci veya ikinci tabloda hiçbir kayıt bulunamazsa, bunun yerine NULL döndürülür.

Önceki örnekte tam birleştirme kullanılırken, Mal ve Hizmet Girişi belgesindeki tüm kalem kalemleri ve Kalem Fiyatları kaydındaki tüm son fiyatlar seçilecektir. Hem birinci hem de ikinci tablodaki bulunmayan kayıtların değerleri NULL olacaktır.

İÇ BİRLEŞİM

INNER birleştirme ile FULL birleştirme arasındaki fark, tablolardan en az birinde bir kayıt bulunmazsa, sorgunun onu hiç göstermemesidir. Sonuç olarak, önceki örnekte FULL'u DAHİLİ olarak değiştirirsek, yalnızca Mal ve Hizmet Girişi belgesindeki Kalem Fiyatları bilgi kaydında kendileri için girişler bulunan kalem kalemleri seçilecektir.

GRUPLANDIRMAYA GÖRE

1C sorgularında gruplandırma, tablo satırlarını (gruplandırma alanları) belirli bir ortak özelliğe (gruplandırma alanları) göre daraltmanıza olanak tanır. Gruplandırma alanları yalnızca toplama işlevleri kullanılarak görüntülenebilir.

Bir sonraki sorgunun sonucu, maksimum fiyatlarıyla birlikte öğe türlerinin bir listesi olacaktır.

SEÇMEK
,
MAKS(Fiyat.Fiyat) AS Fiyat
İTİBAREN

GRUPLANDIRMAYA GÖRE
Fiyatlar.Nomenclature.TypeNomenclature

SONUÇLAR

Gruplamadan farklı olarak, toplamları kullanırken tüm kayıtlar görüntülenir ve toplam satırları bunlara zaten eklenir. Gruplandırma yalnızca genelleştirilmiş kayıtları görüntüler.

Sonuçlar tablonun tamamı için ("GENEL" anahtar kelimesi kullanılarak), birkaç alan için, hiyerarşik yapıya sahip alanlar için ("HİYERARŞİ", "YALNIZCA HİYERARŞİ" anahtar sözcükleri) özetlenebilir. Özetlerken, toplama işlevlerini kullanmak gerekli değildir.

Gruplamayı kullanarak yukarıdaki örneğe benzer bir örnek düşünün. Bu durumda, sorgu sonucu yalnızca gruplandırılmış alanları değil, aynı zamanda ayrıntılı kayıtları da döndürür.

SEÇMEK
Fiyatlar.Nomenklatür.Nomenklatür Tipi AS Nomenklatür Tipi,
Fiyatlar.Fiyat AS Fiyat
İTİBAREN
RegisterInformation.PricesNomenclature.SliceLast AS Fiyatlar
SONUÇLAR
MAKSİMUM(Fiyat)
İLE
Tip Terminolojisi

SAHİP OLMAK

Bu işleç, WHERE işlecine benzer, ancak yalnızca toplama işlevleri için kullanılır. Bu operatör tarafından kullanılanlar dışındaki diğer alanlar gruplandırılmalıdır. "WHERE" operatörü, toplama işlevleri için geçerli değildir.

Aşağıdaki örnekte, madde türüne göre gruplandırılmış olarak 1000'i geçerse maksimum madde fiyatları seçilir.

SEÇMEK

MAKS(Fiyat.Fiyat) AS Fiyat
İTİBAREN
RegisterInformation.PricesNomenclature.SliceLast AS Fiyatlar
GRUPLANDIRMAYA GÖRE
Fiyatlar.Nomenclature.TypeNomenclature
SAHİP OLMAK
MAKS(Fiyatlar.Fiyat) > 1000

GÖRE SIRALA

"ORDER BY" operatörü, sorgu sonucunu sıralar. Kayıtların tutarlı bir sırayla çıkarılmasını sağlamak için AUTO-ORDER kullanılır. İlkel türler olağan kurallara göre sıralanır. Başvuru türleri GUID'e göre sıralanır.

Ada göre sıralanmış bir çalışan listesi alma örneği:

SEÇMEK
Çalışanlar.Adı AS Adı
İTİBAREN
Directory.Çalışanlar AS Çalışanları
GÖRE SIRALA
İsim
OTO SİPARİŞ

1C sorgu dilinin diğer yapıları

  • BİRLEŞİN- birinde iki sorgunun sonuçları.
  • TÜMÜNÜ BİRLEŞTİRİN– JOIN'e benzer, ancak aynı satırları gruplamaz.
  • BOŞ MASA- bazen boş bir iç içe tablo belirtmek için sorguları birleştirirken kullanılır.
  • KOYMAK- karmaşık 1C sorgularını optimize etmek için geçici bir tablo oluşturur. Bu tür isteklere toplu istekler denir.

Sorgu dili özellikleri

  • SUBSTRING bir dizeyi belirtilen bir konumdan belirtilen karakter sayısı kadar keser.
  • YIL…İKİNCİ sayısal türün seçilen değerini almanıza izin verir. Giriş parametresi bir tarihtir.
  • DÖNEM BAŞI VE DÖNEM SONU tarihlerle çalışırken kullanılır. Dönem tipi (GÜN, AY, YIL vb.) ek parametre olarak belirtilir.
  • TARİH EKLE belirli bir türün (SANİYE, DAKİKA, GÜN vb.) belirtilen saatini tarihe eklemenizi veya tarihten çıkarmanızı sağlar.
  • TARİH FARKIçıkış değerinin türünü (GÜN, YIL, AY vb.) belirterek iki tarih arasındaki farkı belirler.
  • ISNULL eksik değeri belirtilen ifadeyle değiştirir.
  • SUNUM ve SUNUMBAĞLANTILARI belirtilen alanın dize gösterimini alın. Sırasıyla herhangi bir değer ve yalnızca referans değerleri için kullanılırlar.
  • TİP, DEĞER TİPİ giriş parametresinin türünü belirlemek için kullanılır.
  • BAĞLANTIöznitelik değer türü için mantıksal bir karşılaştırma işlecidir.
  • İFADE ETMEK değeri istenen türe dönüştürmek için kullanılır.
  • TARİH SAAT sayısal değerlerden (Yıl, Ay, Gün, Saat, Dakika, Saniye) "Tarih" türünde bir değer alır.
  • ANLAM 1C talebinde, önceden tanımlanmış değerleri - dizinler, numaralandırmalar, özellik türleri için planlar - belirtmek için kullanılır. Kullanım örneği: " Burada LegalIndividual = Value(Enumeration.LegalIndividual.Individual)«.

Sorgu oluşturucu

1C ile sorgu oluşturmak için çok uygun bir yerleşik mekanizma vardır - sorgu tasarımcısı. Aşağıdaki ana sekmeleri içerir:

  • "Tablolar ve alanlar" - seçilecek alanları ve bunların kaynaklarını içerir.
  • "Bağlantılar" - BAĞLANTI yapısı için koşulları açıklar.
  • "Gruplandırma" - gruplama yapılarının açıklamasını ve bunlar tarafından özetlenen alanları içerir.
  • "Koşullar" - talepteki verilerin seçiminden sorumludur.
  • "Gelişmiş" - "SELECT" komutunun anahtar sözcükleri vb. gibi ek sorgu parametreleri.
  • “Birleştirmeler / Takma Adlar” - tabloları birleştirme olasılıkları belirtilir ve takma adlar ayarlanır (“NASIL” yapısı).
  • "Sipariş" - sorguların sonucunu sıralamaktan sorumludur.
  • "Toplamlar" - "Gruplandırma" sekmesine benzer, ancak "TOPLAMLAR" yapısı için kullanılır.

İsteğin metni, sol alt köşedeki "İstek" düğmesine tıklayarak görüntülenebilir. Bu formda manuel olarak düzeltilebilir veya kopyalanabilir.


Sorgu Konsolu

"Kuruluş" modunda bir sorgunun sonucunu hızlı bir şekilde görüntülemek veya karmaşık sorgularda hata ayıklamak için . Sorgu metni içine yazılır, parametreler ayarlanır ve sonucu gösterilir.

Sorgu konsolunu ITS diskinden veya .

Dilin yukarıdaki makalelerde dikkate alınmayan özelliklerini açıklamaya ve açıklamaya karar verdim. Makale yeni başlayan geliştiricilere yöneliktir.

1. İnşaat "FROM".

Veritabanından veri almak için "FROM" yapısının kullanılması gerekli değildir.
Örnek: Bankalar ile ilgili tüm bilgileri banka dizininden seçmemiz gerekiyor.
Rica etmek:

Directory.Banks.* SEÇİN

Bankalar dizinindeki tüm alanları seçer. Ve sorguya benzer:

Dizinden Banks.* SEÇİN.Bankalar AS Banks

2. Verileri referans alanına göre sipariş edin

Sorgu verilerini ilkel türlere göre sıralamamız gerektiğinde: "Dize", "Sayı", "Tarih", vb. Verileri bir referans alanına göre sıralamanız gerekiyorsa, her şey "ORDER BY" yapısı kullanılarak çözülür? Referans alanı bir bağlantıdır, benzersiz bir tanımlayıcıdır, örn. Kabaca söylemek gerekirse, rastgele belirli bir karakter dizisi ve olağan sıralama beklenen sonucu vermeyebilir. Referans alanlarını sıralamak için "AUTOORDER" yapısı kullanılır. Bunu yapmak için önce "ORDER BY" yapısını ve ardından "AUTOORDER" yapısını kullanarak verileri doğrudan referans türüne göre sıralamanız gerekir.

Bu durumda, belgeler için sıralama "Tarih-> Sayı" sırasına göre, dizinler için - "Ana görünüm" ile gerçekleşir. Sıralama referans alanlarına dayalı değilse, "AUTOORDER" yapısının kullanılması önerilmez.

Bazı durumlarda, "AUTOORDER" yapısı örnekleme sürecini yavaşlatabilir. Benzer şekilde, belgeleri otomatik düzenlemeden yeniden yazabilirsiniz:

3. Referans tipinin metinsel temsilinin elde edilmesi. "SUNUŞ" yapımı.

Örneğin, "Bankalar" dizininin öğesine bir bağlantı olan "Banka" alanını görüntülemek için bir referans türü alanı görüntülemeniz gerektiğinde, bu alan görüntülendiğinde, bir alt sorgu olduğunu anlamanız gerekir. "Bankalar" dizini, dizinin aranmasını sağlamak için otomatik olarak yürütülecektir. Bu, veri çıkışını yavaşlatacaktır. Bunu önlemek için, nesnenin temsilini hemen almak ve onu zaten görüntüleme için görüntülemek için istekte "TEMSİLCİ" yapısını kullanmak gerekir.

Veri birleştirme sisteminde, bu mekanizma varsayılan olarak kullanılır, ancak hücrelerde düzenler oluştururken, referans alanın temsilini belirtmeli ve örneğin, bağlantının kendisini transkripte koymalısınız.

4. Şablona göre veri örnekleme koşulu.

Örneğin, çalışanların cep telefonlarını (8 -123-456-78-912) formunda almanız gerekir. Bunu yapmak için, talebe aşağıdaki koşulu koymanız gerekir:

Telefon OLARAK "_-___-___-__-__" GİBİ Çalışan OLARAK Directory.Employees OLARAK Çalışan.Adı, Çalışan.Telefon OLARAK SEÇİN

"_" karakteri hizmettir ve herhangi bir karakterin yerine geçer.

5. Toplamların ve gruplamaların eşzamanlı kullanımı.


Toplamlar genellikle gruplamalarla birlikte kullanılır, bu durumda toplamlardaki toplama işlevleri ihmal edilebilir.

Services.Organization AS Organizasyon, Services.Nomenclature AS Terminolojisi, AMOUNT(Hizmetler.Belge Tutarı) AS Document.Services'TEN Belge Tutarı SEÇİN.

Bu durumda istek, bu istekle hemen hemen aynı şekilde dönecektir:

Hizmetleri SEÇİN Organizasyon AS Organizasyonu, Hizmetler Terminoloji AS Terminolojisi, Hizmetler Belge Tutarı AS Belge Tutarı Belgeden.

Yalnızca ilk sorgu, aynı terminolojiye sahip kayıtları daraltacaktır.

6. Referanssız alanlar.

Alanlara bir nokta aracılığıyla başvurulması, referans alan başvurusunu kaldırma işlemi olarak adlandırılır. Örneğin Ödeme.Organizasyon.İdari Birim. Bu durumda, "Ödeme" belgesinin "Kuruluş" referans alanında, "İdari Birim" özniteliğinin değerinin alınacağı başka bir "Kuruluşlar" tablosuna atıfta bulunur. Alanlara bir noktadan erişirken, platformun dolaylı olarak bir alt sorgu oluşturduğunu ve bu tabloları birleştirdiğini anlamak önemlidir.

Rica etmek:

Şu şekilde temsil edilebilir:

Payment.Link, Payment.Organization, Payment.Organization, Organizations'ı SEÇİN. Document.Payment AS'den AdministrativeUnit Payment AS KATILIN Directory.Organizations AS Organizations Software Payment.Organization = Organizations.Link

Bileşik bir türdeki referans alanlarının başvurusu kaldırılırken, çerçeve, alan türünün parçası olan tüm tablolara örtük birleştirmeler oluşturmaya çalışır. Bu durumda sorgu optimal olmayacaktır, eğer alanın ne tür olduğu açıkça biliniyorsa, bu tür alanları yapılandırma ile türe göre kısıtlamak gerekir. İFADE ETMEK().

Örneğin, birkaç belgenin kayıt memuru olarak hareket edebileceği bir birikim kaydı "Ayrılmamış ödemeler" vardır. Bu durumda kayıt şirketi detaylarının değerlerini şu şekilde almak yanlıştır:

Tahsis Edilmemiş Ödemeler.Kayıt Kuruluşu.Tarih, ..... Birikim Kaydı'ndan. Tahsis Edilmemiş Ödemeler OLARAK Tahsis Edilmemiş Ödemeler SEÇİN

bileşik alan kaydedicinin türünü sınırlandırmalısınız:

EXPRESS SEÇİN(Dağıtılmamış Ödemeler. Belge OLARAK Kayıt Kuruluşu. Ödeme). Tarih, ..... Birikim Defterinden. Dağıtılmamış Ödemeler OLARAK Dağıtılmamış Ödemeler

7. İnşaat "NEREDE"

İki tablonun sol birleşiminde sağdaki tabloya "WHERE" koşulunu getirdiğimizde tabloların iç birleşimiyle elde ettiğimiz sonuca benzer bir sonuç elde ederiz.

Örnek. Müşteri Dizininden tüm Müşterileri seçmek ve "Organization" = &Organization öznitelik değerine sahip bir ödeme belgesine sahip müşteriler için "Ödeme" belgesini görüntülemek, olmayanlar için görüntülememek gerekir.

Sorgunun sonucu, yalnızca parametrede kuruluşa göre ödemesi olan müşterilerin kayıtlarını döndürür ve diğer müşterileri filtreler. Bu nedenle, önce "falanca" kuruluş için tüm ödemeleri geçici bir tabloda almanız ve ardından sol birleştirme ile "Müşteriler" dizinine bağlanmanız gerekir.

Payment.Reference AS Ödeme, Payment.Shareholder AS Müşterinin Belgeden ödemelere KOYDUĞU GİBİ SEÇİN. Payment AS Payment NEREDE Payment.Department = &Department; ////////////////////////////////////////////////////////////////////////////// / /////////////////////////////////////////// Müşterileri SEÇİN. Referans AS İstemci, ISNULL(topayments.Payment, "") OLARAK Ödeme ŞİMDİDEN Dizin .Clients AS İstemciler KATILDIKTAN SONRA

Bu durumu başka bir şekilde aşabilirsiniz. "NEREDE" koşulunu doğrudan iki tablonun ilişkisinde uygulamak gerekir. Örnek:

Directory.US_Subscribers AS ST_Subscribers'DAN Clients.Reference, Payment.Reference SEÇİN. Bağlantı

8. İç İçe ve Sanal Tablolarla Birleştirmeler

alt sorgular bazı koşullara göre veri seçmek için genellikle gereklidir. Daha sonra bunları diğer tablolarla birlikte kullanırsanız, bu, sorgunun yürütülmesini kritik ölçüde yavaşlatabilir.

Örneğin, bazı müşteriler için cari tarih için Bakiye Tutarını almamız gerekiyor.

UnallocatedPayBalances.Customer, UnallocatedPaymentsRemains.AmountBalance FROM SEÇİN (Clients.Reference AS Reference FROM Directory.Clients AS Clients WHERE Clients.Ref B(&Clients)) AS NestedQuery SOL JOIN Birikim register.UnallocatedPayments.Balance AS UnallocatedPayments Yazılımı NestedRequest.Reference = UnallocatedPayments kalır .Müşteri

Böyle bir sorgu yürütülürken, DBMS optimize edici bir plan seçerken hatalar yapabilir ve bu da yetersiz sorgu yürütülmesine yol açar. İki tabloyu birleştirirken, DBMS iyileştirici, her iki tablodaki kayıt sayısına bağlı olarak tabloları birleştirmek için bir algoritma seçer. İç içe sorgu durumunda, iç içe sorgunun döndüreceği kayıt sayısını belirlemek son derece zordur. Bu nedenle, iç içe geçmiş sorgular yerine her zaman geçici tablolar kullanmalısınız. O halde sorguyu yeniden yazalım.

Clients.Link'i Bağlantı Olarak SEÇİN İstemcileri Directory.Clients AS İstemcilerinden NEREYE KOYUN
Clients.Link B (&Müşteriler) ; ////////////////////////////////////////////////////////////////////////////// ////////////////////// tClients.Reference, UnallocatedPaymentsBalances.SumBalance SEÇİN, tClients AS tClients SOL KATIL Biriktirme Register.UnallocatedPayments.Balances (, Client IN (tClients SEÇİN) .Reference FROM tClients)) AS UnallocatedPaymentsBalances ON tClients.Reference = UnallocatedPaymentsBalances.Clients

Bu durumda, optimize edici, tClients geçici tablosunun kaç kayıt kullandığını belirleyebilecek ve en uygun tablo birleştirme algoritmasını seçebilecektir.

Sanal Tablolar , çoğu uygulama görevi için neredeyse hazır veriler elde etmenizi sağlar.(İlk Dilim, Son Dilim, Artıklar, Cirolar, Artıklar ve Cirolar) Buradaki anahtar kelime sanaldır. Bu tablolar fiziksel değildir, sistem tarafından anında birleştirilir, yani. sanal tablolardan veri alırken, sistem son kayıt tablolarından veri toplar, oluşturur, gruplandırır ve kullanıcıya verir.

Onlar. sanal bir tablo ile katıldığınızda, bir alt sorgu ile katılırsınız. Bu durumda, DBMS optimize edici, optimum olmayan bir birleştirme planı da seçebilir. Sorgu yeterince hızlı oluşturulmadıysa ve sorgu sanal tablolarda birleştirmeler kullanıyorsa, sanal tablolara erişimi geçici bir tabloya aktarmanız ve ardından iki geçici tablo arasında birleştirme yapmanız önerilir. Önceki sorguyu yeniden yazalım.

Clients.Link'i Bağlantı Olarak SEÇİN İstemcileri Directory.Clients AS İstemcilerinden OYNAYIN Bağlantıya Göre DİZİN
Clients.Link B (&Müşteriler) ; ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// arasında AyrılmamışÖdemeler.AmountBalance, AyrılmamışÖdemeler.Müşteri SEÇİN. (, Client IN (tClients.Reference FROM tClients)) AS AyrılmamışÖdemeBakiyeleri; ////////////////////////////////////////////////////////////////////////////// ////////////////////////////// tClients.Reference, thenRemains.SumRemainder SEÇİN tClients AS SumRemainder AS tClients tClients.Reference = tRemainders. Müşteri

9.Sorgunun sonucunu kontrol etme.

Sorgu yürütmenin sonucu boş olabilir; boş değerleri kontrol etmek için yapıyı kullanın:

RequestRes = Request.Execute(); Eğer reQuery.Empty() ise Geri Döndür; EndIf;

Yöntem Boş() yöntemlerden önce kullanılmalıdır Seçmek() veya Boşalt(), çünkü koleksiyonu almak zaman alıyor.

Sorguları bir döngüde kullanmanın son derece istenmeyen bir durum olduğu kimse için bir keşif değildir. Bu, belirli bir işlevin çalışma süresini önemli ölçüde etkileyebilir. Talepteki tüm verileri almak ve ancak bundan sonra verileri bir döngüde işlemek oldukça arzu edilir. Ancak bazen, isteği döngüden çıkarmanın imkansız hale geldiği durumlar vardır. Bu durumda optimizasyon için sorgunun oluşturulmasını döngünün dışına taşıyabilir ve döngüde gerekli parametreleri değiştirerek sorguyu çalıştırabilirsiniz.

İstek = Yeni İstek; Query.Text = "SEÇ | Clients.Link, | Clients.Date of Doğum |FROM | Directory.Clients AS Clients |WHERE | Clients.Link = &Client"; TableClients Döngüsünden Her Satır İçin Query.SetParameter("Client", Client); QueryResult = Query.Execute().Select(); Döngü Sonu;

Bu, sistemin isteği bir döngüde ayrıştırmasını önleyecektir.

11. İnşaat "HAVING".

Sorgularda oldukça nadir görülen bir yapı. Toplama işlevlerinin değerlerine (SUM, MINIMUM, AVERAGE, vb.) Koşullar uygulamanıza izin verir. Örneğin, yalnızca ödeme tutarı Eylül ayında 13.000 ruble'den fazla olan müşterileri seçmeniz gerekir. "WHERE" koşulunu kullanırsanız, önce geçici bir tablo veya iç içe bir sorgu oluşturmanız, oradaki kayıtları ödeme miktarına göre gruplandırmanız ve ardından bir koşul koymanız gerekir. "HAVING" yapısı bundan kaçınmaya yardımcı olacaktır.

Payment.Customer, SUM(Payment.Amount) OLARAK Belgeden Tutar SEÇİN.Payment AS Payment WHERE MONTH(Payment.Date) = 9 GRUP BY Payment.Customer SAHİP MİKTAR(Payment.Amount) > 13000

Yapıcıda tek yapmanız gereken "Koşullar" sekmesine gitmek, yeni bir koşul eklemek ve "Özel" onay kutusunu işaretlemek. O zaman sadece yaz Tutar(Ödeme Tutarı) > 13000


12. Boş değer

Veritabanındaki üç değerli mantığın ilkelerini burada açıklamayacağım, bu konuda birçok makale var. Nasıl olduğuna dair sadece bir bakış HÜKÜMSÜZ sorgunun sonucunu etkileyebilir. NULL değeri gerçekten bir değer değildir ve değerin tanımlanmadığı gerçeği bilinmemektedir. Bu nedenle, toplama, çıkarma, bölme veya karşılaştırma gibi NULL üzerindeki herhangi bir işlem NULL döndürür. NULL değeri NULL değeriyle karşılaştırılamaz çünkü neyi karşılaştıracağımızı bilmiyoruz. Onlar. bu karşılaştırmaların her ikisi de: NULL = NULL, NULL<>NULL, Doğru veya Yanlış değildir, bu bilinmiyor.

Bir örneğe bakalım.

Ödemesi olmayan müşterilerimiz için "Öznitelik" alanını "Ödeme yok" değeriyle görüntülememiz gerekir. Ve kesinlikle böyle müşterilerimiz olduğunu biliyoruz. Ve yukarıda yazdıklarımın özünü yansıtmak için şöyle yapalım.

Öznitelik OLARAK "Ödeme yok"u SEÇİN, Ödemelere Belge KOYDUĞU GİBİ BOŞ; ////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Clients.Link AS Client, Payment.Link AS Payment PUT tClientPayment FROM Directory.Clients AS Müşteriler KATILDI Document.Payment AS Ödeme Yazılımı Clients.Link = Payment.Shareholder; ////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////// tClientPayment'TEN tClientPayment.Customer'ı tClientPayment OLARAK SEÇİN. Belge

İkinci geçici tablo olan tCustomerPayment'e dikkat edin. Sol birleştirme ile tüm müşterileri ve bu müşteriler için tüm ödemeleri seçiyorum. Ödemesi olmayan müşterilerimiz için "Ödeme" alanı NULL olacaktır. Mantığı izleyerek, ilk geçici tabloda "topayments" 2 alan belirledim, bunlardan biri NULL, ikincisi "Ödeme yok" satırı. Üçüncü tabloda "Payment" ve "Document" alanları ile "tClientPayment" ve "tPayment" tablolarını inner join ile birleştiriyorum. İlk tabloda "Belge" alanının NULL olduğunu, ikinci tabloda "Ödeme" alanında ödemesi olmayanların da NULL olduğunu biliyoruz. Bize böyle bir bağlantıyı ne iade edecek? Ve hiçbir şey döndürmez. Çünkü NULL = NULL karşılaştırması True olarak değerlendirilmez.

Sorgunun beklenen sonucu bize döndürmesi için onu yeniden yazıyoruz:

"Ödeme yok"u İşaret OLARAK, VALUE(Belge. Ödeme. Boş Referans) OLARAK Ödemelere Belge KOYDUĞU GİBİ SEÇİN; ////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Müşterileri SEÇİN. İstemci AS Referansı, ISNULL(Payment.Reference, VALUE(Document.Payment. EmptyReference )) tClientPayment'I Directory.Clients AS'DAN NASIL KOYULUR Clients JOIN Document.Payment AS Payment'ı Clients.Reference'de Bırakın = Payment.Shareholder; ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// tclinpayment.payment'ı tclientpayment OLARAK tclientpay'den müşteri seç Belge

Şimdi, ikinci geçici tabloda, "Ödeme" alanı NULL ise, o zaman bu alanın = ödeme belgesine boş bir referans olduğunu belirttik. İlk Tabloda ayrıca NULL'u boş bir referansla değiştirdik. Artık NULL olmayan alanlar bağlantıya dahil edilir ve sorgu beklenen sonucu döndürür.

Makalede yer alan tüm talepler, dikkate almak istediğim durumları yansıtıyor ve daha fazlasını değil. HAKKINDA çılgın ya da optimal olamazlar, asıl mesele örneğin özünü yansıtmaktır.

13. Belgelenmemiş tasarım özelliği "CHOICE WHEN...THEN....END".

İstekte "Koşullar" yapısını tanımlamanın gerekli olduğu durumlarda, standart sözdizimini kullanırız:

CHOICE WHEN Users.Name = "Vasya Pupkin" SONRA "Favori çalışanımız" BAŞKA "Bunu bilmiyoruz" Directory.Users AS Users'DAN Field1 OLARAK SONLANDIRIN

Ancak, örneğin sorguda ayın adını almamız gerekirse ne olur? Bir sorguda büyük bir yapı yazmak çirkin ve zaman alıcıdır, bu nedenle yukarıdaki bu gösterim biçimi bize yardımcı olabilir:

Ay seçimi (grafik tabanlı değerlendirmenin hesaplanması. Periyodik hesap) 1 olduğunda, 2 olduğunda "Ocak", 3 olduğunda "Şubat", 4 olduğunda "Mart", 5 olduğunda "Nisan", 6 olduğunda "Mayıs" ve 7 olduğunda "Haziran" “Temmuz” sonra “Temmuz” 8 SONRA 9 OLDUĞUNDA "Ağustos" SONRA 10 OLDUĞUNDA "Eylül" SONRA 11 OLDUĞUNDA "Ekim" SONRA 12 OLDUĞUNDA "Kasım" SONRA SONRA "Aralık" AY OLARAK BİTİYOR

Artık tasarım o kadar hantal görünmüyor ve kolayca algılanıyor.

14. Toplu sorgu yürütme.


İstek üretmemek için, büyük bir istek oluşturabilir, onu paketlere ayırabilir ve onunla şimdiden çalışabilirsiniz.
Örneğin, "Kullanıcılar" dizininden "Doğum Tarihi" alanlarını ve her kullanıcı için mevcut rolleri almam gerekiyor. formdaki farklı tablo bölümlerine boşaltmak için. Tabii ki, bunu tek bir sorguda yapabilirsiniz, ardından kayıtlar üzerinde yineleme yapmanız veya daraltmanız gerekir veya şunu yapabilirsiniz:

Users.Link AS Ad, Users.Date of Birth, Users.Role SEÇİN Directory.Users AS Users'DAN Kullanıcılar GİRİN; ////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////// tuUsers.Name TARAFINDAN tuUsers GRUBU OLARAK tuUsers'TAN tuUsers.Name, tuUsers.Date of Doğum SEÇİN , tuKullanıcılar.Doğum Tarihi; ////////////////////////////////////////////////////////////////////////////// /////////////////////////////// wUsers.Name, wUsers TARAFINDAN wUsers GRUP OLARAK wUsers'TAN wUsers.Name, wUsers.Role SEÇİN Doğum Tarihi

tPackage = Request.ExecutePackage();

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

Gördüğümüz gibi, sorgu toplu olarak yürütülebilir ve sonuçla bir dizi olarak çalışabilir. Bazı durumlarda, çok uygun.

15. Toplu talepteki koşullar

Örneğin, "Kullanıcılar" dizininden "Ad, Doğum Tarihi, Kod" alanlarını ilk aldığımız ve "Bireyler" dizininden bu alanlarda koşullu kayıtlar almak istediğimiz bir toplu talebimiz var.

Kullanıcılar.Birey.Adı AS Ad, Kullanıcılar.Birey.Doğum Tarihi AS Doğum Tarihi, Kullanıcılar.Birey.Kod AS Kodu SEÇİN Dizin.Kullanıcılar AS Kullanıcılar'DAN Kullanıcılara KOYUN; ////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////.

Bunun gibi koşulları uygulayabilirsiniz:

NEREDE Bireyler.Kodu (TuUsers'tan TueUsers.Code'u SEÇİN) VE Bireyler.Adı (TuUsers'tan TueUsers.Code'u SEÇİN) VE Bireyler.Date of Doğum Tarihi (Tuusers'tan TueUsers.Date of Doğumu SEÇİN)

Ve şu şekilde mümkün:

NEREDE (Bireyler.Kodu, Bireyler.Adı, Bireyler.Doğum Tarihi) AT (SalıKullanıcılardan TueUsers.Code, TueUsers.Name, TueUsers.Date of Doğum SEÇİN)

Ve kurallara uyduğunuzdan emin olun.

16. Toplu Sorguda "Koşul" için Sorgu Oluşturucuyu Çağırın

Yukarıdaki örnekte olduğu gibi bir koşul koymanız gerektiğinde, sanal tabloda şu veya bu alanın nasıl çağrıldığını unutabilirsiniz.
Örneğin, "Doğum Tarihi" alanına bir koşul koymanız gerekiyor ve sanal tabloda bu alan "Borçlunun Doğum Tarihi" olarak adlandırılıyor ve adı unuttuysanız, düzenlemeden çıkmanız gerekecek. koşulu kaydetmeden ve alan adına bakın. Bunu önlemek için aşağıdaki numarayı kullanabilirsiniz.

"B" Konstrüksiyonundan sonra parantez koymak ve parantezler arasında bir boşluk (boşluk) bırakmak, bu yeri seçip sorgu yapıcısını çağırmak gerekir. Yapıcı, tüm toplu sorgu tablolarına erişebilir. Alım, hem sanal kayıt tablolarında hem de "Koşullar" sekmesi için çalışır. İkinci durumda, "A (keyfi koşul)" onay kutusunu işaretlemek ve "F4" düzenleme moduna girmek gerekir.

Sorgular genellikle hareket halindeyken yapılır ve sadece düşündüğüm "hileleri" göstermeye hizmet ederler.

Dizinlerin sorgularda kullanımını ele almak istedim, ancak bu acı verecek kadar kapsamlı bir konu. Ayrı bir yazıda koyacağım veya daha sonra buraya ekleyeceğim.

güncelleme1. Paragraf 11,12
güncelleme2. Öğeler 13,14,15,16

Kullanılmış Kitaplar:
1C:Enterprise 8 sorgulama dili - E.Yu. Krustalev
1C:Enterprise 8 sisteminde profesyonel gelişim.

/
Veri işlemenin uygulanması

Sorgu sonuçlarını sıralama

1.1. Sorgu sonuçlarını işleme algoritması, sorgudaki kayıtların sırasına bağlıysa veya sorgu işleme sonucu kullanıcıya şu veya bu biçimde sunuluyorsa, sorgu metni şu cümleyi kullanmalıdır: GÖRE SIRALA. İfade yokluğunda GÖRE SIRALA sorgu sonuçlarında kayıtların sunulma sırası hakkında hiçbir varsayımda bulunulamaz.

Ortaya çıkabilecek sorunların tipik örnekleri şunlardır:

  • sorgu sonuçlarına göre doldururken tablo bölümündeki farklı satır dizileri;
  • raporlarda farklı veri çıkışı sırası (satırlar, sütunlar);
  • sorgulama sonuçlarına göre belge hareketlerinin farklı doldurulması (*).

Aynı eylemleri gerçekleştirirken farklı sonuçlar alma olasılığı artar

  • bir bilgi tabanını başka bir DBMS'ye taşırken
  • DBMS sürümünü değiştirirken
  • DBMS parametrelerini değiştirirken

* Not: hareket oluşturan sorguların sonuçlarının sıralanması, yalnızca sıralama hareket oluşturma algoritmasının bir parçasıysa doğrulanır (örneğin, mal sevkiyatlarının dengesini FIFO'ya göre yazmak). Diğer durumlarda, ek sıralama DBMS üzerinde aşırı bir yük oluşturacağından kayıtlar sıralanmamalıdır.

1.2. Sorgu sonuçlarının şu ya da bu şekilde kullanıcıya gösterilmesi gerekiyorsa, o zaman

  • bu tür sorguların sonuçlarını ilkel türlerin alanlarına göre sıralamak gerekir;
  • başvuru türlerinin alanlarına göre sıralama, bu alanların dize temsillerine göre sıralama ile değiştirilmelidir.

Aksi takdirde, satırların sırası kullanıcıya rastgele (anlaşılmaz) görünecektir.

Ayrıca bkz: Değer tablosu satırlarını sıralama

1.3. Teklif yok GÖRE SIRALA sadece ne zaman haklı

  • sorgu sonuçlarını işleme algoritması, belirli bir kayıt sırasına dayanmaz
  • tamamlanan talebin işlenmesinin sonucu kullanıcıya gösterilmez
  • sorgu sonucu - açıkçası bir kayıt

ÇEŞİTLİ tasarım ile paylaşım

2. Sorgu yapıyı kullanıyorsa ÇEŞİTLİ, sıralama yalnızca seçimde yer alan alanlara göre yapılmalıdır (bölümde SEÇMEK).

Bu gereksinim, aşağıdaki sorgu yürütme özelliği ile ilgilidir: sıralama alanları, seçim alanlarına dolaylı olarak dahil edilir, bu da sorgu sonucunda seçim alanlarının aynı değerlerine sahip birkaç satırın görünmesine yol açabilir.

AUTOORDER yapısının kullanımına ilişkin kısıtlamalar

3. İnşaat kullanımı BİRİNCİ tasarım ile birlikte OTO SİPARİŞ yasaklı.

Diğer durumlarda, tasarım OTO SİPARİŞ Sıralama için hangi alanların kullanılacağı geliştirici tarafından kontrol edilmediğinden kullanılması da önerilmez. Böyle bir yapının kullanılması, yalnızca sonuçtaki kayıt sırasının önemli olmadığı, ancak kullanılan VTYS'den bağımsız olarak aynı olması gerektiği durumlarda haklı çıkar.

Dikkat! İşte, materyalleri tamamlanmamış olabilecek dersin deneme sürümü.

öğrenci olarak giriş yap

Okul içeriğine erişmek için öğrenci olarak oturum açın

Yeni başlayan programcılar için 1C 8.3 sorgulama dili: sipariş verme

Bir tablodan gelen bir sorgu yazalım Dizin.Yiyecek gıda kodu ve adı:

Dizinden Kod, Ad SEÇİN. Yiyecek

Her zaman olduğu gibi, bu sorguyu bilgisayarınızda çalıştırın.

Yüksek bir olasılıkla, aşağıdaki sonucu alacaksınız:

Şaşırmış olabilirsiniz, ancak sorgunun bu şekilde yazılmasıyla, hiç kimse bize tablodaki kayıtların tam olarak bu sırasını garanti etmiyor. İstemci-sunucu çalışma modunun çeşitli DBMS'lerde kullanılması durumunda sonuç şöyle olabilir:

Ve ..., genel olarak, sorgu sonucunun sıralama (sıralama) sırasını belirtmezsek, o zaman bu aynı sıranın kesinlikle herhangi bir şey olabileceğini anlıyorsunuz.

Bu nedenle, açıkça talep etmesek bile sorgu sonuçlarını sıralamak için sorgu yazarken iyi bir uygulamadır.

SİPARİŞ BY bölümü

Sorguyu sıralamak istediğiniz alanlar bölümünde listelenir. GÖRE SIRALA virgüllerle ayrılmış:

Sıralama alanı adını iki anahtar sözcükten biri takip edebilir:

  • DSÖ - artan sıralama.
  • TANIM - azalan sıralama.

Bu kelimelerden herhangi birini belirtmezseniz sıralamanın artan düzende olduğu kabul edilir.

Bilgi ile donanmış, sorgumuzun sonucunu azalan alanda sıralayalım kod:

Şimdi aşağıdaki tabloyu düzenleyelim.

böylece alana göre sıralama önce yapılır Tatmak artan ve ardından (aynı alan değerine sahip satırlar arasında Tatmak) alana göre sıralandı Renk Azalan:

REHBERDEN Lezzet, Renk SEÇİN. Lezzetine Göre Yemek Sırası. İsim VOZR, Renk. İsim DESC

Ayrıca, sıralamayı alanlara göre değil belirttiğimize dikkatinizi çekerim. Tatmak Ve Renk, ve onların dize sahne ile İsim. Dersin deneme sürümünü okuyorsunuz, tam dersler yer almaktadır.

Bunun nedeni, sıralamanın yalnızca aşağıdaki türlerden birine sahip alanlara göre mümkün olmasıdır: Astar, Sayı, tarih.

Ve alanlar Tatmak Ve Renk dizin öğelerine referanslardır Tatmak Ve Renk, mantıklı olmayan sıralama (bu durumda sıralama, bağlantının dahili tanımlayıcısı tarafından yapılacaktır). Ancak bu öğelerin niteliklerinden birine göre sıralayabilirsiniz. Bizim durumumuz için en uygun olanı bir string özniteliği olacaktır. İsim.

Otomatik sipariş verebilme

AUTOORDER anahtar sözcüğü, sorgu sonuçlarını sıralamak için alanların otomatik olarak oluşturulmasını etkinleştirmenizi sağlar.

Şimdi bu fırsatı ayrıntılı olarak tanıyacağız, ancak 1C şirketinin metodolojik tavsiyelerinde gereksiz yere kullanılmasını önermediği konusunda hemen bir rezervasyon yapmak istiyorum (bunun nedenlerinden bahsedeceğiz).

O zaman hadi gidelim.

Her şeyden önce, AUTOORDER anahtar kelimesi bir sorguda ORDER BY bölümünün hemen sonrasına veya yerine yerleştirilebilir:

Otomatik düzenleme aşağıdaki ilkelere göre çalışır:

Dava 1

Bir istekte bulunursa:

  • SİPARİŞ TARAFINDAN bir bölüm var

Arama tabloları için varsayılan sıralama alanları, yapılandırıcıdaki arama ayarlarına göre seçim yapılan kod ve addır:

Belge tabloları için varsayılan sıralama alanı belge tarihidir.

Bir örnek düşünün:

Sıralama alanı olduğundan Favori renk tipi var Referans.Renkler İsim

Vaka #2

Bir istekte bulunursa:

  • ama SONUÇLAR AÇIK bir bölüm var (bunun üzerinden geçeceğiz)

Bu durumda, sorgu sonucu toplam alanlara göre (aynı sırayla) sıralanacaktır.

Vaka #3

Bir istekte bulunursa:

  • eksik bölüm SİPARİŞ TARAFINDAN
  • SONUÇLAR AÇIK bölüm yok
  • ancak GROUP BY bölümü var (gruplandırmayı geçtik)

Bu durumda, sorgu sonucu alanları gruplandırarak (aynı sırayla) sıralanacaktır.

Bir örnek düşünün:

Gruplandırma alanı olduğundan Şehir tipi var Dizin.Şehirler, alanın ana görünüm olarak seçildiği ayarlarda İsim, bu durumda bu sorgu şuna eşdeğerdir:

Vaka #4

Son olarak, istekte ise:

  • eksik bölüm SİPARİŞ TARAFINDAN
  • SONUÇLAR AÇIK bölüm yok
  • GROUP BY bölümü eksik

Bu durumda, sorgu sonucu, verilerin seçildiği tablolar için varsayılan sıralama alanlarına göre sorguda göründükleri sıraya göre sıralanacaktır.

Bir örnek düşünün:

Otomatik düzenleme neden istenmez?

Otomatik düzenleme şunlar için iyidir:

  • evrensel sorgular için, geliştiricinin verilerin hangi tablolardan isteneceğini öngöremediği durumlarda
  • elde edilen kayıt sırasının önemli olmadığı, ancak kullanılan VTYS'den bağımsız olarak aynı olması gereken durumlar için

Diğer tüm durumlarda, otomatik sıralama özelliğinin kullanılması istenmez çünkü bugün sıralama alanı olan alanlar yarın sıralama alanı olmayabilir.

Örneğin, bugün bir aramadan sorgu sonuçlarına duyarlı kod yazabiliriz. Yiyecek alana göre sıralandı İsim.

Ve yarın, 1C (veya başka bir geliştirici), yapılandırıcıdaki veritabanı ayarlarını değiştirecek, böylece dizin için varsayılan sıralama alanı Yiyecekörneğin bir alan olur kod. Ve sorguda otomatik sıralamayı kullanırsak, sıralama düzeni zaten farklı olacağından raporumuz bozulur. Dersin deneme sürümünü okuyorsunuz, tam dersler yer almaktadır.

Bu nedenle, bölümde her zaman belirli alanlar ve onlar için belirli bir sıralama düzeni belirlemeye çalışın. GÖRE SIRALA, böyle bir istek artık şu şekilde kırılamaz:

Dizinden Kod, Ad SEÇİN. İsim YAŞA GÖRE YEMEK SIRASI

testi çöz

testi başlat

1. Sorgu sonuçları varsayılan olarak sıralanır

2. Sorgu sonuçları şuna göre sıralanabilir:

3. "FIELD_NAME TARAFINDAN SİPARİŞ" şuna göre sıralar:

4. Artan düzende sıralamak için ORDER BY bölümünde alan adını ve anahtar kelimeyi belirtmeniz gerekir.

5. Azalan düzende sıralamak için ORDER BY bölümünde alan adını ve anahtar kelimeyi belirtmeniz gerekir.

6. Sorgularda otomatik sıralama mümkündür