Basit sorgular. Aptallar için toplu istekler Bir istekle çalışma şeması

1C Enterprise platformu, aynı anda birkaç sorguyu sırayla yürütmenize olanak tanır. 1C'de buna istek paketi denir. Bir pakette her istek noktalı virgülle ayrılır.

Bir pakette sorguların adım adım yürütülmesini sağlamak için, kural olarak, başlangıçta geçici tablolar oluşturulur, ardından filtreler, birleştirmeler ve birleştirmeler gibi paylaşım koşulları oluşturulur. Bu sayede nihai sonuca ulaşılır. Bir toplu işte herhangi bir sorgulama sonucu elde edilen geçici tablolar, toplu olarak toplu sonuna kadar veya geçici tabloları yok eden bir sorgu yürütülünceye kadar varlığını sürdürür.

Ayrıca toplu sorguların ve geçici tabloların kullanılması, bu kodun tüm bölümünün okunabilirliğini önemli ölçüde artırır. İç içe sorgular da içeren karmaşık sorguların anlaşılması çok zor olabilir. Bununla birlikte, uzun ve karmaşık bir sorguyu birkaç parçaya bölerseniz ve hatta geçici tablolar kullanırsanız, bu yalnızca algıyı iyileştirmekle kalmayacak, aynı zamanda çoğu durumda performansın artmasına da yol açacaktır.

1C'de toplu sorgular lehine bir diğer önemli detay, aksine, toplu işteki her sorgunun sonucunu ayrı ayrı elde edebilmemizdir.

1C dilinde bir istek paketi oluşturma örneği

Sorgu paketinin nasıl oluşturulacağına dair bir örnek görmek için sorgu konsolundan netlik sağlamak amacıyla çağıracağımız sorgu tasarımcısını kullanacağız. Böylece paketi çalıştırmanın sonucunu hemen görebiliriz.

Basit bir toplu istek oluşturalım. İstek metnini hemen içine eklemenizi ve ardından onu açıp istek paketinin nasıl oluştuğunu görmenizi öneririm. Konsola yeni bir istek ekleyin ve aşağıdaki metni yapıştırın:

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

Kendini destekleyen bağlantı.
Kendini destekleyen. Ebeveyn,
Kendini destekleyen Kod,
Kendini destekleyen Hızlı Seçim Kodu,
Kendi kendini destekleyen isim.
Kendinden destekli. Tip,
Bilanço dışı,
Kendini destekleyen, niceliksel.
İTİBAREN
Hesap Planı Kendi Kendini Destekleyen AS Kendi Kendini Destekleyen.
NEREDE
Kendini destekleyen.Link = &Hesap
;
////////////////////////////////////////////////////////////////////////////////

SEÇMEK
Kendinden Destekli TiplerSubconto.Line Numarası AS Satır Numarası,
Subconto.ViewSubconto AS TypeSubconto'nun kendi kendini destekleyen türleri,
Kendinden destekliTypesSubconto.TypeSubconto.Name AS Adı,
Kendinden destekliTypesSubconto.TypeSubconto.ValueType ASValueType,
Self-supportingTypesSubconto.OnlyTurnover AS OnlyTurnover,
Self-supportingTypesSubconto.Summary AS Özetleyici
İTİBAREN
Hesap Planı Kendi Kendine Desteklenen Alt Hesap Türleri.
NEREDE
Self-supportingTypesSubaccount.Link = &Hesap
GÖRE SIRALA
Kendi kendini destekleyen TypesSubconto.NumberLines

Benim için şöyle görünüyor:

Şimdi sorgu tasarımcısına geçelim. Burada “Paket İste” sekmesiyle ilgileneceğiz:

Gördüğünüz gibi iki istekten oluşan bir paketimiz var. Bunlardan herhangi birine çift tıklayarak düzenlemeye devam edebilirsiniz:

“Tamam” butonuna tıklayın ve toplu isteğin sonucunu görmeye çalışın.

"Hesap" parametresini ayarlayalım. Hesap planından herhangi bir hesabı seçebilirsiniz. Muhtemelen zaten tahmin ettiğiniz gibi, bu istek paketinin hesap özelliklerini alması gerekir. “Çalıştır”a tıklayın ve sonucu görün:

Yöntemler Run() ve RunBatch()

okunabilirliği büyük ölçüde artırıyorlar, bu da hata olasılığını azaltıyor => bu tek başına benim için yeterli.

1C:Enterprise sürüm 8.0'ın yerleşik sorgu dili, geçici tabloları kullanma ve toplu sorgular yazma becerisinden yoksundu. Aynı zamanda, karmaşık hesaplamaların tek bir istek içinde (yani istemci - 1C:Enterprise sunucusu - DBMS sunucusu arasındaki bir etkileşim döngüsü) gerçekleştirilmesi sıklıkla gerekliydi. Bu tür sorunları çözmek için alt sorgular kullanıldı; meta veri nesnelerine değil, bu nesnelerden yapılan seçimlere yapılan çağrılar. Tipik olarak alt sorgular gruplandırmayla gerçekleştirildi ve çoğunlukla birleştirmelerde kullanıldı.

DBMS sunucusu iyileştiricisi (hangi DBMS'yi kullanırsanız kullanın) böyle bir sorguyu her zaman doğru şekilde optimize edemez. Bu durumda optimize edicinin sorunu doğru bağlantı yöntemini seçmektir. İki örneği birleştirmek için çeşitli algoritmalar vardır. Bir veya başka bir algoritmanın seçimi, bir ve diğer örnekte kaç kayıt bulunacağına bağlıdır. İki fiziksel tabloyu birleştiriyorsanız, DBMS mevcut istatistiklere dayanarak her iki örneğin boyutunu kolayca belirleyebilir. Birleştirilen seçimlerden biri alt sorgu ise kaç kayıt döndüreceğini anlamak çok zorlaşır. Bu durumda DBMS plan seçerken hata yapabilir ve bu da sorgu performansında ciddi bir düşüşe yol açabilir.

Yukarıdaki yöntemi kullanarak sorguyu yeniden yazmak, DBMS iyileştiricisinin çalışmasını basitleştirmeyi amaçlamaktadır. Yeniden yazılan sorguda, birleştirmelere katılan tüm seçimler fiziksel tablolar olacak ve DBMS, her seçimin boyutunu kolayca belirleyebilecektir. Bu, DBMS'nin mümkün olan tüm planlar arasında en hızlı olanı seçmesinin garanti edilmesini sağlayacaktır. Üstelik DBMS her koşulda en doğru seçimi yapacaktır. Bu şekilde yeniden yazılan bir sorgu herhangi bir DBMS'de eşit derecede iyi çalışacaktır; bu özellikle dolaşım çözümleri geliştirirken önemlidir. Ayrıca bu şekilde yeniden yazılan bir sorgu daha iyi okunur, anlaşılır ve hata ayıklanır.

Sorguyu bu şekilde yeniden yazarak, ek yük (geçici tabloların oluşturulması) nedeniyle sorguyu bir miktar yavaşlatmış olabileceğimiz anlaşılmalıdır. Eğer DBMS plan seçiminde hata yapmazsa muhtemelen eski sorguyu yeni sorgudan daha hızlı yürütecektir. Ancak bu yavaşlama her zaman son derece küçük olacaktır. Yavaşlamanın boyutu kullanılan DBMS'ye ve donanım performansına bağlıdır. Tipik bir durumda, tek bir geçici tablonun oluşturulması birkaç milisaniye sürebilir. Yani, bu yavaşlamaların sistem performansı üzerinde gözle görülür bir etkisi olamaz ve kural olarak göz ardı edilebilirler.

Makale, 1C:Enterprise platformunda uygulanan toplu isteklerin mekanizmasını açıklamaktadır. Makaleyi okuduktan sonra şunları öğreneceksiniz:

  • Toplu istekler nedir ve ne içindir?
  • Sorgu Oluşturucu'yu kullanarak bir dizi sorguyu nasıl oluşturabilirim?
  • Bir gruptan her sorgu için bir dizi sonuç nasıl döndürülür?

Uygulanabilirlik

Materyal, 1C:Enterprise platformunun mevcut sürümleri, sürüm 8.3 ile ilgilidir.

Bir grup isteğin amacı

Platform, toplu isteklerle çalışmanıza olanak tanır. Birkaç isteği “aynı anda” yürütme fırsatı buluyoruz. Toplu istekte istek metinleri “;” sembolü ile ayrılır. (noktalı virgül).

Sorgular sırayla yürütülür ve bir sorgunun yürütülmesi sırasında oluşturulan geçici tablolar, tüm sorgu kümesinin yürütülmesinin sonuna kadar veya bu geçici tabloyu yok eden toplu işte bir sorgunun yürütülmesine kadar mevcut olacaktır. Alt sorgudan önemli bir fark, her toplu sorgunun sonuçlarının ayrı ayrı mevcut olmasıdır.

Sorgu grupları, artımlı sorgu yürütme elde etmenize olanak tanır. Bunu yapmak için toplu sorguda önce geçici tablolar oluşturulur, ardından sorgunun nihai sonucunu elde etmek için bunlar birlikte kullanılır (birleşimler, birleşimler, filtreler). Toplu sorgularda geçici tabloların kullanılmasının sorgu metninin okunabilirliğini artırabileceğini de unutmamak gerekir.

İç içe geçmiş sorguların bulunduğu büyük sorguların anlaşılması genellikle oldukça zordur. Ancak böyle bir sorguyu geçici tablolar kullanarak yeniden yazarsanız sorgunun netliği oldukça artabilir. Geçici tablolar içeren bir sorgu paketinin kullanılması da sorgu performansını iyileştirebilir.

İç içe sorguların geçici tablolarla değiştirilmesine dayalı olarak sorgu performansını optimize etmeye yönelik teknikler vardır.

Aynı verileri büyük bir sorguda birden çok kez kullanmanız gerektiğinde (örneğin, diğer tablolara katılarak veya başka tablolarla birleşerek) geçici bir tablo yararlı olabilir. İç içe geçmiş sorgular kullanıldığında, bu tür verilerin aynı iç içe geçmiş sorgular kullanılarak birkaç kez alınması gerekir; bu da hem metnin okunabilirliğini hem de performansı kesinlikle etkiler.

Tasarımcıyı kullanarak bir grup istek oluşturma

Pakette yer alan bireysel istekler metin içerisinde “;” sembolü ile ayrılmıştır. (noktalı virgül). Sorgu metninin manuel olarak bölünmesini önlemek için bunun için sorgu oluşturucuyu kullanabilirsiniz.
Sorgu Oluşturucu'da sorgu grupları için ayrı bir sekme bulunur. İstekler, komut panelindeki ilgili düğme kullanılarak bir pakete eklenebilir ve yukarı veya aşağı taşınabilir.

Bireysel isteklerin görsel gösterimi - tasarımcının sağ tarafında, bireysel bir isteğin metnini düzenlemeye devam edebileceğiniz yer imleri. Bu sekmelerde, geçici tablolar için, veri alma talepleri için - "Paket 2 talebi" vb., imha için - "- NameVT" adları görüntülenir.

Bu pakette oluşturulan geçici tablolar aynı zamanda veritabanı tabloları listesinde de görünür. Ancak bu, geçici tabloların diğer tüm bilgi bankası tablolarıyla birlikte veritabanında saklandığı anlamına gelmez.

Paket İsteklerinin Gerçekleştirilmesi

Eğer nesne Rica etmek bir toplu istek yürütüldüğünde, geçici bir tablo yöneticisi kurulur; toplu isteğin bir parçası olarak yok edilmeyen geçici tablolar, kurulu yöneticiye kaydedilecektir.

Toplu istek metninde, toplu işlemin yürütülmek üzere başlatıldığı sırada kurulu geçici tablo yöneticisinde bulunan geçici tabloları kullanmak ve yok etmek mümkündür.

Yöntemin yanı sıra Koşmak() Paketin tüm isteklerini sırayla yürüten ve paketteki son isteğin sonucunu döndüren platformda başka bir yöntem daha var - ExecuteBatch().

Bu yöntem, tüm sorguları sırayla yürütür ve paketteki her sorgu için, paket gövdesindeki sorguların sırasına göre bir dizi sonuç döndürür.

Geçici bir tabloyu yok etmeye yönelik bir sorgunun sonucu şu değerdir: Tanımsız, aynı zamanda sonuçlar dizisine de yerleştirilir.

Bu makale SQL diline aşina olan okuyucular için hazırlanmıştır.

Sürüm 8'den beri kullanılan 1C sorgu dili, bugün veritabanlarıyla çalışmak için yararlı bir araç haline geldi; bu, onlardan okumanıza ancak yazmanıza izin vermiyor. Sözdizimsel olarak sorgu dili SQL diline çok benzer, ancak Rusçadır.

Aşağıda ana sorgu dili ile SQL operatörleri arasındaki yazışma tablosu verilmiştir:

1C sorgu dili operatörleri

SQL ifadesi

ÇEŞİTLİ

BİRLEŞTİRMEK

GRUPLANDIRMA ŞEKLİ

BİRLEŞTİR

GÖRE SIRALA

Ve bu tam bir liste değil. Mevcut sorgu dili operatörleri hakkında daha kapsamlı referans bilgileri, aşağıda tartışılacak olan sorgu tasarımcısından edinilebilir.

Program kodundan bir 1C isteğinin yürütülmesi, yerleşik dil nesnesi “Request” kullanılarak gerçekleştirilir. Yerleşik programlama dilini kullanarak veritabanı sorgusu yazmaya bir örnek:

Talep = Yeni Talep; Query.Text = "SELECT | Eşanlamlı.Bağlantı AS Bağlantısı |FROM | Directory.Directory1 AS Eşanlamlı"; Select = Query.Run().Select(); While Selection.Next() Döngü // Seçim işlemeyi ekle SelectionDetailedRecords EndCycle;

“Run” yöntemi sorguyu yürütür, “Select” yöntemi “SelectFromQueryResult” türünde bir değer döndürür. Bir değerler tablosu döndüren Unload yöntemini de kullanabilirsiniz.

İstek parametreleri "Parametreler" özelliğinde saklanır (bu durumda bu bir yapıdır, dolayısıyla tüm yapı yöntemleri burada uygulanabilir - ekleme, silme vb.).

“Query.Parameters.Insert” (“Directory”, DirectoryLink) parametresinin ayarlanmasına bir örnek. İstekte, "&Directory" işaretini kullanarak parametrelere erişebilirsiniz. Aşağıda parametreleri kullanan bir isteğin örneği verilmiştir:

Talep = Yeni Talep; Query.Text = "SELECT | Users.Link AS Bağlantısı, | Users.Parent AS Parent, | Users.Name AS Adı |FROM | Directory.Users AS Kullanıcılar |WHERE | Users.Link = &Directory"; Query.Parameters.Insert("Dizin", DirectoryLink); Select = Query.Run().Select(); While Selection.Next() Döngü // Seçim işlemeyi ekle SelectionDetailedRecords EndCycle;

Sorgu dilinin yalnızca veritabanından veri okumak için tasarlandığını, dolayısıyla INS ERT ve UPDATE gibi SQL ifadelerinin analoglarına sahip olmadığını hatırlayalım. Veriler yalnızca yerleşik 1C programlama dilinin nesne modeli aracılığıyla değiştirilebilir. Ayrıca 1C sorgu dilinde SQL'de analogları olmayan operatörler vardır, örneğin:

  • HİYERARŞİDE
  • YER
  • DİZİN:

HİYERARŞİDE– aktarılan bağlantının hiyerarşisinde yer alan hiyerarşik dizinin tüm öğelerini seçmenize olanak tanır. Örnek istek kullanımı HİYERARŞİDE:

Ürünler.Bağlantı, Ürünler.Direktörden Makale.Ürünler AS Ürünler NEREDE Ürünler.Bağlantı HİYERARŞİDE(&Narenciye)"

Bu durumda sonuç, bu dizinin kaç hiyerarşi düzeyine sahip olduğuna bakılmaksızın, Citrus terminoloji dizininin tüm alt öğelerini döndürecektir.

Ayrıca örneğin görev “Kalem” adında bir ürün bulmaktır. Ürünün “Kırtasiye” hiyerarşisinde yer alması gerekmektedir. Mal”, yani kapı kolunu aramamıza gerek kalmıyor. Bu durumda isimlendirmenin yapısı aşağıdaki gibidir:

Ofis

|_ Dolma kalemler |_ Kırmızı kalem |_ Mavi kalem |_ Mürekkep kalemler |_ Cetveller

Aksesuarlar

|_ Kapı kolları |_ Basit kapı kolu |_ Lüks kapı kolu

Aşağıdaki isteği yazıyoruz:

Ürünler.Bağlantı, Ürünler.Dizin'den Makale.Ürünler NEREDE Ürünler.Ürünler.Ad Gibi "Kalem%" VE Ürünler.HİYERARŞİDE BAĞLANTI(&Kırtasiye)"

Tasarımı kullanırken HİYERARŞİDE"Ofis" parametresine boş bir bağlantı iletirseniz, platformun her öğeyi köke ait olup olmadığını kontrol edeceği için isteğin yürütülmesinin yavaşlayacağını dikkate almak gerekir.

YER– Bu ifade sonucu geçici bir tabloya yerleştirir. Örnek istek:

SELECT Users.Link AS Bağlantı, Users.Parent AS Parent, Users.Name AS Ad PLACE SelectedUsers FROM Directory.Users AS Kullanıcılar WHERE Users.Link = &Directory; SELECT SelectedUsers.Link AS Bağlantısı, SelectedUsers.Parent AS Parent, SelectedUsers.Name AS Ad FROM SelectedUsers AS SelectedUsers

Bu SQL sorgusu birkaç sorgu tarafından yürütülecektir:

  • Geçici bir tablo oluşturmak (platform önceden oluşturulmuş geçici tabloları "yeniden kullanabilir", böylece oluşturma işlemi her zaman gerçekleşmez);
  • Verileri geçici bir tabloya yerleştirme;
  • Ana sorgunun yani SEL ECT'nin bu geçici tablodan çalıştırılması;
  • Geçici bir masayı yok etmek/temizlemek.

Geçici bir tablo yapı aracılığıyla açıkça yok edilebilir TAHRİP ETMEK veya dolaylı olarak - geçici tablo yöneticisini kapatırken.

Yerleşik programlama dilinin "Sorgu" nesnesi, geçici tablolarla çalışmak üzere tasarlanmış "Geçici Tablo Yöneticisi" özelliğine sahiptir. Örnek kod:

MVT = Yeni TemporaryTableManager(); Talep = Yeni Talep; Query.TemporaryTableManager = MVT;

Bir sorgu çalıştırıldıktan sonra MVT değişkeni ikinci kez başka bir sorguda kullanılabilir, bu da şüphesiz geçici tablo kullanmanın bir başka avantajıdır. Bu durumda “Close” metodu çağrıldığında veri tabanından geçici tablo silinecektir...

MVT.Close();

...veya bir değişkeni bellekten temizlerken, yani değişkenin bildirildiği yöntemi çalıştırırken. Geçici tablolar disk alt sistemindeki yükü artırır, bu nedenle çok fazla geçici alt sistem (örneğin bir döngüde) veya büyük hacimli alt sistemler oluşturmamalısınız.

DİZİN:– bu operatör operatörle birlikte kullanılır YER. Geçici bir tablo oluştururken, bu operatör, oluşturulan tabloyu indeksleyebilir, bu da onunla çalışmayı önemli ölçüde hızlandırır (ancak yalnızca indeks sorgunuzla eşleşiyorsa).

Ücretsiz uzman danışmanlığı

İsteğin için teşekkürler!

Bir 1C uzmanı 15 dakika içinde sizinle iletişime geçecektir.

Bazı sorgu dili operatörlerinin özellikleri

DEGİSİM İCİN– bu operatörün amacı belirli bir sorgu tablosunu (veya sorguya katılan tüm tabloları) kilitlemektir. Kilitleme tablaya U kilidi uygulanarak gerçekleştirilir. SQL'de bu, ipucu UPDLOCK aracılığıyla uygulanır. Bu tasarım kilitlenmeleri önlemek için gereklidir. Yapılı bir istek örneği DEGİSİM İCİN:

Kullanıcılar.Bağlantı AS Bağlantısını, Kullanıcılar.Üst AS Ana, Kullanıcılar.Adı AS Adını Dizinden Seçin.Kullanıcılar AS Kullanıcılar SOL JOIN Dizine.RFK AS RFK Kullanıcılar TARAFINDAN.RFK = RFK.Bağlantı Dizini.Kullanıcıları DEĞİŞTİRMEK İÇİN

Bu örnekte Kullanıcılar tablosuna U kilidi yerleştirilecektir. Bir kilit için tablo belirtmezseniz sorguya katılan tüm tablolara uygulanacaktır. Bu tasarımın yalnızca otomatik kilit yönetimi modunun etkinleştirildiği yapılandırmalarda çalıştığını unutmamak önemlidir.



BİRLEŞTİRMEK– istek bağlantıları destekliyor SOL/SAĞ, TAM, İÇ, SQL'deki birleştirmelere karşılık gelir – LEFT/RIGHT JOIN, OUTER JOIN, INNER JOIN.

Ancak sorgu oluşturucuyu kullanırken şunları yapamazsınız: DOĞRU KATILIN. Yapıcı basitçe tabloları değiştirecektir ancak operatör her zaman solak olacaktır. Bu nedenle 1C'de right join'in kullanımını hiçbir zaman göremezsiniz.

Sözdizimsel olarak bağlantı şöyle görünür:

Dizin.Directory1 AS'den Table1.Link AS Link'i SEÇİN Table1 SOL JOIN Directory.Directory2 AS Table2 BY Table1.Attributes = Table2.Attributes

1C sorgu dilinde Kartezyen ürününü (CROSS JOIN) birleştirmek için bir operatör yoktur. Ancak operatörün bulunmaması sorgu dilinin böyle bir bağlantıyı desteklemediği anlamına gelmez. Gerekirse aşağıdaki gibi tabloları birleştirebilirsiniz:

Dizin.Direktör1 AS Tablo1'DEN Tablo1.Bağlantı AS Bağlantısını SEÇİN Dizin.Direktör2 AS Tablo2'YE DOĞRUDAN BİRLEŞİN SOL

Örnekte görüldüğü gibi bağlantı anahtarı ayarlanmıştır. DOĞRU OLARAK yani bir tablonun her satırı diğerinin bir satırına karşılık gelir. Her iki tabloda da satırlarınız varsa birleştirme türü (LEFT, RIGHT, FULL, INNER) önemli değildir, ancak tablolardan birinde satır yoksa (tablo diyelim) sonuç farklı olacaktır. Örneğin, kullanırken DAHİLİ bağlantı sonucu boş olacaktır. Kullanma SOL SAĞ sonuçta ortaya çıkan birleştirme, hangi tabloya katıldığımıza bağlı olarak veriye sahip olacak veya olmayacak - verilerle veya verilerle. Kullanma TAM DOLU Veriler her zaman bağlanacaktır (doğal olarak yalnızca bir tablodan, çünkü diğeri boştur); bağlantı türünün seçimi belirli uygulama görevine bağlıdır.

Farklı bağlantı türlerinin nasıl çalıştığına dair küçük bir görsel ipucu:



BEĞENMEK. Benzer SQL operatörünün aksine - LIKE, şablon BEĞENMEK yalnızca bazı özel karakterler kullanılarak belirtilebilir:

  • % (yüzde): herhangi bir sayıda rastgele karakter içeren bir dizi;
  • _ (alt çizgi): isteğe bağlı bir karakter;
  • / - sonraki karakter normal karakter olarak yorumlanmalıdır.

YAZILIMIN SONUÇLARI SQL analogu ROLLUP operatörüdür. Operatör kullanım örneği SONUÇLAR:

Ürünleri SEÇİN.Fiyat AS Fiyat, Ürünler.Ürün AS Ürün Dizinden.Adlandırma AS Ürünler SONUÇLAR ORTALAMA (Fiyat) Ürüne Göre

Sonuç şu şekilde olacaktır:

Yatak

9833,333

Ütü

Dolma kalem

Yani, gruplandırmanın yapıldığı alanın değerini ve toplama fonksiyonunun değerini içeren sonuca ek bir satır eklenir.

Toplu isteklerle çalışma

1C, toplu isteklerle çalışmanıza olanak tanır. Toplu istekte istek metinleri noktalı virgülle (;) ayrılır. 1C toplu isteği sırayla yürütülür. Örnek toplu istek metni:

Kullanıcılar.Bağlantı AS Bağlantısını, Kullanıcılar.Üst AS Ana, Kullanıcılar.Adı AS Dizinden Adını SEÇİN.Kullanıcılar AS Kullanıcılar;
Çalışma Programı SEÇİN.Kullanıcı AS Kullanıcı, Çalışma Programı.Tarih AS Tarih, Çalışma Programı.Çalışma Saatleri AS Çalışma Saatleri Kayıt Bilgilerinden.Çalışma Programı AS Çalışma Programı

Bir pakette yer alan tüm sorguların sonucunu alabilmek için request nesnesinin “Run” yerine “ExecutePackage” metodunu kullanmanız gerekmektedir. Bu yöntem tüm istekleri sırayla yürütür. Sorgu sonucu, paketteki her sorguya ilişkin sonuçların bir dizisidir ve dizideki yerleştirme sırası, paket metnindeki sorgu sırası ile aynıdır.

Bir sorgu dili düşünürken sanal tablolar gibi bir özellikten bahsetmeye değer. Sanal tablolar veritabanında mevcut değildir; bunlar, DBMS tarafında alt sorgular kullanılarak sorgu olarak yürütülen bir tür sarmalayıcıdır. Sanal tabloları kullanan 1C sorgusu örneği:

RegisterLiaabilityTurnovers.Liability AS Liability'yi RegisterAccumulations.RegisterLiaibility.Turnover() AS'den RegisterLiaabilityTurnovers SEÇİN

DBMS'ye böyle bir sorgu şöyle görünecektir:

SELECT T1.Fld25931RRef FR OM (SELECT T2._Fld25931RRef AS Fld25931RRef, CAST(SUM(T2._Fld25936) AS NUMERIC(38, 8)) AS Fld25936Ciro_, CAST(SUM(T2._Fld25937) AS SAYISAL(38, 8) ) AS Fld25937Ciro_ FR OM dbo._AccumRgTn25938 T2 NEREDE ((T2._Fld949 = @P1)) VE ((T2._Fld25936 @P2 VEYA T2._Fld25937 @P3)) GRUP TARAFINDAN T2._Fld25931RRef HAVING (CAST(SUM(T2._Fld2) ) 5936 ) SAYISAL OLARAK(38, 8))) 0,0 VEYA (CAST(SUM(T2._Fld25937) SAYISAL(38, 8)) OLARAK 0,0) T1>>>>

Bir alt sorgu, gruplandırma olduğu için SQL'e benzemediği görülebilir. Sanal tablolar genel olarak "sözdizimsel şekerdir", yani genel olarak sorgu geliştirmenin kolaylığı için oluşturulurlar, böylece sorgular daha kompakt ve daha okunabilir olur.

Yalnızca kayıtların sanal tabloları vardır, ancak bir kayıtta hangi sanal tabloların mevcut olduğu sorgu tasarımcısında görülebilir.



Sanal tabloları kullanırken her zaman bir seçim koşulu sağlamanız gerekir. Aksi takdirde performans sorunları yaşanabilir.



İstek gövdesinde şöyle görünür:

Birikim Kaydı Pasif Ciroları (, Operasyon = &İşlem) AS Pasif Ciroları.

Sorgu yazmanın, yani sorgu metinleri oluşturmanın rahatlığı için, 1C'de içerik menüsü (sağ fare düğmesi) aracılığıyla çağrılabilecek bir kurucu vardır:



Sorgu tasarımcısında desteklenen sorgu dili işlevlerinin ve işleçlerinin tam listesini görebilirsiniz.


Sorgu Oluşturucu, her türlü karmaşıklıkta sorgu oluşturmaya yönelik çok esnek bir görsel araçtır. Yalnızca yapılandırıcı modunda kullanılabilir. Kurumsal modda "Sorgu Konsolu" adı verilen bir birim vardır - bu, ITS diskinde sağlanan harici işlemdir. Yönetilen bir uygulama için sorgu konsolu its.1c.ru adresinden indirilebilir.

Sorgu tasarımcısında çalışmanın açıklaması bu makalenin kapsamı dışında olduğundan ayrıntılı olarak tartışılmayacaktır.

İdeal olmayan sorgu performansının nedenleri

Aşağıda sorgu yürütülmesinin yavaş olmasına neden olan ana nedenlerin (hepsi değil) bir listesi bulunmaktadır.

  • Alt sorgularla birleştirmeleri kullanma

Alt sorgularla birleştirme yapılması önerilmez; alt sorgular geçici tablolarla değiştirilmelidir. Alt sorguların birleştirilmesi önemli performans kayıplarına yol açabilir ve farklı DBMS'lerde sorgu yürütme hızı önemli ölçüde farklılık gösterebilir. Bu tür sorguların yürütme hızı, DBMS'deki istatistiklere de duyarlıdır. Bu davranışın nedeni, DBMS iyileştiricisinin en uygun sorgu yürütme planını her zaman doğru şekilde belirleyememesidir, çünkü iyileştirici, alt sorgunun yürütüldükten sonra kaç satır döndüreceği hakkında hiçbir şey bilmez.

  • Sorgu birleştirmelerinde sanal tabloları kullanma

DBMS düzeyindeki sanal tablolar alt sorgular olarak yürütülür, dolayısıyla nedenler ilk paragraftakiyle aynıdır.

  • Bir sorguda mevcut dizinlere uymayan koşulları kullanma

Talep koşullarında ise (operatörde NEREDE veya sanal tablo koşulları) tümü dizine dahil olmayan alanları kullanıyorsa, bu sorgu, SQL yapı tablosu taraması veya dizin taraması (tamamen veya kısmen) kullanılarak yürütülecektir. Bu yalnızca sorgu yürütme süresini etkilemekle kalmayacak, aynı zamanda ekstra satırlara aşırı bir S kilidi yerleştirilecek ve bu da kilidin yükselmesine neden olabilecek, yani tüm tablonun kilitlenmesine neden olacaktır.

  • Sorgu Koşullarında OR Kullanımı

Mantıksal operatörü kullanma VEYA tasarımda NEREDE aynı zamanda tablo taramasıyla da sonuçlanabilir. Bunun nedeni DBMS'nin dizini doğru şekilde kullanamamasıdır. Yerine VEYA tasarımı kullanabilirsiniz HER ŞEYİ BİRLEŞTİRİN.

  • Bileşik türdeki alanlar için nokta aracılığıyla veri alma

Nokta yoluyla değerlerin elde edilmesi önerilmez (yapımda NEREYİ SEÇİN), çünkü nesne niteliğinin karmaşık bir tür olduğu ortaya çıkarsa, bu karmaşık türe dahil olan her tabloyla birleştirme gerçekleşecektir. Sonuç olarak, DBMS sorgusu önemli ölçüde daha karmaşık hale gelecektir ve bu da optimize edicinin doğru sorgu yürütme planını seçmesini engelleyebilir.

1C GOODWILL şirket blogu

1C Enterprise platformu, aynı anda birkaç sorguyu sırayla yürütmenize olanak tanır. 1C'de buna istek paketi denir. Bir pakette her istek noktalı virgülle ayrılır.

Bir pakette sorguların adım adım yürütülmesini sağlamak için, kural olarak, önce geçici tablolar oluşturulur, ardından filtreler, birleştirmeler ve birleştirmeler gibi paylaşım koşulları oluşturulur. Bu sayede nihai sonuca ulaşılır. Bir toplu iş içindeki herhangi bir sorgulama sonucunda elde edilen geçici tablolar, bir bütün olarak toplu işin sonuna kadar veya geçici tabloları yok eden bir sorgu yürütülünceye kadar varlığını sürdürür.

Ayrıca toplu sorguların ve geçici tabloların kullanılması, bu kodun tüm bölümünün okunabilirliğini önemli ölçüde artırır. İç içe sorgular da içeren karmaşık sorguların anlaşılması çok zor olabilir. Bununla birlikte, uzun ve karmaşık bir sorguyu birkaç parçaya bölerseniz ve hatta geçici tablolar kullanırsanız, bu yalnızca algıyı iyileştirmekle kalmayacak, aynı zamanda çoğu durumda performansın artmasına da yol açacaktır.

1C'de toplu sorguların lehine olan bir diğer önemli detay ise, iç içe geçmiş sorgulardan farklı olarak toplu sorgudaki her sorgunun sonucunu ayrı ayrı elde edebilmemizdir.

1C dilinde bir istek paketi oluşturma örneği

Bir sorgu paketinin nasıl oluşturulacağına ilişkin bir örnek görmek için, netlik sağlamak amacıyla sorgu konsolundan arayacağımız sorgu tasarımcısını kullanacağız. Böylece paketi çalıştırmanın sonucunu hemen görebiliriz.

Basit bir toplu istek oluşturalım. İstek metnini hemen konsola yapıştırmanızı ve ardından yapıcıyı açıp istek paketinin nasıl oluştuğunu görmenizi öneririm. Konsola yeni bir istek ekleyin ve aşağıdaki metni yapıştırın:

Kendini destekleyen. Ebeveyn,

Kendini destekleyen Kod,

Kendini destekleyen Hızlı Seçim Kodu,

Kendi kendini destekleyen isim.

Kendinden destekli. Tip,

Bilanço dışı,

Kendini destekleyen, niceliksel.

Hesap Planı Kendi Kendini Destekleyen AS Kendi Kendini Destekleyen.

////////////////////////////////////////////////////////////////////////////////

Kendinden Destekli TiplerSubconto.Line Numarası AS Satır Numarası,

Subconto.ViewSubconto AS TypeSubconto'nun kendi kendini destekleyen türleri,

Kendinden destekliTypesSubconto.TypeSubconto.Name AS Adı,

Kendinden destekliTypesSubconto.TypeSubconto.ValueType ASValueType,

Self-supportingTypesSubconto.OnlyTurnover AS OnlyTurnover,

Self-supportingTypesSubconto.Summary AS Özetleyici

Hesap Planı Kendi Kendine Desteklenen Alt Hesap Türleri.

GÖRE SIRALA

Kendi kendini destekleyen TypesSubconto.NumberLines

Benim için şöyle görünüyor:

Şimdi sorgu tasarımcısına geçelim. Burada “Paket İste” sekmesiyle ilgileneceğiz:

Gördüğünüz gibi iki istekten oluşan bir paketimiz var. Bunlardan herhangi birine çift tıklayarak düzenlemeye devam edebilirsiniz:

“Tamam” butonuna tıklayın ve toplu isteğin sonucunu görmeye çalışın.

"Hesap" parametresini ayarlayalım. Hesap planından herhangi bir hesabı seçebilirsiniz. Muhtemelen zaten tahmin ettiğiniz gibi, bu istek paketinin hesap özelliklerini alması gerekiyor. “Çalıştır”a tıklayın ve sonucu görün:

Yöntemler Run() ve RunBatch()

Toplu işlerdeki tüm istekleri tek tek yürüten ve son isteğin sonucunu döndüren Execute() yöntemine ek olarak, 1C'de bir ExecuteBatch() yöntemi vardır. Toplu işteki her isteğin bir dizi örneğini döndürür. Yukarıdaki örnekte bu yöntem yürütülmektedir.

ArrayResults = Query.ExecuteBatch();

Selection1 = ArrayResults.Select();

Select1.Next() ise O zaman

//Seçim 1 olan işlemler

endIf;

SelectionViewsSubconto = ArrayResults.Select();

1C 8.3 ve 8.2'de toplu taleplerle çalışma yazısı ilk olarak 1C GOODWILL şirket blogunda yayınlandı.