Perbandingan dengan tanggal kosong dalam permintaan 1c

Semua dokumen yang ada dalam konfigurasi 1C, dan, oleh karena itu, hampir semua register harus memiliki setidaknya satu variabel dengan tipe Tanggal, itulah sebabnya setiap pengembang perlu mengetahui dan memahami:

  • Bagaimana mengonversi parameter tipe lain ke tipe yang dimaksud;
  • Cara menentukan tanggal kosong dalam permintaan 1C;
  • Apa perbedaan antara batas tanggal dan waktu.

Untuk pertanyaan-pertanyaan inilah kami akan mencoba menjawabnya di artikel kami.

Apa itu tanggal dan bagaimana menentukannya

Karena sebagian besar keputusan manajemen dan akuntansi tidak memerlukan akurasi waktu melebihi 1 detik, pengembang platform 1C memutuskan bahwa nilai ini akan menjadi minimum maksimum dalam format tanggal. Dengan demikian, setiap variabel yang menggambarkan waktu suatu peristiwa dalam program harus berisi:

  • Tahun terjadinya peristiwa;
  • Bulan acara ini;
  • Hari.

Opsional: jam, menit, dan detik. Jika ketiga parameter ini dihilangkan dan tidak ada kondisi tambahan, program secara otomatis menyetel waktu ke awal hari.

Format tanggal yang ada di dunia memiliki perbedaan yang signifikan:

  1. Di Rusia, kami terbiasa mendahulukan hari, lalu datang bulan acara, dan di akhir - tahun;
  2. Penduduk AS memulai tanggal dengan satu bulan;
  3. Ceko, Polandia, dan Slovenia menulis periode dalam format "Tahun - Bulan - Hari".

Ini adalah format terakhir yang digunakan platform 1C.

Konversikan ke tanggal

Untuk mendapatkan parameter dengan tipe Tanggal dari beberapa nilai atau dari string, Anda harus menggunakan kode yang ditunjukkan pada Gambar. satu

Seperti yang Anda lihat dari gambar di atas, Anda dapat menentukan tanggal baik dengan bantuan satu baris, dan dengan pembagian baris ini menjadi bagian-bagian komponennya menggunakan koma, hasilnya tidak akan berubah.

Penting untuk dipahami bahwa tahun dari tanggal harus berisi empat digit, termasuk milenium dan abad peristiwa, bulan, hari, jam dan detik - harus terdiri dari dua karakter, termasuk nol di depan.

Hitung mundur dalam program dimulai dari awal hari pada 1 Januari 0001. Untuk kode di atas, nilai ini dapat ditentukan dengan salah satu dari dua cara (Gbr. 2).

Beras. 2

Di baris kedua, kami menghilangkan jam, menit, dan detik acara, yang sama sekali tidak memengaruhi kinerja kode kami.

Fitur menggunakan tanggal dalam permintaan 1C

Untuk sebagian besar tipe data yang digunakan oleh platform 1C, ada nilai kosong yang telah ditentukan sebelumnya. Untuk angka, ini adalah 0, untuk tautan, Anda dapat menentukan nilai EmptyReference (), untuk tanggal, biasanya menganggap tanggal mulai sebagai nilai kosong, dengan itu Anda perlu membandingkan detail yang sesuai ketik saat mengatur parameter kueri.

Penting untuk dipahami bahwa meskipun tidak ada angka yang ditunjukkan dalam nilai atribut form dari jenis yang dimaksud, yaitu, jendela terlihat seperti (Gbr. 3), ini tidak berarti bahwa tidak ada yang ditentukan di dalamnya, perbandingan parameter ini dengan string kosong tidak akan berfungsi.

Beras. 3

Setelah menerima tanggal kosong, kami dapat menentukannya sebagai parameter untuk permintaan kami, yaitu, menggunakan konstruksi (Gbr. 4)

Namun, ada kalanya lebih baik untuk memeriksa di dalam badan permintaan tanpa melewatkan tanggal kosong sebagai parameter. Untuk melakukan ini, Anda dapat memasukkan kondisi yang sesuai dalam kode permintaan (Gbr. 5) dan menggunakan fungsi permintaan DateTime ().

Beras. 5

Dalam teks kueri yang diberikan, kami menghilangkan nol di depan untuk tahun, bulan dan hari, dan juga tidak menunjukkan jam, menit dan detik, dan program, seperti yang mereka katakan, memakan asumsi ini.

Batas tanggal dan waktu

Fakta menarik lainnya tentang hubungan antara kueri dan tanggal adalah penggunaan konsep "titik waktu" ketika merujuk ke berbagai tabel database.

Akurasi "hingga satu milidetik" yang ditunjukkan dalam dokumentasi teknis ketika menjelaskan tipe tanggal primitif paling jelas dimanifestasikan ketika memilih catatan dari tabel virtual register akumulasi: jika register akumulasi, selain tabel Perputaran, memiliki tabel Remains dan Remains dan Perputaran, maka pemilihannya yang dilakukan selama waktu tertentu dapat memberikan hasil yang berbeda.

Untuk memahami bagaimana dan mengapa ini terjadi, pertimbangkan contoh sederhana:

  1. Sebelum dokumen penjualan dilakukan pada 12 jam 31 menit 36 ​​detik, saldo menurut nomenklatur Gula adalah 30 kg;
  2. Dokumen pada waktu yang ditentukan dihapuskan 10 kg;
  3. Laporan yang dihasilkan pada tanggal dokumen pada 12 jam 31 menit 36 ​​detik menurut tabel Saldo akan menunjukkan sisa 30 kg;
  4. Laporan yang sama pada tabel Residuals dan Turnovers pada saat yang sama akan menunjukkan sisa 20 kg.

Apa alasan perilaku ini dan bagaimana cara menghindarinya?

Masalahnya adalah bahwa dalam tabel Remains, periode ditetapkan sebagai segmen terbuka, yaitu, gerakan yang dilakukan pada saat laporan dihasilkan tidak diperhitungkan, yaitu, waktu diambil pada awal detik yang ditentukan. dalam parameter. Pada saat yang sama, untuk tabel Turns dan untuk tabel Remaining AND Turnover, batas waktu diperhitungkan, yaitu waktu diambil pada akhir detik yang ditentukan.

Ada beberapa jalan keluar dari situasi ini:

  1. Saat menggunakan tabel Residual, tunjukkan titik waktu 1 detik lebih lama dari yang ditentukan;
  2. Gunakan hanya tabel Remains and Turnovers (bukan opsi yang paling optimal dalam hal kinerja);
  3. Gunakan konsep Perbatasan.

Opsi terakhir dapat diwakili oleh kode yang ditunjukkan pada Gambar. 6.

Pada parameter pertama objek kami, kami menunjukkan tanggal yang diperlukan untuk membuat laporan, parameter kedua menentukan jenis perbatasan. Karena penting bagi kami bahwa pergerakan untuk tanggal tertentu disertakan dalam sampel, kami harus menyetel parameter ini ke posisi "Termasuk".

Sangat sering dalam permintaan 1C Anda harus bekerja dengan tanggal. Terutama ketika kueri sedang dibangun untuk objek metadata yang berisi informasi berkala. Sebagai aturan, ini adalah register (informasi, akumulasi, perhitungan, akuntansi). Mari kita pertimbangkan fungsi yang paling sering digunakan dari bahasa kueri 1C untuk bekerja dengan tanggal. Kami akan membuat contoh berdasarkan register informasi Organisasi Karyawan Revisi konfigurasi ZUP 2.5.

  • TANGGAL WAKTU

    Memungkinkan Anda mendapatkan tanggal dalam permintaan (dengan atau tanpa waktu) dengan menentukan tahun, bulan, hari, jam, menit, detik.
    Sintaksis:
    TANGGAL WAKTU (Tahun, Bulan, Hari, Jam, Menit, Detik)
    Biasanya jam, menit dan detik tidak ditentukan. Mari kita beri contoh mini. Masukkan teks berikut di Konsol Kueri:

    PILIH TANGGAL WAKTU (2016, 1, 1)

    Sebagai hasil dari mengeksekusi permintaan, kami mendapatkan tanggal - 01/01/2016
    Faktanya, sulit untuk membayangkan situasi di mana tanggal akan ditunjukkan dalam permintaan dengan cara ini. Lagi pula, ketika Anda perlu menentukan periode, parameter digunakan. Tetapi ada kasus ketika fungsi ini bernilai khusus. Ini adalah saat kita perlu menentukan tanggal kosong di bidang atau dalam kondisi kueri. Biarkan saya mengingatkan Anda bahwa untuk bahasa 1C, tanggal kosong terlihat seperti - 0001.01.01. Jadi, untuk mendapatkan tanggal kosong dalam permintaan, cukup tentukan TANGGAL WAKTU (1, 1, 1)... Sebagai contoh, mari kita pilih dari register informasi Organisasi Karyawan entri yang tidak diisi Periode Penyelesaian:

    PILIH Pegawai Organisasi Periode, Pegawai Organisasi, Pegawai, Pegawai Organisasi, Jabatan, Pegawai Organisasi, Subbagian Organisasi DARI Daftar Informasi Pegawai Organisasi SEBAGAI Pegawai Organisasi MANA Pegawai Organisasi.

  • AWAL PERIODE

    Mengembalikan awal periode yang berlaku untuk tanggal yang ditentukan.
    Sintaksis:
    PERIODE MULAI (Tanggal, Jenis Periode)
    PeriodType dapat mengambil nilai berikut: MENIT, JAM, HARI, MINGGU, BULAN, KUARTA, TAHUN, DEKADE, SEMI TAHUNAN
    Di konsol kueri, masukkan:

    PILIH MULAI PERIODE (TANGGAL WAKTU (2016, 1, 15), BULAN)

    Permintaan akan kembali - 01.01.2016
    Sekarang untuk contoh. Seperti yang Anda ketahui frekuensi di register Organisasi Karyawan satu hari. Mari buat kueri di mana tanggal awal bulan akan ditampilkan alih-alih periode catatan yang valid.

    PILIH PERIODE AWAL (Karyawan Organisasi. Periode, BULAN) SEBAGAI Awal Bulan, Pegawai Organisasi. Pegawai, Pegawai Organisasi. Jabatan, Pegawai Organisasi. Subbagian Organisasi.

  • AKHIR PERIODE

    Sintaksnya sama dengan awal periode. Dan seperti namanya, ini mengembalikan akhir periode berdasarkan tanggal dan jenis periode. Kami tidak akan mempertimbangkan secara detail. Mari kita batasi diri kita pada contoh mini.
    Pertanyaan:

    PILIH AKHIR PERIODE (TANGGAL WAKTU (2016, 1, 15), BULAN)

    Kembali 1/31/2016 23:59:59
    Seperti yang Anda lihat, nilai yang dikembalikan akurat ke detik.

  • TAMBAHKAN

    Menambahkan jumlah slot waktu yang ditentukan ke tanggal.
    Sintaksis:
    TAMBAHKAN KE TANGGAL (Tanggal, Jenis Periode, Hitungan)
    PeriodType menerima nilai yang sama dengan fungsi AWAL PERIODE
    Mari kita ambil tanggal Februari sebagai contoh:

    PILIH TAMBAHKAN KE TANGGAL (DATETIME (2016, 2, 15), MONTH, 2)

    Kami mendapatkan tanggal 04/15/2016 0:00:00 Terlepas dari kenyataan bahwa Februari adalah bulan yang singkat, hari tanggal yang diterima sama dengan tanggal aslinya. Sangat nyaman bahwa Anda tidak perlu memikirkan jumlah hari dalam bulan.
    Jumlahnya bisa negatif. Kemudian interval dihitung dalam arah yang berlawanan.

  • PERBEDAAN

    Menghitung perbedaan antara dua tanggal dalam unit yang ditentukan.
    Sintaksis:
    PERBEDAAN TANGGAL (Tanggal Mulai, Tanggal Berakhir, Jenis Periode)
    Jenis periode dapat mengambil nilai berikut: KEDUA, MENIT, JAM, HARI, BULAN, KUARTA, TAHUN
    Misalnya:

    PILIH PERBEDAAN TANGGAL (TANGGAL WAKTU (2016, 2, 15), TANGGAL WAKTU (2016, 3, 1), HARI)

    kembali 15

Fungsi yang paling sering digunakan dari bahasa kueri 1C dipertimbangkan di sini. Selebihnya jarang digunakan. Jika perlu, contoh bekerja dengan mereka dapat ditemukan di bantuan yang dibangun ke dalam platform 1C.

Saat bekerja dengan tanggal 1C, urutan khas bagian tanggal adalah tahun, bulan, hari, jam, menit, detik. Dalam hal ini, jam, menit, detik dapat dilewati.

Saat membuat tanggal dari string ("cast to date"), Anda dapat menentukan dalam format lokal (hari.bulan.tahun jam: menit: detik), tetapi hanya sepenuhnya.

Misalnya:
// Bekerja dengan tanggal 1C - ubah tanggal menjadi 1C dari bagian - tahun, bulan, hari (ditambah waktu opsional)
Tanggal = Tanggal (2012,10,30); // tidak ada waktu
Tanggal = Tanggal (2012,10,30,12.00,00); //bersama waktu

// Bekerja dengan tanggal 1C - ubah tanggal menjadi 1C dari string, dengan cara yang berbeda
Tanggal = Tanggal ("20121030"); // tahun bulan hari
Tanggal = Tanggal ("30/10/2012 12:00:00"); // format lokal, hanya lengkap

// Bekerja dengan tanggal 1C - menentukan nilai tanggal tanpa casting, secara langsung
Tanggal = "20121030"; // tidak ada waktu
Tanggal = "20121030120000"; //bersama waktu

Bekerja dengan tanggal 1C - Tanggal kosong 1C

Untuk memeriksa tanggal 1C untuk kepenuhan - ini dibandingkan dengan "tanggal kosong". Jika ada atribut tipe tanggal di buku referensi / dokumen, jika pengguna belum mengisi kolom ini, maka nilainya juga akan menjadi "tanggal kosong".

"Tanggal kosong" adalah 01.01.0001 00:00:00.

Misalnya:
Tanggal Kosong = "00010101000000";
Jika RequiredDate = "00010101000000" Maka
Laporan ("Anda tidak mengisi tanggal yang sangat diperlukan");
Berakhir jika;

Bekerja dengan tanggal 1C - Tanggal dalam rincian (buku referensi, dokumen, dll.)

Saat menentukan jenis atribut, Anda dapat menentukan penggunaan:

  • Tanggal saja (waktu selalu 00:00:00)
  • Hanya waktu (tanggal selalu 01.01.0001)
  • Tanggal dan waktu

Mendapatkan tanggal

Untuk mendapatkan tanggal dan waktu, gunakan fungsi 1C CurrentDate().

Tempat yang sangat penting adalah di mana fungsi ini dipanggil - di klien atau di server. Untuk detailnya, lihat topik "Mode Performa / Performa". Sering terjadi bahwa waktu sedikit berbeda pada mesin klien, sehingga mereka mencoba menggunakan waktu server di mana-mana - bahkan jika tidak diatur dengan benar di server, maka setidaknya semua klien akan memiliki waktu yang salah yang sama.

Untuk mendapatkan tanggal server (tanggal yang ditetapkan dalam sistem operasi komputer server), biasanya modul umum dibuat dalam konfigurasi dengan kotak centang "Server" dicentang di properti, dan fungsi dibuat di dalamnya
// fungsi terletak di modul umum, misalnya, bernama ServerFunctions
// di properti modul umum, kotak centang "Server" dicentang dan kotak centang "Klien" tidak disetel
Fungsi GetServerDate () Ekspor
Kembali CurrentDate();
Fungsi Akhir

// memanggil fungsi ini untuk digunakan dari modul lain terlihat seperti ini
DocumentObject.Date = ServerFunctions.GetServerDate(); //NamaModul.NamaFungsi()

Juga, di klien tipis, tepat di sebelah fungsi modul, ditunjukkan di mana ia akan dieksekusi:

Awal dan akhir hari

Untuk tanggal "30/10/2012":

  • tanggal mulai hari terlihat seperti ini "30/10/2012 00:00:00"
  • tanggal akhir terlihat seperti ini "30/10/2012 23:59:59"

Ini digunakan dalam laporan dan kueri yang membutuhkan data untuk periode - hari, bulan, tahun.

Misalnya, periode dari 01/01/2012 00:00:00 hingga 31/01/2012 00:00:00 salah, karena tidak menyertakan satu hari dalam sebulan (tetapi mencakup satu detik dari hari terakhir hari dalam sebulan).

Bekerja dengan tanggal 1C - Membandingkan tanggal

Tanggal berisi tanggal dan waktu. Saat membandingkan tanggal (tidak termasuk waktu), mereka biasanya dibawa ke awal hari (bulan, tahun).

Misalnya:
Tanggal1 = Tanggal ("30/10/2012 12:00:00");
Jika StartDay (Date1) = StartDay (DocumentRef.Date) Maka
Laporan ("Dokumen dimasukkan pada tanggal yang ditentukan");
Berakhir jika;

Untuk jaga-jaga, contoh membandingkan tanggal dalam satu periode:
Jika DocumentRef.Date> = StartMonth (CurrentDate ()) dan
DokumenRef.Tanggal

Bekerja dengan tanggal 1C - Mengubah tanggal

Tanggal adalah jumlah detik. Jika kita ingin tidak hanya mengetahui apakah satu tanggal lebih besar dari yang lain, tetapi juga berapa banyak lagi, maka kita mendapatkan perbedaan dalam hitungan detik.

Misalnya:
DayStart = CurrentDate () - DayStart (CurrentDate ());
Report ("Sejak awal hari telah berlalu" + String (Dari awal hari) + "detik");
Report ("Sejak awal hari telah berlalu" + String (Dari awal hari / 60) + "menit");
Report ("Sejak awal hari telah berlalu" + String (Dari awal hari / 60/60) + "jam");

Kami juga dapat mengubah tanggal, saat mengubah, kami menambah atau mengurangi jumlah detik:
StartThisDay = StartDay (CurrentDate ());

EarlyPreviousDay = Hari Awal (BeginningThisDay - 1); // hapus yang kedua - lakukan "kemarin" dan ambil awal hari dari "kemarin"

StartPreviousDay = StartThisDay - 24 * 60 * 60; // cara lain - kita kurangi 24 jam - 24 (jam) * 60 (menit ternyata) * 60 (detik)

Bekerja dengan tanggal 1C - Momen waktu

Sebuah titik waktu adalah representasi tanggal diperpanjang berlaku untuk dokumen (dan sesuai register).

Diperlukan untuk membandingkan waktu dokumen jika tanggal dan waktu dokumen sama. Dengan demikian, ini dapat digunakan saat memfilter dalam kueri.

Momen waktu dapat diperoleh dari dokumen dengan cara berikut:
// metode 1
DocumentMomentTime = DocumentRef.Timepoint();

Anda juga dapat membandingkan titik waktu dengan tanggal/waktu:
Moment of TimeStatus = Momen Waktu Baru (Awal Hari (CurrentDate ()));
Jika DocumentRef.MomentTime (). Bandingkan (TimeTimeStandard) = -1 Maka
Report ("Dokumen diperkenalkan lebih awal dari hari ini");
Berakhir jika;
// Jika dokumen dimasukkan pada tanggal hari ini pukul 00:00:00, maka dokumen itu tetap dimasukkan - hari ini

Bekerja dengan tanggal 1C - Pemformatan tanggal

Artikel ini akan melihat cara untuk memeriksa nilai nol tergantung pada jenis atribut yang diperiksa, termasuk tautan nol.

Nilai NULL dikembalikan ketika tidak ada alat peraga. Jenis dalam kasus ini juga akan NULL. Misalnya, Anda menggabungkan dua tabel melalui gabungan kiri. Jika tidak ada nilai yang ditemukan di tabel kanan untuk tabel kiri, NULL akan dikembalikan.

Pemeriksaan nilai ini dapat dilakukan dengan menggunakan konstruksi "IS NULL" dan "". Dalam kasus pertama, ia mengembalikan True atau False. Dalam kasus kedua, Anda dapat segera menetapkan nilai yang berbeda dalam kasus ketika NULL dikembalikan.

Permintaan 1C 8.3 di bawah ini akan mengembalikan daftar orang yang dapat dihubungi untuk mitra yang tidak memiliki segmen tertentu.

PILIH
KontakMitra.Link
DARI
Contact Person Directory.Partners SEBAGAI CONTACT PERSON PARTNER
INTERNAL JOINT Directory.SegmentsPartners AS SegmentsPartners
Kontak Mitra Perangkat Lunak.Pemilik = Segmen Mitra.Induk
DI MANA
Segmen Mitra.Ref IS NULL

Tanggal kosong

Validasi untuk tanggal kosong dilakukan dengan membandingkannya dengan konstruksi DATE TIME (1, 1, 1, 0, 0, 0). Contoh penggunaan diberikan di bawah ini:

Tautan kosong dalam permintaan 1C

Dalam kasus ketika atribut yang dikembalikan memiliki tipe referensi, misalnya, itu adalah elemen dari beberapa kamus, dokumen, dll., konstruksi berikut digunakan: VALUE (Directory.ReferenceName.EmptyRef).

Dalam contoh di bawah ini, kueri memilih semua mitra yang tidak memiliki wilayah bisnis yang ditentukan.

Untuk memeriksa "ValueFilled" Anda perlu melakukan kondisi sebaliknya:

Mitra.BisnisWilayah<>VALUE (Directory.BusinessRegions.EmptyLink)

Baris kosong

Untuk memeriksa jenis string, perbandingan dibuat dengan pola lain. Pada kasus ini - "".

Kueri di bawah ini akan memilih semua mitra dengan nama kosong.

Pada titik tertentu, ada kebutuhan untuk bekerja dengan variabel tipe "Tanggal". Pada artikel ini, kita akan melihat teknik dasar - melewati tanggal saat ini, memeriksa nilai kosong, tanggal yang berubah-ubah.

Saat menulis kueri, seringkali perlu membandingkan data dengan tanggal saat ini. Bahasa 1C bawaan memiliki fungsi CurrentDate (). Ini memungkinkan Anda untuk menentukan waktu dan tanggal saat ini di komputer Anda. Untuk melakukan operasi dengan tanggal saat ini, perlu untuk meneruskan nilai fungsi ini sebagai parameter ke permintaan.

Di bawah ini adalah kueri yang memilih semua file yang dilampirkan ke laporan pengeluaran dengan tanggal pembuatan hingga sekarang:

ContohRequest = Permintaan Baru;
ContohPermintaan.Teks = "
| PILIH
| Laporan Lanjutan File Terlampir. Tautan
| DARI
| Referensi.AvailableReportAttachedFilesASA AdvanceReportAttachedFiles
| DI MANA
| Laporan Lanjutan File Terlampir.Tanggal< &ТекДата»;
ContohRequest.SetParameter("CurrentDate", CurrentDate());

Tanggal kustom

Fungsi di atas memungkinkan Anda untuk membandingkan dan, oleh karena itu, membuat pilihan untuk periode apa pun. Metode ini memungkinkan Anda untuk menentukan pilihan ketat dalam kueri tanpa menggunakan parameter tambahan.

Perhatikan bahwa menggunakan fungsi ini pada contoh di atas, kami hanya melewatkan tiga angka (tahun, bulan, hari) sebagai parameter input. Tiga terakhir (jam, menit, detik) adalah opsional dan, jika tidak ada, diganti dengan "0", yaitu awal hari.

Untuk contoh ini, Anda akan menerima semua file yang dilampirkan pada laporan pengeluaran hingga akhir tahun 2016 lalu. Dalam hal ini, kami akan menunjukkan jam, menit dan detik untuk membandingkan dengan momen dalam waktu "31 Desember 2016 pukul 23:59:59".

PILIH
Laporan Lanjutan File Terlampir. Tautan
DARI
Directory.AvailableReportAttachedFiles AS AdvanceReportAttachedFiles
DI MANA
Laporan Lanjutan File Terlampir.Tanggal< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Tanggal kosong

Paling mudah untuk memeriksa variabel untuk melihat apakah itu berisi tanggal kosong dengan perbandingan sederhana. Dalam contoh ini, menggunakan kueri, kami akan memilih semua penerimaan kas ke rekening bank, yang tanggal masuknya tidak diisi.