Standart parametre &Dönem ve kullanımdaki sorunlar. Parametrelerde SKD 1s 8 SKD periyoduna göre belirlenen sıklıkta rapor oluşturuyoruz

  • 26.11.2023

Bir dizi sorgu verisi içeren bir rapor oluşturalım:

KALAN DEPOLARDAKİ ÜRÜNLERİ SEÇİN. Depo, MallarDepolarda Kalır. İsimlendirme, Depolarda Kalan Ürünler. Birikim Kaydından QuantityBalance. Depolardaki Ürünler. Remains(&MyDate,) AS ÜrünlerInWarehousesRemains

Şimdi parametreler sekmesine geçelim ve sistemin &MyDate parametremize ek olarak &Period parametresini de oluşturduğunu görelim.
Dönemlerin görsel olarak takip edilebilmesi için bir ana rapor formu oluşturup içine verilerin yer aldığı bir tablo alanı yerleştireceğiz: Settings Composer.Settings.DataParameters

Raporu kaydedip işletmede açalım. Parametrelerin bulunduğu tablo alanında yalnızca &Periyod parametresi görüntülenir:

Buna göre bu parametrede yapılacak herhangi bir değişiklik istenilen sonucu vermeyecektir.

&MyDate parametresi neden kullanılamıyor? Elbette, çünkü parametreler sekmesinde işaretli bir onay kutusu var Kullanılabilirlik sınırlaması.

Kutunun işaretini kaldırın. Şimdi her ikisini de mevcut parametrelerde görüyoruz. Yalnızca raporu oluştururken raporun &MyDate'e değil, &Period parametresine tepki verdiğini göreceğiz.

Bu örnekte yapılacak en basit şey, istekteki &MyDate parametresini &Period olarak yeniden adlandırıp istenilen sonuca ulaşmaktır. Ama belki de &Period parametresinin kullanıldığı bir sorgunuz var ya da dini görüşünüz bu parametreyi kullanmanıza izin vermiyor, her durumda sorunu şu şekilde çözebilirsiniz:

KALAN DEPOLARDAKİ ÜRÜNLERİ SEÇİN. Depo, MallarDepolarda Kalır. İsimlendirme, Depolarda Kalan Ürünler. Birikim Kaydından QuantityBalance. Depolardaki Ürünler. Remains((&MyDate) ,) AS ProductsInWarehousesRemains

GÜNCELLEME kullanıcıdan Boo:

“Standart” (sistem tarafından eklenen) parametrelerin kullanılmasındaki temel sorun, bir raporda birden fazla sanal tablo kullanıldığında, eğer bu parametre tanımlanmışsa, diğer tüm durumlarda değerinin “kendi” tabloları yerine kullanılmasıdır.

Sana bir örnek vereyim:

SELECT EmployeesSP.Employee, WorkersSP.ReasonChangesConditions, WorkersSP.Period, WorkersSPAnotherDate.Period AS Period2, WorkersSPAnotherDate.ReasonChangesStates AS ReasonChangesCondition2 FROM RegisterInformation.EmployeesOrganizations.SliceLast(&Period , Employee = &Employee ) AS Employees JV SOL BAĞLANTI Bilgi Kaydı.Kuruluş Çalışanları.En Son Dilim(&OtherDate ,) AS EmployeesSPAnotherDate BY EmployeesSP.Employee = EmployeesSPAnotherDate.Employee

İkinci alt sorguda dilim tarih parametresi olarak OtherDate değeri yerine “standart” PERIOD parametresinin değeri kullanılacaktır.

Bu "aksaklık", ikinci alt sorgu ikinci veri setine çıktılansa ve ACS kullanılarak bağlansa bile gözlemlenecektir. İkinci istekte “ADDATE(&Period, MONTH, -1)” gibi bir ifadenin kullanılması seçeneği de çalışmayacak, ay çıkarılmayacaktır. Ancak istekteki "Dönem" parametresini örneğin "FirstDate" olarak yeniden adlandırmak bu sorunu çözer.

Bu arada, örneğin ciro elde etmek için kullanılan sanal birikim tabloları ve muhasebe kayıtlarında da tam olarak aynı sorun gözleniyor. Sistem buraya “Dönem Başı” ve “Dönem Sonu” parametrelerini ekler.
Bu nedenle, karmaşıklığı biraz da olsa artan taleplerde, kullanılabilirliği ve "standart dönemlerin" kullanımını kapatmak mantıklı olacaktır.

Erişim kontrol sisteminde süreyi ayarlamanın bazı özellikleri.

Veri Birleştirme Sistemi (DCS) kullanılarak geliştirilen raporların çoğu, kullanıcının raporun oluşturulacağı dönemi girmesini gerektirir.

Kural olarak, ACS'de dönem girişi, aşağıdaki yapı kullanılarak parametreler aracılığıyla düzenlenir, bkz. Bu dönem girişi yöntemi “klasik” olarak kabul edilir; ITS ve 1C'deki geliştirmeye ayrılmış diğer literatür hakkındaki bir makalede açıklanmıştır, bu nedenle bunu esas alalım. Örnek olarak, belirli bir süre için Mal ve Hizmet Satışlarının tüm belgelerini alan basit bir talebi ele alalım, bkz.

Bu raporu kullanırken kullanıcı periyodu parametreler üzerinden ayarlar, bakın, her şey doğru gibi görünüyor... AMA küçük bir sorun var:

Mesele şu ki, kullanıcıların büyük çoğunluğu dönemi 1C'nin "anladığından" farklı bir şekilde "anlıyor", örnekler:

Kullanıcı açısından dönem belirtilmemiş yani SINIRSIZ yani tarih kısıtlaması olmayan TÜM dokümanların rapora dahil edilmesi gerekmektedir.

1C sisteminin "bakış açısına göre" parametre süresi belirlenir ve ... her iki sınırı da 01.01.0001'e eşittir ve rapora yalnızca boş tarihi olan belgeler dahil edilecektir; bu, pratikte şu anlama gelir: tek bir belge dahil edilmeyecektir.

Kullanıcı açısından raporun 28.01.2010 tarihinden itibaren tüm belgeleri içermesi gerekmektedir.

1C'nin “bakış açısından” 01/28/2010 - 01/01/0001 dönemi bir istisnaya neden olacaktır.

Elbette kullanıcıya raporun görmeyi beklediği belgeleri neden göstermediğini ve dönemin 1C "bakış açısına" göre nasıl sunulduğunu açıklamaya çalışabilirsiniz, ancak bu nankör bir iştir ve aynı zamanda yanlıştır. İyi bir program, her şeyden önce kullanıcı dostu olmalıdır, çünkü program kullanıcı için mevcuttur ve bunun tersi geçerli değildir, bu nedenle, dönemi kullanıcının anladığı şekilde anlamak için 1C'yi "öğretmeniz" gerekecektir:

1). Dönem Başı ve Dönem Sonu belirtilmemiş -> tüm belgeler.

2). Yalnızca Dönem Başı belirtilir -> Dönem Başından itibaren tüm belgeler

3). Ayrıca Dönem Sonu >= Dönem Başı kontrol edeceğiz, eğer bu doğru değilse Dönem Sonu belirtilmediğini yani. 2).

Yukarıdakilere dayanarak Bitiş Tarihi parametresinin ifadesi şu şekildedir:

WHEN &Period.EndDate=DATETIME(1,1,1)

DAHA SONRA TARİHSAAT(3999,12,31)

NE ZAMAN &Dönem.Bitiş Tarihi<&Период.ДатаНачала

DAHA SONRA TARİHSAAT(3999,12,31) TARİHSAAT(3999,12,31,23,59,59)

&Dönem.Bitiş Tarihi

Dönem seçim tasarımımızın son hali şekilde gösterilmiştir.

Not: Parametreleri ayarlamak için bu mekanizma, eski 1C 8.1 ve 8.2 platformları (ve bunların kontrolü altında çalışan yapılandırmalar) için tasarlanmıştır; 1C platformunun eski sürümlerinde, boş parametreleri kontrol etmek için yerleşik mekanizmalar bulunur ve mekanizmaya başvurmaya gerek yoktur. Bu makalede açıklananlara ek olarak 1C platformunun bazı sürümlerinde hatalar ve yanlış işlemler mümkündür.

Bir erişim kontrol sisteminde raporlar oluştururken, genellikle rapor formunda bir dönem seçimi görüntülemeye ihtiyaç vardır, böylece tarihleri ​​manuel olarak girmenize gerek kalmaz, ancak standart dönemler listesinden seçim yaparsınız, örneğin: "Yıl" , “Ay”, “Hafta” vb. Tarih türündeki parametreler için yalnızca "Bu yılın başlangıcı, ay vb." belirtebilirsiniz ancak "Bitiş" sağlanmaz.

Sorun şu ki, veri türlerinden yalnızca "Standart başlangıç ​​tarihi" türü mevcut, ancak ben aynı zamanda "Standart bitiş tarihi"ni de istiyorum.

Bunu aşmanın bir yolu var.

  1. Yeni bir Parametre oluşturalım, adını "Nokta" koyalım
  2. Bu parametreyi “Standart dönem” türüne ayarlayın
  3. Talepte kullanılan “Dönem Başı” ve “Dönem Sonu” parametrelerinin “İfade” alanına “ &Period.StartDate" ve " &Dönem.Bitiş Tarihi” sırasıyla.

Ama hafif bir incelik var. Sorguda sanal tablolar kullanırsak, büyük olasılıkla rapor çalışmayı durduracak ve “Görünüm işlenirken hata, tür uyuşmazlığı, parametre numarası…” gibi bir hata mesajı görüntülenecektir.

Bunu önlemek için tüm sanal tablo parametrelerini kaldırmanız gerekir.

Ve bunları “Veri Bileşimi” sekmesindeki tablolara ekleyin.

Hızlı rapor ayarlarında parametrelerin görüntülenmesi için rapor parametrelerine karşılık gelen bayrağı etkinleştirelim.

Artık rapor formundaki dönem seçimi şu şekilde görünüyor.

Bu makale, bir Veri Kompozisyon Sistemi (DCS) kullanırken bir dönem ayarlamanın bazı özelliklerini, sıradan bir kullanıcı ile 1C sistemi arasındaki dönem kavramındaki farklılıklar nedeniyle ortaya çıkan sorunları tartışmakta ve ayrıca bunları çözmenin yollarını önermektedir. .
Veri Birleştirme Sistemi (DCS) kullanılarak geliştirilen raporların çoğu, kullanıcının raporun oluşturulacağı dönemi girmesini gerektirir. Kural olarak, ACS'de dönem girişi aşağıdaki yapı kullanılarak parametreler aracılığıyla düzenlenir, bkz. Şekil 1 Bu döneme girme yöntemi "klasik" olarak kabul edilir, ITS ve 1C'deki gelişime adanmış diğer literatür hakkındaki bir makalede anlatılmıştır, bu yüzden bunu temel alalım. Örnek olarak, belirli bir süre için Mal ve Hizmet Satışlarının tüm belgelerini alan basit bir talebi ele alalım, bkz. İncir. 2 Bu raporu kullanırken kullanıcı periyodu parametreler aracılığıyla ayarlar, bkz. Şek. 3 Her şey doğru gibi görünüyor... AMA küçük bir sorun var:

Mesele şu ki, kullanıcıların büyük çoğunluğu dönemi 1C'nin "anladığından" farklı bir şekilde "anlıyor", örnekler:
1). Hadi düşünelim Şek. 3
Kullanıcı açısından dönem belirtilmemiş yani SINIRSIZ yani tarih kısıtlaması olmayan TÜM dokümanların rapora dahil edilmesi gerekmektedir.
1C sisteminin "bakış açısına göre" parametre süresi belirlenir ve ... her iki sınırı da 01.01.0001'e eşittir ve rapora yalnızca boş tarihi olan belgeler dahil edilecektir; bu, pratikte şu anlama gelir: tek bir belge dahil edilmeyecektir.
2). Hadi düşünelim Şekil 4
Kullanıcı açısından raporun 28.01.2010 tarihinden itibaren tüm belgeleri içermesi gerekmektedir.
1C'nin "bakış açısına göre" 01/28/2010 - 01/01/0001 dönemi bir istisnaya neden olacaktır.

Elbette kullanıcıya raporun görmeyi beklediği belgeleri neden göstermediğini ve dönemin 1C "bakış açısına" göre nasıl sunulduğunu açıklamaya çalışabilirsiniz, ancak bu nankör bir iştir ve aynı zamanda yanlıştır. İyi bir program, her şeyden önce kullanıcı dostu olmalıdır, çünkü program kullanıcı için mevcuttur ve bunun tersi geçerli değildir, bu nedenle, dönemi kullanıcının anladığı şekilde anlamak için 1C'yi "öğretmeniz" gerekecektir:
1). Dönem Başı ve Dönem Sonu belirtilmemiş -> tüm belgeler.
2). Yalnızca Dönem Başı belirtilir –> Dönem Başından itibaren tüm belgeler
3). Ayrıca Dönem Sonu >= Dönem Başı kontrol edeceğiz, eğer bu doğru değilse Dönem Sonu belirtilmediğini yani. 2).
Yukarıdakilere dayanarak Bitiş Tarihi parametresinin ifadesi şu şekilde görünecektir:

SELECT WHEN &Period.EndDate=DATETIME(1,1,1) THEN DATETIME(3999,12,31,23,59,59) ELSE SELECT WHEN &Period.EndDate<&Период.ДатаНачала ТОГДА ДАТАВРЕМЯ(3999,12,31,23,59,59) ИНАЧЕ &Период.ДатаОкончания КОНЕЦ КОНЕЦ

Dönem seçim tasarımımızın son hali şekilde gösterilmiştir. Şekil 5

Öyleyse başlayalım.

Örneği anlamak için basit bir dolaşımdaki birikim kaydı üzerine inşa edeceğiz.

Benim durumumda bu, "Devam Eden İşler Muhasebesi" birikim kaydıdır.

Örneğin, parametrelerini katı bir şekilde göstereceğiz (parametrelerin erişim kontrol sistemine yumuşak bir şekilde uygulanması yoluyla değil):

Lütfen sanal tablonun frekansının “Kayıt” olduğunu unutmayın.

Ancak yukarıda da belirtildiği gibi periyodiklik açısından döneme ihtiyacımız var, bu nedenle "Dönem" alanını şu şekilde hesaplamayı öneriyorum (pek hoş değil ama daha iyi bir seçenek görmedim):

Ekran görüntüsünden görülebileceği gibi, isteğe kullanıcının formda belirttiği bir parametre iletilir: "Frekans" numaralandırmasının değeri - bu numaralandırma neredeyse tüm standart çözümlerde bulunur.

Mevcut türlerini “Parametreler” sekmesinde belirteceğiz:

Bu ayarla her şeyin güzel ve göze hoş gelmesi için dönemimizi formatlıyoruz)

İşte formatların kendisi:

Ay: DF="MMMM yyyy "y.""

Gün: DF = gg.AA.yyyy

Hafta: DF = """gg.AA.yyyy" tarihinden itibaren hafta

Çeyrek: DF = "yyyy "y"nin "çeyreğine"."

Yıl: DF = "yyyy "y.""

On yıl: DF = "" "dd.MM.yyyy" ile on yıl

Yarı yıl: DF = ""GG.AA.yyyy'den itibaren yarı yıl"

Bu kadar. Çıktı harika bir resim: