1c istekteki tarihi belirtir. boş değeri kontrol ederek

1c istekteki tarihi belirtir.  boş değeri kontrol ederek
1c istekteki tarihi belirtir. boş değeri kontrol ederek

1C'de kontrol edin boş değerözel bir fonksiyon tarafından gerçekleştirilir. Özelliğinizin veya değişkeninizin doldurulup doldurulmadığını kontrol etmek için genel bağlamdan bir işlev kullanın DeğerDolu(<Значение>) .

1C 8'de, bir değer, varsayılan değerden farklıysa doldurulmuş (boş değil) kabul edilir. bu türden. Örneğin, bir referans türü için varsayılan değer şöyledir: Boş bağlantı(bu referans kitabı, belge vb.). Değer içeren değişkenler ve ayrıntılar da boştur. Hükümsüz Ve Tanımlanmamış.

1'ler boş değeri kontrol eder. Örnekler

Değişken = Directoryes.Nomenclature.EmptyLink();

Kontrol = DeğerDolu(Değişken); Bu durumda değişken Sınav değeri içerecek Yalan DeğerDolu(<Значение>) . Ayrıca işlev

. koşullarda doğrudan kullanılabilir.

Örnek 1.1

Değer Doldurulmuşsa(Değişken) Then Report("Değişkendeki değer boş değil!"); endIf;

Değişken = Documents.AdvanceReport.FindByNumber("000000001"); Kontrol = DeğerDolu(Değişken); İÇİNDE bu örnekte eğer belgeÖn rapor 000000001 numara ile Bu durumda değişken var, o zaman değişkende değeri içerecek Doğru değeri içerecek.

, aksi takdirde Fonksiyonu kullan DeğerDolu gibi değişken türlerdeki değişkenler için mümkün değildir, Değer tablosu Değerler ağacı

vesaire. İşlev tüm konfigürasyonlarda çalışır. 1C'deki değerler tablosunun boş olduğunu nasıl kontrol edebilirsiniz? Bu amaçla yöntem kullanılır Miktar()

Değerler tablosunda kaç satır bulunduğunu kontrol etmek için bunu kullanabilirsiniz. Örnek 3. Let Masam

- kodda yukarıda tanımlanan değerler tablosu.

MyTable.Quantity() = 0 ise Geri Dön; endIf;

Değer ağacının doluluğunun belirlenmesi ve sorgu sonucu seçimi için de aynı yöntem kullanılabilir. Örnek 4. Let Ağacım

— kodda yukarıda tanımlanan değerler ağacı.

MyTree.Rows.Quantity() = 0 ise Geri Dön; endIf;

Gördüğünüz gibi, değer ağacında birinci düzey satırların varlığını kontrol ediyoruz; eğer orada değilse ağaç boştur. Örnek 5. Let Rica etmek

1C konfigürasyonlarında bulunan tüm belgeler ve dolayısıyla hemen hemen tüm kayıtlar, Tarih türünde en az bir özelliğe sahip olmalıdır; bu nedenle her geliştiricinin bilmesi ve anlaması gerekir:

  • Diğer türlerdeki parametreler söz konusu türe nasıl dönüştürülür;
  • 1C isteğinde boş bir tarih nasıl belirlenir;
  • Tarih ile zaman sınırı arasındaki fark nedir?

Makalemizde cevaplamaya çalışacağımız bu sorulardır.

Tarih nedir ve nasıl belirlenir

Çoğu yönetim kararının alınması ve kayıtların tutulması, 1 saniyeyi aşan zaman doğruluğu gerektirmediğinden, 1C platformunun geliştiricileri bu değerin tarih biçiminde mutlak minimum olacağına karar verdi. Bu nedenle, programdaki bir olayın zamanını tanımlayan her özellik şunları içermelidir:

  • Olayın gerçekleştiği yıl;
  • Bu etkinliğin yapıldığı ay;
  • Gün.

Şunları belirtmenize gerek yoktur: saat, dakika ve saniye. Bu üç parametre atlanırsa ve ek koşullar yoksa, program saati otomatik olarak günün başlangıcına ayarlar.

Dünyada mevcut tarih formatları arasında önemli farklılıklar bulunmaktadır:

  1. Rusya'da önce günü, sonra olayın gerçekleştiği ayı ve yılın sonuna koymaya alışkınız;
  2. ABD'de ikamet edenler tarihe ay ile başlar;
  3. Çekler, Polonyalılar ve Slovenyalılar dönemleri Yıl – Ay – Gün formatında kaydederler.

1C platformunun kullandığı ikinci formattır.

Tarihe dönüştür

Birkaç değerden veya bir dizeden Date tipinde bir parametre elde etmek için Şekil 2'de gösterilen kodu kullanmalısınız. 1

Yukarıdaki şekilden de görülebileceği gibi ister tek çizgi kullanarak, ister bu çizgiyi virgül yardımıyla bileşenlerine ayırarak tarihi belirleyebilirsiniz, sonuç değişmeyecektir.

Tarihin yılının, olayın milenyum ve yüzyılı da dahil olmak üzere dört rakamdan oluşması gerektiğini; ayın, günün, saatlerin ve saniyelerin, baştaki sıfırlar dahil olmak üzere iki karakter uzunluğunda olması gerektiğini anlamak önemlidir.

Programda zaman geri sayımı 1 Ocak 0001'de günün başlangıcından başlar. Yukarıdaki kod için bu değer iki yoldan biriyle belirlenebilir (Şekil 2).

Pirinç. 2

İkinci satırda olayın saat, dakika ve saniyelerini çıkardık, bu da kodumuzun performansını hiç etkilemedi.

1C sorgularında tarih kullanmanın özellikleri

1C platformu tarafından kullanılan çoğu veri türü için önceden tanımlanmış geçersiz değerler vardır. Sayılar için 0'dır, bağlantılar için EmptyLink() değerini tanımlayabilirsiniz; bir tarih için boş değer genellikle başlangıç ​​tarihi olarak kabul edilir ve ilgili türün ayrıntılarının, tarih ayarlanırken karşılaştırılması gerekir. parametreleri isteyin.

Söz konusu türe sahip bir form özelliğinin değerinde hiçbir sayı belirtilmemişse, yani pencere (Şekil 3) gibi görünse bile, bunun, içinde hiçbir şeyin belirtilmediği anlamına gelmediğini anlamak önemlidir; bu parametrenin boş bir dizeyle karşılaştırılması işe yaramaz.

Pirinç. 3

Boş bir tarih aldıktan sonra bunu isteğimize parametre olarak belirtebiliriz, yani yapıyı kullanabiliriz (Şekil 4)

Ancak, parametre olarak boş bir tarih iletmeden istek gövdesinin içini kontrol etmenin daha iyi olduğu zamanlar vardır. Bunu yapmak için istek koduna (Şekil 5) uygun koşulu girebilir ve DateTime() istek fonksiyonunu kullanabilirsiniz.

Pirinç. 5

Yukarıdaki istek metninde yıl, ay ve günün baştaki sıfırlarını atladık ve ayrıca saat, dakika ve saniyeyi belirtmedik ve program, dedikleri gibi, bu varsayımı tüketti.

Tarih ve saat sınırı

Bir diğer ilginç gerçek Sorgular ve tarihler arasındaki ilişkiyle ilgili olarak, çeşitli veritabanı tablolarına erişirken "zamandaki nokta" kavramının kullanılmasıdır.

İlkel Tarih türünü tanımlarken teknik belgelerde belirtilen "milisaniyeye kadar" hassasiyet, en açık şekilde şu kayıtlardan kayıt seçildiğinde ortaya çıkar: sanal tablolar birikim kaydı: birikim kaydında Ciro tablosuna ek olarak Kalan ve Kalan ve Ciro tabloları varsa, bunlardan belirli bir süre boyunca yapılan örnekleme farklı sonuçlar verebilir.

Bunun nasıl ve neden olduğunu anlamak için basit bir örnek düşünün:

  1. Satış belgesi 12 saat 31 dakika 36 saniyede gerçekleştirilmeden önce Şeker terminolojisine göre teraziler 30 kg;
  2. Belge girişi belirtilen zaman 10 kg silindi;
  3. Belge tarihinde 12 saat 31 dakika 36 saniyede Kalan tablosuna göre oluşturulan rapor 30 kg bakiyeyi gösterecek;
  4. Kalanlar ve Cirolar tablosundaki aynı rapor aynı zaman için 20 kg'lık bir bakiye gösterecektir.

Bu davranışın nedeni nedir ve bundan nasıl kaçınılır?

Sorun, Kalan tablosunda dönemin açık bir segment olarak belirtilmesi, yani raporun oluşturulduğu anda yapılan hareketlerin dikkate alınmaması, yani zamanın, belirtilen saniyenin başında alınmasıdır. parametre. Aynı zamanda Cirolar tablosu için ve Kalanlar ve Cirolar tablosu için zaman sınırları dikkate alınır yani süre belirtilen saniyenin sonunda alınır.

Bu durumdan çıkmanın birkaç yolu vardır:

  1. Kalanlar tablosunu kullanırken belirtilenden 1 saniye daha büyük bir zaman noktası belirtin;
  2. Yalnızca Kalanlar ve Cirolar tablosunu kullanın (performans açısından en uygun seçenek değildir);
  3. Sınır kavramını kullanın.

Son seçenek, Şekil 2'de gösterilen kodla temsil edilebilir. 6.

Nesnemizin ilk parametresinde raporun oluşturulması gereken tarihi belirtiyoruz, ikinci parametre ise kenarlık tipini belirliyor. Belirli bir tarihteki hareketlerin seçime dahil edilmesi bizim için önemli olduğundan bu parametreyi “Dahil” konumuna getirmeliyiz.

Çoğu zaman birlikte çalışmaya ihtiyaç vardır tür değişkenleri"Tarih". Bu makalede temel tekniklere bakacağız - geçerli tarihin iletilmesi, boş bir değerin kontrol edilmesi, rastgele bir tarih.

Sorgu yazarken genellikle verileri geçerli tarihle karşılaştırmanız gerekir. Yerleşik 1C dili CurrentDate() işlevine sahiptir. Belirlemenizi sağlar şimdiki zaman ve bilgisayardaki tarih. Güncel tarihle işlem yapabilmek için bu fonksiyonun değerini isteğe parametre olarak iletmelisiniz.

Aşağıda, oluşturulma tarihi şu ana kadar olan gider raporlarına eklenen tüm dosyaları seçen bir sorgu bulunmaktadır:

Örnekİstek = Yeni İstek;
Örnek İstek.Text = "
|SEÇ
| AdvanceReportAttachedFiles.Link
|DAN
| Directory.AdvanceReportAttachedFilesAS AdvanceReportAttachedFiles
|NEREDE
| AdvanceReportAttachedFiles.Date< &ТекДата»;
Örnek request.SetParameter("CurrentDate", CurrentDate());

Özel tarih

Yukarıda tartışılan işlev, karşılaştırma yapmanıza ve dolayısıyla herhangi bir dönem için seçim yapmanıza olanak tanır. Bu yöntem, ek parametreler kullanmadan istekte katı bir seçim belirlemenize olanak tanır.

Yukarıdaki örnekte bu işlevi kullanırken, giriş parametresi olarak yalnızca üç sayıyı (yıl, ay, gün) ilettiğimizi lütfen unutmayın. Son üçü (saat, dakika, saniye) isteğe bağlıdır ve yoksa “0” yani günün başlangıcı ile değiştirilir.

Bu örnek, geçen yılın 2016 sonuna kadar gider raporlarına eklenen tüm dosyaları alacaktır. Bu bağlamda “31 Aralık 2016 23:59:59” zaman noktasını karşılaştırmak için saat, dakika ve saniyeyi belirteceğiz.

SEÇMEK
AdvanceReportAttachedFiles.Link
İTİBAREN
Directory.AdvanceReportAttachedFiles AS AdvanceReportAttachedFiles
NEREDE
AdvanceReportAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Boş tarih

Bir değişkenin boş bir tarih içerip içermediğini kontrol etmenin en kolay yolu şudur: sıradan karşılaştırma. Bu örnekte tüm makbuzları seçmek için bir sorgu kullanacağız. peşin Gelen tarihin doldurulmadığı hesaplara.

Sorgularla çalışırken herhangi bir programcının boş değerlerle bir şekilde etkileşime girmesi gerekir. Boş değerle neyi kastediyoruz?

Boş değer ya değer değildir ya da veri türü için varsayılan değerdir. İlkel türlerde her şey oldukça basittir: Varsayılan değer, başlangıç ​​noktası görevi gören bir başlangıç ​​değeridir.

Boş Değer Türleri

Bir sorguda karşılaşılabilecek veya gerekli olabilecek boş değer türlerine bakalım.

  • Sayı türü için boş değer sıfır – 0'dır.
  • Dize türü için – boş bir dize – “”.
  • Tarih türü için – ilk yılın 1 Ocak – 01/01/0001 00:00:00. Bu tarihten itibaren zaman 1C'ye göre sayılır.*
  • Boolean türü için varsayılan değer teknik olarak False'tur ancak mantıksal olarak türün her iki değeri de dolguludur. Bu nedenle boş bir değerin False olup olmadığına karar vermek belirli bir algoritmanın mantığına dayanır.

*Dikkatli olun, 1C dışında farklı tarih sayma sistemleri vardır. farklı noktalar geri sayım.

Eksik değer her anlamda yalnızca türle eşleşir Hükümsüz. Bu tür yalnızca bir değer içerir; bu, değer olmadığını gösterir.

Benzer tip Tanımlanmamış ayrıca yalnızca bir değer içerir, ancak Tanımsız, veri yokluğu anlamına gelmez, yalnızca tür için varsayılan değeri belirlemenin imkansızlığı anlamına gelir. Tanımsız, açıkça tanımlanmayanlar da dahil olmak üzere bileşik türler için varsayılan değerdir. Örneğin, içindeki değer yeni hat türü açıkça tanımlanmayan bir sütundaki değerler tablosu.

ortak referans türlerde belirsizlik çok daha azdır. Tüm referans türleri boş bir değer sağlar. Boş değer, veri türünü belirten aynı referanstır ancak belirli bir değer için benzersiz bir tanımlayıcı içermez. Bu sayede boş bir bağlantıya normal bir bağlantıymış gibi davranabilir ve platformun sağladığı tüm yöntemleri ona uygulayabilir, onunla tam teşekküllü bir değermiş gibi çalışabiliriz.

Bir Sorguda Boş Değerlerle Çalışmak

Bir sorgu sonucuna açıkça boş bir değer girmeniz veya mevcut değerleri boş bir değerle karşılaştırmanız gerekip gerekmediğini sorgunuzdaki boş değerleri nasıl tanımlayacağınızı bilmeniz gerekir.

Türler Sayı, Dize, Boolean istekte yerleşik dilde olduğu gibi açıklanmıştır:

SampleTypeNumber AS olarak 0'ı SEÇİN, SampleTypeString AS "Merhaba dünya", SampleTypeBoolean AS Doğru

Temel olarak ilkel bir tür olan tanımsız, benzer şekilde tanımlanır:

Biriktirme Kaydı'ndan Batch.Period'u seçin.Geri Kalan Yerde Toplu İş Olarak Toplu İş.DocumentBatch = Tanımsız

Boş referans değerlerinin tanımlanması biraz daha zordur. Tüm referans nesnelerinin önceden tanımlanmış bir EmptyReference hizmet değeri vardır. Bu sayede, Değer işlevi aracılığıyla boş bir bağlantıyı tek bir yöntemle seçmek mümkündür:

Değer Seçin(Directory.Nomenclature.EmptyLink) İsimlendirme Nasıl Boşaltılır

Null değerleri ile çalışma olanakları biraz daha zengindir. Diğer ilkel türler gibi Null da yerleşik dilde olduğu gibi tanımlanır. Ayrıca Is Null adlı özel bir operatör ve IsNull işlevi de vardır.

  • Is Null operatörü oluşturmanıza olanak sağlar mantıksal ifade seçilen değerin Null değeriyle karşılaştırılması.
  • IsNull işlevi, Null değilse ilk argümanı, aksi takdirde ikinci argümanı döndürür.

Boş değerleri tanımlayan ifadeler, ifadeleri destekleyen tüm sorgu bölümlerinde kullanılabilir. Örneğin, Seçim bölümüne boş bir bağlantı veya Koşul'a Boş bir denetim ekleyebilirsiniz.

Pratik örnekler

Değer işlevini kullanma

Products.Link As Nomenclature, Products.Link = Value(Directory.Nomenclature.EmptyLink) Benzerini SeçinLinkEmpty From TueProducts As TueProducts

Is Null operatörünü kullanma

Ürünleri Seçin.Adlandırma Olarak Bağlantı, Ürünler.Bağlantı Bu Bağlantı Gibi Boştur TueProducts Olarak TueProducts'tan Boş

Solda boş veya tam birleştirme

Boş olup olmadığı kontrol ediliyor

Örnek, sol birleştirmede ikinci tablodaki ilk tablo için eşleşme olmadığında yaygın bir pratik durumu göstermektedir. Bu durumda ikinci tablonun tüm alanları Null olacaktır.

TueProducts'ı seçin.Adlandırma Olarak Bağlantı, Kalanlar.Miktar Olarak Kalan Miktar, Kalanlar.Kalan Miktar, TueProducts olarak TueProducts'tan NoRemaining Olarak Boştur Sol Bağlantı RegisterAccumulations.ProductsInWarehouses.TueProducts'a Göre Kalanlar.Link = Kalanlar.Nomenclature

Boş Değerleri İşleme

Eksik değerleri değiştirmek üzere bazı varsayılan değerleri elde etmeye yönelik ortak bir tekniği göstermek için önceki sorgunun değiştirilmesi. Bu örnekte IsNull işlevi kullanılarak eksik kalan değer, mantıksal olarak doğru bir 0 ile değiştirilir.

TueProducts.Link As Nomenclature'ı seçin, IsNull (Remaining.QuantityRemaining, 0) As Quantity From TueProducts as TueProducts Sol Bağlantı RegisterAccumulations.ProductsInWarehouses.TueProducts'a Göre Kalanlar.Link = Kalanlar.Nomenclature

Bu yazıda çeşitli boş değer türlerine ve özelliklerine baktık ve bunları belirlemenin yollarını inceledik. çeşitli türler sorgularda boş değerler ve pratik kısımda dikkate alınan malzemenin uygulama kolaylığına ikna olduk.