• Boş tarih isteğini kontrol edin 1s. Bir sorguda boş değerlerle çalışma

    1C yapılandırmalarında bulunan tüm belgeler ve sonuç olarak neredeyse tüm kayıtlar, Tarih türünde en az bir özniteliğe sahip olmalıdır, bu nedenle her geliştiricinin bilmesi ve anlaması gerekir:

    • Diğer türlerin parametreleri söz konusu türe nasıl dönüştürülür;
    • 1C sorgusunda boş bir tarih nasıl tanımlanır;
    • Tarih ve saat sınırı arasındaki fark nedir?

    Yazımızda cevaplamaya çalışacağımız sorular bunlardır.

    Tarih nedir ve nasıl belirlenir

    Çoğu yönetim kararı ve muhasebe, 1 saniyeyi aşan zaman doğruluğu gerektirmediğinden, 1C platformunun geliştiricileri, bu değerin tarih biçimindeki minimum sınır olacağına karar verdiler. Bu nedenle, programdaki bir olayın zamanını tanımlayan her öznitelik şunları içermelidir:

    • Olayın meydana geldiği yıl;
    • Bu olayın olduğu ay;
    • Gün.

    İsteğe bağlı: saat, dakika ve saniye. Bu üç parametre atlanırsa ve ek bir koşul yoksa, program otomatik olarak günün başlangıcını ayarlar.

    Dünyada var olan tarih biçimlerinin önemli bir farkı vardır:

    1. Rusya'da önce günü, sonra olayın ayını ve sonunda da yılı koymaya alışkınız;
    2. ABD'de ikamet edenler tarihi ay ile başlatır;
    3. Çekler, Polonyalılar ve Slovenler dönemi "Yıl - Ay - Gün" formatında kaydederler.

    1C platformunun kullandığı ikinci biçimdir.

    tarihe dönüştür

    Birkaç değerden veya bir diziden Tarih tipine sahip bir parametre almak için, Şekil 1'de gösterilen kodu kullanmanız gerekir. 1

    Yukarıdaki şekilde görüldüğü gibi tarihi hem tek satır yardımıyla belirleyebilirsiniz hem de bu satırı virgülle bileşenlerine ayırdığınızda sonuç değişmez.

    Tarihin yılı, olayın milenyumu ve yüzyılı dahil olmak üzere dört basamak içermelidir; ay, gün, saat ve saniye, baştaki sıfırlar dahil olmak üzere iki karakter uzunluğunda olmalıdır.

    Programda geri sayım 1 Ocak 0001'de günün başlangıcından itibaren 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 atladık, bu da kodumuzun performansını en ufak bir şekilde 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 bu 0'dır, bağlantılar için EmptyReference() değerini tanımlayabilirsiniz, tarih için geri sayımın başlama tarihi boş bir değer olarak kabul edilir, bununla birlikte karşılık gelen türün ayrıntıları sorgu parametreleri ayarlanırken karşılaştırılmalıdır.

    Söz konusu türün form özniteliğinin değerinde hiçbir sayı belirtilmemiş olsa bile, yani pencere şöyle görünse bile (Şekil 3), bunun içinde hiçbir şey belirtilmediği anlamına gelmediğini anlamak önemlidir, karşılaştırma boş bir dize ile bu parametre çalışmaz.

    Pirinç. 3

    Boş bir tarih aldıktan sonra, bunu talebimiz için bir parametre olarak belirtebiliriz, yani yapıyı kullanabiliriz (Şekil 4)

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

    Pirinç. 5

    Talebin verilen metninde yıl, ay ve günün başındaki sıfırları atladık ve ayrıca saat, dakika ve saniye belirtmedik ve program dedikleri gibi bu varsayımı yedi.

    Tarih ve saat sınırı

    Sorgular ve tarih arasındaki ilişkiyle ilgili bir başka ilginç gerçek de, çeşitli veritabanı tablolarına atıfta bulunurken "zaman içinde nokta" kavramının kullanılmasıdır.

    Tarih ilkel türünü tanımlarken teknik belgelerde belirtilen "milisaniyeye kadar" doğruluk, en açık şekilde birikim kaydının sanal tablolarından kayıtlar seçilirken ortaya çıkar: Ciro tablosuna ek olarak birikim kaydı şu özelliklere sahipse: Kalanlar ve KalanlarVe Cirolar tabloları, ardından bunlar üzerinde belirli bir süre için yapılan seçim farklı sonuçlar verebilir.

    Bunun nasıl ve neden olduğunu anlamak için basit bir örneği ele alalım:

    1. Satış belgesinin 12 saat 31 dakika 36 saniyede uygulanmasından önce, Şeker terminolojisine göre bakiyeler 30 kg idi;
    2. Belge belirtilen zamanda 10 kg yazdı;
    3. Kalan tablosuna göre belge tarihinde 12 saat 31 dakika 36 saniyede oluşturulan rapor 30 kg bakiyeyi gösterecek;
    4. Bakiyeler ve Cirolar tablosundaki aynı rapor aynı anda 20 kg'lık bir denge gösterecektir.

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

    Sorun şu ki Remains tablosunda periyot açık segment olarak ayarlanıyor yani raporun üretildiği andaki gerçekleştirilen hareketler dikkate alınmıyor yani süre başında alınıyor. ikinci parametrede belirtilir. Aynı zamanda Cirolar tablosu ve Kalanlar ve Cirolar tablosu için zaman sınırları dikkate alınır, yani belirtilen saniyenin sonunda süre alınır.

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

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

    İkinci seçenek, Şekil 1'de gösterilen kodla temsil edilebilir. 6.

    Objemizin ilk parametresinde raporun hangi tarih için oluşturulması gerektiğini belirtiyoruz, ikinci parametre ise border tipini belirliyor. Belirli bir tarihteki hareketlerin seçime dahil olması bizim için önemli olduğundan bu parametreyi “Dahil” konumuna getirmeliyiz.

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

    Boş bir değer, bir değerin olmaması veya bir veri türü için varsayılan değerdir. İlkel türlerde işler oldukça basittir: varsayılan değer, referans noktası görevi gören bazı başlangıç ​​değerleridir.

    Boş Türleri

    Bir sorguda karşılaşılabilecek veya gerekli olabilecek boş değer türlerini göz önünde bulundurun.

    • 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 Ocak ayının 1'i 01.01.0001 00:00:00'dır. Bu tarihten itibaren saat 1C'de sayılır. *
    • Boole türü için varsayılan değer teknik olarak False'dir, ancak mantıksal olarak her iki tür değeri de doldurulur. Bu nedenle, boş değerin False olup olmadığı kararı, belirli bir algoritmanın mantığına bağlıdır.

    *Dikkatli olun, 1C dışında farklı referans noktalarına sahip farklı tarih sistemleri vardır.

    Eksik değer tamamen yalnızca türe karşılık gelir Hükümsüz. Bu tür, bir değerin olmadığını gösteren yalnızca bir değer içerir.

    benzer tip Tanımsız ayrıca yalnızca bir değer içerir, ancak Tanımsız, verilerin olmadığı anlamına gelmez, yalnızca tür için varsayılan değerin belirlenememesi 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, türü açıkça tanımlanmayan bir sütundaki değer tablosundaki yeni satırdaki bir değer.

    Bu yüzden referans türleri çok daha az belirsizdir. Tüm başvuru türleri boş bir değer sağlar. Boş bir değer, bir veri türüyle aynı referanstır, ancak belirli bir değer için benzersiz bir tanımlayıcı yoktur. Bu sayede boş bir referansı normal bir referans olarak ele alabilir ve platformun sağladığı tüm yöntemleri ona tam teşekküllü bir değer olarak çalışarak uygulayabiliriz.

    Bir sorguda boş değerlerle çalışma

    Sorgu sonucuna açıkça bir boş değer girmeniz veya mevcut değerleri buna karşı karşılaştırmanız gerekiyorsa, bir sorguda boş değerleri nasıl tanımlayacağınızı bilmeniz gerekir.

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

    ExampleTypeNumber OLARAK 0, ExampleTypeString OLARAK "Merhaba dünya", ExampleTypeBoolean OLARAK True SEÇİN

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

    Biriktirme Kaydından Lot.Period Seçin.Lot Olarak Kalan Lotlar.BatchDocument = 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, Value işlevi aracılığıyla boş bir bağlantıyı tek bir şekilde seçmek mümkündür:

    Değeri seç(Reference.Nomenclature.EmptyReference) Boş Terminoloji Olarak

    Boş değerlerle çalışma olanakları biraz daha zengindir. Diğer ilkel türler gibi, Null da yerleşik dildekiyle aynı şekilde tanımlanır. Ayrıca, Is Null özel operatörü ve Is Null işlevi sağlanır.

    • Is Null operatörü, seçilen değeri Null değeriyle karşılaştıran bir Boolean ifadesi oluşturmanıza olanak tanır.
    • IsNull işlevi, Null değilse ilk bağımsız değişkeni, aksi halde ikinci bağımsız değişkeni döndürür.

    Null'ları tanımlayan ifadeler, ifadeleri destekleyen herhangi bir sorgu bölümünde kullanılabilir. Örneğin, Seç bölümüne bir boş bağlantı veya Koşul'a bir Boş test ekleyebilirsiniz.

    Pratik örnekler

    Değer işlevini kullanma

    Terminoloji Olarak Goods.Reference'ı Seçin, Goods.Reference = Value(Catalog.Nomenclature.EmptyReference) Bunun GibiReferans wGoods Olarak wGoods'tan Boş

    Operatörü Kullanmak Null

    Terminoloji Olarak Goods.Link'i Seçin, Goods.Link Bu Gibi BoşturLinkBoş

    Solda boş veya tam birleştirme

    Boş onay

    Örnek, sol birleşimde ilk tablo için ikinci tablo için eşleşme olmadığında sık görülen pratik bir durumu göstermektedir. Bu durumda, ikinci tablonun tüm alanları Null'a eşit olacaktır.

    WProducts'ı seçin. Terminoloji Olarak Referans, Kalanlar. Miktar Olarak Kalan Miktar, Kalanlar. Sol yönden katılım Birikim Kaydı.MallarDepolarda.TueGoods'a Göre Bakiye Olarak Kalanlar.Referans = Kalanlar.Nomenklatür

    Boş Değerleri İşleme

    Eksik olanlar yerine bazı varsayılan değerleri almak için ortak bir teknik 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 olan 0 ile değiştirilir.

    Terminoloji Olarak TueProducts.Reference'ı, Miktar Olarak IsNull(Remains.QuantityRemainder, 0)'ı Seçin TueProducts'tan WProducts Olarak Sol yönden katılım Birikim Kaydı.MallarDepolarda.TueGoods'a Göre Bakiye Olarak Kalanlar.Referans = Kalanlar.Nomenklatür

    Bu yazıda, çeşitli boş değer türlerine ve özelliklerine baktık, sorgularda farklı boş değer türlerinin nasıl tanımlanacağını inceledik ve pratik kısımda, ele alınan malzemenin kullanım kolaylığına ikna olduk. .

    Bu makale, boş bir referans da dahil olmak üzere teslim edilen özelliğin türüne bağlı olarak boş bir değer olup olmadığını kontrol etmenin yollarını tartışacaktır.

    Öznitelik basitçe mevcut olmadığında NULL değeri döndürülür. Bu durumda tür de NULL olacaktır. Örneğin, sol birleştirme yoluyla iki tabloyu birleştiriyorsunuz. Sağ tablodaki sol tablo için değer bulunamaması durumunda NULL döndürülür.

    Bu değerin kontrolü "IS NULL" ve "" yapısı kullanılarak yapılabilir. İlk durumda, True veya False döndürülür. İkinci durumda, NULL döndürüldüğünde hemen başka bir değer ayarlayabilirsiniz.

    Aşağıdaki 1C 8.3 sorgusu, segment seti olmayan iş ortakları için ilgili kişilerin bir listesini döndürür.

    SEÇMEK
    ContactPartners.Link
    İTİBAREN
    Dizin.Ortakların İrtibat Kişileri AS Ortakların İrtibat Kişileri
    İÇ BİRLEŞİM
    PO ContactPartners.Owner = SegmentsPartners.Parent
    NEREDE
    SegmentsPartners.Reference IS NULL

    boş tarih

    Değer, DATETIME(1, 1, 1, 0, 0, 0) yapısıyla karşılaştırılarak boş bir tarih için kontrol edilir. Örnek bir kullanım aşağıda verilmiştir:

    İstek 1C'de boş bağlantı

    Döndürülen özniteliğin bir referans türüne sahip olması durumunda, örneğin, bazı dizinlerin, belgelerin vb. bir öğesiyse, aşağıdaki yapı kullanılır: VALUE(Catalog.CatalogName.EmptyReference).

    Aşağıdaki örnekte sorgu, iş bölgesi belirtilmemiş tüm iş ortaklarını seçer.

    "ValueFilled" olup olmadığını kontrol etmek için ters koşulu yapmanız gerekir:

    Partners.İşBölgesi<>VALUE(Catalog.BusinessRegions.EmptyReference)

    Boş satır

    Dize türlerini kontrol etmek için başka bir modelle karşılaştırma yapılır. Bu durumda - "".

    Aşağıdaki sorgu, boş bir ada sahip tüm ortakları seçecektir.

    1C tarihleriyle çalışırken, tarih bölümlerinin tipik sırası yıl, ay, gün, saat, dakika, saniye şeklindedir. Bu durumda saatler, dakikalar, saniyeler atlanabilir.

    Bir dizgiden ("bug to date") bir tarih oluştururken, yerelleştirilmiş bir biçimde (gün.ay.yıl saat:dakika:saniye) belirtebilirsiniz, ancak yalnızca tam olarak belirtebilirsiniz.

    Örneğin:
    // 1C tarihleriyle çalışma - tarihi parçalardan 1C'ye dönüştürün - yıl, ay, gün (artı isteğe bağlı saat)
    Tarih = Tarih(2012,10,30); //zaman yok
    Tarih = Tarih(2012,10,30,12,00,00); //zamanla

    //1C tarihleriyle çalışmak - bir tarihi bir diziden 1C'ye dönüştürmek, farklı yollar
    Tarih = Tarih("20121030"); //yıl ay gün
    Tarih = Tarih("30.10.2012 12:00:00"); //yerelleştirilmiş biçim, yalnızca tam

    //1C tarihleriyle çalışma - doğrudan tarih değerini atamadan belirtme
    Tarih = "20121030"; //zaman yok
    Tarih = "20121030120000"; //zamanla

    1C tarihleriyle çalışma - Boş tarih 1C

    1C tarihini doluluk açısından kontrol etmek için “boş tarih” ile karşılaştırılır. Dizinde/belgede tarih türünde bir özellik varsa, kullanıcı bu alanı doldurmamışsa değeri de “boş tarih” olacaktır.

    "Boş tarih" 01.01.0001 00:00:00'dır.

    Örneğin:
    EmptyDate = "00010101000000";
    İstenenTarih = "00010101000000" ise
    alert("Gerekli tarihi doldurmadınız");
    EndIf;

    Tarihlerle çalışma 1C - Ayrıntılı tarih (dizinler, belgeler vb.)

    Nitelik türünü belirtirken, aşağıdakileri kullanmayı belirtebilirsiniz:

    • Yalnızca tarih (bu durumda saat her zaman 00:00:00'dır)
    • Yalnızca saat (o zaman tarih her zaman 01.01.0001'dir)
    • tarih ve saat

    tarihi almak

    Tarih ve saati almak için 1C CurrentDate() işlevi kullanılır.

    Bu işlevin çağrıldığı yer çok önemlidir - istemcide veya sunucuda. Ayrıntılar için “Çalışma Zamanı Modu/Çalışma Zamanı” konusuna bakın. İstemci makinelerde zamanın biraz farklı olduğu sık sık olur, bu nedenle sunucu saatini her yerde kullanmaya çalışırlar - sunucuda doğru ayarlanmamış olsa bile, en azından tüm istemciler aynı yanlış zamana sahip olacaktır.

    Sunucu tarihini (sunucu bilgisayarın işletim sisteminde ayarlanan tarih) almak için, genellikle özelliklerde “Sunucu” onay kutusu işaretli olarak yapılandırmada ortak bir modül oluşturulur ve içinde bir işlev oluşturulur.
    //işlev ortak bir modülde bulunur, örneğin ServerFunctions adlı
    // genel modülün özelliklerinde "Sunucu" onay kutusu ayarlandı ve "İstemci" onay kutusu ayarlanmadı
    İşlev GetServerDate() Dışa Aktarma
    CurrentDate();
    Bitiş İşlevleri

    //bu işlevi başka bir modülden kullanmak için çağırmak şuna benzer
    DocumentObject.Date = ServerFunctions.GetServerDate(); //ModülAdı.İşlevAdı()

    Ayrıca, ince istemcide, modül fonksiyonlarının hemen yanında, nerede çalıştırılacağı belirtilir:

    Günün başlangıcı ve bitişi

    "30.10.2012" tarihi için:

    • günün başlangıç ​​tarihi şu şekilde görünüyor "10/30/2012 00:00:00"
    • günün bitiş tarihi şu şekilde görünür: "30.10.2012 23:59:59"

    Belirli bir dönem için - gün, ay, yıl - veri gerektiren raporlarda ve sorgularda kullanılır.

    Örneğin, "01/01/2012 00:00:00" ile "01/31/2012 00:00:00" arasındaki dönem yanlıştır çünkü ayın bir gününü içermez (fakat ayın bir saniyesini içerir) ayın son günü).

    Tarihlerle çalışma 1C - Tarih karşılaştırması

    Tarih, tarih ve saati içerir. Tarihleri ​​karşılaştırırken (zamana bakılmaksızın), genellikle günün başına (ay, yıl) getirilirler.

    Örneğin:
    Date1 = Date("10/30/2012 12:00:00 PM");
    StartDay(Date1) = StartDay(DocumentRef.Date) ise, O zaman
    Show("Belirtilen tarihte girilen belge");
    EndIf;

    Her ihtimale karşı, bir dönemdeki tarihleri ​​karşılaştırmaya bir örnek:
    DocumentReference.Date >= MonthStart(CurrentDate()) ise ve
    DocumentReference.Date

    Tarihlerle çalışma 1C - Tarihi değiştirme

    Tarih saniye sayısıdır. Yalnızca bir tarihin diğerinden daha büyük olup olmadığını değil, aynı zamanda ne kadar büyük olduğunu da öğrenmek istiyorsak, farkı saniye cinsinden alırız.

    Örneğin:
    StartDay = CurrentDate() – StartDay(CurrentDate());
    Report("Günün başından itibaren geçti" + String(FROMDayStart) + "saniye");
    Report("Günün başından itibaren geçti " + String (Günün başlangıcından itibaren / 60) + "dakika");
    Report("Günün başından itibaren geçti " + String (Günün başlangıcından itibaren / 60/60) + "saat");

    Tarihi de değiştirebiliriz, değiştirirken saniye sayısını ekler veya çıkarırız:
    StartThisDay = StartDay(CurrentDate());

    StartPreviousDay = StartDay(StartThisDay - 1); // ikinciyi kaldır - "dün" yapıyor ve "dün"den günün başlangıcını alıyor

    Önceki Güne Başla = Bu Güne Başla - 24*60*60; //başka bir yol - 24 saati çıkarın - 24(saat) * 60 (dakika çıktı) * 60 (saniye)

    Tarihlerle çalışma 1C - Zamanın anı

    Bir zaman noktası, belgeler (ve dolayısıyla kayıtlar) için geçerli olan bir tarihin genişletilmiş bir temsilidir.

    Evrakların tarih ve saatlerinin aynı olması halinde evrakların zamanlarının karşılaştırılması gerekmektedir. Buna göre sorgularda seçimler için kullanılabilir.

    Bir belgeden belirli bir zaman noktasını aşağıdaki şekillerde alabilirsiniz:
    //Yöntem 1
    DocumentTimeMoment = DocumentReference.MomentTime();

    Zamandaki bir noktayı tarih/saat ile de karşılaştırabilirsiniz:
    MomentInTimeReference = Yeni MomentInTime(StartDay(CurrentDate())));
    DocumentReference.TimeIn().Compare(InTimeReference) = -1 ise O zaman
    Show("Belge bugünden önce girildi");
    EndIf;
    //Belge bugünün tarihi ile 00:00:00'da girildiyse, yine de girilir - bugün

    Tarihlerle çalışma 1C - Tarihleri ​​biçimlendirme