Permintaan 1c dalam hierarki dari daftar. Operator "dalam hierarki" dalam kueri. Operator logika antara

Bagian ini menunjukkan contoh penyelesaian masalah umum saat bekerja dengan direktori hierarki.

Memperoleh elemen direktori hierarki yang berada di bawah grup tertentu

Untuk mendapatkan elemen bawahan dari direktori hierarki, bahasa kueri menyediakan konstruksi IN HIERARCHY. Contoh penggunaan DALAM HIERARKI:


MEMILIH
Nomenklatur.Kode,
Nomenklatur.Harga Pembelian
DARI

Dalam contoh ini, semua catatan direktori Nomenklatur yang terletak di grup &Group akan diperoleh, termasuk dirinya sendiri, grup bawahannya, dan elemen yang termasuk dalam grup bawahan.

Jika kita hanya tertarik pada elemen dan grup yang terletak langsung pada grup tertentu, maka kita dapat memperoleh elemen tersebut dengan menetapkan kondisi pada kolom Induk. Contoh:


MEMILIH
Nomenklatur.Kode,
Tata Nama.Nama SEBAGAI Nama,
Nomenklatur.Harga Pembelian
DARI
Direktori.Nomenklatur SEBAGAI Tata Nama

DI MANA
Nomenklatur.Induk = &Grup

Kueri ini akan memilih grup dan elemen yang berada di bawah grup dengan tautan &Grup.

Memeriksa keberadaan elemen bawahan dari elemen direktori

Untuk memeriksa keberadaan rekaman bawahan dari elemen direktori, Anda bisa menggunakan kueri yang serupa dengan yang disajikan:

Dalam contoh ini, referensi ke elemen yang ingin Anda periksa turunannya ditulis ke parameter kueri Induk. Setelah menjalankan kueri seperti itu, Anda perlu memeriksa kekosongan hasilnya. Jika hasilnya tidak kosong, maka ada catatan bawahan. Jika tidak, tidak. Contoh:


Jika Permintaan.Jalankan().Kosong() Lalu
Laporan("Tidak ada entri");
Jika tidak
Report("Catatan tersedia");
berakhir jika;

Mendapatkan semua orang tua dari suatu elemen

Bahasa kueri tidak menyediakan sarana khusus apa pun untuk mengambil semua induk suatu elemen. Anda dapat menggunakan total hierarki untuk menyelesaikan tugas, namun memperoleh total hierarki dioptimalkan untuk membangun total sejumlah besar rekaman, dan tidak sepenuhnya efektif untuk mendapatkan induk dari satu elemen. Untuk mengambil semua catatan induk suatu elemen dengan lebih efisien, disarankan untuk melakukan perulangan melalui induknya dalam porsi kecil. Contoh:


ItemItem Saat Ini = ItemItem;

Kueri = Kueri Baru("PILIH
| Nomenklatur. Induk,
| Nomenklatur.Orang Tua.Orang Tua,
| Nomenklatur.Orangtua.Orangtua.Orangtua,
| Nomenklatur.Orangtua.Orangtua.Orangtua.Orangtua,
| Tata Nama.Orang Tua.Orang Tua.Orang Tua.Orang Tua.Orang Tua
|DARI
| Direktori.Nomenklatur SEBAGAI Tata Nama
|DIMANA
| Nomenclature.Link = &CurrentNomenclatureElement";

Sedangkan Siklus Kebenaran
Permintaan.SetParameter("ItemItem Saat Ini",ItemItem Saat Ini);
Hasil = Kueri.Jalankan();
Jika Hasil.Kosong() Lalu
Menggugurkan;
berakhir jika;
Pilihan = Hasil.Pilih();
Seleksi.Berikutnya();
Untuk ColumnNumber = 0 Berdasarkan Result.Columns.Quantity() - 1 Loop
CurrentItemItem = Pilihan[Nomor Kolom];
Menggugurkan;
Jika tidak
Laporan(ItemItem Saat Ini);
berakhir jika;
Siklus Akhir;

Jika CurrentItemItem = Directories.Nomenclature.EmptyLink() Lalu
Menggugurkan;
berakhir jika;
Siklus Akhir;

Dalam contoh ini, semua induk tautan yang direkam dalam variabel ElementNomenclature ditampilkan di jendela pesan layanan. Dalam siklus tersebut, 5 orang tua penghubung dipilih.

Jika jumlah level dalam direktori terbatas dan kecil, maka dimungkinkan untuk mendapatkan semua level induk dengan satu permintaan tanpa loop.

Menampilkan direktori hierarki dalam laporan

Untuk menampilkan direktori hierarki dalam laporan sambil mempertahankan hierarki, Anda harus menggunakan kueri yang mirip dengan berikut ini:


MEMILIH
Nomenklatur.Kode,
Tata Nama.Nama SEBAGAI Nama,
Nomenklatur.Harga Pembelian
DARI
Direktori.Nomenklatur SEBAGAI Tata Nama
SORTIR DENGAN
Nama HIERARKI

Kueri ini memilih semua rekaman dari direktori dan mengaturnya berdasarkan hierarki. Hasilnya akan diurutkan berdasarkan nama, dengan mempertimbangkan hierarki.

Agar grup direktori ditempatkan di atas elemen, klausa ORDER BY dalam permintaan ini perlu diganti dengan yang berikut:


SORTIR DENGAN
Nomenklatur. Ini adalah HIERARCHI Grup,
Nama

Hasilnya akan tetap diurutkan secara hierarki, namun grup akan muncul di atas elemen.

Dimungkinkan juga untuk mengganti penawaran ORDER BY dengan opsi AUTO ORDER. Dalam hal ini, hasilnya akan diurutkan sesuai dengan pengaturan direktori, mis. jika direktori menyatakan bahwa grup harus ditempatkan di atas elemen, maka grup tersebut akan ditempatkan di atas.

Dimungkinkan juga untuk mendapatkan struktur hierarki direktori menggunakan hasilnya.


MEMILIH
Nomenklatur.Kode,
Tata Nama.Nama SEBAGAI Nama,
Nomenklatur.Harga Pembelian

DARI Direktori.Nomenklatur SEBAGAI Nomenklatur

DI MANA
(Nomenklatur.Grup Ini = SALAH)

ORDER BERDASARKAN Nama

Mendapatkan total berdasarkan hierarki

Untuk mendapatkan total berdasarkan hierarki dalam kueri, Anda harus menentukan kata kunci HIERARCHY dalam klausa SOFTWARE TOTAL setelah menentukan bidang yang akan digunakan untuk menghitung total. Contoh laporan "Perputaran barang" dengan perolehan total berdasarkan hierarki:


MEMILIH

DARI

HIERARKI Tata Nama

Sebagai hasil dari permintaan ini, total akan dihitung tidak hanya untuk setiap item, tetapi juga untuk kelompok yang memiliki item ini atau itu.

Jika kita tidak membutuhkan total untuk elemen, namun hanya membutuhkan total untuk grup, kita perlu menggunakan konstruksi HIERARCHY ONLY dalam totalnya. Contoh:


MEMILIH
Akuntansi Perputaran Nomenklatur.Nomenklatur SEBAGAI Tata Nama,
Akuntansi untuk NomenclatureTurnover.Nomenclature.Presentation,
Akuntansi untuk NomenclatureTurnover.QuantityTurnover SEBAGAI QuantityTurnover
DARI
Daftar Akumulasi.Akuntansi Nomenklatur.Perputaran BAGAIMANA Akuntansi NomenklaturPerputaran
JUMLAH HASIL (QuantityTurnover) PO
HANYA HIERARKI Nomenklatur

Hasil dari kueri ini akan berupa catatan total hanya untuk kelompok item.

Apa itu direktori 1C dan mengapa diperlukan? Direktori menyimpan informasi permanen bersyarat, mis. informasi yang hampir tidak berubah dalam jangka waktu yang lama. Misalnya, direktori “Nomenklatur” berisi daftar barang yang dijual atau diproduksi. Selain itu, direktori dapat berisi banyak properti yang menjelaskan elemen direktori.

Jika kita membandingkan jenis kelamin seseorang, maka daftarnya terbatas dan tidak berubah, sehingga lebih cocok untuk melakukan pencacahan.

Setelah membuat direktori baru, kita akan melihat gambar berikut.

Mari kita lihat semua bookmarknya.

Dasar

Di sini nama (pengidentifikasi dalam database) dan sinonim (nama pengguna direktori) ditunjukkan. Komentar opsional adalah komentar yang dapat menjelaskan tujuan direktori atau menjelaskan fitur-fiturnya.

Hirarki

Pada tab ini Anda dapat mengonfigurasi kedalaman elemen direktori bersarang. Dengan menggunakan pengaturan ini, akan lebih mudah untuk membedakan dan merinci elemen menurut kriteria tertentu. Misalnya, produk “Lemari” ada di satu kelompok, dan produk “Meja” ada di kelompok lain. Secara default, saat dibuat, direktori ditampilkan daftar elemen. Jika Anda mencentang kotak Direktori hierarki, maka setiap elemen dapat berada di bawah elemen (grup) lain. Di bawah ini adalah opsi untuk menyesuaikan bookmark ini dan mengubah tampilan dalam mode kustom.

Jenis hierarki:

Hirarki kelompok dan elemen

Dengan pengaturan ini, elemen hanya dapat disarangkan dalam grup (folder).

Di sini, seperti yang Anda lihat, semua elemen dan grup memiliki ikon yang sama, dan elemen apa pun dapat disarangkan.

Tempatkan kelompok di atas

Jika kotak ini dicentang, grup akan selalu berada di atas, jika tidak, grup akan disusun berdasarkan urutan, misalnya seperti ini:

Membatasi jumlah level hierarki

Jika kotak centang tidak dicentang di sini, maka penyarangan tidak terbatas.

Jika kotak centang dicentang, Anda dapat menentukan jumlah level di bawah.

Pemilik

Di penanda pemilik direktori lain dapat ditunjukkan sehubungan dengan mana direktori ini berada di bawahnya. Diagram hubungan direktori bawahan mirip dengan diagram hubungan direktori hierarki, hanya saja di sini direktori lain bertindak sebagai induk dan disebut pemilik. Dalam konfigurasi tipikal, contoh yang baik adalah subordinasi direktori "Perjanjian" ke direktori "Counterparty", karena Tidak mungkin ada perjanjian yang tidak dimiliki oleh pihak mana pun.

Bidang "Daftar Pemilik Direktori" menentukan daftar direktori yang memiliki elemen direktori ini.

Di bawah bidang "Penggunaan subordinasi" ditunjukkan elemen mana dari direktori ini yang akan disubordinasikan.

Cara mengetahui secara terprogram apakah suatu direktori bersifat hierarkis atau tidak

Untuk melakukan ini, Anda perlu merujuk pada metadata

Ini adalah HierarchicalDirectory = Metadata.Directories.Counterparty.Hierarchical;

Bersambung...

Bahasa kueri di 1C 8 adalah analog sederhana dari “bahasa pemrograman terstruktur” yang terkenal (seperti yang lebih sering disebut, SQL). Namun di 1C hanya digunakan untuk membaca data, model data objek digunakan untuk mengubah data.

Perbedaan menarik lainnya adalah sintaksis Rusia. Meskipun sebenarnya Anda bisa menggunakan konstruksi berbahasa Inggris.

Contoh permintaan:

MEMILIH
Bank.Nama,
Bank.CorrAccount
DARI
Direktori.Bank BAGAIMANA Bank

Permintaan ini memungkinkan kita melihat informasi tentang nama dan rekening koresponden semua bank yang ada di database.

Bahasa kueri adalah cara paling sederhana dan efektif untuk memperoleh informasi. Seperti dapat dilihat dari contoh di atas, dalam bahasa kueri Anda perlu menggunakan nama metadata (ini adalah daftar objek sistem yang membentuk konfigurasi, yaitu direktori, dokumen, register, dll.).

Deskripsi konstruksi bahasa kueri

Struktur kueri

Untuk memperoleh data cukup menggunakan konstruksi “SELECT” dan “FROM”. Permintaan paling sederhana terlihat seperti ini:

PILIH * DARI Direktori.Nomenklatur

Dimana “*” berarti memilih semua field tabel, dan Direktori.Nomenklatur – nama tabel dalam database.

Mari kita lihat contoh yang lebih kompleks dan umum:

MEMILIH
<ИмяПоля1>BAGAIMANA<ПредставлениеПоля1>,
Jumlah(<ИмяПоля2>) BAGAIMANA<ПредставлениеПоля2>
DARI
<ИмяТаблицы1>BAGAIMANA<ПредставлениеТаблицы1>
<ТипСоединения>MENGGABUNGKAN<ИмяТаблицы2>BAGAIMANA<ПредставлениеТаблицы2>
OLEH<УсловиеСоединениеТаблиц>

DI MANA
<УсловиеОтбораДанных>

KELOMPOK OLEH
<ИмяПоля1>

SORTIR DENGAN
<ИмяПоля1>

HASIL
<ИмяПоля2>
OLEH
<ИмяПоля1>

Dalam kueri ini, kami memilih data bidang "Nama Bidang1" dan "Nama Bidang1" dari tabel "NamaTabel1" dan "NamaTabel", menetapkan sinonim ke bidang menggunakan operator "BAGAIMANA", dan menghubungkannya menggunakan kondisi tertentu "TableConnectionCondition ”.

Dari data yang diterima, kami memilih hanya data yang memenuhi kondisi dari "WHERE" "Kondisi Pemilihan Data". Selanjutnya, kami mengelompokkan permintaan berdasarkan bidang "Nama Bidang1", sambil menjumlahkan "Nama Bidang2". Kami membuat total untuk bidang tersebut “Nama Bidang1” dan bidang terakhir “Nama Bidang2”.

Langkah terakhir adalah mengurutkan permintaan menggunakan konstruksi ORDER BY.

Desain umum

Mari kita lihat struktur umum bahasa kueri 1C 8.2.

PERTAMAN

Dengan menggunakan operator ini, Anda bisa mendapatkan n jumlah record pertama. Urutan rekaman ditentukan oleh urutan dalam kueri.

PILIH 100 PERTAMA
Bank.Nama,
Bank Kode SEBAGAI BIC
DARI
Direktori.Bank BAGAIMANA Bank
SORTIR DENGAN
Bank.Nama

Permintaan tersebut akan menerima 100 entri pertama dari direktori “Bank”, diurutkan berdasarkan abjad.

DIIZINKAN

Desain ini relevan untuk bekerja dengan mekanisme. Inti dari mekanisme ini adalah untuk membatasi pembacaan (dan tindakan lainnya) kepada pengguna untuk catatan tertentu dalam tabel database, dan bukan tabel secara keseluruhan.

Jika pengguna mencoba menggunakan kueri untuk membaca catatan yang tidak dapat diaksesnya, dia akan menerima pesan kesalahan. Untuk menghindari hal ini, Anda harus menggunakan konstruksi “ALLOWED”, yaitu permintaan hanya akan membaca catatan yang diizinkan.

PILIH DIPERBOLEHKAN
Repositori Informasi Tambahan Tautan
DARI
Direktori.Repositori Informasi Tambahan

BERMACAM-MACAM

Menggunakan "DIFFERENT" akan mencegah baris duplikat memasuki hasil query 1C. Duplikasi berarti semua bidang permintaan cocok.

PILIH 100 PERTAMA
Bank.Nama,
Bank Kode SEBAGAI BIC
DARI
Direktori.Bank BAGAIMANA Bank

Meja Kosong

Konstruksi ini sangat jarang digunakan untuk menggabungkan kueri. Saat bergabung, Anda mungkin perlu menentukan tabel bersarang kosong di salah satu tabel. Operator “EmptyTable” tepat untuk ini.

Contoh dari bantuan 1C 8:

PILIH Tautan.Nomor, TABEL KOSONG.(No., Barang, Jumlah) SEBAGAI Komposisi
DARI Dokumen. Faktur Biaya
GABUNGKAN SEMUANYA
PILIH Tautan.Nomor, Isi.(Nomor Baris, Produk, Kuantitas)
DARI Dokumen.Dokumen Faktur.Faktur.Komposisi.*

TIDAK BOLEH

Fitur yang sangat berguna yang memungkinkan Anda menghindari banyak kesalahan. YesNULL() memungkinkan Anda mengganti nilai NULL dengan nilai yang diinginkan. Sangat sering digunakan untuk memeriksa keberadaan suatu nilai pada tabel yang digabungkan, misalnya:

MEMILIH
Tautan Referensi Nomenklatur,
IsNULL(Item Tersisa.QuantityRemaining,0) SEBAGAI QuantityRemaining
DARI


Dapat digunakan dengan cara lain. Misalnya, jika untuk setiap baris tidak diketahui di tabel mana nilainya ada:

ISNULL(InvoiceReceived.Date, InvoiceIssued.Date)

HOW adalah operator yang memungkinkan kita memberikan nama (sinonim) pada suatu tabel atau field. Kami melihat contoh penggunaan di atas.

Konstruksi ini sangat mirip - memungkinkan Anda mendapatkan representasi string dari nilai yang diinginkan. Satu-satunya perbedaan adalah REPRESENTATION mengonversi nilai apa pun menjadi tipe string, sedangkan REPRESENTATIONREF hanya mengonversi nilai referensi. REPRESENTASI REFERENSI direkomendasikan untuk digunakan dalam kueri sistem komposisi data untuk pengoptimalan, kecuali, tentu saja, bidang data referensi direncanakan untuk digunakan dalam pemilihan.

MEMILIH
Lihat(Tautan), //string, misalnya “Laporan Lanjutan No. 123 tanggal 10/10/2015
Lihat(DeletionMark) SEBAGAI DeleteMarkText, //string, “Ya” atau “Tidak”
ViewReferences(DeletionMark) AS DeleteMarkBoolean //boolean, Benar atau Salah
DARI
Dokumen.Laporan Muka

CEPAT

Express memungkinkan Anda mengonversi nilai bidang ke tipe data yang diinginkan. Anda dapat mengonversi nilai menjadi tipe primitif atau tipe referensi.

Ekspres untuk tipe referensi digunakan untuk membatasi tipe data yang diminta dalam bidang tipe kompleks, sering kali digunakan untuk mengoptimalkan kinerja sistem. Contoh:

EXPRESS(TableCost.Subconto1 SEBAGAI Direktori.Item Biaya).Jenis ActivityForTaxAccountingCosts

Untuk tipe primitif, fungsi ini sering digunakan untuk membatasi jumlah karakter dalam bidang yang panjangnya tidak terbatas (bidang tersebut tidak dapat dibandingkan). Untuk menghindari kesalahan" Parameter tidak valid dalam operasi perbandingan. Anda tidak dapat membandingkan bidang
panjang tak terbatas dan bidang tipe yang tidak kompatibel
", Anda perlu menyatakan bidang-bidang seperti berikut:

EXPRESS(Komentar SEBAGAI Baris(150))

TANGGAL PERBEDAAN

Dapatkan 267 pelajaran video di 1C gratis:

Contoh penggunaan IS NULL dalam permintaan 1C:

PILIH DARI
Ref
KONEKSI KIRI DaftarAkumulasi.ProdukDiGudang.Sisa SEBAGAI Sisa Produk
Software NomenclatureRef.Link = Barang TerjualCommitteesRemains.Nomenclature
DIMANA TIDAK TERSISA BARANG.JUMLAHNYA TERSISA NULL

Tipe data dalam kueri dapat ditentukan dengan menggunakan fungsi TYPE() dan VALUETYPE(), atau dengan menggunakan operator logika REFERENCE. Kedua fungsi tersebut serupa.

Nilai yang telah ditentukan sebelumnya

Selain menggunakan parameter yang diteruskan dalam kueri dalam bahasa kueri 1C, Anda dapat menggunakan nilai yang telah ditentukan sebelumnya atau . Misalnya, transfer, direktori yang telah ditentukan sebelumnya, bagan akun, dan sebagainya.Untuk ini, konstruksi “Nilai()” digunakan.

Contoh penggunaan:

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

WHERE Counterparty.Jenis Informasi Kontak = Nilai(Pencacahan.Jenis Informasi Kontak.Telepon)

DIMANA Saldo Akun.Akun Akuntansi = Nilai(Bagan Akun.Laba.LabaRugi)

Koneksi

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.

Misalnya:

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

GABUNG BENAR dalam bahasa 1C sangat mirip koneksi KIRI, dengan pengecualian satu perbedaan - masuk 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:

DARI

KONEKSI LENGKAP
Direktori.Bank BAGAIMANA Bank

OLEH

Bahasa kueri akan mengembalikan kedua tabel secara lengkap hanya jika kondisi untuk menggabungkan 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.

Asosiasi

Konstruksi JOIN dan JOIN ALL menggabungkan dua hasil menjadi satu. Itu. hasil dari melakukan keduanya akan “digabung” menjadi satu, yang umum.

Artinya, sistem bekerja sama persis dengan sistem biasa, hanya untuk tabel sementara.

Cara menggunakan INDEX BY

Namun, ada satu hal yang perlu diperhatikan. Membangun indeks pada tabel sementara juga membutuhkan waktu untuk diselesaikan. Oleh karena itu, disarankan untuk menggunakan konstruksi “ ” hanya jika diketahui secara pasti bahwa akan terdapat lebih dari 1-2 record dalam tabel sementara. Jika tidak, efeknya mungkin sebaliknya - kinerja bidang yang diindeks tidak mengimbangi waktu yang diperlukan untuk membuat indeks.

MEMILIH
Kurs mata uang Penampang terbaru Mata Uang AS Mata Uang,
Nilai tukar mata uang Penampang terbaru.
Nilai Mata Uang PUT
DARI
Daftar Informasi.Kurs Mata Uang.Irisan Terakhir(&Periode,) AS Nilai Mata UangIrisan Terakhir
INDEKS OLEH
Mata uang
;
MEMILIH
HargaNomenklatur.Nomenklatur,
HargaNomenklatur.Harga,
HargaNomenklatur.Mata uang,
Nilai mata uang. Nilai
DARI
Daftar Informasi.Nomenklatur Harga.Irisan Terakhir(&Periode,
Nomenklatur B (&Nomenklatur) DAN Tipe Harga = &Tipe Harga) SEBAGAI Nomenklatur Harga
KIRI BERGABUNG Nilai Mata Uang SEBAGAI Nilai Mata Uang
Perangkat Lunak HargaNomenklatur.Mata Uang = Nilai Mata Uang.Mata Uang

Pengelompokan

Bahasa kueri 1C memungkinkan Anda menggunakan fungsi agregat khusus saat mengelompokkan hasil kueri. Pengelompokan juga dapat digunakan tanpa fungsi agregat untuk “menghilangkan” duplikat.

Fungsi-fungsi berikut ada:

Jumlah, Kuantitas, Jumlah berbeda, Maksimum, Minimum, Rata-rata.

Contoh 1:

MEMILIH
Penjualan Barang Barang dan Jasa Nomenklatur,
SUM (Penjualan Barang Jasa Barang. Jumlah) SEBAGAI Kuantitas,
SUM(Penjualan BarangLayananBarang.Jumlah) SEBAGAI Jumlah
DARI

KELOMPOK OLEH
Penjualan Barang dan Jasa Nomenklatur

Permintaan tersebut menerima semua lini barang dan merangkumnya berdasarkan kuantitas dan jumlah berdasarkan item.

Contoh No.2

MEMILIH
Bank.Kode,
KUANTITAS (Bank.Link BERBEDA) SEBAGAI Jumlah Duplikat
DARI
Direktori.Bank BAGAIMANA Bank
KELOMPOK OLEH
Bank.Kode

Contoh ini akan menampilkan daftar BIC di direktori “Bank” dan menunjukkan berapa banyak duplikat yang ada untuk masing-masing BIC.

Hasil

Hasil merupakan cara memperoleh data dari suatu sistem dengan struktur hierarki. Fungsi agregat dapat digunakan untuk bidang ringkasan, seperti halnya pengelompokan.

Salah satu cara paling populer untuk menggunakan hasil dalam praktiknya adalah penghapusan barang secara batch.

MEMILIH




DARI
Dokumen Penjualan Barang dan Jasa Barang CARA Penjualan Barang dan Jasa
SORTIR DENGAN

HASIL
SUM (Kuantitas),
JUMLAH(Jumlah)
OLEH
Tata nama

Hasil kueri akan berupa hierarki berikut:

Hasil umum

Jika Anda perlu mendapatkan total untuk semua “total”, gunakan operator “UMUM”.

MEMILIH
Penjualan Barang Barang dan Jasa Nomenklatur SEBAGAI Tata Nama,
Penjualan Barang dan Jasa.Link AS Document,
Penjualan Barang dan Jasa Barang Kuantitas SEBAGAI Kuantitas,
Penjualan Barang dan Jasa Barang Jumlah SEBAGAI Jumlah
DARI
Dokumen Penjualan Barang dan Jasa Barang CARA Penjualan Barang dan Jasa
SORTIR DENGAN
Penjualan Barang dan Jasa Barang Link Tanggal
HASIL
SUM (Kuantitas),
JUMLAH(Jumlah)
OLEH
ADALAH UMUM,
Tata nama

Sebagai hasil dari mengeksekusi permintaan tersebut, kami mendapatkan hasil berikut:

Di mana 1 tingkat pengelompokan adalah agregasi dari semua bidang yang diperlukan.

Mengatur

Operator ORDER BY digunakan untuk mengurutkan hasil query.

Penyortiran untuk tipe primitif (string, angka, boolean) mengikuti aturan biasa. Untuk bidang tipe referensi, pengurutan dilakukan berdasarkan representasi internal tautan (pengidentifikasi unik), bukan berdasarkan kode atau representasi referensi.

MEMILIH

DARI
Direktori.Nomenklatur SEBAGAI Tata Nama
SORTIR DENGAN
Nama

Permintaan tersebut akan menampilkan daftar nama di direktori nomenklatur, diurutkan berdasarkan abjad.

Pemesanan otomatis

Hasil kueri tanpa pengurutan adalah kumpulan baris yang disajikan secara kacau. Pengembang platform 1C tidak menjamin bahwa baris akan ditampilkan dalam urutan yang sama saat menjalankan kueri yang sama.

Jika Anda perlu menampilkan catatan tabel dalam urutan konstan, Anda harus menggunakan konstruksi Urutan Otomatis.

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

Tabel virtual

Tabel virtual dalam 1C adalah fitur unik dari bahasa kueri 1C yang tidak ditemukan dalam sintaks serupa lainnya. Tabel virtual adalah cara cepat untuk mendapatkan informasi profil dari register.

Setiap jenis register memiliki kumpulan tabel virtualnya sendiri, yang mungkin berbeda tergantung pada pengaturan register.

  • potongan yang pertama;
  • potongan yang terakhir.
  • sisa;
  • revolusi;
  • saldo dan perputaran.
  • gerakan dari subconto;
  • revolusi;
  • kecepatan Dt Kt;
  • sisa;
  • saldo dan perputaran
  • subkonto.
  • basis;
  • data grafik;
  • masa berlaku sebenarnya.

Untuk pengembang solusi, data diambil dari satu tabel (virtual), namun kenyataannya platform 1C mengambil dari banyak tabel, mengubahnya menjadi bentuk yang diperlukan.

MEMILIH
Produk di Gudang Sisa dan Perputaran Nomenklatur,
ProdukDi GudangSisaDanPerputaran.JumlahInisialSisa,
ProdukDi GudangSisaDanPerputaran.PerputaranKuantitas,
BarangDiGudangSisaDanPerputaran.JumlahMasuk,
BarangDiGudangSisaDanPerputaran.JumlahKonsumsi,
ProdukDi GudangSisaDanPerputaran.JumlahSisa Akhir
DARI
DaftarAkumulasi.BarangDiGudang.SisaDanPerputaran SEBAGAI BarangDiGudangSisaDanPerputaran

Kueri ini memungkinkan Anda mengambil data dalam jumlah besar dengan cepat.

Opsi Tabel Virtual

Aspek yang sangat penting dalam bekerja dengan tabel virtual adalah penggunaan parameter. Parameter tabel virtual adalah parameter khusus untuk pemilihan dan konfigurasi.

Untuk tabel seperti itu, penggunaan pemilihan dalam konstruksi “WHERE” dianggap salah. Selain fakta bahwa kueri menjadi kurang optimal, ada kemungkinan menerima data yang salah.

Contoh penggunaan parameter ini:

Daftar Akumulasi Barang di Gudang Saldo dan Perputaran (& Awal Periode & Akhir Periode, Bulan, Pergerakan dan Batas Periode, Nomenklatur = & Nomenklatur yang Wajib)

Algoritma untuk tabel virtual

Misalnya, tabel virtual tipe “Sisa” yang paling banyak digunakan menyimpan data dari dua tabel fisik – saldo dan pergerakan.

Saat menggunakan tabel virtual, sistem melakukan manipulasi berikut:

  1. Kami mendapatkan nilai perhitungan terdekat dalam hal tanggal dan pengukuran di tabel total.
  2. Kami “menambahkan” jumlah dari tabel pergerakan ke jumlah dari tabel total.


Tindakan sederhana seperti itu dapat meningkatkan kinerja sistem secara keseluruhan secara signifikan.

Menggunakan Pembuat Kueri

Pembuat Kueri– alat yang dibangun ke dalam sistem 1C Enterprise yang sangat memudahkan pengembangan kueri basis data.

Pembuat kueri memiliki antarmuka yang cukup sederhana dan intuitif. Namun demikian, mari kita lihat penggunaan konstruktor kueri secara lebih detail.

Konstruktor teks kueri diluncurkan dari menu konteks (tombol kanan mouse) di tempat yang diinginkan dalam kode program.

Deskripsi konstruktor permintaan 1C

Mari kita lihat setiap tab desainer lebih detail. Pengecualian adalah tab Builder, yang merupakan topik untuk diskusi lain.

Tab Tabel dan Bidang

Tab ini menentukan sumber data dan bidang yang perlu ditampilkan dalam laporan. Intinya, konstruksi SELECT.. FROM dijelaskan di sini.

Sumbernya bisa berupa tabel database fisik, tabel register virtual, tabel sementara, kueri bersarang, dll.

Di menu konteks tabel virtual, Anda dapat mengatur parameter tabel virtual:

tab Koneksi

Tab digunakan untuk mendeskripsikan koneksi beberapa tabel dan membuat konstruksi dengan kata CONNECTION.

Tab pengelompokan

Pada tab ini, sistem memungkinkan Anda mengelompokkan dan meringkas bidang yang diperlukan dari hasil tabel. Menjelaskan penggunaan konstruksi GROUP BY, SUM, MINIMUM, AVERAGE, MAXIMUM, QUANTITY, NUMBER OF DIFFERENT.

tab ketentuan

Bertanggung jawab atas semua yang muncul dalam teks permintaan setelah konstruksi WHERE, yaitu untuk semua kondisi yang dikenakan pada data yang diterima.

Tab Lanjutan

tab Selain itu penuh dengan segala macam parameter yang sangat penting. Mari kita lihat masing-masing propertinya.

Pengelompokan Memilih catatan:

  • N pertama– parameter yang mengembalikan hanya N catatan ke kueri (operator PERTAMA)
  • Tidak ada duplikat– memastikan keunikan catatan yang diterima (operator BERBEDA)
  • Diizinkan– memungkinkan Anda untuk memilih hanya catatan-catatan yang diizinkan oleh sistem untuk Anda pilih dengan mempertimbangkan (konstruksi yang DIIZINKAN)

Pengelompokan Jenis permintaan menentukan jenis permintaan apa yang akan dilakukan: pengambilan data, pembuatan tabel sementara, atau penghancuran tabel sementara.

Di bawahnya ada bendera Kunci data yang diterima untuk modifikasi nanti. Ini memungkinkan Anda untuk mengaktifkan kemampuan untuk mengatur penguncian data, yang menjamin keamanan data dari saat dibaca hingga diubah (hanya relevan untuk mode penguncian otomatis, desain UNTUK PERUBAHAN).

Tab Gabung/Alias

Pada tab perancang kueri ini, Anda dapat mengatur kemampuan untuk menggabungkan tabel dan alias yang berbeda (konstruksi BAGAIMANA). Tabel ditunjukkan di sisi kiri. Jika Anda menyetel bendera di seberang tabel, konstruksi UNITE akan digunakan, jika tidak - UNITE ALL (perbedaan antara kedua metode). Di sisi kanan, korespondensi bidang dalam tabel yang berbeda ditunjukkan, jika korespondensi tidak ditentukan, kueri akan mengembalikan NULL.

tab pesanan

Ini menentukan urutan pengurutan nilai (ORDER BY) - descending (DESC) atau ascending (ASC).

Ada juga bendera yang menarik - Pemesanan otomatis(dalam permintaan - PEMESANAN OTOMATIS). Secara default, sistem 1C menampilkan data dalam urutan “kacau”. Jika Anda menyetel tanda ini, sistem akan mengurutkan data berdasarkan data internal.

Tab Kumpulan Kueri

Pada tab perancang kueri, Anda bisa membuat yang baru, dan juga menggunakannya sebagai navigasi. Dalam teks permintaan, paket dipisahkan dengan simbol “;” (koma).

Tombol "Kueri" di perancang kueri

Di sudut kiri bawah pembuat permintaan terdapat tombol Permintaan, yang dengannya Anda dapat melihat teks permintaan kapan saja:

Di jendela ini, Anda dapat melakukan penyesuaian terhadap permintaan dan menjalankannya.


Menggunakan Konsol Kueri

Konsol Kueri adalah cara sederhana dan nyaman untuk men-debug kueri kompleks dan memperoleh informasi dengan cepat. Pada artikel kali ini saya akan mencoba menjelaskan cara menggunakan Query Console dan memberikan link untuk mendownload Query Console.

Mari kita lihat lebih dekat alat ini.

Unduh konsol kueri 1C

Pertama-tama, untuk mulai bekerja dengan konsol kueri, Anda perlu mengunduhnya dari suatu tempat. Perawatan biasanya dibagi menjadi dua jenis - bentuk terkontrol dan konvensional (atau, terkadang disebut 8.1 dan 8.2/8.3).

Saya mencoba menggabungkan dua tampilan ini dalam satu pemrosesan - formulir yang diinginkan terbuka dalam mode operasi yang diinginkan (dalam mode terkelola, konsol hanya berfungsi dalam mode tebal).

Deskripsi konsol kueri 1C

Mari kita mulai melihat konsol kueri dengan deskripsi panel pemrosesan utama:

Di header konsol kueri, Anda dapat melihat waktu eksekusi kueri terakhir dengan akurasi milidetik, ini memungkinkan Anda membandingkan desain yang berbeda dalam hal kinerja.

Kelompok tombol pertama di bilah perintah bertanggung jawab untuk menyimpan kueri saat ini ke file eksternal. Ini sangat mudah; Anda selalu dapat kembali menulis permintaan yang rumit. Atau, misalnya, menyimpan daftar contoh khas desain tertentu.

Di sebelah kiri, di bidang “Permintaan”, Anda dapat membuat permintaan baru dan menyimpannya dalam struktur pohon. Kelompok tombol kedua bertanggung jawab untuk mengelola daftar permintaan. Dengan menggunakannya Anda dapat membuat, menyalin, menghapus, memindahkan permintaan.

  • Menjalankanmeminta– eksekusi dan hasil sederhana
  • Jalankan paket– memungkinkan Anda melihat semua kueri perantara dalam kumpulan kueri
  • Melihat tabel sementara– memungkinkan Anda melihat hasil yang dikembalikan oleh kueri sementara pada tabel

Parameter permintaan:

Memungkinkan Anda mengatur parameter permintaan saat ini.

Di jendela parameter kueri, berikut ini yang menarik:

  • Tombol Dapatkan dari permintaan secara otomatis menemukan semua parameter dalam permintaan untuk kenyamanan pengembang.
  • Bendera Parameter umum untuk semua permintaan– saat diinstal, pemrosesannya tidak menghapus parameter saat berpindah dari satu permintaan ke permintaan lainnya dalam daftar umum permintaan.

Tetapkan parameter dengan daftar nilai Caranya sangat sederhana, cukup ketika memilih nilai parameter, klik tombol hapus nilai (silang), sistem akan meminta Anda untuk memilih tipe data, di mana Anda harus memilih “Daftar Nilai”:

Juga di panel atas terdapat tombol untuk memanggil pengaturan konsol kueri:

Di sini Anda dapat menentukan parameter untuk kueri penyimpanan otomatis dan parameter eksekusi kueri.

Teks permintaan dimasukkan ke dalam bidang permintaan konsol. Hal ini dapat dilakukan hanya dengan mengetik tes kueri atau dengan memanggil alat khusus - perancang kueri.

Perancang kueri 1C 8 dipanggil dari menu konteks (tombol kanan mouse) ketika Anda mengklik kolom input:

Menu ini juga memiliki fungsi berguna seperti menghapus atau menambahkan jeda baris (“|”) pada permintaan, atau menerima kode permintaan dalam bentuk yang mudah digunakan ini:

Permintaan = Permintaan Baru;
Permintaan.Teks = ”
|PILIH
| Mata Uang. Tautan
|DARI
| Direktori.Mata Uang SEBAGAI Mata Uang”;
RequestResult = Permintaan.Eksekusi();

Bidang bawah konsol kueri menampilkan bidang hasil kueri, itulah sebabnya pemrosesan ini dibuat:



Selain itu, konsol kueri, selain daftar, dapat menampilkan data dalam bentuk pohon - untuk kueri yang berisi total.

Pengoptimalan kueri

Salah satu poin terpenting dalam meningkatkan produktivitas 1C enterprise 8.3 adalah optimasipermintaan. Poin ini juga sangat penting ketika lulus sertifikasi. Di bawah ini kita akan membahas alasan umum kinerja kueri dan metode pengoptimalan yang tidak optimal.

Seleksi dalam tabel virtual menggunakan konstruksi WHERE

Penting untuk menerapkan filter ke detail tabel virtual hanya melalui parameter VT. Dalam situasi apa pun Anda tidak boleh menggunakan konstruksi WHERE untuk pemilihan dalam tabel virtual; ini adalah kesalahan serius dari sudut pandang optimasi. Dalam hal pemilihan menggunakan WHERE, sebenarnya sistem akan menerima SEMUA record dan baru kemudian memilih yang diperlukan.

BENAR:

MEMILIH

DARI
Daftar Akumulasi Penyelesaian bersama dengan Peserta Organisasi Saldo (
,
Organisasi = &Organisasi
DAN Individu = & Individu) BAGAIMANA Penyelesaian Bersama dengan Peserta Organisasi Saldo

SALAH:

MEMILIH
Penyelesaian bersama dengan Peserta Organisasi Saldo Jumlah Saldo
DARI
Daftar Akumulasi Penyelesaian Bersama dengan Peserta Organisasi Saldo (,) BAGAIMANA Penyelesaian Bersama dengan Peserta Organisasi Saldo
DI MANA
Penyelesaian bersama dengan Peserta Organisasi Saldo Organisasi = & Organisasi
DAN Penyelesaian bersama dengan Peserta Organisasi Saldo Individu = & Individu

Mendapatkan nilai bidang bertipe kompleks menggunakan titik

Saat menerima data bertipe kompleks dalam kueri melalui sebuah titik, sistem menghubungkan dengan gabungan kiri tabel sebanyak mungkin tipe yang ada di bidang tipe kompleks.

Misalnya, sangat tidak diinginkan untuk melakukan optimasi untuk mengakses bidang catatan register – registrar. Pendaftar memiliki tipe data komposit, di antaranya terdapat semua kemungkinan tipe dokumen yang dapat menulis data ke register.

SALAH:

MEMILIH
Kumpulan Rekaman.Perekam.Tanggal,
RecordSet.Kuantitas
DARI
DaftarAkumulasi.ProdukOrganisasi SEBAGAI SetRecords

Faktanya, kueri seperti itu tidak akan mengakses satu tabel, tetapi 22 tabel database (register ini memiliki 21 tipe registrar).

BENAR:

MEMILIH
PILIHAN
KETIKA ProductsOrg.Registrar LINK Dokumen.Penjualan Produk dan Layanan
KEMUDIAN EXPRESS(ProdukOrganisasi.Registrar SEBAGAI Dokumen.Penjualan BarangJasa).Tanggal
KETIKA GoodsOrg.Registrar LINK Dokumen.Penerimaan BarangJasa
LALU EKSPRES(GoodsOrg.Registrar SEBAGAI Dokumen.Penerimaan Jasa Barang).Tanggal
AKHIR SEBAGAI TANGGAL,
ProdukOrg.Kuantitas
DARI
DaftarAkumulasi.ProdukOrganisasi SEBAGAI ProdukOrganisasi

Atau opsi kedua adalah menambahkan informasi tersebut ke detailnya, misalnya, dalam kasus kami, menambahkan tanggal.

BENAR:

MEMILIH
ProdukOrganisasi.Tanggal,
ProdukOrganisasi.Kuantitas
DARI
Daftar Akumulasi Barang Organisasi SEBAGAI Barang Organisasi

Subkueri dalam kondisi bergabung

Untuk pengoptimalan, penggunaan subkueri dalam kondisi gabungan tidak dapat diterima; ini memperlambat kueri secara signifikan. Dianjurkan untuk menggunakan VT dalam kasus seperti itu. Untuk terhubung, Anda hanya perlu menggunakan objek metadata dan VT, setelah sebelumnya mengindeksnya berdasarkan bidang koneksi.

SALAH:

MEMILIH …

KIRI GABUNG (
PILIH DARI DaftarInformasi.Batas
DI MANA …
KELOMPOK BERDASARKAN...
) OLEH …

BENAR:

MEMILIH …
Batasan PUT
DARI Daftar Informasi.Batas
DI MANA …
KELOMPOK BERDASARKAN...
INDEKS OLEH...;

MEMILIH …
DARI Dokumen Penjualan Barang dan Jasa
Batas GABUNG KIRI
OLEH …;

Menggabungkan Catatan dengan Tabel Virtual

Ada situasi ketika, saat menghubungkan tabel virtual ke tabel lain, sistem tidak bekerja secara optimal. Dalam hal ini, untuk mengoptimalkan kinerja kueri, Anda bisa mencoba menempatkan tabel virtual di tabel sementara, jangan lupa mengindeks bidang yang digabungkan dalam kueri tabel sementara. Hal ini disebabkan oleh fakta bahwa VT sering kali terdapat dalam beberapa tabel DBMS fisik, sebagai hasilnya, subquery dikompilasi untuk memilihnya, dan masalahnya serupa dengan poin sebelumnya.

Menggunakan pilihan berdasarkan bidang yang tidak diindeks

Salah satu kesalahan paling umum saat menulis kueri adalah menggunakan kondisi pada bidang yang tidak diindeks, hal ini bertentangan aturan pengoptimalan kueri. DBMS tidak dapat mengeksekusi query secara optimal jika query menyertakan pilihan pada field yang tidak dapat diindeks. Jika Anda mengambil tabel sementara, Anda juga perlu mengindeks bidang koneksi.

Harus ada indeks yang sesuai untuk setiap kondisi. Indeks yang sesuai adalah indeks yang memenuhi persyaratan berikut:

  1. Indeks berisi semua bidang yang tercantum dalam kondisi.
  2. Bidang-bidang ini berada di awal indeks.
  3. Pilihan ini berurutan, yaitu nilai yang tidak terlibat dalam kondisi kueri tidak “terjepit” di antara keduanya.

Jika DBMS tidak memilih indeks yang benar, seluruh tabel akan dipindai - ini akan berdampak sangat negatif pada kinerja dan dapat menyebabkan pemblokiran seluruh kumpulan catatan dalam waktu lama.

Menggunakan logika OR dalam kondisi

Itu saja, artikel ini membahas aspek dasar pengoptimalan kueri yang harus diketahui oleh setiap pakar 1C.

Kursus video gratis yang sangat berguna tentang pengembangan dan pengoptimalan kueri, Saya sangat merekomendasikan untuk pemula dan banyak lagi!

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) AS 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 manakah 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 "Resi barang", sebaliknya "Penjualan barang" "SELECT | SELECT | WHEN Remainings.Registrar LINK Document.Receipt of Goods dan Jasa | LALU ""Kwitansi"" | LAINNYA ""Konsumsi"" | AKHIR SEBAGAI Jenis Pergerakan | DARI | Daftar Akumulasi. Produk yang Tersisa 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 berkisar antara 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.

Desain “IN HIERARCHY” dalam kueri 1C:Enterprise 8.x memungkinkan Anda mendapatkan elemen bawahan dari objek konfigurasi hierarki sesuai dengan pilihan yang diberikan. Hari ini di artikel kita akan melihat contoh penggunaannya, serta tindakan platform di sisi DBMS dan dampaknya terhadap kinerja.

Penggunaan

Mari kita lihat contoh sederhana penggunaan konstruksi "IN HIERARCHY". Saat menjalankan permintaan berikut, elemen bawahan dari direktori hierarki "Produk" akan diperoleh untuk nilai yang diteruskan dari variabel "Tautan".

Teks Kueri = " PILIH | Produk . Tautan,| Barang-barang . Kode vendor |DARI| Direktori . Produk SEBAGAI Produk|DIMANA | Barang-barang . Tautan DALAM HIERARKI(& Tautan)"

Dalam database pengujian, direktori "Produk" memiliki data pengujian berikut:

Tentu saja, gambar tersebut tidak menampilkan semua entri direktori. Tangkapan layar hanya menunjukkan struktur penyimpanan data dalam direktori hierarki. Tabel direktori menyimpan 10 grup tingkat atas, yang masing-masing berisi 5 grup bersarang dengan masing-masing 200 elemen.

Mari kembali ke permintaan pengujian. Mari teruskan tautan ke grup "Grup - 1" ke parameter "&Tautan" (lihat tangkapan layar di atas). Maka hasil querynya akan terlihat seperti ini:

Seperti yang bisa kita lihat, permintaan tersebut mengembalikan tautan ke grup teratas itu sendiri (diteruskan sebagai parameter), serta grup bersarang dengan elemen di dalamnya. Dengan demikian, penggunaan konstruksi “IN HIERARCHY” memungkinkan Anda memperoleh data yang tersubordinasi secara hierarki dengan mudah.

Sintaks bahasa kueri 1C:Enterprise SQL klasik sangat mirip dalam beberapa hal. Namun untuk ekspresi “IN HIERARCHY” tidak ada analoginya dalam bahasa query SQL, misalnya untuk ekspresi bahasa query platform “B” terdapat operator SQL serupa “IN”. Oleh karena itu, karya platform dengan DBMS saat menggunakan operator ini menarik.

Di balik layar

Jadi mari kita mulai. Misalnya, kita akan menggunakan kueri yang ditulis sebelumnya untuk direktori “Produk”. Kami akan menganalisis tindakan platform untuk dua situasi:

  1. Kami akan meneruskan grup tingkat atas “Grup 1” sebagai parameter “&Tautan” (seperti yang kami lakukan sebelumnya).
  2. Dalam parameter kami akan meneruskan tautan ke grup "Grup 1 - 1", yang bersarang di grup tingkat atas "Grup 1".

Sekarang, secara berurutan. Dalam kasus pertama, platform akan melakukan tindakan berikut di server SQL:

1. Pertama, kueri SQL dijalankan untuk mendapatkan tautan ke grup direktori yang diteruskan sebagai parameter dan semua grup bawahan. Hasilnya ditempatkan di tabel sementara "#tt1".

2. Pada tahap kedua, query yang sama dieksekusi dua kali:

Tangkapan layar berisi komentar mendetail tentang teks kueri SQL. Singkatnya, kueri memungkinkan Anda memilih elemen bawahan untuk grup yang direferensikan dalam tabel sementara. Pertanyaannya tetap: "Mengapa query dieksekusi dua kali?" Jawabannya sederhana di sini: pertama, kueri menerima elemen bawahan untuk grup tingkat pertama yang sudah terdapat dalam tabel sementara (lihat poin 1). Kueri kedua kemudian mengambil subelemen untuk subgrup tingkat kedua. Karena tidak ada grup direktori yang ada di tingkat ketiga hierarki, kueri ini tidak lagi dijalankan.

Dalam kasus kami, kueri kedua akan mengembalikan hasil kosong, karena tidak ada elemen bawahan untuk rekaman yang terletak di tingkat hierarki ke-3 (tidak ada grup di sana).

3. Untuk mendapatkan hasil akhir kueri, platform menghasilkan kueri SQL berikut:

Hasil dari permintaan khusus ini dapat diproses lebih lanjut oleh algoritma dalam bahasa bawaan platform. Jadi, entri dalam tabel sementara "#tt1" digunakan untuk mengatur kondisi pengambilan sampel dari tabel referensi "_Reference41".

4. Pada langkah terakhir, platform 1C:Enterprise 8.x menghapus tabel sementara “#tt1”, karena tidak akan digunakan lagi di masa mendatang.

Ini menyelesaikan proses mengeksekusi operator “IN HIERARCHY”. Izinkan saya mengingatkan Anda bahwa urutan tindakan yang dipertimbangkan pada server SQL dilakukan ketika kami meneruskan tautan ke grup tingkat atas "Grup - 1" ke permintaan di sisi platform. Namun bagaimana perilaku platform jika kita meneruskan tautan ke grup tingkat kedua “Grup - 1 - 1” sebagai parameter “&Tautan”? Semuanya akan terjadi dengan cara yang sama, kecuali untuk poin berikut: di atas, pada tahap kedua eksekusi kueri SQL oleh platform, tertulis bahwa kueri untuk mendapatkan elemen bawahan dieksekusi dua kali - dalam hal memperoleh elemen bawahan untuk grup "Grup - 1 - 1" tidak demikian. Permintaan hanya akan dieksekusi satu kali.

Faktanya adalah jumlah permintaan untuk mendapatkan elemen bawahan bergantung pada jumlah grup dalam hierarki. Dengan kata lain, jika tingkat hierarki elemen berisi setidaknya satu grup, maka permintaan dari poin 2.

Dampak Kinerja

Penggunaan operator mana pun yang salah dalam kueri dapat mengakibatkan kinerja sistem menjadi kurang optimal. Operator yang dimaksud “ DALAM HIERARCHI” tidak terkecuali. Ini harus digunakan dengan hati-hati, karena ini sangat memperumit algoritma untuk mengeksekusi query SQL ke database dan dengan demikian meningkatkan beban pada server DBMS.

Izinkan saya memberi Anda contoh kueri suboptimal yang dapat menyebabkan konsekuensi menyedihkan yang disebutkan di atas:

PILIH Produk. Tautan DARI Direktori. Produk SEBAGAI Produk DI MANA (Produk. Tautan DALAM HIERARCHY (& Tautan) ATAU Produk. Tautan DALAM HIERARCHY (& Tautan1) ATAU Produk. Tautan DALAM HIERARCHY (& Tautan2) )

Seperti yang Anda duga, permintaan tersebut akan menghasilkan banyak kueri SQL, yang akan mengakibatkan penurunan kinerja sistem informasi.

Tariklah kesimpulanmu!

Terserah Anda untuk menarik kesimpulan. Izinkan saya mengatakan bahwa operator “IN HIERARCHY” digunakan oleh platform untuk sistem komposisi data ketika kondisi pemilihannya meliputi “IN GROUP”, “IN GROUP FROM THE LIST” dan lain-lain. Saya rasa tidak perlu menjelaskan bahwa dengan manipulasi yang salah, pengguna dapat mengatur pilihan yang sangat rumit dan meningkatkan beban pada server 1C dan DBMS beberapa kali. Mari ubah pengaturan hanya untuk pengguna berpengalaman.

Dan tentu saja, saat menulis mekanisme Anda sendiri, perhatikan operator “IN HIERARCHY”. Sangat nyaman di satu sisi, dan berbahaya di sisi lain.