Konstruksi dan perbaikan sendiri

Cara menulis ekspresi dalam kueri 1C. Fitur bekerja dengan bidang View dan fungsi View() dari bahasa kueri. Tipe fungsi dan nilai tipe

Bahasa query 1C adalah salah satu perbedaan utama antara versi 7.7 dan 8. Salah satu poin terpenting dalam mempelajari pemrograman 1C adalah bahasa query. Di 1C 8.3, kueri adalah alat paling kuat dan efektif untuk memperoleh data. Bahasa kueri memungkinkan Anda memperoleh informasi dari database dengan cara yang nyaman.

Sintaksnya sendiri sangat mengingatkan pada T-SQL klasik, hanya saja dalam 1C, menggunakan bahasa kueri, Anda hanya dapat menerima data menggunakan konstruksi Select. Bahasa ini juga mendukung konstruksi yang lebih kompleks, misalnya (permintaan dalam permintaan). Kueri dalam 1C 8 dapat ditulis dalam Sirilik dan Latin.

Pada artikel kali ini saya akan mencoba membahas tentang kata kunci utama dalam bahasa query 1C:

  • memilih
  • diizinkan
  • bermacam-macam
  • cepat
  • Pertama
  • untuk perubahan
  • arti
  • tipe nilai (dan operator REFERENSI)
  • pilihan
  • kelompokkan menurut
  • memiliki
  • TIDAK BOLEH
  • Ya BATAL
  • koneksi - kanan, kiri, internal, penuh.

Serta beberapa trik kecil bahasa 1C, yang dengannya Anda dapat membuat teks permintaan secara optimal.

Untuk men-debug kueri di sistem 1C 8.2, alat khusus disediakan - konsol kueri. Anda dapat melihat deskripsi dan mendownloadnya menggunakan link -.

Mari kita lihat operator paling penting dan menarik dari bahasa kueri 1C.

PILIH

Dalam bahasa kueri 1C Enterprise 8, kueri apa pun dimulai dengan kata kunci MEMILIH. Dalam bahasa 1C tidak ada konstruksi UPDATE, DELETE, CREATE TABLE, INSERT, manipulasi ini dilakukan dalam teknologi objek. Tujuannya adalah untuk membaca data saja.

Misalnya:

MEMILIH
Direktori Saat Ini.Nama
DARI
Direktori.Nomenklatur SEBAGAI Direktori Saat Ini

Kueri akan mengembalikan tabel dengan nama item.

Dekat struktur MEMILIH Anda dapat menemukan kata kunci UNTUK PERUBAHAN, DIIZINKAN, BERMACAM-MACAM, PERTAMA

DIIZINKAN— hanya memilih rekaman dari tabel yang haknya dimiliki oleh pengguna saat ini.

BERMACAM-MACAM— artinya hasilnya tidak akan mengandung garis duplikat.

SELEKSI (KASUS)

Seringkali desain ini diremehkan oleh para programmer. Contoh penggunaannya:

Direktori Saat Ini.Nama,

KETIKA Direktori Saat Ini.Layanan KEMUDIAN

"Melayani"

AKHIR CARA MELIHATNomenklatur

Direktori.Nomenklatur SEBAGAI Direktori Saat Ini

Contoh ini akan mengembalikan nilai teks di bidang “Jenis Barang” - “Produk” atau “Layanan”.

DI MANA

Desain bahasa kueri 1C yang memungkinkan Anda memaksakan pilihan pada data yang diterima. Harap dicatat bahwa sistem menerima semua data dari server, dan baru kemudian dipilih berdasarkan parameter ini.

MEMILIH
Direktori.Nama
DARI
Direktori Saat Ini. Nomenklatur SEBAGAI Direktori Saat Ini
DIMANA CurrentDirectory.Service = BENAR

Dalam contoh ini, kita memilih rekaman yang nilai atribut “Layanannya” diatur ke “True”. Dalam contoh ini, kita dapat memenuhi ketentuan berikut:

"DIMANA LAYANANNYA"

Intinya, kita memilih baris yang ekspresi setelah kata kuncinya sama dengan "Benar".

Anda dapat menggunakan kondisi langsung dalam ekspresi:

Kode MANA = "005215"

Menggunakan operator “VALUE()” dalam kondisi, gunakan akses ke elemen dan enumerasi yang telah ditentukan sebelumnya dalam permintaan 1C:

WHERE Tipe Barang = Nilai(Pencacahan.Jenis Barang.Produk)

Nilai waktu dapat ditentukan sebagai berikut:

DIMANA Tanggal Penerimaan > DATETIME(2012,01,01):

Paling sering, kondisi ditentukan sebagai parameter yang diteruskan ke permintaan:

Dapatkan 267 pelajaran video di 1C gratis:

DIMANA Grup Nomenklatur= &Grup Nomenklatur

Suatu kondisi dapat diterapkan pada tipe atribut jika tipe atribut tersebut bertipe komposit:

Jika Anda perlu membatasi pilihan dari daftar nilai atau larik, Anda dapat melakukan hal berikut:

DIMANA Daftar Akumulasi Panitera B (&Daftar Dokumen Seleksi)

Kondisinya juga bisa rumit, terdiri dari beberapa kondisi:

DIMANA Tanggal Penerimaan > DATETIME(2012,01,01) AND NomenclatureGroup= &NomenclatureGroup DAN BUKAN Layanan

KELOMPOK OLEH

Desain bahasa query 1C 8.2 digunakan untuk mengelompokkan hasil.

Misalnya:

MEMILIH
Penerimaan Barang dan Jasa Barang,
SUM(Penerimaan BarangJasaBarang.Jumlah) SEBAGAI Kuantitas,
SUM(Penerimaan BarangJasaBarang.Jumlah) SEBAGAI Jumlah
DARI
Dokumen Penerimaan Barang dan Jasa Barang CARA Penerimaan Barang dan Jasa

KELOMPOK OLEH
Penerimaan BarangJasaBarang.Barang

Permintaan ini akan merangkum semua penerimaan berdasarkan jumlah dan kuantitas berdasarkan item.

Selain kata kunci JUMLAH Anda dapat menggunakan fungsi agregat lainnya: KUANTITAS, JUMLAH YANG BERBEDA, MAKSIMUM, MINIMUM, RATA-RATA.

MEMILIKI

Sebuah desain yang sering terlupakan, padahal sangat penting dan bermanfaat. Ini memungkinkan Anda menentukan pilihan dalam bentuk fungsi agregat, ini tidak dapat dilakukan dalam desain DI MANA.

Contoh penggunaan HAVING dalam permintaan 1C:

MEMILIH
Penerimaan Barang dan Jasa Barang,
SUM(Penerimaan BarangJasaBarang.Jumlah) SEBAGAI Kuantitas,
SUM(Penerimaan BarangJasaBarang.Jumlah) SEBAGAI Jumlah
DARI
Dokumen Penerimaan Barang dan Jasa Barang CARA Penerimaan Barang dan Jasa

KELOMPOK OLEH
Penerimaan Barang dan Jasa Barang.barang

SUM(Penerimaan BarangJasaBarang.Jumlah) > 5

Jadi kami akan memilih jumlah produk yang datang lebih dari 5 buah.

ARTI()

Misalnya:

DIMANA Bank = Nilai(Direktori.Banks.EmptyLink)

WHERE Jenis Nomenklatur = Nilai (Direktori.Jenis Nomenklatur.Produk)

WHERE Tipe Barang = Nilai (Enumerasi.Jenis Barang.Layanan)

KETIK dalam permintaan

Tipe data dapat diperiksa dengan menggunakan fungsi TYPE() dan VALUETYPE() atau menggunakan operator logika REFERENCE.

CEPAT()

Operator Express dalam kueri 1C digunakan untuk mengonversi tipe data.

Sintaksis: CEPAT(<Выражение>BAGAIMANA<Тип значения>)

Dengan menggunakannya, Anda dapat mengonversi nilai string menjadi nilai tanggal atau referensi menjadi data string, dan seterusnya.

Dalam aplikasi praktis, operator Express() sangat sering digunakan untuk mengonversi bidang yang panjangnya tidak terbatas, karena bidang yang panjangnya tidak terbatas tidak dapat dipilih, dikelompokkan, dll. Jika bidang tersebut tidak dikonversi, Anda akan menerima pesan kesalahan Anda tidak dapat membandingkan bidang dengan panjang tidak terbatas dan bidang dengan tipe yang tidak kompatibel.

MEMILIH
KontakInformasi.Objek,
EXPRESS(ContactInfo.Lihat SEBAGAI BARIS(150)) SEBAGAI Tampilan
DARI
Daftar Informasi Informasi Kontak BAGAIMANA Informasi Kontak

KELOMPOK OLEH
EXPRESS(ContactInfo.Representasi SEBAGAI BARIS(150)),
Informasi Kontak.Objek

TIDAK ADA (TIDAK ADA)

Fungsi yang cukup berguna dari bahasa kueri 1C yang memeriksa nilai dalam catatan, dan apakah nilainya sama BATAL, Ini memungkinkan Anda menggantinya dengan nilai Anda sendiri. Paling sering digunakan saat mendapatkan tabel saldo dan perputaran virtual untuk disembunyikan BATAL dan beri tanda 0 (nol) yang jelas.

ISNULL(Pajak Pra Bulan.ManfaatFSS Terapan, 0)

Fungsi bahasa kueri 1C ISNULL akan mengembalikan nol jika tidak ada nilai, yang akan menghindari kesalahan.

BERGABUNG

Ada 4 jenis koneksi: KIRI, BENAR, LENGKAP, INTERNAL.

KONEKSI KIRI dan KANAN

Joins digunakan untuk menghubungkan dua tabel berdasarkan kondisi tertentu. Fitur kapan KIRI GABUNG adalah kita mengambil tabel pertama yang ditentukan secara keseluruhan dan mengikat tabel kedua secara kondisional. Bidang tabel kedua yang tidak dapat dibatasi oleh kondisi diisi dengan nilai BATAL.

Contoh gabung kiri dalam permintaan 1C:

Ini akan mengembalikan seluruh tabel dan mengisi kolom "Bank" hanya di tempat-tempat di mana kondisi "Counterparty.Name = Banks.Name" terpenuhi. Jika kondisi tidak terpenuhi, bidang Bank akan disetel ke BATAL.

GABUNG KANAN dalam bahasa 1C 8.3 sangat mirip koneksi KIRI, dengan pengecualian satu perbedaan: di HAK SAMBUNGAN Tabel "utama" adalah yang kedua, bukan yang pertama.

KONEKSI LENGKAP

KONEKSI LENGKAP berbeda dari kiri dan kanan karena menampilkan semua catatan dari dua tabel dan hanya menghubungkan catatan yang dapat dihubungkan berdasarkan kondisi.

Misalnya:

KONEKSI LENGKAP
Direktori.Bank BAGAIMANA Bank

OLEH

Bahasa kueri akan mengembalikan kedua tabel secara lengkap hanya jika kondisi Gabung catatan terpenuhi. Berbeda dengan gabungan kiri/kanan, NULL mungkin muncul di dua bidang.

GABUNG DALAM

GABUNG DALAM berbeda dari yang lengkap karena hanya menampilkan record-record yang dapat dihubungkan sesuai dengan kondisi tertentu.

Misalnya:

DARI
Direktori.Counterparty SEBAGAI Klien

GABUNG DALAM
Direktori.Bank BAGAIMANA Bank

OLEH
Klien.Nama = Bank.Nama

Kueri ini hanya akan mengembalikan baris yang bank dan pihak lawannya memiliki nama yang sama.

Kesimpulan

Ini hanya sebagian kecil dari sintaks dari bahasa query 1C 8, kedepannya saya akan mencoba mempertimbangkan beberapa poin lebih detail, menunjukkan dan banyak lagi!

Bahasa kueri adalah salah satu mekanisme dasar 1C 8.3 untuk pengembang. Dengan menggunakan kueri, Anda dapat dengan cepat mengambil data apa pun yang disimpan dalam database. Sintaksnya sangat mirip dengan SQL, tetapi ada beberapa perbedaan.

Keuntungan utama bahasa kueri 1C 8.3 (8.2) dibandingkan SQL:

  • bidang referensi dereferensi (merujuk satu atau lebih titik ke detail objek);
  • bekerja dengan hasil sangat nyaman;
  • kemampuan untuk membuat tabel virtual;
  • permintaan dapat ditulis dalam bahasa Inggris dan Rusia;
  • kemampuan untuk memblokir data untuk menghindari kebuntuan.

Kekurangan bahasa query di 1C:

  • tidak seperti SQL, dalam kueri 1C tidak mengizinkan perubahan data;
  • kurangnya prosedur tersimpan;
  • ketidakmungkinan mengubah string menjadi angka.

Mari kita lihat tutorial mini kami tentang konstruksi dasar bahasa kueri 1C.

Karena kueri di 1C hanya memungkinkan Anda menerima data, kueri apa pun harus dimulai dengan kata "PILIH". Setelah perintah ini, bidang dari mana data harus diperoleh ditunjukkan. Jika Anda menentukan “*”, semua bidang yang tersedia akan dipilih. Tempat dari mana data akan dipilih (dokumen, register, direktori, dll.) ditunjukkan setelah kata “DARI”.

Dalam contoh yang dibahas di bawah ini, nama seluruh nomenklatur dipilih dari direktori “Nomenklatur”. Setelah kata “BAGAIMANA”, alias (nama) untuk tabel dan bidang ditunjukkan.

MEMILIH
Nomenklatur Nama SEBAGAI Nama Nomenklatur
DARI
Direktori.Nomenklatur SEBAGAI Tata Nama

Di samping perintah “PILIH” Anda dapat menentukan kata kunci:

  • BERMACAM-MACAM. Kueri hanya akan memilih baris yang berbeda setidaknya dalam satu bidang (tanpa duplikat).
  • N pertama, Di mana N– jumlah baris dari awal hasil yang perlu dipilih. Paling sering, konstruksi ini digunakan bersamaan dengan penyortiran (ORDER BY). Misalnya, ketika Anda perlu memilih sejumlah dokumen terbaru berdasarkan tanggal.
  • DIIZINKAN. Desain ini memungkinkan Anda untuk memilih dari database hanya catatan-catatan yang tersedia untuk pengguna saat ini. Berdasarkan penggunaan kata kunci ini, pengguna akan menerima pesan kesalahan saat mencoba menanyakan rekaman yang tidak dapat mereka akses.

Kata kunci ini dapat digunakan secara bersamaan atau terpisah.

UNTUK PERUBAHAN

Proposal ini memblokir data untuk mencegah konflik timbal balik. Data yang terkunci tidak akan dibaca dari koneksi lain hingga transaksi berakhir. Dalam klausa ini, Anda dapat menentukan tabel tertentu yang perlu dikunci. Jika tidak, semua orang akan diblokir. Desainnya hanya relevan untuk mode penguncian otomatis.

Paling sering, klausa “UNTUK PERUBAHAN” digunakan saat menerima saldo. Lagi pula, ketika beberapa pengguna mengerjakan program secara bersamaan, sementara yang satu menerima saldo, yang lain dapat mengubahnya. Dalam hal ini, sisa yang dihasilkan tidak lagi benar. Jika Anda memblokir data dengan proposal ini, maka hingga karyawan pertama menerima saldo yang benar dan melakukan semua manipulasi yang diperlukan dengannya, karyawan kedua akan terpaksa menunggu.

MEMILIH
Penyelesaian bersama Karyawan,
Penyelesaian bersama Jumlah penyelesaian bersama Saldo
DARI
Daftar Akumulasi Penyelesaian bersama dengan karyawan Saldo SEBAGAI Penyelesaian bersama
UNTUK PERUBAHAN

DI MANA

Perancangan diperlukan untuk memaksakan semacam seleksi pada data yang diunggah. Dalam beberapa kasus memperoleh data dari register, lebih masuk akal untuk menentukan kondisi pemilihan dalam parameter tabel virtual. Saat menggunakan "WHERE", semua catatan diambil terlebih dahulu, dan baru kemudian pemilihan diterapkan, yang secara signifikan memperlambat kueri.

Di bawah ini adalah contoh permintaan untuk mendapatkan contact person untuk posisi tertentu. Parameter pemilihan memiliki format: &NamaParameter (nama parameter dapat berubah-ubah).

SELEKSI (KASUS)

Desainnya memungkinkan Anda menentukan kondisi langsung di isi permintaan.

Pada contoh di bawah, “Bidang Tambahan” akan berisi teks tergantung pada apakah dokumen tersebut diposting atau tidak:

MEMILIH
PendaftaranTiU.Link,
PILIHAN
KAPAN PenerimaanT&U.Dilakukan
LALU “Dokumennya sudah disahkan!”
LAINNYA “Dokumen itu tidak diposting...”
AKHIR SEBAGAI Bidang Tambahan
DARI
Dokumen Penerimaan Barang dan Jasa CARA S&K Penerimaan

BERGABUNG

Menggabungkan tautan dua tabel berdasarkan kondisi hubungan tertentu.

KONEKSI KIRI/KANAN

Inti dari gabungan KIRI adalah bahwa tabel pertama yang ditentukan diambil secara keseluruhan dan tabel kedua ditautkan sesuai dengan kondisi koneksi. Jika tidak ada record yang sesuai dengan tabel pertama di tabel kedua, maka NULL diganti sebagai nilainya. Sederhananya, tabel utama adalah tabel pertama yang ditentukan dan data tabel kedua (jika ada) sudah menggantikan datanya.

Misalnya, perlu untuk memperoleh item barang dari dokumen “Penerimaan barang dan jasa” dan harga dari daftar informasi “Harga barang”. Dalam hal ini, jika harga untuk posisi apa pun tidak ditemukan, gantikan dengan NULL. Semua item dari dokumen akan dipilih terlepas dari apakah item tersebut memiliki harga atau tidak.

MEMILIH
Kwitansi & Nomenklatur U,
Harga.Harga
DARI
Dokumen Kwitansi Barang dan Jasa Barang CARA Kwitansi S&K
INTERNAL GABUNG DaftarInformasi.HargaNomenklatur.IrisanHarga AS Terakhir
Tanda Terima Perangkat Lunak&U.Nomenklatur = Harga.Nomenklatur

DI DALAM BENAR semuanya justru sebaliknya.

KONEKSI LENGKAP

Jenis koneksi ini berbeda dari yang sebelumnya karena semua rekaman tabel pertama dan tabel kedua akan dikembalikan. Jika tidak ada catatan yang ditemukan di tabel pertama atau kedua berdasarkan kondisi tautan yang ditentukan, NULL akan dikembalikan.

Saat menggunakan koneksi penuh pada contoh sebelumnya, semua item barang dari dokumen “Kwitansi Barang dan Jasa” dan semua harga terbaru dari daftar “Harga Barang” akan dipilih. Nilai record yang tidak ditemukan pada tabel pertama dan kedua akan sama dengan NULL.

GABUNG DALAM

Perbedaan antara INNER JOIN dan FULL JOIN adalah jika record tidak ditemukan di setidaknya satu tabel, query tidak akan menampilkannya sama sekali. Akibatnya, hanya item-item tersebut dari dokumen “Kwitansi Barang dan Jasa” yang akan dipilih yang terdapat catatan dalam register informasi “Harga Barang”, jika pada contoh sebelumnya kita mengganti “FULL” dengan “INTERNAL”.

KELOMPOK OLEH

Pengelompokan dalam kueri 1C memungkinkan Anda untuk menciutkan baris tabel (bidang pengelompokan) menurut karakteristik umum tertentu (bidang pengelompokan). Bidang pengelompokan hanya dapat ditampilkan menggunakan fungsi agregat.

Hasil dari query berikut akan berupa daftar jenis produk dengan harga maksimumnya.

MEMILIH
,
MAX(Harga.Harga) SEBAGAI Harga
DARI

KELOMPOK OLEH
Harga.Nomenklatur.Jenis Nomenklatur

HASIL

Tidak seperti pengelompokan, saat menggunakan total, semua catatan ditampilkan dan total baris ditambahkan ke dalamnya. Pengelompokan hanya menampilkan catatan umum.

Hasil dapat diringkas untuk seluruh tabel (menggunakan kata kunci “UMUM”), untuk beberapa bidang, untuk bidang dengan struktur hierarki (kata kunci “HIERARCHY”, “HANYA HIERARCHY”). Saat merangkum hasil, tidak perlu menggunakan fungsi agregat.

Mari kita lihat contoh serupa dengan contoh di atas menggunakan pengelompokan. Dalam hal ini, hasil kueri tidak hanya akan mengembalikan bidang yang dikelompokkan, tetapi juga catatan terperinci.

MEMILIH
Harga.Nomenklatur.Jenis Nomenklatur SEBAGAI Jenis Nomenklatur,
Harga.Harga SEBAGAI Harga
DARI
Daftar Informasi Harga Nomenklatur Cuplikan Harga AS Terbaru
HASIL
MAKSIMUM (Harga)
OLEH
JenisNomenklatur

MEMILIKI

Operator ini mirip dengan operator WHERE, namun hanya digunakan untuk fungsi agregat. Bidang lainnya, kecuali yang digunakan oleh operator ini, harus dikelompokkan. Operator WHERE tidak berlaku untuk fungsi agregat.

Pada contoh di bawah, harga maksimum suatu barang dipilih jika melebihi 1000, dikelompokkan berdasarkan jenis barang.

MEMILIH

MAX(Harga.Harga) SEBAGAI Harga
DARI
Daftar Informasi Harga Nomenklatur Cuplikan Harga AS Terbaru
KELOMPOK OLEH
Harga.Nomenklatur.Jenis Nomenklatur
MEMILIKI
MAKSIMUM(Harga.Harga) > 1000

SORTIR DENGAN

Operator ORDER BY mengurutkan hasil kueri. Untuk memastikan bahwa catatan ditampilkan dalam urutan yang konsisten, AUTO ORDER digunakan. Tipe primitif diurutkan menurut aturan biasa. Jenis referensi diurutkan berdasarkan GUID.

Contoh mengurutkan daftar karyawan berdasarkan nama:

MEMILIH
Karyawan.Nama SEBAGAI Nama
DARI
Direktori.Karyawan BAGAIMANA Karyawan
SORTIR DENGAN
Nama
PESANAN OTOMATIS

Konstruksi bahasa kueri 1C lainnya

  • MENGGABUNGKAN– hasil dari dua pertanyaan menjadi satu.
  • GABUNGKAN SEMUANYA– mirip dengan COMBINE, tetapi tanpa mengelompokkan baris yang identik.
  • MEJA KOSONG– terkadang digunakan saat menggabungkan kueri untuk menentukan tabel bersarang yang kosong.
  • TEMPAT– membuat tabel sementara untuk mengoptimalkan kueri 1C yang kompleks. Permintaan seperti ini disebut permintaan batch.

Fitur Bahasa Kueri

  • SUBSTRING memotong string dari posisi tertentu ke sejumlah karakter tertentu.
  • TAHUN... KEDUA memungkinkan Anda mendapatkan nilai yang dipilih dari tipe numerik. Parameter masukannya adalah tanggal.
  • AWAL PERIODE dan AKHIR PERIODE digunakan saat bekerja dengan tanggal. Jenis periode (HARI, BULAN, TAHUN, dll.) ditunjukkan sebagai parameter tambahan.
  • TAMBAHKAN TANGGAL memungkinkan Anda menambah atau mengurangi waktu tertentu dari jenis tertentu dari suatu tanggal (DETIK, MENIT, HARI, dll.).
  • TANGGAL PERBEDAAN menentukan perbedaan antara dua tanggal, menunjukkan jenis nilai keluaran (HARI, TAHUN, BULAN, dll.).
  • TIDAK BOLEH mengganti nilai yang hilang dengan ekspresi yang ditentukan.
  • REPRESENTASI dan REPRESENTASILINK dapatkan representasi string dari bidang yang ditentukan. Berlaku masing-masing untuk nilai apa pun dan hanya nilai referensi.
  • JENIS, JENIS NILAI digunakan untuk menentukan jenis parameter input.
  • TAUTAN adalah operator perbandingan logis untuk tipe nilai atribut.
  • CEPAT digunakan untuk mengonversi nilai ke tipe yang diinginkan.
  • TANGGAL WAKTU mendapat nilai bertipe "Tanggal" dari nilai numerik (Tahun, Bulan, Hari, Jam, Menit, Detik).
  • ARTI dalam permintaan 1C, ini digunakan untuk menunjukkan nilai yang telah ditentukan sebelumnya - direktori, enumerasi, rencana untuk jenis karakteristik. Contoh penggunaan: " Dimana Perorangan Hukum = Nilai(Pencacahan. Perorangan Hukum. Perorangan)«.

Pembuat Kueri

Untuk membuat kueri dengan 1C, terdapat mekanisme bawaan yang sangat nyaman - perancang kueri. Ini berisi tab utama berikut:

  • “Tabel dan Bidang” - berisi bidang yang perlu dipilih dan sumbernya.
  • "Koneksi" - menjelaskan kondisi struktur KONEKSI.
  • "Pengelompokan" - berisi deskripsi struktur pengelompokan dan jumlah bidang berdasarkan struktur tersebut.
  • "Kondisi" - bertanggung jawab untuk memilih data dalam permintaan.
  • "Lanjutan" - parameter kueri tambahan, seperti kata kunci untuk perintah "PILIH", dll.
  • “Gabungan/Alias” - kemungkinan penggabungan tabel ditunjukkan dan alias ditentukan (konstruksi “BAGAIMANA”).
  • "Order" bertanggung jawab untuk mengurutkan hasil kueri.
  • "Total" - mirip dengan tab "Pengelompokan", tetapi digunakan untuk konstruksi "TOTAL".

Teks permintaan itu sendiri dapat dilihat dengan mengklik tombol “Permintaan” di pojok kiri bawah. Dalam formulir ini, dapat dikoreksi secara manual atau disalin.


Konsol Permintaan

Untuk melihat dengan cepat hasil kueri dalam mode Perusahaan, atau men-debug kueri kompleks, gunakan . Ini berisi teks permintaan, menetapkan parameter, dan menampilkan hasilnya.

Anda dapat mengunduh konsol kueri pada disk ITS, atau melalui .

Saya memutuskan untuk memberikan kontribusi dan menjelaskan fitur-fitur bahasa yang tidak dibahas dalam artikel di atas. Artikel ini ditujukan untuk pengembang pemula.

1. Desain “IZ”.

Untuk mendapatkan data dari database, sama sekali tidak perlu menggunakan konstruksi “FROM”.
Contoh: Kita perlu memilih semua informasi tentang bank dari direktori bank.
Meminta:

PILIH Direktori.Bank.*

Memilih semua bidang dari direktori Banks. Dan mirip dengan permintaan:

PILIH Bank.* DARI Direktori.Bank SEBAGAI Bank

2. Mengurutkan data berdasarkan kolom referensi

Ketika kita perlu mengatur data kueri berdasarkan tipe primitif: "String", "Nomor", "Tanggal", dll., maka semuanya diselesaikan dengan menggunakan konstruksi "ORDER BY" jika Anda perlu mengurutkan data berdasarkan bidang referensi? Bidang referensi adalah tautan, pengidentifikasi unik, mis. Secara kasar, beberapa rangkaian karakter yang sewenang-wenang dan pengurutan biasa dapat menghasilkan hasil yang tidak diharapkan sepenuhnya. Untuk mengurutkan kolom referensi, konstruksi "AUTO ORDER" digunakan. Untuk melakukan ini, pertama-tama Anda harus mengurutkan data secara langsung berdasarkan tipe referensi menggunakan konstruksi "ORDER BY", dan kemudian konstruksi "AUTO ORDER".

Dalam hal ini, untuk dokumen, pemesanan akan dilakukan dalam urutan "Tanggal->Nomor", untuk buku referensi di "Tampilan Utama". Jika pemesanan tidak dilakukan berdasarkan kolom referensi, maka tidak disarankan menggunakan konstruksi "AUTO ORDER".

Dalam beberapa kasus, konstruksi "AUTO ORDER" dapat memperlambat proses pemilihan. Demikian pula, Anda dapat menulis ulang tanpa memesan dokumen secara otomatis:

3.Memperoleh representasi teks dari tipe referensi. Desain "PRESENTASI".

Saat Anda perlu menampilkan bidang dengan tipe referensi, misalnya bidang "Bank", yang merupakan tautan ke elemen direktori "Bank", Anda perlu memahami bahwa saat menampilkan bidang ini, subkueri ke " Direktori Banks" akan secara otomatis dijalankan untuk mendapatkan tampilan direktori. Ini akan memperlambat keluaran data. Untuk menghindari hal ini, Anda perlu menggunakan konstruksi “PREPRESENTASI” dalam permintaan untuk segera mendapatkan representasi objek dan kemudian menampilkannya untuk dilihat.

Dalam sistem komposisi data, mekanisme ini digunakan secara default, namun saat membuat tata letak dalam sel, Anda harus menentukan representasi bidang referensi, dan, misalnya, menempatkan tautan itu sendiri dalam transkrip.

4. Kondisi pengambilan sampel data sesuai template.

Misalnya, Anda perlu mendapatkan ponsel formulir karyawan (8 -123-456-78-912). Untuk melakukan ini, Anda perlu mengatur kondisi berikut dalam permintaan:

PILIH Karyawan.Nama, Karyawan.Telepon SEBAGAI Telepon DARI Direktori.Karyawan SEBAGAI Karyawan DI MANA Telepon SEPERTI "_-___-___-__-__"

Karakter "_" adalah karakter layanan dan menggantikan karakter apa pun.

5. Penggunaan total dan pengelompokan secara bersamaan.


Total sering kali digunakan bersama dengan pengelompokan; dalam hal ini, fungsi agregat tidak boleh ditentukan dalam total.

PILIH Penyediaan Layanan.Organisasi SEBAGAI Organisasi, Penyediaan Layanan.Nomenklatur SEBAGAI Nomenklatur, SUM(Penyediaan Layanan.Jumlah Dokumen) SEBAGAI Jumlah Dokumen DARI Dokumen.Penyediaan Layanan SEBAGAI Penyediaan Layanan KELOMPOK BERDASARKAN Penyediaan Layanan.Organisasi, Penyediaan Jasa.HASIL Nomenklatur OLEH UMUM, Organisasi, Nomen klatura

Dalam hal ini, kueri akan kembali hampir sama dengan kueri berikut:

PILIH Penyediaan Jasa.Organisasi SEBAGAI Organisasi, Penyediaan Jasa.Nomenklatur SEBAGAI Nomenklatur, Penyediaan Jasa.Jumlah Dokumen SEBAGAI Jumlah Dokumen DARI Dokumen.Penyediaan Jasa SEBAGAI Penyediaan Jasa JUMLAH HASIL (Jumlah Dokumen) MENURUT UMUM, Organisasi, Tata nama

Hanya kueri pertama yang akan menciutkan rekaman dengan nomenklatur yang sama.

6. Bidang dereferensi.

Mengacu pada bidang melalui titik disebut operasi dereferensi bidang referensi. Misalnya Pembayaran.Organisasi.Unit Administrasi. Dalam hal ini, di bidang referensi "Organisasi" pada dokumen "Pembayaran", ini merujuk ke tabel "Organisasi" lain, di mana nilai atribut "Unit Administratif" akan diperoleh. Penting untuk dipahami bahwa ketika mengakses bidang melalui titik, platform secara implisit membuat subkueri dan menggabungkan tabel-tabel ini.

Meminta:

Dapat direpresentasikan sebagai:

PILIH Pembayaran.Tautan, Pembayaran.Organisasi, Pembayaran.Organisasi, Organisasi. Unit Administratif DARI Dokumen.Pembayaran SEBAGAI Pembayaran KIRI GABUNG Direktori.Organisasi SEBAGAI Organisasi Perangkat Lunak Pembayaran.Organisasi = Organisasi.Link

Saat melakukan dereferensi bidang referensi dari tipe komposit, kerangka kerja mencoba membuat gabungan implisit ke semua tabel yang merupakan bagian dari tipe bidang tersebut. Dalam hal ini query tidak akan maksimal, jika sudah diketahui dengan jelas jenis fieldnya, maka perlu dilakukan pembatasan field tersebut berdasarkan jenisnya dengan konstruk. CEPAT().

Misalnya, ada daftar akumulasi “Pembayaran yang tidak terdistribusi”, di mana beberapa dokumen dapat bertindak sebagai pencatat. Dalam hal ini, salah mendapatkan nilai detail registrar dengan cara ini:

PILIH Pembayaran yang Tidak Dapat Dialokasikan.Daftar.Tanggal, ..... DARI Akumulasi Daftar.Pembayaran yang Tidak Dialokasikan SEBAGAI Pembayaran yang Tidak Dialokasikan

Anda harus membatasi jenis bidang komposit ke logger:

PILIH EXPRESS(Pembayaran yang Tidak Dialokasikan.Daftarkan SEBAGAI Dokumen.Pembayaran).Tanggal, ..... DARI Akumulasi Daftar.Pembayaran yang Tidak Dialokasikan SEBAGAI Pembayaran yang Tidak Dialokasikan

7. Konstruksi "DIMANA"

Dengan gabungan kiri dua tabel, saat Anda menerapkan kondisi “WHERE” pada tabel kanan, kita akan mendapatkan hasil yang serupa dengan hasil gabungan tabel dalam.

Contoh. Penting untuk memilih semua Klien dari Direktori Klien dan bagi klien yang memiliki dokumen pembayaran dengan nilai atribut "Organisasi" = &Organisasi, tampilkan dokumen "Pembayaran", bagi yang tidak, jangan tampilkan.

Hasil kueri akan mengembalikan rekaman hanya untuk klien yang memiliki pembayaran menurut organisasi di parameternya, dan akan memfilter klien lain. Oleh karena itu, Anda harus terlebih dahulu menerima semua pembayaran untuk organisasi "ini dan itu" dalam tabel sementara, dan kemudian menghubungkannya ke direktori "Klien" menggunakan gabungan kiri.

PILIH Pembayaran.Link SEBAGAI Pembayaran, Pembayaran.Pemegang Saham SEBAGAI TEMPAT Klien kePembayaran DARI Dokumen.Pembayaran SEBAGAI Pembayaran DI MANA Pembayaran.Cabang = &Cabang; ////////////////////////////////////////////////// // ///////////////////////////// PILIH Klien.Tautan SEBAGAI Klien, ISNULL(tPayment.Payment, "") SEBAGAI Pembayaran DARI Direktori .Klien SEBAGAI Klien KIRI KONEKSI kepembayaran SEBAGAI PERANGKAT LUNAK pembayaran Klien.Link = kepembayaran.Klien

Anda bisa menyiasati kondisi ini dengan cara lain. Hal ini diperlukan untuk menerapkan kondisi "WHERE" secara langsung pada hubungan antara dua tabel. Contoh:

PILIH Klien.Tautan, Pembayaran.Tautan DARI Direktori.US_Pelanggan SEBAGAI US_Pelanggan KONEKSI KIRI Dokumen.Pembayaran SEBAGAI Perangkat Lunak Pembayaran (Clients.Link = Pembayaran.Klien DAN Pembayaran.Klien.Nama SEPERTI "Paket Gula") KELOMPOK BERDASARKAN Klien.Tautan, Pembayaran. Tautan

8. Bergabung dengan Tabel Bersarang dan Virtual

Kueri Bersarang sering kali diperlukan untuk mengambil data berdasarkan beberapa kondisi. Jika Anda kemudian menggunakannya bersama dengan tabel lain, hal ini dapat sangat memperlambat eksekusi kueri.

Misalnya, kita perlu mendapatkan Jumlah Saldo pada tanggal saat ini untuk beberapa klien.

PILIH UnallatedPaymentsRemains.Customer, UnallatedPaymentsRemains.AmountRemaining FROM (PILIH Klien.Tautan SEBAGAI Tautan DARI Direktori.Klien SEBAGAI Klien DI MANA Klien.Tautan DI(&Klien)) SEBAGAI NestedQuery KIRI GABUNG RegisterAccumulations.UnallocationdPayments.Balances SEBAGAI Pembayaran yang Tidak Terisi OLEH Permintaan Bersarang. Tautan = Saldo Pembayaran yang Tidak Terisi. Pelanggan

Saat menjalankan kueri seperti itu, pengoptimal DBMS mungkin membuat kesalahan saat memilih rencana, yang akan menyebabkan eksekusi kueri menjadi kurang optimal. Saat menggabungkan dua tabel, pengoptimal DBMS memilih algoritma penggabungan tabel berdasarkan jumlah record di kedua tabel. Jika ada kueri bertumpuk, sangat sulit menentukan jumlah rekaman yang akan dikembalikan oleh kueri bertumpuk. Oleh karena itu, Anda harus selalu menggunakan tabel sementara, bukan kueri bersarang. Jadi mari kita tulis ulang permintaannya.

PILIH Klien.Tautan SEBAGAI Tautan TEMPAT tKlien DARI Direktori.Klien SEBAGAI Klien DI MANA
Klien.Link B (&Klien) ; ////////////////////////////////////////////////// // //////////////////////////// PILIH tClients.Link, UnallatedPaymentsRemains.AmountRemaining, DARI tClients SEBAGAI tClients KIRI GABUNG RegisterAccumulations.UnallatedPayments.Balances (, Klien IN (PILIH tClients.Link DARI tClients)) SEBAGAI UnallatedPaymentsBalances tClients.Link = UnallatedPaymentsBalances.Clients

Dalam hal ini, pengoptimal akan dapat menentukan berapa banyak catatan yang digunakan tabel sementara tClients dan akan dapat memilih algoritma optimal untuk menggabungkan tabel.

Tabel virtual , memungkinkan Anda memperoleh data praktis yang sudah jadi untuk sebagian besar tugas yang diterapkan (Irisan Pertama, Irisan Terakhir, Sisa, Perputaran, Sisa, dan Perputaran) Kata kuncinya di sini adalah virtual. Tabel-tabel ini tidak bersifat fisik, tetapi disusun oleh sistem dengan cepat, yaitu. Saat menerima data dari tabel virtual, sistem mengumpulkan data dari tabel register akhir, merakit, mengelompokkan, dan menerbitkannya kepada pengguna.

Itu. Saat menyambung ke tabel virtual, sambungan dibuat ke subkueri. Dalam hal ini, pengoptimal DBMS juga dapat memilih rencana koneksi yang tidak optimal. Jika kueri tidak dibuat dengan cukup cepat dan kueri menggunakan gabungan dalam tabel virtual, disarankan untuk memindahkan akses ke tabel virtual ke tabel sementara, lalu membuat gabungan antara dua tabel sementara. Mari kita tulis ulang permintaan sebelumnya.

PILIH Klien.Tautan SEBAGAI Tautan TEMPAT tKlien DARI Direktori.Klien SEBAGAI Klien INDEKS DENGAN Tautan DIMANA
Klien.Link B (&Klien) ; ////////////////////////////////////////////////// // //////////////////////////// PILIH Pembayaran yang Tidak Dialokasikan.AmountBalance, Pembayaran yang Tidak Dialokasikan.Klien SEBAGAI Klien TEMPAT saldo DARI RegisterAccumulations.UnallatedPayments.Balances(, Klien B ( PILIH tClients.Tautan DARI tClients)) SEBAGAI Saldo Pembayaran yang Tidak Terisi; ////////////////////////////////////////////////// // //////////////////////////// PILIH tClients.Link, toRemainders.AmountRemaining SEBAGAI JumlahSisa DARI tClients SEBAGAI tClients KIRI GABUNG keRemainders SEBAGAI Sisa OLEH tClients.Link = tSisa.Klien

9.Memeriksa hasil permintaan.

Hasil kueri mungkin kosong; untuk memeriksa nilai kosong, gunakan konstruksi berikut:

ResRequest = Permintaan.Eksekusi(); Jika resQuery.Empty() Kemudian Kembali; berakhir jika;

metode Kosong() harus digunakan sebelum metode Memilih() atau Membongkar(), karena mengambil koleksi memerlukan waktu.

Ini bukanlah wahyu kepada siapa pun bahwa sangat tidak diinginkan untuk menggunakan kueri dalam satu lingkaran. Hal ini dapat sangat mempengaruhi waktu pengoperasian fungsi tertentu. Sangat diinginkan untuk menerima semua data dalam permintaan dan kemudian memproses data dalam satu lingkaran. Namun terkadang ada kalanya menjadi tidak mungkin untuk memindahkan permintaan ke luar loop. Dalam hal ini, untuk pengoptimalan, Anda dapat memindahkan pembuatan kueri ke luar loop, dan ke dalam loop, mengganti parameter yang diperlukan dan menjalankan kueri.

Permintaan = Permintaan Baru; Query.Text = "PILIH | Klien.Link, | Klien.Tanggal Lahir |DARI | Direktori.Klien SEBAGAI Klien |WHERE | Klien.Link = &Klien"; Untuk Setiap Baris DARI TableClients Loop Query.SetParameter("Klien", Klien); QueryResult = Query.Execute().Select(); Siklus Akhir;

Ini akan menyelamatkan sistem dari pemeriksaan sintaksis permintaan dalam satu lingkaran.

11. Konstruksi "MEMILIKI".

Sebuah desain yang cukup jarang diminta. Memungkinkan Anda menerapkan kondisi pada nilai fungsi agregat (SUM, MINIMUM, AVERAGE, dll.). Misalnya, Anda hanya perlu memilih klien yang jumlah pembayarannya pada bulan September lebih dari 13.000 rubel. Jika Anda menggunakan ketentuan “WHERE”, pertama-tama Anda harus membuat tabel sementara atau kueri bersarang, mengelompokkan catatan di sana berdasarkan jumlah pembayaran, lalu menerapkan ketentuan tersebut. Konstruksi “HAVING” akan membantu menghindari hal ini.

PILIH Pembayaran.Pelanggan, JUMLAH(Pembayaran.Jumlah) SEBAGAI Jumlah DARI Dokumen.Pembayaran SEBAGAI Pembayaran DI MANA BULAN(Tanggal Pembayaran) = 9 KELOMPOK BERDASARKAN Pembayaran.Pelanggan MEMILIKI JUMLAH(Pembayaran.Jumlah) > 13000

Di konstruktor, untuk melakukan ini, cukup buka tab "Kondisi", tambahkan kondisi baru dan centang kotak "Kustom". Lalu tulis saja Jumlah(Pembayaran.Jumlah) > 13000


12. Nilai BATAL

Di sini saya tidak akan menjelaskan prinsip logika tiga nilai dalam database, ada banyak artikel tentang topik ini. Sekilas saja tentang caranya BATAL dapat mempengaruhi hasil kueri. Nilai NULL sebenarnya bukan sebuah nilai, dan fakta bahwa nilai tersebut tidak terdefinisi tidak diketahui. Oleh karena itu, operasi apa pun dengan NULL akan menghasilkan NULL, baik itu penjumlahan, pengurangan, pembagian, atau perbandingan. Nilai NULL tidak bisa dibandingkan dengan nilai NULL karena kita tidak tahu apa yang harus dibandingkan. Itu. kedua perbandingan tersebut adalah: NULL = NULL, NULL<>NULL tidak Benar atau Salah, tidak diketahui.

Mari kita lihat sebuah contoh.

Bagi klien yang belum memiliki pembayaran, kita perlu menampilkan kolom “Tanda” dengan nilai “Tidak ada pembayaran”. Selain itu, kami tahu pasti bahwa kami memiliki klien seperti itu. Dan untuk mencerminkan inti dari apa yang saya tulis di atas, mari kita lakukan dengan cara ini.

PILIH "Tidak ada pembayaran" SEBAGAI Atribut, NULL SEBAGAI TEMPAT Dokumen untuk pembayaran; ////////////////////////////////////////////////// // /////////////////////////// PILIH Klien.Tautan SEBAGAI Klien, Pembayaran.Tautan BAGAIMANA Pembayaran PUT tClientPayment DARI Direktori.Klien SEBAGAI Klien KIRI KONEKSI Dokumen. Pembayaran SEBAGAI Klien Perangkat Lunak Pembayaran.Link = Pembayaran.Pemegang Saham; ////////////////////////////////////////////////// // //////////////////////////// PILIH tClientPayment.Client DARI tClientPayment SEBAGAI tClientPayment INTERNAL GABUNG tPayment SEBAGAI tTopay OLEH tClientPayment.Payment = tPayment.Document

Perhatikan tabel sementara kedua tClientPayment. Dengan gabung kiri saya memilih semua klien dan semua pembayaran untuk klien ini. Bagi klien yang tidak memiliki pembayaran, kolom “Pembayaran” akan menjadi NULL. Mengikuti logika, di tabel sementara pertama “tPayments” saya menetapkan 2 bidang, salah satunya NULL, baris kedua “Tidak memiliki pembayaran”. Pada tabel ketiga, saya menghubungkan tabel “tClientPayment” dan “tPayment” menggunakan kolom “Pembayaran” dan “Dokumen” dengan gabungan internal. Kita tahu bahwa pada tabel pertama kolom “Dokumen” adalah NULL, dan pada tabel kedua, yang tidak memiliki pembayaran pada kolom “Pembayaran” juga NULL. Apa manfaat hubungan seperti itu bagi kita? Tapi itu tidak akan mengembalikan apa pun. Karena perbandingan NULL = NULL tidak bernilai True.

Agar permintaan memberikan hasil yang diharapkan, mari kita tulis ulang:

PILIH "Tanpa pembayaran" SEBAGAI Atribut, NILAI(Dokumen.Pembayaran.Tautan Kosong) SEBAGAI TEMPAT Dokumen untukPembayaran; ////////////////////////////////////////////////// // ///////////////////////////// PILIH Klien.Link SEBAGAI Klien, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink )) BAGAIMANA Pembayaran PUT tClientPayment DARI Direktori.Klien SEBAGAI Klien KIRI KONEKSI Dokumen.Pembayaran SEBAGAI Pembayaran OLEH Klien.Link = Pembayaran.Pemegang Saham; ////////////////////////////////////////////////// // //////////////////////////// PILIH tClientPayment.Client DARI tClientPayment SEBAGAI tClientPayment INTERNAL GABUNG tPayment SEBAGAI tTopay OLEH tClientPayment.Payment = tPayment.Document

Sekarang, di tabel sementara kedua, kami telah menunjukkan bahwa jika kolom “Pembayaran” adalah NULL, maka kolom ini = tautan kosong ke dokumen pembayaran. Pada tabel Pertama kami juga mengganti NULL dengan referensi kosong. Sekarang koneksi melibatkan bidang non-NULL dan permintaan akan mengembalikan hasil yang diharapkan.

Semua permintaan yang terkandung dalam artikel mencerminkan situasi yang ingin saya pertimbangkan dan tidak lebih. TENTANG Mereka mungkin tidak delusi atau suboptimal, yang utama adalah mereka mencerminkan esensi dari contoh tersebut.

13. Fitur tidak terdokumentasi dari desain "PILIHAN KAPAN... KEMUDIAN... AKHIR".

Jika perlu untuk menjelaskan konstruksi "Kondisi" dalam permintaan, kami menggunakan sintaks standar:

PILIH PILIHAN KETIKA Users.Name = "Vasya Pupkin" LALU "Karyawan favorit kami" LAINNYA "Kami tidak tahu ini" AKHIR SEBAGAI Bidang1 DARI Direktori.Pengguna SEBAGAI Pengguna

Namun bagaimana jika, misalnya, kita perlu mendapatkan nama bulan dalam sebuah permintaan? Menulis konstruksi besar dalam permintaan itu jelek dan memakan waktu, jadi bentuk penulisan di atas dapat membantu kita:

PILIH BULAN(US_CalculationConsumption_ScheduleTurnover.CalculationPeriod) KAPAN 1 LALU "Januari" KAPAN 2 LALU "Februari" KAPAN 3 LALU "Maret" KAPAN 4 LALU "April" KAPAN 5 LALU "Mei" KAPAN 6 LALU "Juni" KAPAN 7 LALU "Juli" K KAPAN 8 LALU "Agustus" KAPAN 9 LALU "September" KAPAN 10 LALU "Oktober" KAPAN 11 LALU "November" KAPAN 12 LALU "Desember" BERAKHIR SEBAGAI BULAN

Kini desainnya terlihat tidak terlalu rumit dan mudah dimengerti.

14. Eksekusi kueri batch.


Agar tidak memperbanyak permintaan, Anda dapat membuat satu permintaan besar, membaginya menjadi beberapa paket, dan mengerjakannya.
Misalnya, saya perlu mendapatkan bidang berikut dari direktori "Pengguna": "Tanggal Lahir" dan peran yang tersedia untuk setiap pengguna. unggah ini ke bagian tabel yang berbeda pada formulir. Tentu saja, Anda dapat melakukan ini dalam satu permintaan, lalu Anda harus mengulangi catatan atau menciutkannya, atau Anda dapat melakukan ini:

PILIH Pengguna.Tautan SEBAGAI Nama Lengkap, Pengguna.Tanggal Lahir, Pengguna.Peran PUT vtUsers DARI Direktori.Users SEBAGAI Pengguna; ////////////////////////////////////////////////// // ///////////////////////////// PILIH tueUsers.Nama lengkap, tueUsers.Tanggal Lahir DARI tueUsers SEBAGAI tueUsers KELOMPOK OLEH tueUsers.nama lengkap, tueUsers . Tanggal lahir; ////////////////////////////////////////////////// // //////////////////////////// PILIH wUsers.Nama Lengkap, wUsers.Peran DARI wUsers SEBAGAI wUsers KELOMPOK BERDASARKAN wUsers.Nama Lengkap, wUsers.Tanggal Kelahiran

tPackage = Permintaan.ExecutePackage();

TP_Tanggal Lahir = tPackage.Upload();
TP_Roles = tPackage.Bongkar();

Seperti yang bisa kita lihat, query dapat dieksekusi secara batch dan hasilnya dapat diproses sebagai array. Dalam beberapa kasus, ini sangat nyaman.

15. Ketentuan dalam permintaan batch

Misalnya, kami memiliki permintaan batch, di mana pertama-tama kami mendapatkan bidang: “Nama, Tanggal Lahir, Kode” dari direktori “Pengguna” dan ingin mendapatkan catatan dengan ketentuan untuk bidang ini dari direktori “Individu”.

PILIH Pengguna.Individual.Nama SEBAGAI Nama, Pengguna.Individual.Tanggal Lahir SEBAGAI Tanggal Lahir, Pengguna.Individual.Kode SEBAGAI Kode TEMPAT vtUsers DARI Direktori.Users SEBAGAI Pengguna; ////////////////////////////////////////////////// // ///////////////////////////// PILIH Individu Tautan SEBAGAI Individu DARI Direktori Individu SEBAGAI Individu

Anda dapat menerapkan ketentuan seperti ini:

WHERE Individuals.Code IN (SELECT vtUsers.Code FROM vtUsers) AND Individuals.Name IN (SELECT vtUsers.Code FROM vtUsers) DAN Individuals.BirthDate IN (SELECT vtUsers.DateBirth FROM tvUsers)

Dan Anda dapat melakukannya seperti ini:

WHERE (Individu.Kode, Individu.Nama, Individu.Tanggal Lahir) IN (PILIH tueUsers.Code, tueUsers.Name, tueUsers.Tanggal Lahir DARI tueUsers)

Selain itu, ketertiban juga perlu dijaga.

16. Memanggil pembuat kueri untuk “kondisi” dalam permintaan batch

Jika perlu menerapkan suatu kondisi, seperti pada contoh di atas, Anda bisa lupa bagaimana bidang ini atau itu dipanggil dalam tabel virtual.
Misalnya, Anda perlu menerapkan kondisi pada bidang "Tanggal Lahir", dan dalam tabel virtual bidang ini disebut "Tanggal Lahir Debitur", dan jika Anda lupa namanya, Anda harus keluar dari pengeditan kondisi tanpa simpan dan lihat nama fieldnya. Untuk menghindarinya, Anda bisa menggunakan teknik berikut ini.

Anda perlu meletakkan tanda kurung setelah Konstruksi "B" dan meninggalkan ruang kosong (spasi) di antara tanda kurung, pilih ruang ini dan panggil konstruktor kueri. Perancang akan memiliki akses ke semua tabel kueri batch. Teknik ini bekerja pada tabel register virtual dan pada tab “Kondisi”. Dalam kasus terakhir, Anda perlu mencentang kotak "P (kondisi sewenang-wenang)" dan masuk ke mode pengeditan "F4".

Pertanyaan sering kali dibuat dengan cepat dan hanya berfungsi untuk menggambarkan “teknik” yang sedang saya pertimbangkan.

Saya ingin melihat penggunaan indeks dalam kueri, tetapi ini adalah topik yang sangat luas. Saya akan menaruhnya di artikel tersendiri, atau menambahkannya di sini nanti.

pembaruan1. Poin 11,12
pembaruan2. Poin 13,14,15,16

Buku Bekas:
Bahasa kueri "1C:Enterprise 8" - E.Yu. Khrustalev
Pengembangan profesional dalam sistem 1C:Enterprise 8."

Artikel ini memberikan teknik yang berguna saat bekerja dengan kueri 1C v.8.2, serta informasi yang kurang diketahui tentang bahasa kueri. Saya tidak berusaha memberikan gambaran lengkap tentang bahasa kueri, tetapi saya hanya ingin membahas beberapa poin yang mungkin berguna bagi seseorang.

Jadi, mari kita mulai. Permintaan adalah objek khusus di 1C 8.2, yang digunakan untuk menghasilkan dan mengeksekusi kueri terhadap tabel database di sistem. Untuk menjalankan kueri, Anda perlu membuat teks kueri yang menjelaskan tabel mana yang akan digunakan sebagai sumber data kueri, bidang mana yang harus dipilih, pengurutan dan pengelompokan mana yang akan diterapkan, dll. Anda dapat membaca lebih lanjut tentang pertanyaan di buku "Panduan Pengembang 1C 8.2". Bahasa kueri 1C 8.2 sangat mirip sintaksisnya dengan bahasa kueri database SQL lainnya, tetapi ada juga perbedaan. Di antara keuntungan utama bahasa kueri bawaan, perlu diperhatikan dereferensi bidang, keberadaan tabel virtual, kemudahan penggunaan total, dan bidang yang tidak diketik dalam kueri. Kerugiannya adalah Anda tidak dapat menggunakan kueri sebagai bidang keluaran, Anda tidak dapat menggunakan prosedur tersimpan, dan Anda tidak dapat mengonversi string menjadi angka.

Saya akan memberikan informasi dan rekomendasi tentang bahasa query poin demi poin:
1. Untuk meningkatkan keterbacaan permintaan dan mengurangi jumlah parameter permintaan, Anda dapat menggunakan literal untuk mengakses data konfigurasi yang telah ditentukan sebelumnya dalam permintaan NILAI (PERWAKILAN NILAI). Sebagai representasi nilai, nilai enumerasi, data direktori yang telah ditentukan, rencana jenis perhitungan, rencana jenis karakteristik, bagan akun, tautan kosong, nilai titik rute, nilai transfer sistem ( misalnya, Tipe Pergerakan Akumulasi, Tipe Akun) dapat digunakan.
Contoh:

WHERE Kota = NILAI(Direktori.Kota.Moskow)
WHERE Kota = VALUE(Direktori.Kota.EmptyLink)
WHEREProductType = VALUE(Enumeration.ProductTypes.Service)
WHEREMovementType = VALUE(MovementTypeAccumulation.Masuk)
DIMANA Titik Rute =
VALUE(Proses Bisnis.Perjanjian.RoutePoint.Perjanjian)

Ekspresi dalam tanda kurung selalu diawali dengan kata tunggal (Direktori, Pencacahan, dll.) yang sesuai dengan jenis nilai yang telah ditentukan.

2.Pemesanan otomatis dalam kueri dapat sangat memperlambat proses. Jika penyortiran tidak diperlukan, lebih baik tidak digunakan sama sekali. Dalam banyak kasus, lebih efisien jika menulis pengurutan menggunakan kata kunci SORTIR DENGAN.

3.Anda perlu memastikan bahwa saat menggunakan alias, bidang ambigu tidak muncul. Jika tidak, sistem tidak akan memahami objek mana yang perlu diakses.
Contoh permintaan dengan bidang ambigu:
MEMILIH
Tata Nama. Tautan,
Sisa BarangSisa.JumlahSisa
DARI
Direktori.Nomenklatur SEBAGAI Tata Nama
SAMBUNGAN KIRI Daftarkan Akumulasi Sisa Barang Sisa SEBAGAI Sisa Barang Tersisa
Produk Tersisa Perangkat LunakSisa.Nomenklatur = Nomenklatur.Link
Alias ​​tabel perlu diperbaiki, misalnya seperti ini: “Directory.Nomenclature AS Nomenclature1”, dan “Nomenclature.Link” harus dikoreksi sesuai dengan “Nomenclature1.Link”.

4.Terkadang berguna untuk mendapatkan representasi bidang referensi menggunakan kata kunci PERTUNJUKAN beserta linknya agar tidak terjadi akses berulang pada database. Ini berguna ketika menampilkan hasil query dalam sebuah tabel.
Contoh:
MEMILIH
PERWAKILAN(Dokumen.Counterparty) SEBAGAI Penerima,
PRESENTASI(Dokumen.Basis)
DARI
Dokumen. Faktur SEBAGAI Dokumen

5.Gunakan dalam permintaan EXPRESS (Bidang SEBAGAI Tipe) memungkinkan Anda menghapus tabel yang tidak perlu dari koneksi dengan bidang tipe data kompleks. Sehingga mempercepat eksekusi permintaan.
Contoh (registrar adalah field dengan tipe komposit untuk tabel fisik register akumulasi Sisa Barang, dalam permintaan Tanggal dan Nomor dokumen Penerimaan Barang dipilih, sedangkan ketika mengakses rincian dokumen Tanggal dan Nomor melalui Panitera, tidak ada keterhubungan ganda antara tabel register dengan tabel dokumen yang merupakan pencatat register Sisa Barang ):
PILIH BERBAGAI[b] EXPRESS(Sisa Barang. Pencatat SEBAGAI Dokumen. Penerimaan Barang). Nomor SEBAGAI NOMOR PENERIMAAN,
[b] EKSPRES(Sisa Barang. Pencatat SEBAGAI Dokumen. Penerimaan Barang). Tanggal SEBAGAI TANGGAL PENERIMAAN
[b]DARI Daftar Akumulasi Sisa Barang SEBAGAI Barang Sisa DI MANA (EKSPRES(Sisa Barang. Pencatat SEBAGAI Dokumen. Penerimaan Barang) BUKAN NULL)

6. Bila dalam konfigurasi 1C ada pengguna yang memiliki hak terbatas atas objek konfigurasi tertentu, maka kata kunci harus digunakan dalam permintaan objek tersebut DIIZINKAN sehingga permintaan dijalankan tanpa kesalahan (Pilih Diizinkan...)

7.Saat menggabungkan tabel yang berisi tabel bersarang (misalnya, Dokumen dengan bagian tabel), kata kunci dapat berguna DAPAT DIKOSONGKAN ketika, misalnya, salah satu dokumen tidak memiliki bagian tabel.
Contoh:
PILIH Tautan.Nomor, TABEL KOSONG.(No., Barang, Jumlah) SEBAGAI Komposisi

GABUNGKAN SEMUANYA
PILIH Tautan.Nomor, Komposisi.(Nomor Baris, Tata Nama, Kuantitas)
DARI Dokumen.Faktur

8.Saat bekerja dengan gabungan tabel yang masing-masing berisi satu baris, baris tabel mungkin perlu digabungkan (di kedua tabel tidak ada bidang yang dapat digunakan untuk menggabungkannya). Hal ini dapat dicapai dengan menggunakan konstruksi " Tabel KONEKSI LENGKAP Berdasarkan TRUE" Jika suatu tabel mempunyai lebih dari satu baris, maka hasilnya adalah jumlah baris yang sama dengan hasil kali jumlah baris kedua tabel. Jika terdapat O baris dalam satu tabel, maka jumlah baris pada tabel yang dihasilkan akan sama dengan jumlah baris pada tabel kedua. Selain itu, untuk menghubungkan tabel tersebut, Anda dapat menggunakan produk tabel Cartesian, di mana semua kombinasi baris dari kedua tabel akan muncul di tabel yang dihasilkan. Kita harus ingat bahwa jika ada 0 baris di salah satu tabel, maka hasil kali kartesiusnya adalah 0, jadi full join akan lebih baik. Secara umum, bukan koneksi penuh DENGAN BENAR Anda dapat menggunakan jenis gabungan lainnya, namun dalam kasus ini tabel yang dihasilkan juga mungkin memiliki 0 baris, meskipun salah satu tabel memiliki jumlah baris bukan nol. Dalam kasus gabungan penuh, situasi ini hanya akan terjadi dalam satu kasus, jika jumlah baris di kedua tabel adalah 0. Jika Anda mengetahui bahwa ada setidaknya satu baris dalam tabel, maka Anda dapat menggunakan KONEKSI KIRI dengan meja lain dengan syarat DENGAN BENAR.
Contoh (memang dibuat-buat, untuk Full Join):
MEMILIH
Pertama 1
Jenis Kelamin. Tautan,
K. Pihak lawan
DARI
Pencacahan Gender SEBAGAI Gender
SAMBUNGAN LENGKAP (Pilih 1 D. Counterparty DARI Dokumen. Penjualan Barang CARA D Atur Berdasarkan D. Waktu) CARANYA
AKTIF (BENAR)

9. Untuk mendapatkan record unik pada field tertentu, lebih tepat menggunakan kata kunci daripada mengelompokkan BERMACAM-MACAM di request, karena konstruksi ini lebih jelas dan kata kuncinya KELOMPOK OLEH memiliki penerapan yang lebih luas dan sering digunakan jika diperlukan tambahan untuk menghitung fungsi agregat dengan mengelompokkan. Dalam beberapa kasus, perlu untuk mengeluarkan sejumlah baris yang terbatas. Untuk melakukan ini, tentukan kata kunci dalam deskripsi permintaan PERTAMA dan setelahnya - jumlah baris yang diperlukan.
Contoh untuk PERTAMA:
Pilih Pertama 5
Direktori.Nomenklatur.Nama,
Direktori.Nomenklatur.Harga Pembelian
Sortir dengan
Direktori.Nomenklatur.Harga Pembelian Menurun
Contoh untuk BERMACAM-MACAM:
Pilih Beragam
Dokumen.Consumable.Counterparty

10.Fungsi agregasi dalam query dapat digunakan tanpa kata kunci KELOMPOK. Dalam hal ini, semua hasil akan dikelompokkan menjadi satu baris.
Contoh:
Memilih
Jumlah(Faktur.Jumlah) Sebagai Jumlah
Dari
Dokumen.Faktur.Komposisi Sebagai Faktur

11.Dalam kueri di bidang pilihan, Anda dapat dengan bebas mengakses detail bidang pilihan. Fitur ini disebut dereferensi bidang pilih. Jika sumber datanya adalah tabel bersarang (bagian tabel dokumen), maka di kolom pilihan Anda juga dapat mengakses kolom tabel utama (misalnya, melalui kolom Tautan, akses kolom tabel utama Akun)
Contoh:
MEMILIH[B] Penerimaan Barang dan Jasa Barang Kuantitas SEBAGAI Kuantitas, Penerimaan Barang dan JasaBarang.Link.Counterparty DARI DI MANA
Ada satu kekhasan dalam menggunakan dereferensi bidang jika ada pengelompokan dalam permintaan. Dalam kueri apa pun dengan pengelompokan dalam daftar bidang kueri, Anda dapat dengan bebas mengakses detail bidang pengelompokan.
Contoh:
MEMILIH
Penerimaan Barang dan Jasa Nomenklatur Barang,
Penerimaan Barang dan Jasa Nomenklatur Kode,
SUM (Penerimaan Barang dan Jasa. Jumlah) SEBAGAI Kuantitas,
Penerimaan Barang dan JasaBarang.Link.Counterparty,
Penerimaan Barang dan JasaBarang.Link.Tanggal
DARI
Dokumen Penerimaan Barang dan Jasa Barang CARA Penerimaan Barang dan Jasa
DI MANA
Penerimaan Barang dan JasaBarang.Link = &Link
KELOMPOK OLEH
Penerimaan Barang dan Jasa Nomenklatur Barang,
Penerimaan Barang dan JasaBarang.Link
Bantuan 1C mengatakan bahwa jika ada pengelompokan, hanya bidang pengelompokan dan fungsi agregat untuk bidang pilihan yang dapat berpartisipasi dalam bidang pemilihan kueri. Ada satu kasus luar biasa ketika fungsi agregat diterapkan pada bidang tabel bertumpuk. Dalam hal ini, dalam daftar bidang pilihan, dimungkinkan untuk mengakses bidang tabel tingkat atas tanpa mengelompokkan hasil berdasarkan bidang ini.
Contoh:
MEMILIH
Penerimaan Barang dan Jasa Barang (JUMLAH (Jumlah), Nomenklatur),
Penerimaan Barang dan Jasa Link,
Penerimaan Barang dan Jasa Counterparty
DARI
Dokumen Penerimaan Barang dan Jasa CARA Penerimaan Barang dan Jasa
KELOMPOK OLEH
Penerimaan Barang dan Jasa Barang (Nomenklatur)

12. Terkadang, alih-alih menentukan bidang apa pun dalam pengelompokan, ada gunanya menyertakan parameter berikut dalam bidang pilihan kueri:
MEMILIH DocProducts.Nomenklatur, &Rekanan, &Periode, SUM(DocProducts.Quantity * DocProducts.Q) SEBAGAI Kuantitas, SUM(DocProducts.Amount) SEBAGAI Jumlah DARI Dokumen.Penerimaan.Produk SEBAGAI DocProducts DI MANA DocProducts.Link = &Tautan
KELOMPOK OLEH DocProducts.Nomenklatur
Dan kemudian atur parameter di badan permintaan:
Permintaan.SetParameter("&Akun", PilihAkun);
Query.SetParameter("&Periode", Tanggal);

13. Dalam kueri universal, parameter dapat digunakan dalam deskripsi sumber data kueri, dalam kondisi DI MANA, dalam kondisi penggabungan tabel dan parameter tabel virtual. Ada dua teknik untuk membuat kueri umum:
A) menggunakan mekanisme penggabungan string, menambahkan variabel ke teks permintaan;
Contoh 1:

OrderingType = ?(BEBERAPA VARIABEL,"","DESC");
Query.Text = "Pilih... Susun BERDASARkan Bidang1 " + Tipe Pesanan + "...";
Contoh2:
Query.Text = "Pilih Bidang1...";

Jika BEBERAPA VARIABEL = 1 Maka
Permintaan.Teks = Permintaan.Teks + ",Field2...";
berakhir jika;
B) menggunakan parameter di berbagai bagian permintaan (misalnya, di bagian sumber data permintaan), dan kemudian metode bahasa bawaan - STREPLACE(). Saat merancang kueri universal, mengakses properti objek akan berguna METADATA(), yang dengannya Anda dapat menentukan nama tabel untuk beberapa tautan (misalnya, untuk dokumen akan menjadi seperti ini - Tautan . METADATA().NAME), meneruskan parameter ke beberapa prosedur universal.
Contoh:
Memilih
DocTch.Nomenklatur,
...
DARI
&Beberapa DocTC SEBAGAI DocTC
Dan kemudian atur parameter di badan permintaan
Request.Text = StrReplace(Request.Text, "&SomeDocTCH", "Dokumen."+Link.Metadata().Name+".Produk");

Parameter dapat digunakan dalam kondisi kueri untuk mengaktifkan kondisi opsional &Parameter ATAU BUKAN BeberapaProperti:
Request.SetParameter(“&Parameter”, “Counterparty.Name=””Ivanov”””);
Menggunakan literal BENAR Anda dapat menghapus filter tertentu dalam permintaan
Permintaan.SetParameter("&Parameter", Benar);

14.Sangat berguna dalam perancang kueri adalah perintah menu konteks tabel - " Ganti nama tabel...", yang dengannya Anda bisa mendapatkan beberapa nama umum untuk sumber data. Untuk membuat kueri untuk tabel dengan tipe yang sama, strukturnya serupa, akan berguna jika tabel kedua menyalin teks kueri dari tabel pertama, lanjutkan ke jendela perancang kueri dan pilih item di menu konteks tabel - Ganti meja... dan pilih tabel kedua.

15.Saat bekerja dengan pembuatan kueri bersarang di bagian kondisi atau parameter tabel virtual perancang kueri, teknik menyorot spasi dalam tanda kurung digunakan, kemudian item "Perancang Kueri" muncul di menu konteks, dan saat mengedit kueri bertingkat, seluruh kueri dalam tanda kurung disorot dalam kondisi tersebut.
Contoh kueri bersarang:
Produk B (Pilih Produk...)

16. Saat mendesain laporan ACS dalam kueri untuk menyeimbangkan register, akan lebih mudah dan benar menggunakan ekspresi sebagai parameter Periode AddToDate(EndPeriod(Periode,DAY),SECOND,1), karena saldo virtual diperoleh pada awal periode, tidak termasuk detik terakhir. Teknik +1 detik tidak dapat digunakan dengan dokumen: menurut metode baru dalam pengeposan dokumen, saldo register harus diterima untuk Periode yang ditentukan oleh objek Batas dengan saat dokumen termasuk (dan bukan pada tanggal dokumen). dokumen +1 detik!), dan menurut metode pengeposan lama - pada saat dokumen dibuat (dan bukan pada tanggal dokumen!). Saat menganalisis omset atau data untuk suatu periode, akan lebih mudah untuk menambahkan parameter dengan tipenya Periode Standar(dalam hal ini tidak perlu memberikan tanggal terakhir interval di penghujung hari). Untuk kolom standar “Awal Periode”, di kolom “Ekspresi” Anda harus memasukkan "&Periode.Tanggal Mulai" Dan untuk kolom standar “Akhir Periode” di kolom “Ekspresi” tulis “ &Periode.Tanggal Berakhir". Banyak informasi berguna tentang bahasa kueri tidak dapat ditemukan di asisten sintaksis, tetapi dalam bantuan penuh konfigurator 1C 8.2 (tombol F1)

17. Fungsi kueri AdalahNull(lebih mudah untuk menulis versi bahasa Inggris AdalahNull) biasanya digunakan untuk menghilangkan nilai Null untuk bidang kueri numerik. Dalam beberapa kasus, misalnya, gabungan lengkap dua tabel, fungsinya IsNull (Parameter1,Parameter2) dapat berhasil menggantikan desain PILIHAN KAPAN... LALU..LAINNYA....AKHIR, ketika untuk bidang apa pun nilai NULL dapat berada di tabel pertama dan kedua (konstruksi ini memungkinkan Anda mendapatkan nilai non-Null untuk bidang tersebut). Namun kita harus mengingatnya, tidak seperti operator kondisional PILIHAN fungsi AdalahNull mengonversi tipe argumen kedua ke tipe argumen pertama, yang harus diperhitungkan jika tipe argumennya berbeda!
Contoh:
IsNull(Reg.Sisa,0)
IsNull(Dok.Produk,Dok1.Item)

18. Pada konstruksi bersyarat PILIHAN Ada sintaks alternatif untuk kasus sederhana pengujian kesetaraan terhadap nilai tertentu, namun tidak terdokumentasi:
Ekspresi Pilihan Ketika 1 Lalu “Tinggi” Ketika 2 Lalu “Menengah” Lain “Rendah” Berakhir

19. Operator pengecekan nilai NULL Ya Batal(Kami dapat merekomendasikan menggunakan versi bahasa Inggris Apakah Null). Konstruksi ini muncul karena setiap operasi yang membandingkan dua nilai, setidaknya salah satunya adalah Null, selalu salah. Menulis Dimana Nama = Null salah. Bentuk negasi dari operator ini juga menarik Tidak ada nol- salah, tapi benar Ya Tidak Null atau bentuk Tidak (Bidang 1 adalah Null)- ini merupakan perbedaan yang signifikan dari semua operator yang digunakan bersama dengan operator He.

20. Terkadang formulir operator berguna DI DALAM untuk memeriksa kecocokan dengan salah satu nilai yang terdaftar.
Contoh:
...Di mana Nama Produk B ("Peralatan Rumah Tangga", "Komputer")
Untuk buku referensi, formulir operator mungkin bermanfaat DI DALAM pemeriksaan keanggotaan hierarki.
Contoh:
...Dimana Nomenklatur DALAM HIERARKI (&Grup)
Operator DI DALAM sering digunakan untuk memeriksa apakah suatu nilai disertakan dalam hasil subkueri.
Contoh:
...Dimana Nomenclature.Link B (Pilih Nomenclature.Link...).
Dalam subkueri, Anda bisa mengakses bidang kueri luar dalam suatu kondisi.
Contoh:
// Pilih nama produk yang hadir
// dalam faktur
MEMILIH
Produk.Nama
DARI
Direktori.Nomenklatur BAGAIMANA Produk
DI MANA
Produk.Link B
(MEMILIH
Komposisi Faktur.Nomenklatur
DARI
Dokumen.Faktur.Komposisi SEBAGAI Komposisi Faktur
DI MANA
InvoiceContent.Nomenclature = Produk.Link)
Operasi DI DALAM dapat digunakan dengan array, daftar nilai, tabel nilai, kueri bersarang. Dalam hal ini, kondisinya bisa dikurangi
Sintaks untuk subkueri
(ekspresi1, ekspresi2,...,ekspresiN) Dalam (Pilih ekspresi1, ekspresi2,...,ekspresiN...)
Sintaks untuk tabel nilai
(ekspresi1, ekspresi2,...,ekspresiN) Dalam (&TK), di mana N kolom pertama digunakan dalam tabel nilai TK

20. Ada lelucon di Internet tentang bagaimana perancang kueri selalu melakukannya KIRI menggabungkan tabel (dan menukarnya), tidak peduli bagaimana kita menentukannya BENAR:
1C: Perusahaan menyukai "ke kiri".

21. Lebih mudah untuk men-debug kueri kompleks di konsol kueri. Ada banyak dari mereka di Internet. Setelah men-debug kueri, Anda dapat menyalinnya dan di perancang kueri ada tombol yang bagus “ Meminta", di mana Anda dapat menempelkannya dalam bentuk yang sama dan menyimpannya (sebelumnya hanya dapat disalin di konfigurator dan memformat permintaan menggunakan karakter pemisah baris). Di jendela yang terbuka ketika Anda mengklik tombol "Query", Anda dapat mengedit query dan melihat hasil eksekusi, yang cukup nyaman.

22.Saat mendesain laporan ACS, Anda harus ingat bahwa jika Anda perlu menyediakan pemfilteran berdasarkan bidang tertentu, tidak perlu menambahkan parameter ke teks permintaan. Pembuat Kueri memiliki tab " Komposisi data", tempat Anda dapat menambahkan parameter ke kondisi. Selain itu, pada tingkat laporan ACS terdapat tab kondisi di mana Anda dapat menambahkan kondisi sewenang-wenang dan menyimpannya dalam pengaturan cepat. Dalam hal ini, kondisinya akan bersifat universal (kesetaraan, ketidaksetaraan, kepemilikan, pencantuman dalam daftar, dll.).

23. Saat bekerja dengan dokumen, Anda mungkin perlu menambahkan pengurutan berdasarkan bidang tabel virtual MOMEN WAKTU, tapi sial - dalam kueri bersarang, pengurutan berdasarkan bidang ini tidak berfungsi dengan benar. Menari dengan rebana membantu: mengurutkan berdasarkan bidang virtual MOMEN WAKTU diganti dengan dua pengurutan: berdasarkan tanggal dan tautan. Anda juga bisa menyelesaikan masalah melalui tabel sementara dengan memindahkan kueri bertumpuk ke kueri terpisah. Pada banyak rilis, fitur atau bug ini belum diperbaiki.
Contoh permintaan yang tidak berfungsi yang menerima dokumen terakhir yang diposting untuk rekanan yang ditentukan (atau lebih tepatnya, bagian tabel dari dokumen):

MEMILIH
Produk Konsumsi. Tautan,
Bahan Habis Pakai. Nomor Baris,
Produk Habis Pakai. Produk,
Barang Habis Pakai. Kuantitas,
Produk Habis Pakai Harga,
Barang Habis Pakai.Jumlah
DARI

DI MANA
Produk Konsumsi. Tautan B
(PILIH TERATAS 1
D.Tautan
DARI
Dokumen. Habis AS D
DI MANA
D. Tautan Dilakukan

ORDER BY D. Link.Momen Waktu MENURUN)

Solusi yang memungkinkan:
A) Ganti dengan SORTIR DENGAN pada
ORDER BY D.Tanggal DESC.
ORDER OLEH D.Link MENURUN

B) Anda bisa memindahkan kueri bersarang ke tabel sementara:
PILIH ATAS 1
D.Tautan
TETAPKAN TZLink
DARI
Dokumen. Habis AS D
DI MANA
D. Tautan Dilakukan
Dan D.Counterparty = &Counterparty

SORTIR DENGAN
D. Tautan Momen Waktu MENURUN
;

////////////////////////////////////////////////////////////////////////////////
MEMILIH
Produk Konsumsi. Tautan,
Bahan Habis Pakai. Nomor Baris,
Produk Habis Pakai. Produk,
Barang Habis Pakai. Kuantitas,
Produk Habis Pakai Harga,
Barang Habis Pakai.Jumlah
DARI
Dokumen.Barang Habis Pakai.Barang SEBAGAI Barang Habis Pakai
DI MANA
Produk Konsumsi. Tautan B
(MEMILIH
T.Link
DARI
TZLink SEBAGAI T)
C) Anda dapat merujuk ke tabel utama dokumen, dan baru kemudian ke bagian tabel
PILIH ATAS 1
Bahan habis pakai. Tautan,
Barang habis pakai.Barang.(
Tautan,
Nomor Baris,
Produk,
Kuantitas,
Harga,
Jumlah
)
DARI
Dokumen. Bahan Habis Pakai SEBAGAI Bahan Habis Pakai
DI MANA
Biaya.Counterparty = &Counterparty
Dan Bahan Habis Pakai. Dilakukan

SORTIR DENGAN
Bahan habis pakai. Momen Waktu MENURUN

24. Saat mengakses tabel utama suatu dokumen (direktori), Anda juga dapat mengakses data di tabel bawahan (bagian tabel). Peluang ini disebut bidang tabel dereferensi. Contoh tugas adalah tugas mencari dokumen yang berisi produk tertentu pada bagian tabel.
Contoh:
Pilih Receipt.Link DARI Document.Receipt Where Receipt.Goods.Nomenclature = &Nomenclature.

Kelebihan query ini dibandingkan query pada tabel nested Receipt.Goods adalah jika terdapat duplikat pada dokumen maka hasil query hanya akan mengembalikan dokumen unik saja tanpa menggunakan kata kunci. BERMACAM-MACAM.
Membandingkan:
Pilih Berbagai Produk.Link DARI Dokumen.Kwitansi.Produk sebagai Produk Dimana Produk.Nomenklatur = &Nomenklatur.
Mungkin hanya itu saja. Jelas masih banyak pertanyaan dalam bahasa query yang belum saya bahas. Untuk menulis artikel ini, saya menggunakan informasi yang saya terima setelah menyelesaikan kursus dasar 1C 8.2 spec8.ru, serta dari buku “Panduan Pengembang 1C 8.2” dan Internet.
Terimakasih untuk semua!

Pada artikel ini kami ingin mendiskusikan semuanya dengan Anda Fungsi bahasa kueri 1C, Dan konstruksi bahasa kueri. Apa perbedaan antara fungsi dan desain? Fungsi tersebut dipanggil dengan tanda kurung dan parameter yang mungkin di dalamnya, dan konstruksinya ditulis tanpa tanda kurung. Niscaya semua struktur dan fungsi bahasa kueri 1C menjadikan proses akuisisi data fleksibel dan multifungsi. Fungsi dan konstruksi ini berlaku untuk bidang permintaan, dan beberapa juga berlaku untuk kondisi.

Fungsi Bahasa Kueri 1C

Karena penjelasannya jelas Fungsi bahasa kueri 1C jauh lebih jarang dibandingkan deskripsi struktur, kami memutuskan untuk mulai melihat fungsi. Sekarang mari kita lihat masing-masing secara terpisah, jelaskan tujuan, sintaksis, dan contoh penggunaannya, jadi:

1. Fungsi TANGGAL WAKTU- fungsi ini membuat bidang konstan dengan tipe "Tanggal".

Sintaksis: TANGGAL WAKTU(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Contoh penggunaan:

2. Fungsi PERBEDAAN TANGGAL- mengembalikan selisih antara dua tanggal dalam salah satu dimensi (tahun, bulan, hari, jam, menit, detik). Pengukuran dilewatkan sebagai parameter.

Sintaksis: TANGGAL PERBEDAAN(<Дата1>, <Дата2>, <Тип>)

Contoh penggunaan:

Query.Text = "PILIH | DIFFERENCEDATE(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS Qty.Days";

3. Fungsi NILAI- menetapkan bidang konstan dengan catatan yang telah ditentukan sebelumnya dari database; Anda juga bisa mendapatkan tautan kosong jenis apa pun.

Sintaks: NILAI(<Имя>)

Contoh penggunaan:

Request.Text = "PILIH //elemen yang telah ditentukan | VALUE(Direktori.Mata Uang.Dolar) SEBAGAI Dolar, //tautan kosong | VALUE(Dokumen.Kwitansi Barang dan Jasa.EmptyLink) SEBAGAI Kwitansi, //nilai transfer | VALUE(Transfer . Perorangan Sah. Perorangan) SEBAGAI Perorangan, //akun yang telah ditentukan sebelumnya | NILAI(Bagan Akun. Swadaya. Materi) SEBAGAI Akun_10" ;

4. fungsi PILIH- kami memiliki analog dari konstruksi IF, yang digunakan dalam kode, hanya yang ini yang digunakan dalam kueri 1C.

Sintaksis: PILIHAN KAPAN<Выражение>KEMUDIAN<Выражение>JIKA TIDAK<Выражение>AKHIR

Contoh penggunaan:

Request.Text = //jika jumlahnya lebih dari 7500, maka harus ada diskon 300 rubel, //jadi jika kondisi dipicu maka fungsinya //mengembalikan Jumlah - 300 //jika tidak, permintaan akan mengembalikan Jumlah saja "PILIH | PILIH | KETIKA TCReceipts.Amount > 7500 | MAKA TCReceipts.Amount - 300 | LAINNYA TCReceipts.Amount | AKHIR SEBAGAI AmountWithDiscount |FROM | Document.Receipt of GoodsServices.Goods AS TCReceipts";

5. fungsi EKSPRES- memungkinkan Anda mengekspresikan bidang konstan dengan tipe tertentu.

Sintaksis: EXPRESS(Nama Bidang SEBAGAI Nama Tipe)

Contoh penggunaan:

Query.Text = "PILIH BERBAGAI | Sales.Registrar.Number, | SELECT | KETIKA Sales.Registrar LINK Document.Consumable | THEN EXPRESS(Sales.Registrar AS Document.Consumable) | ELSE SELECT | KETIKA Sales.Registrar LINK Document.Implementation | KEMUDIAN EXPRESS(Penjualan.Registrar SEBAGAI Dokumen.Implementasi) | AKHIR | ... | AKHIR SEBAGAI Nomor | DARI | DaftarAkumulasi.Pembelian SEBAGAI Pembelian";

Apakah ada pilihan lain untuk menggunakan fungsi EXPRESS di bidang tipe campuran, di mana hal itu terjadi? Contoh paling sederhana adalah “Registrar” untuk register apa pun. Jadi mengapa kita perlu memenuhi syarat tipe di registrar? Mari kita pertimbangkan situasi ketika kita memilih bidang "Nomor" dari registrar, dari tabel mana nomor tersebut akan dipilih? Jawaban yang benar dari semuanya! Oleh karena itu, agar kueri kita bekerja dengan cepat, kita harus menentukan tipe eksplisit menggunakan fungsi EXPRESS

Contoh penggunaan:

Query.Text = "SELECT | EXPRESS(Nomenclature.Comment AS Line(300)) AS Comment, | EXPRESS(Nomenclature.Sum AS Number(15,2)) AS Sum |FROM | Directory.Nomenclature AS Nomenclature";

6. fungsi ISNULL(ejaan alternatif ISNULL) - jika bidang bertipe NULL, maka diganti dengan parameter kedua dari fungsi tersebut.

Sintaksis: TIDAK BATAL(<Поле>, <ПодставляемоеЗначение>)

Contoh penggunaan:

Perhatikan juga bahwa disarankan untuk SELALU mengganti tipe NULL dengan nilai tertentu, karena perbandingan dengan tipe NULL selalu menghasilkan FALSE meskipun Anda membandingkan NULL dengan NULL. Paling sering, nilai NULL terbentuk sebagai hasil penggabungan tabel (semua jenis penggabungan kecuali yang internal).

Query.Text = //Pilih seluruh item dan saldonya //jika tidak ada saldo pada beberapa item, maka akan ada field //NULL yang akan diganti dengan nilai 0 "SELECT | No. Link, | ISNULL (ProductsInStockRemains.InStockRemaining, 0) SEBAGAI Sisa | DARI | Direktori.Nomenklatur SEBAGAI No. | KONEKSI KIRI Daftarkan Akumulasi. Barang Di Gudang. Sisa SEBAGAI Barang Di GudangSisa | ON (Barang Di GudangSisa. Nomenklatur = No. Tautan)";

7. fungsi REPRESENTASI- memungkinkan Anda mendapatkan representasi bidang permintaan.

Sintaksis: PERTUNJUKAN(<НаименованиеПоля>)

Contoh penggunaan:

Query.Text = "PILIH | REPRESENTASI(FreeRemainingRemains.Nomenclature) SEBAGAI Nomenklatur, | REPRESENTASI(FreeRemainingRemaining.Warehouse) SEBAGAI Gudang, | FreeRemainingRemaining.InStockRemaining |FROM |Daftar Akumulasi.FreeRemaining.Remaining SEBAGAI FreeRemainingRemaining";

Dibangun dalam bahasa kueri 1C

Kami berdiskusi dengan Anda di atas Fungsi bahasa kueri 1C, sekarang saatnya untuk mempertimbangkan konstruksi dalam bahasa kueri 1C, mereka tidak kalah penting dan berguna, mari kita mulai.

1. Tautan Konstruksi- adalah operator logika untuk memeriksa tipe referensi. Paling sering ditemui saat memeriksa bidang tipe kompleks terhadap tipe tertentu. Sintaksis: TAUTAN<Имя таблицы>

Contoh penggunaan:

Request.Text = //jika tipe nilai pencatat adalah dokumen Resi, //maka query akan mengembalikan "Kwitansi barang", sebaliknya "Penjualan barang" "PILIH | PILIH | KAPAN Tersisa.LINK Registrar Dokumen.Resi BarangLayanan | LALU ""Penerimaan"" | LAINNYA ""Konsumsi"" | AKHIR SEBAGAI Jenis Pergerakan | DARI | Daftar Akumulasi. Sisa Produk di Gudang SEBAGAI Tetap" ;

2. Desain ANTARA- operator ini memeriksa apakah nilainya berada dalam kisaran yang ditentukan.

Sintaksis: DI ANTARA<Выражение>DAN<Выражение>

Contoh penggunaan:

Request.Text = //dapatkan seluruh nomenklatur yang kodenya terletak pada rentang 1 hingga 100 "SELECT | Nomenclature.Link |FROM | Directory.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code BETWEEN 1 AND 100" ;

3. Konstruksi B dan B HIERARKI- periksa apakah nilainya ada dalam daftar yang ditransfer (array, tabel nilai, dll. dapat ditransfer sebagai daftar). Operator IN HIERARCHY memungkinkan Anda melihat hierarki (contoh penggunaan Bagan Akun).

Sintaksis: DI DALAM(<СписокЗначений>), DALAM HIERARKI(<СписокЗначений>)

Contoh penggunaan:

Request.Text = //pilih semua sub-akun dari akun "PILIH | Swadaya. Tautan SEBAGAI Akun | DARI | Bagan Akun. Swadaya SEBAGAI Swadaya | WHERE | Swadaya. Tautan DALAM NILAI HIERARCHY (Bagan Rekening. Swadaya. Barang)";

4. Desain SERUPA- Fungsi ini memungkinkan kita membandingkan string dengan pola string.

Sintaksis: MENYUKAI "<ТекстШаблона>"

Pilihan pola baris:

% - urutan yang berisi sejumlah karakter arbitrer.

Satu karakter sewenang-wenang.

[...] - karakter tunggal atau rangkaian karakter apa pun yang tercantum di dalam tanda kurung siku. Pencacahan dapat menentukan rentang, misalnya a-z, yang berarti karakter sembarang yang termasuk dalam rentang tersebut, termasuk ujung rentang.

[^...] - karakter tunggal atau rangkaian karakter apa pun yang tercantum di dalam tanda kurung siku kecuali yang tercantum setelah tanda negasi.

Contoh penggunaan:

Query.Text = //temukan seluruh nomenklatur yang mengandung akar kata TABUR dan diawali //baik dengan huruf kecil atau kapital t "SELECT | Nomenclature. Link | FROM | Directory. Nomenclature AS Nomenclature | WHERE | Products. Name LIKE "" [Tt ]abur%""" ;

5. Desain DIPERBOLEHKAN- operator ini memungkinkan Anda untuk memilih hanya catatan-catatan dari database yang izin bacanya dimiliki oleh penelepon. Hak-hak ini dikonfigurasi pada tingkat rekaman (RLS).

Sintaksis: ALLOWED ditulis setelah kata kunci SELECT

Contoh penggunaan:

Request.Text = "PILIH DIPERBOLEHKAN | Rekanan. Tautan | DARI | Direktori. Rekanan SEBAGAI Rekanan";

6. Desain BERBAGAI- memungkinkan Anda memilih rekaman yang tidak memiliki rekaman duplikat.

Sintaksis: VARIOUS ditulis setelah kata kunci SELECT

Contoh penggunaan:

Request.Text = //memilih catatan dimana pembaca mempunyai hak "PILIH BERBAGAI | Counterparties.Name |FROM | Direktori. Counterparty SEBAGAI Counterparty" ;

Selain itu, konstruksi VARIOUS dapat digunakan dengan operator yang DIPERBOLEHKAN dan operator lainnya.

Contoh penggunaan:

Request.Text = //memilih berbagai catatan dimana pembaca mempunyai hak "PILIH DIIZINKAN BERBAGAI | Counterparties.Name |FROM | Direktori. Counterparty SEBAGAI Counterparty";

7. Desain PERTAMA- memilih jumlah rekaman yang ditentukan dalam parameter dari hasil kueri.

Sintaks: PERTAMA<число>

Contoh penggunaan:

Request.Text = //pilih 4 nomor CCD pertama dari direktori "PILIH 4 PERTAMA | Nomor CCD. Tautan | DARI | Direktori. Nomor CCD SEBAGAI Nomor CCD";

8. Desain UNTUK PERUBAHAN- memungkinkan Anda mengunci meja, hanya berfungsi dalam transaksi (hanya relevan untuk kunci otomatis).

Sintaksis: UNTUK PERUBAHAN<НаименованиеТаблицы>

Contoh penggunaan:

Query.Text = "PILIH | Sisa Bebas. Nomenklatur, | Sisa Bebas. Gudang, | Sisa Bebas. Sisa Stok | DARI | Daftar Akumulasi. Sisa Bebas. Sisa SEBAGAI Sisa Bebas | UNTUK PERUBAHAN | Daftar Akumulasi .Sisa Gratis.Sisa";

9. Desain DIPESAN OLEH- mengatur data berdasarkan bidang tertentu. Jika bidangnya adalah tautan, maka saat menyetel bendera PESANAN OTOMATIS Penyortiran akan terjadi berdasarkan representasi tautan; jika tandanya dimatikan, maka tautan diurutkan berdasarkan senioritas alamat tautan di memori.

Sintaksis: SORTIR DENGAN<НаименованиеПоля>PESANAN OTOMATIS

Contoh penggunaan:

Query.Text = "PILIH | Sisa Bebas. Nomenklatur SEBAGAI Nomenklatur, | Sisa Sisa Bebas. Gudang SEBAGAI Gudang, | Sisa Bebas. Sisa Persediaan | DARI | Daftar Akumulasi. Sisa Bebas. Sisa SEBAGAI Sisa Bebas | | ORDER BY | Tata Nama | AUTO ORDER VANIE";

10. Desain KELOMPOK OLEH- digunakan untuk mengelompokkan string kueri berdasarkan bidang tertentu. Bidang numerik harus digunakan dengan fungsi agregat apa pun.

Sintaksis: KELOMPOK OLEH<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Contoh penggunaan:

Query.Text = "PILIH | ItemsInWarehouses.Nomenclature SEBAGAI Nomenklatur, | ItemsInWarehouses.Warehouse, | SUM(ItemsInWarehouses.InStock) SEBAGAI INSTOCK |FROM | RegisterAccumulations.ItemsInWarehouses SEBAGAI ItemsInWarehouses | |GROUP BY | ItemsInWarehouses.Nomenclature, | ItemsAtWarehouse ah.Warehouse" ;

11. Desain MEMILIKI- memungkinkan Anda menerapkan fungsi agregat ke kondisi pemilihan data, mirip dengan konstruksi WHERE.

Sintaksis: MEMILIKI<агрегатная функция с условием>

Contoh penggunaan:

Query.Text = //memilih rekaman yang dikelompokkan dengan bidang InStock lebih besar dari 3 "SELECT | ItemsInStocks.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) AS INSTOCK |FROM | RegisterAccumulations.ItemsInStocks AS ItemsInStocks | | KELOMPOK BERDASARKAN | ProdukDiGudang.Nomenklatur, | ProdukDiGudang.Gudang | |TERSEDIA | JUMLAH(ProdukDiGudang.InStock) > 3" ;

12. INDEKS Konstruksi OLEH- digunakan untuk mengindeks bidang kueri. Kueri dengan pengindeksan membutuhkan waktu lebih lama untuk diselesaikan, namun mempercepat pencarian melalui bidang yang diindeks. Hanya dapat digunakan di tabel virtual.

Sintaksis: INDEKS OLEH<Поле1, ... , ПолеN>

Contoh penggunaan:

Query.Text = "PILIH | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | TEMPAT DataTs | FROM | &Ts AS Ts | | INDEX BY | Ts.NameOS, | Ts .CodeOS";

13. Desain DI MANA- memungkinkan Anda menerapkan ketentuan pada bidang pilihan mana pun. Hasilnya hanya akan mencakup catatan yang memenuhi kondisi tersebut.

Sintaksis: DI MANA<Условие1 ОператорЛогСоединения УсловиеN>

Contoh penggunaan:

Query.Text = //semua catatan dengan CompensationRemaining dipilih<>0 dan //AmountForCalcCompRemaining > 100 "SELECT | CompensationRPOREmains.Counterparty, |CompensationRPOREmains.Child, | CompensationRPOREmains.CompensationRemaining, | CompensationRPOREmains.AmountForCalcCompRemains |Tempatkan DataTz |FROM | Daftar Akumulasi.CompensationRP.Remains AS CompensationRPRemains | WHERE |CompensationRPORE maining.KompensasiSisa<>0 | Dan KompensasiRPOREmains.AmountForCalcCompRemaining> 100" ;

14. HASIL Desain... UMUM- digunakan untuk menghitung total; desain menentukan bidang yang akan digunakan untuk menghitung total dan fungsi agregat diterapkan pada bidang total. Saat menggunakan total untuk setiap bidang setelah konstruksi TOTAL, data dikelompokkan. Ada konstruksi UMUM opsional; penggunaannya juga menyediakan pengelompokan tambahan. Anda akan melihat contoh hasil permintaan di bawah ini.

Sintaksis: HASIL<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>OLEH<ОБЩИЕ> <Поле1, ... , ПолеN>

Contoh penggunaan:

Request.Text = "PILIH | Perhitungan. Perjanjian Counterparty. Jenis Perjanjian SEBAGAI Jenis Kontrak, | Perhitungan. Perjanjian Counterparty SEBAGAI Kontrak, | Perhitungan. Counterparty, | Perhitungan. Jumlah Saldo Penyelesaian Bersama SEBAGAI Saldo | DARI | Daftar Akumulasi. Reksa Penyelesaian DENGAN Pihak Rekanan Saldo SEBAGAI Perhitungan | TOTAL | JUMLAH (Saldo) |Perangkat Lunak | UMUM, | Jenis Perjanjian";

Gambar tersebut menguraikan pengelompokan yang dibentuk selama pelaksanaan permintaan, yang paling atas mengacu pada bagian UMUM, dan yang kedua mengacu pada bidang Jenis Perjanjian Perjanjian Lawan Pihak.