1s jika nilainya kosong. Konversikan ke tanggal

Artikel ini akan membahas cara memeriksa nilai kosong bergantung pada jenis atribut yang diperiksa, termasuk tautan kosong.

Nilai NULL dikembalikan jika atribut tidak ada. Tipe dalam hal ini juga adalah NULL. Misalnya, Anda menggabungkan dua tabel menggunakan gabungan kiri. Jika tidak ada nilai yang ditemukan di tabel kanan untuk tabel kiri, NULL akan dikembalikan.

Pengecekan nilai ini dapat dilakukan dengan menggunakan konstruksi “IS NULL” dan “ ”. Dalam kasus pertama, Benar atau Salah dikembalikan. Dalam kasus kedua, Anda dapat segera menetapkan nilai yang berbeda jika NULL dikembalikan.

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

MEMILIH
Kontak PersonPartners.Link
DARI
Direktori.Contact Person Mitra SEBAGAI Contact Person Mitra
Direktori GABUNG INTERNAL. Segmen Mitra SEBAGAI Segmen Mitra
Perangkat Lunak Contact Person dari Partners.Owner = Segmen dari Partners.Parent
DI MANA
Segmen Mitra

Tanggal kosong

Nilai diperiksa untuk tanggal kosong dengan membandingkannya dengan konstruksi DATETIME(1, 1, 1, 0, 0, 0) . Contoh penggunaan diberikan di bawah ini:

Tautan kosong dalam permintaan 1C

Jika atribut yang dikembalikan adalah tipe referensi, misalnya, elemen direktori, dokumen, dll., konstruksi berikut digunakan: VALUE(Directory.DirectoryName.EmptyLink).

Pada contoh di bawah, kueri memilih semua mitra yang wilayah bisnisnya tidak ditentukan.

Untuk memeriksa "ValueFilled" Anda perlu melakukan kondisi sebaliknya:

Mitra.Wilayah Bisnis<>VALUE(Direktori.BusinessRegions.EmptyLink)

Tali kosong

Untuk memeriksa tipe string, perbandingan dilakukan dengan sampel lain. Dalam hal ini - "".

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

Saat bekerja dengan kueri, setiap programmer harus berinteraksi dengan nilai kosong dengan satu atau lain cara. Apa yang dimaksud dengan nilai kosong?

Nilai null berarti tidak ada nilai atau nilai default untuk tipe data. Dengan tipe primitif, semuanya cukup sederhana: nilai default adalah beberapa nilai awal yang berfungsi sebagai titik awal.

Jenis Nilai Null

Mari kita lihat jenis nilai kosong yang mungkin ditemui atau diperlukan dalam kueri.

  • Untuk tipe Number, nilai yang kosong adalah nol – 0.
  • Untuk tipe String – string kosong – “”.
  • Untuk jenis Tanggal – 1 Januari tahun pertama – 01/01/0001 00:00:00. Mulai tanggal inilah waktu dihitung dalam 1C.*
  • Untuk tipe Boolean, nilai defaultnya secara teknis adalah False, tetapi secara logis kedua nilai tipe tersebut diisi. Oleh karena itu, memutuskan apakah suatu nilai kosong adalah False atau tidak didasarkan pada logika algoritma tertentu.

*Hati-hati, di luar 1C terdapat sistem penghitungan tanggal yang berbeda dengan titik awal yang berbeda.

Nilai yang hilang sepenuhnya hanya sesuai dengan tipenya Batal. Tipe ini hanya berisi satu nilai, yang menunjukkan tidak ada nilai.

Tipe serupa Belum diartikan juga hanya berisi satu nilai, tetapi Undefinisi tidak berarti tidak adanya data, tetapi hanya ketidakmungkinan menentukan nilai default untuk tipe tersebut. Tidak terdefinisi adalah nilai default untuk tipe komposit, termasuk yang tidak ditentukan secara eksplisit. Misalnya, nilai dalam baris baru dari tabel nilai dalam kolom yang tipenya tidak ditentukan secara eksplisit.

Bersama referensi jenis ketidakpastiannya jauh lebih sedikit. Semua tipe referensi memberikan nilai null. Nilai kosong adalah referensi yang sama yang menunjukkan tipe data, tetapi tanpa pengidentifikasi unik untuk nilai tertentu. Berkat ini, kami dapat memperlakukan tautan kosong seolah-olah tautan biasa dan menerapkan semua metode yang disediakan oleh platform padanya, bekerja dengannya dengan nilai penuh.

Bekerja dengan Nilai Null dalam Kueri

Apakah Anda perlu memasukkan nilai null secara eksplisit ke dalam hasil kueri atau membandingkan nilai yang ada dengan nilai null, Anda perlu mengetahui cara mendeskripsikan nilai null dalam kueri Anda.

Jenis Angka, String, Boolean dijelaskan dalam permintaan seperti dalam bahasa bawaan:

PILIH 0 SEBAGAI ContohTypeNumber, "Halo dunia" SEBAGAI ContohTypeString, Benar SEBAGAI ContohTypeBoolean

Tidak terdefinisi, pada dasarnya merupakan tipe primitif, dijelaskan dengan cara yang sama:

Pilih Batch.Period Dari Daftar Akumulasi.Batch Sebagai Batch Dimana Tersisa.DocumentBatch = Tidak Terdefinisi

Nilai referensi kosong sedikit lebih sulit untuk didefinisikan. Semua objek referensi memiliki nilai layanan yang telah ditentukan sebelumnya, yaituEmptyReference. Berkat ini, dimungkinkan untuk memilih tautan kosong dengan satu cara - melalui fungsi Nilai:

Pilih Nilai(Directory.Nomenclature.EmptyLink) Cara Mengosongkan Nomenklatur

Kemungkinan untuk bekerja dengan nilai Null agak lebih kaya. Seperti tipe primitif lainnya, Null dideskripsikan dengan cara yang sama seperti dalam bahasa bawaan. Selain itu, ada operator khusus Is Null dan fungsi IsNull.

  • Operator Is Null memungkinkan Anda membuat ekspresi logis yang membandingkan nilai yang dipilih dengan nilai Null.
  • Fungsi IsNull mengembalikan argumen pertama jika bukan Null, dan argumen kedua sebaliknya.

Ekspresi yang menentukan nilai kosong dapat digunakan di bagian kueri mana pun yang mendukung ekspresi. Misalnya, Anda dapat menambahkan tautan kosong ke bagian Pilih atau centang Null ke Kondisi.

Contoh praktis

Menggunakan fungsi Nilai

Pilih Products.Link Sebagai Nomenklatur, Products.Link = Value(Directory.Nomenclature.EmptyLink) Seperti IniLinkEmpty Dari TueProducts Sebagai TueProducts

Menggunakan operator Is Null

Pilih Products.Link Sebagai Nomenklatur, Products.Link Tidak Ada Seperti Tautan IniKosongkan Dari SelProduk Sebagai SelProduk

Null di kiri atau gabung penuh

Memeriksa Null

Contoh ini menunjukkan situasi praktis yang umum ketika, dengan gabungan kiri, tidak ada kecocokan untuk tabel pertama di tabel kedua. Dalam hal ini, semua bidang tabel kedua akan bernilai Null.

Pilih TueProducts.Link Sebagai Nomenklatur, Remains.QuantityRemaining Sebagai Quantity, Remains.QuantityRemaining Adalah Null Karena NoRemaining Dari TueProducts sebagai TueProducts Koneksi Kiri RegisterAccumulations.ProductsInWarehouses.Remains As Remains Oleh TueProducts.Link = Remains.Nomenclature

Menangani Nilai Null

Modifikasi kueri sebelumnya untuk mendemonstrasikan teknik umum untuk mendapatkan beberapa nilai default untuk menggantikan nilai yang hilang. Dalam contoh ini, dengan menggunakan fungsi IsNull, nilai sisa yang hilang diganti dengan 0 yang benar secara logis.

Pilih TueProducts.Link Sebagai Nomenklatur, IsNull (Remaining.QuantityRemaining, 0) Sebagai Kuantitas Dari TueProducts sebagai TueProducts Koneksi Kiri RegisterAccumulations.ProductsInWarehouses.Remains As Remains Oleh TueProducts.Link = Remains.Nomenclature

Pada artikel ini, kami melihat berbagai jenis nilai kosong dan propertinya, mempelajari cara mendefinisikan berbagai jenis nilai kosong dalam kueri, dan pada bagian praktis kami yakin akan kemudahan penerapan materi yang dibahas.

Query.Text = "SELECT | UseStorageUnits.Link | FROM | Directory.useStorageUnits AS UseStorageUnits // Contoh 1. perbandingan dengan nilai boolean kosong: | WHERE | UseStorageUnits. Izinkan SelectionFromBackupZone = False // Contoh 2. tetapi jika boolean ini ditentukan , maka lebih baik seperti ini: // kondisi untuk Boolean negatif: |. WHERE |. BUKAN unit penyimpanan. Izinkan Seleksi Dari Zona Cadangan // Contoh 3. pemilihan berdasarkan kondisi field yang tidak terisi yang bertipe “direktori tertentu”. type” |.WHERE |.unit penyimpanan.Area Pilihan Aktif = VALUE (Direktori. ) // Contoh 3a.pemilihan berdasarkan bidang yang tidak terisi yang memiliki tipe "dokumen dengan tipe tertentu" |. OurDocument.EmptyLink) // Contoh 3b. dokumen dari berbagai jenis" (bidang gabungan) | WHERE | (OurInformationRegister.Document = VALUE(Document.OurDocument1.EmptyLink) | OR OurInformationRegister.Document = VALUE(Document.OurDocument2.EmptyLink) | ATAU...(dll. - kami secara berurutan mencantumkan kondisi untuk semua kemungkinan tipe bidang gabungan ini)) // Contoh 4. atau sebaliknya, jika Anda perlu memilih nilai yang diisi dari tipe "string", maka kondisinya akan membantu: |.DIMANA | StorageUnits.Name > """" // Contoh 5. jika Anda perlu memilih dokumen dengan tipe tertentu, dengan tipe data komposit, misalnya di register "RunningTasks", sumber daya "Task" memiliki tipe komposit, di antaranya nilai-nilai yang memungkinkan dokumen "Seleksi" |WHERE | EXPRESS(Informasi RegisterExecutedTasks.Task AS Document.Selection) LINK Document.Selection // Contoh 5a. Contoh serupa lainnya, ketika Anda perlu memilih dokumen dengan tipe tertentu | PILIHAN | KAPAN EKSPRESIKAN (ag Korespondensi Dokumen. DokumenBU SEBAGAI Dokumen. Penerimaan Barang dan Jasa) LINK Dokumen Penerimaan Barang dan Jasa | LALU ""Penerimaan Barang dan Jasa"" | KAPAN MENGUNGKAPKAN (ag Korespondensi Dokumen. DokumenBU SEBAGAI Dokumen. Penjualan Barang dan Jasa) LINK Dokumen Penjualan Barang dan Jasa | LALU ""Penjualan Barang dan Jasa"" | LAINNYA """" | END AS DocumentView // Contoh 6. pemilihan berdasarkan kondisi nilai yang tidak ditentukan: | SavedSettings.User = UNDEFINED // Contoh 7. pemilihan berdasarkan jenis pergerakan "Masuk" dari register akumulasi, "Beban" - serupa): | RegProductsInRetail.MovementType = VALUE(AccumulationMovementType.Receipt) // Contoh 8. Cara menunjukkan dalam permintaan bahwa permintaan tidak perlu dijalankan (misalnya, Anda perlu secara terprogram, bergantung pada beberapa kondisi, mengembalikan hasil permintaan kosong - Meminta. Teks = StrReplace(Query.Text, "WHERE Doc.Link = &DocumentLink", "WHERE IS FALSE");). Untuk melakukan ini, cukup tambahkan kondisi “Where is False”. Omong-omong, berapa pun volume data yang diminta dalam sampel, permintaan seperti itu akan langsung dieksekusi. |WHERE is FALSE // Contoh 9. Mengecek apakah hasil query berisi data: If NOT Query.Execute().Empty() Then // Contoh 10. memilih tanggal kosong: |WHERE | tbStrings.CancellationDate = DATETIME(1, 1, 1)

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

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

Pertanyaan-pertanyaan inilah yang akan kami coba jawab di artikel kami.

Apa itu tanggal dan bagaimana menentukannya

Karena pengambilan sebagian besar keputusan manajemen dan pencatatan tidak memerlukan akurasi waktu melebihi 1 detik, pengembang platform 1C memutuskan bahwa nilai ini akan menjadi nilai minimum absolut dalam format tanggal. Jadi, setiap atribut yang menjelaskan waktu suatu peristiwa dalam program harus memuat:

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

Tidak perlu menyebutkan: jam, menit dan detik. Jika ketiga parameter ini dihilangkan dan tidak ada ketentuan tambahan, program secara otomatis menyetel waktu ke awal hari.

Format tanggal yang ada di dunia memiliki perbedaan yang signifikan:

  1. Di Rusia, kita terbiasa mendahulukan hari, lalu bulan kejadian, dan akhir tahun;
  2. Penduduk AS mengawali tanggal dengan bulan;
  3. Orang Ceko, Polandia, dan Slovenia mencatat 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 sebuah string, Anda harus menggunakan kode yang ditunjukkan pada Gambar. 1

Terlihat dari gambar di atas, Anda dapat menentukan tanggal baik dengan menggunakan satu baris maupun dengan membagi baris tersebut menjadi beberapa bagian menggunakan koma, hasilnya tidak akan berubah.

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

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

Beras. 2

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

Fitur penggunaan tanggal dalam kueri 1C

Untuk sebagian besar tipe data yang digunakan oleh platform 1C, terdapat nilai void yang telah ditentukan sebelumnya. Untuk angka adalah 0, untuk tautan Anda dapat menentukan nilainya Tautan Kosong(), untuk tanggal, nilai kosong biasanya dianggap sebagai tanggal mulai, dan dengan itu detail dari jenis yang sesuai harus dibandingkan saat mengatur parameter permintaan.

Penting untuk dipahami bahwa meskipun tidak ada angka yang ditentukan dalam nilai atribut formulir yang memiliki tipe yang dimaksud, yaitu jendelanya terlihat seperti (Gbr. 3), ini tidak berarti tidak ada yang ditentukan di dalamnya; perbandingan parameter ini dengan string kosong tidak akan berhasil.

Beras. 3

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

Namun, ada kalanya lebih baik memeriksa bagian dalam isi permintaan, tanpa memasukkan 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 permintaan di atas, kami menghilangkan angka nol di depan 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 mengenai hubungan antara query dan tanggal adalah penggunaan konsep “point in time” ketika mengakses berbagai tabel database.

Keakuratan "hingga satu milidetik" yang ditentukan dalam dokumentasi teknis ketika menjelaskan tipe Tanggal primitif paling jelas terlihat ketika memilih catatan dari tabel virtual register akumulasi: jika register akumulasi, selain tabel Perputaran, memiliki Sisa dan tabel Sisa dan Perputaran, kemudian dilakukan pengambilan sampel dalam waktu tertentu, dapat memberikan hasil yang berbeda-beda.

Untuk memahami bagaimana dan mengapa hal ini terjadi, perhatikan contoh sederhana:

  1. Sebelum dokumen penjualan dilakukan pada waktu 12 jam 31 menit 36 ​​detik, saldo menurut tata nama Gula sebanyak 30 kg;
  2. Dokumen tersebut menghapuskan 10 kg pada waktu yang ditentukan;
  3. Laporan yang dihasilkan pada tanggal dokumen 12 jam 31 menit 36 ​​detik menurut tabel Sisa akan menunjukkan saldo 30 kg;
  4. Laporan yang sama pada tabel Sisa dan Perputaran untuk waktu yang sama akan menunjukkan saldo 20 kg.

Apa alasan perilaku ini dan bagaimana cara menghindarinya?

Soalnya pada tabel Sisa periodenya ditetapkan sebagai segmen terbuka, yaitu pergerakan yang dilakukan pada saat laporan dibuat tidak diperhitungkan, yaitu waktu diambil pada awal detik yang ditentukan dalam parameternya. Pada saat yang sama, untuk tabel Perputaran dan untuk tabel Sisa dan Perputaran, batasan waktu diperhitungkan, yaitu waktu diambil pada akhir detik yang ditentukan.

Ada beberapa jalan keluar dari situasi ini:

  1. Saat menggunakan tabel Sisa, tunjukkan titik waktu 1 detik lebih lama dari yang ditentukan;
  2. Gunakan hanya tabel Sisa dan Perputaran (bukan pilihan paling optimal dari sudut pandang kinerja);
  3. Gunakan konsep Batas.

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

Pada parameter pertama objek kami, kami menunjukkan tanggal pembuatan laporan, parameter kedua menentukan jenis batas. Karena penting bagi kami bahwa pergerakan pada tanggal tertentu disertakan dalam pilihan, kami harus mengatur parameter ini ke posisi “Termasuk”.

  • Sergei Savenkov

    semacam ulasan "pendek"... seolah-olah mereka sedang terburu-buru di suatu tempat