1c isteğinde boş tarihle karşılaştırma

1C konfigürasyonlarında bulunan tüm belgeler ve bu nedenle hemen hemen tüm kayıtlar, Date türünde en az bir değişkene 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 talebinde boş bir tarih nasıl belirlenir;
  • Tarih ve saat sınırı arasındaki fark nedir?

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

Tarih nedir ve nasıl belirlenir

Yönetim kararlarının ve muhasebenin çoğu 1 saniyeyi aşan zaman doğruluğu gerektirmediğinden, 1C platformunun geliştiricileri bu değerin tarih formatında maksimum minimum olacağına karar verdi. Bu nedenle, programdaki bir olayın zamanını tanımlayan her değişken şunları içermelidir:

  • Olayın meydana geldiği yıl;
  • Bu etkinliğin ayı;
  • Gün.

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

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

  1. Rusya'da önce günü koymaya alışkınız, ardından olayın ayı geliyor ve sonunda - yıl;
  2. ABD sakinleri tarihe bir ay ile başlar;
  3. Çekler, Polonyalılar ve Slovenler dönemi “Yıl - Ay - Gün” biçiminde yazarlar.

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

Tarihe dönüştür

Birkaç değerden veya bir diziden Date tipi ile bir parametre almak için Şekil 1'de gösterilen kodu kullanmanız gerekir. bir

Yukarıdaki şekilden de görebileceğiniz gibi, hem bir satır yardımıyla hem de bu satırı virgülle bileşenlerine ayırarak tarihi belirleyebilirsiniz, sonuç değişmez.

Tarih yılının, olayın bin yılı ve yüzyılı, ay, gün, saat ve saniye dahil olmak üzere dört basamak içermesi gerektiğini anlamak önemlidir - 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, kodumuzun performansını hiçbir şekilde etkilemeyen olayın saat, dakika ve saniyelerini çıkardık.

1C taleplerinde tarihi kullanma özellikleri

1C platformu tarafından kullanılan veri türlerinin çoğu için önceden tanımlanmış geçersiz değerler vardır. Rakamlar için bu 0, bağlantılar için EmptyReference () değerini tanımlayabilirsiniz, bir tarih için, başlangıç ​​tarihini boş bir değer olarak düşünmek gelenekseldir, onunla ilgili ayrıntıları karşılaştırmanız gerekir. sorgu parametrelerini ayarlarken yazın.

Söz konusu türün form özniteliğinin değerinde herhangi bir sayı belirtilmemiş olsa bile, yani pencere şuna benziyorsa (Şekil 3), bunun içinde hiçbir şeyin belirtilmediği anlamına gelmediğini anlamak önemlidir. bu parametrenin boş bir dize ile karşılaştırılması çalışmayacaktır.

Pirinç. 3

Boş bir tarih aldıktan sonra, isteğimize parametre olarak belirtebiliriz, yani inşaatı kullanabiliriz (Şekil 4).

Ancak, parametre olarak boş bir tarih geçmeden 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 işlevini () kullanabilirsiniz.

Pirinç. 5

Verilen sorgu metninde yıl, ay ve gün için baştaki sıfırları atladık ve ayrıca saat, dakika ve saniye belirtmedik ve dedikleri gibi program bu varsayımı yedi.

Tarih ve saat sınırı

Sorgular ve tarihler arasındaki ilişkiyle ilgili bir başka ilginç gerçek, çeşitli veritabanı tablolarına atıfta bulunulurken "zamandaki nokta" kavramının kullanılmasıdır.

İlkel Tarih türünü tanımlarken teknik belgelerde belirtilen "milisaniyeye kadar" doğruluk, birikim kaydının sanal tablolarından kayıtlar seçilirken en açık şekilde kendini gösterir: birikim kaydı, Cirolar tablosuna ek olarak, Kalanlar ve Kalanlar tablolarına sahipse ve Cirolar, daha sonra onlar için 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 örnek düşünün:

  1. Satış belgesi 12 saat 31 dakika 36 saniyede gerçekleştirilmeden önce, Şeker terminolojisine göre bakiyeler 30 kg idi;
  2. Belirtilen zamanda belge 10 kg'dan yazılmıştır;
  3. Bakiye tablosuna göre 12 saat 31 dakika 36 saniye belge tarihi itibariyle oluşturulan raporda kalan 30 kg;
  4. Aynı rapor, artıklar ve Cirolar tablosunda aynı anda 20 kg'lık bir artık gösterecektir.

Bu davranışın nedeni nedir ve nasıl önlenir?

Sorun, Kalanlar tablosunda periyodun açık bir segment olarak ayarlanması, yani raporun oluşturulduğu sırada yapılan hareketlerin dikkate alınmamasıdır, yani belirtilen saniyenin başındaki zaman alınır. parametrede. Aynı zamanda Turns tablosu ve Kalan VE Ciro tablosu için zaman sınırları dikkate alınır yani belirtilen saniyenin sonundaki 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 Kalanlar ve Cirolar tablosunu kullanın (performans açısından en uygun seçenek değil);
  3. Sınır kavramını kullanın.

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

Objemizin ilk parametresinde raporun üretilmesi gereken tarihi belirtiyoruz, ikinci parametre ise bordür tipini belirliyor. Belirli bir tarihe ait hareketlerin örneğe dahil olması bizim için önemli olduğu için bu parametreyi "Dahil" konumuna getirmeliyiz.

1C taleplerinde çok sık tarihlerle çalışmanız gerekir. Özellikle sorgu, periyodik bilgiler içeren meta veri nesneleri için oluşturulduğunda. Kural olarak, bunlar kayıtlardır (bilgi, birikim, hesaplama, muhasebe). Tarihlerle çalışmak için 1C sorgu dilinin en sık kullanılan işlevlerini ele alalım. Bilgi kaydına dayalı örnekler oluşturacağız ÇalışanlarKuruluşlar ZUP yapılandırma revizyonu 2.5.

  • TARİH SAAT

    Yıl, ay, gün, saat, dakika, saniye belirterek istekteki tarihi (zamanlı veya zamansız) almanızı sağlar.
    Sözdizimi:
    TARİH SAAT (Yıl, Ay, Gün, Saat, Dakika, Saniye)
    Genellikle saat, dakika ve saniye belirtilmez. Mini bir örnek verelim. Sorgu Konsolu'na aşağıdaki metni girin:

    TARİH SAAT SEÇİN (2016, 1, 1)

    İsteğin yerine getirilmesi sonucunda - 01/01/2016 tarihini alıyoruz
    Aslında tarihin bu şekilde talepte belirtileceği bir durumu hayal etmek zor. Sonuçta periyodu belirtmeniz gerektiğinde parametreler kullanılır. Ancak bu işlevin belirli bir değere sahip olduğu bir durum vardır. Bu, alanlarda veya sorgu koşullarında boş bir tarih belirtmemiz gereken zamandır. 1C dili için boş tarihin - 0001.01.01 gibi göründüğünü hatırlatmama izin verin. Böylece istekte boş bir tarih almak için belirtmeniz yeterlidir. TARİH SAAT (1, 1, 1)... Örnek olarak bilgi kaydından seçim yapalım ÇalışanlarKuruluşlar doldurulmamış girişler Tamamlanma Süresi:

    Kuruluşların Çalışanlarını SEÇİN.Süre, Kuruluşların Çalışanları.Çalışan, Kuruluşların Çalışanları.Pozisyon, Kuruluşların Çalışanları.Bir Kuruluşun Bilgi Kayıtlarından Alt Bölümleri.Nerede Olan Kuruluşların Çalışanları OLARAK Kuruluşların Çalışanları Kuruluşların Çalışanları.

  • DÖNEM BAŞLANGICI

    Belirtilen tarih için ait olduğu dönemin başlangıcını döndürür.
    Sözdizimi:
    DÖNEM BAŞLANGIÇ (Tarih, DönemTürü)
    PeriodType aşağıdaki değerleri alabilir: DAKİKA, SAAT, GÜN, HAFTA, AY, ÇEYREK, YIL, ON YIL, YARI YIL
    Sorgu konsolunda şunu girin:

    DÖNEM BAŞLANGICI SEÇİN (TARİH SAAT (2016, 1, 15), AY)

    Talep geri dönecek - 01.01.2016
    Şimdi bir örnek için. Kayıttaki frekansı bildiğiniz gibi ÇalışanlarKuruluşlar Bir gün. Kayıtların geçerli olduğu dönem yerine ayın başlangıç ​​tarihinin görüneceği bir sorgu oluşturalım.

    DÖNEM BAŞLANGICI (Örgüt Çalışanları. Dönem, AY) Ay Başı, Örgüt Çalışanları, Çalışan, Örgüt Çalışanları, Pozisyon, Örgüt Çalışanları, Bir Kurumun Alt Bölümü OLARAK SEÇİNİZ.

  • DÖNEM SONU

    Sözdizimi, dönemin başlangıcıyla aynıdır. Ve adından da anlaşılacağı gibi, tarih ve dönem türüne göre dönemin sonunu döndürür. Ayrıntılı olarak düşünmeyeceğiz. Kendimizi küçük bir örnekle sınırlayalım.
    Sorgu:

    DÖNEM SONUNU SEÇİN (TARİH SAAT (2016, 1, 15), AY)

    31.01.2016 23:59:59
    Gördüğünüz gibi, değer saniyeye doğru döndürülür.

  • TARİH EKLE

    Belirtilen sayıda zaman aralığını tarihe ekler.
    Sözdizimi:
    TARİHE EKLE (Tarih, DönemTürü, Sayı)
    PeriodType, işlevle aynı değerleri kabul eder DÖNEM BAŞLANGICI
    Örnek olarak bir Şubat tarihini ele alalım:

    TARİHE EKLE SEÇİN (DATETIME (2016, 2, 15), AY, 2)

    04/15/2016 tarihini alıyoruz 0:00:00 Şubat ayı kısa bir ay olmasına rağmen, alınan tarihin tarihi ile orijinal tarihin aynısı. Ayların gün sayısını düşünmek zorunda kalmamanız çok uygun.
    Sayı negatif olabilir. Daha sonra aralık ters yönde sayılır.

  • FARK

    Belirtilen birimlerde iki tarih arasındaki farkı hesaplar.
    Sözdizimi:
    TARİH FARKI (Başlangıç ​​Tarihi, Bitiş Tarihi, Dönem Türü)
    Dönem türü aşağıdaki değerleri alabilir: İKİNCİ, DAKİKA, SAAT, GÜN, AY, ÇEYREK, YIL
    Örneğin:

    TARİH FARKINI SEÇİN (TARİH SAAT (2016, 2, 15), TARİH SAAT (2016, 3, 1), GÜN)

    15 döndürür

1C sorgu dilinin en sık kullanılan işlevleri burada ele alındı. Gerisi nadiren kullanılır. Gerekirse, onlarla çalışma örnekleri 1C platformunda yerleşik yardımda bulunabilir.

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

Bir dizeden ("tarihe göre yayın") bir tarih oluştururken, yerelleştirilmiş biçimde (gün.ay.yıl saat: dakika: saniye) belirtebilirsiniz, ancak yalnızca tamamen.

Örneğin:
// 1C tarihleriyle çalışma - bir 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.000,00); //zamanla

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

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

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

1C tarihini doluluk açısından kontrol etmek için - "boş tarih" ile karşılaştırılır. Referans kitap/belgede tarih tipi özelliği varsa, kullanıcı bu alanı doldurmamışsa değeri de “boş tarih” olacaktır.

"Boş tarih" 01.01.0001 00:00:00.

Örneğin:
BoşTarih = "00010101000000";
RequiredDate = "00010101000000" ise
Rapor ("Çok gerekli bir tarihi doldurmadınız");
EndIf;

Tarihlerle çalışma 1C - Ayrıntılarda tarih (referans kitaplar, belgeler vb.)

Nitelik türünü belirtirken, aşağıdakilerin kullanımını belirtebilirsiniz:

  • Yalnızca tarih (saat her zaman 00:00:00'dır)
  • Yalnızca saat (tarih her zaman 01.01.0001)
  • Tarih ve saat

tarih almak

Tarih ve saati almak için 1C CurrentDate () işlevini kullanın.

En önemli yer, bu işlevin çağrıldığı yerdir - istemcide veya sunucuda. Ayrıntılar için "Performans Modu / Performans" konusuna bakın. İstemci makinelerde zaman genellikle biraz farklıdır, bu nedenle sunucu zamanını 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 konfigürasyonda ortak bir modül oluşturulur ve bunun içinde işlev oluşturulur.
// işlev, örneğin ServerFunctions adlı ortak bir modülde bulunur
// ortak modülün özelliklerinde "Sunucu" onay kutusu işaretli ve "İstemci" onay kutusu ayarlanmamış
İşlev GetServerDate () Dışa Aktarma
CurrentDate'i Döndür ();
EndFunction

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

Ayrıca, ince istemcide, modüllerin işlevlerinin hemen yanında, nerede yürütüleceği belirtilir:

Günün başlangıcı ve sonu

"30.10.2012" tarihi için:

  • günün başlangıç ​​tarihi şöyle görünüyor "30.10.2012 00:00:00"
  • bitiş tarihi şöyle görünüyor "30.10.2012 23:59:59"

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

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

1C tarihleriyle çalışma - Tarihleri ​​karşılaştırma

Tarih, tarih ve saati içerir. Tarihleri ​​karşılaştırırken (saat hariç), genellikle günün başlangıcına (ay, yıl) getirilir.

Örneğin:
Tarih1 = Tarih ("30.10.2012 12:00:00");
StartDay (Date1) = StartDay (DocumentRef.Date) ise
Rapor ("Belge belirtilen tarihe kadar girildi");
EndIf;

Her ihtimale karşı, bir dönemdeki tarihleri ​​karşılaştırma örneği:
DocumentRef.Date> = StartMonth (CurrentDate ()) ve
BelgeRef.Tarih

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 daha fazla olduğunu da bulmak istiyorsak, farkı saniye cinsinden elde ederiz.

Örneğin:
DayStart = CurrentDate () - DayStart (CurrentDate ());
Rapor ("Günün başından beri" + String (Günün başından itibaren) + "saniye");
Rapor ("Günün başından beri" + Dize (Günün başından itibaren / 60) + "dakika");
Rapor ("Günün başından beri" + Dize (Günün başından itibaren / 60/60) + "saatler");

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

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

StartPreviousDay = StartThisDay - 24 * 60 * 60; // başka bir yol - 24 saat - 24 (saat) * 60 (dakika çıktı) * 60 (saniye) çıkarıyoruz

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

Zamandaki bir nokta, belgelere (ve buna göre kayıtlara) uygulanabilen genişletilmiş bir tarih gösterimidir.

Belgelerin tarih ve saatlerinin aynı olması durumunda belgelerin saatlerinin karşılaştırılması gerekir. Buna göre sorgularda filtreleme yaparken kullanılabilir.

Bir belgeden zaman içinde bir an aşağıdaki yollarla elde edilebilir:
// Yöntem 1
DocumentMomentTime = DocumentRef.Timepoint ();

Ayrıca bir tarih/saat ile zaman içinde bir noktayı karşılaştırabilirsiniz:
Moment of TimeStatus = New Moment of Time (Günün Başlangıcı (CurrentDate ()));
Eğer DocumentRef.MomentTime ().Karşılaştır (TimeTimeStandard) = -1 Sonra
Rapor ("Belge bugünden daha önce tanıtıldı");
EndIf;
// Belge bugünün tarihi 00:00:00'a kadar girilmişse, yine de girilmiştir - bugün

Tarihlerle çalışma 1C - Tarih biçimlendirme

Bu makale, bir boş bağlantı da dahil olmak üzere, teslim edilen özniteliğin türüne bağlı olarak bir boş değeri denetlemenin yollarını inceleyecektir.

Hiçbir sahne olmadığında bir NULL değeri döndürülür. Bu durumda tür de NULL olacaktır. Örneğin, bir sol birleştirme yoluyla iki tabloya katılıyorsunuz. Soldaki tablo için sağdaki tabloda hiçbir değer bulunmaması durumunda, NULL döndürülecektir.

Bu değerin kontrolü "IS NULL" ve "" yapıları kullanılarak gerçekleştirilebilir. İlk durumda, True veya False değerini döndürür. İkinci durumda, NULL döndürüldüğünde hemen farklı bir değer ayarlayabilirsiniz.

Aşağıdaki 1C 8.3 talebi, belirli bir segmenti olmayan ortaklar için irtibat kişilerinin bir listesini döndürür.

SEÇME
İletişimPartners.Link
İTİBAREN
ORTAKLARIN İLETİŞİM KİŞİLERİ OLARAK Rehber.Ortakların İrtibat Kişileri
DAHİLİ JOINT Directory.SegmentsPartners AS SegmentsPartners
Yazılım İş Ortağı Contacts.Owner = İş Ortağı Segments.Parent
NEREDE
İş Ortağı Segmentleri.Ref NULL

boş tarih

Boş bir tarih için doğrulama, DATE TIME (1, 1, 1, 0, 0, 0) yapısıyla karşılaştırılarak gerçekleştirilir. Aşağıda bir kullanım örneği verilmiştir:

1C isteğinde boş bağlantı

Döndürülen özniteliğin bir referans türü olması durumunda, örneğin, bu bir sözlük, belge vb.'nin bir öğesiyse, aşağıdaki yapı kullanılır: DEĞER (Directory.ReferenceName.EmptyRef).

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

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

Partners.İş Bölgesi<>DEĞER (Directory.BusinessRegions.EmptyLink)

boş satır

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

Aşağıdaki sorgu, adı boş olan tüm ortakları seçecektir.

Bir noktada, "Date" türündeki değişkenlerle çalışmaya ihtiyaç vardır. Bu makalede, temel tekniklere bakacağız - geçerli tarihi geçmek, boş bir değer olup olmadığını kontrol etmek, rastgele bir tarih.

Sorgu yazarken, genellikle verileri geçerli tarihle karşılaştırmak gerekir. Yerleşik 1C dili CurrentDate () işlevine sahiptir. Bilgisayarınızdaki geçerli saati ve tarihi belirlemenizi sağlar. Güncel tarih ile işlem yapabilmek için bu fonksiyonun değerini isteğe parametre olarak iletmek gerekir.

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

ÖrnekTalep = Yeni İstek;
ExampleRequest.Text = "
| SEÇ
| Gelişmiş RaporEklenen Dosyalar.Link
|
| Reference.AvailableReportAttachedFilesASA AdvanceReportAttachedFiles
| NEREDE
| Gelişmiş Rapor Ekli Dosyalar.Tarih< &ТекДата»;
ExampleRequest.SetParameter ("CurrentDate", CurrentDate ());

Özel tarih

Yukarıdaki işlev, karşılaştırmanıza ve dolayısıyla herhangi bir dönem için bir seçim yapmanıza olanak tanır. Bu yöntem, ek parametreler kullanmadan sorguda katı bir seçim belirtmenize olanak tanır.

Yukarıdaki örnekte bu işlevi kullanarak, giriş parametreleri olarak yalnızca üç sayı (yıl, ay, gün) ilettiğimizi 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 için, geçen 2016'nın sonuna kadar gider raporlarına eklenen tüm dosyaları alacaksınız. Bu bağlamda, "31 Aralık 2016 23:59:59" ile karşılaştırmak için saat, dakika ve saniyeyi belirteceğiz.

SEÇME
Gelişmiş RaporEklenen Dosyalar.Link
İTİBAREN
Directory.AvailableReportAttachedFiles AS AdvanceReportAttachedFiles
NEREDE
Gelişmiş Rapor Ekli Dosyalar.Tarih< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

boş tarih

Basit bir karşılaştırma ile bir değişkenin boş bir tarih içerip içermediğini kontrol etmek en kolay yoldur. Bu örnekte, bir sorgu kullanarak, giriş tarihi doldurulmayan bir banka hesabına tüm nakit makbuzları seçeceğiz.