Buku catatan pemrogram. Menggunakan Direktif yang Diizinkan Membatasi Akses pada Tingkat Rekaman


Bahasa kueri 1C 8 adalah alat yang sangat diperlukan bagi programmer 1C, memungkinkan Anda menulis kode yang lebih ringkas, sederhana, mudah dipahami, dan menggunakan lebih sedikit sumber daya sistem saat bekerja dengan data. Artikel ini membuka serangkaian pelajaran tentang bahasa kueri 1C 8. Pada pelajaran pertama kita akan melihat struktur operator utama bahasa ini - MEMILIH. Dengan menggunakan operator ini, Anda dapat membuat pilihan dari tabel database. Data tabel yang dipilih dapat diurutkan, kondisi ditempatkan di dalamnya, dihubungkan dan digabungkan dengan data dari tabel lain, dikelompokkan berdasarkan berbagai bidang, dan masih banyak lagi.

Bahasa kueri 1C perusahaan 8 - Struktur operator PILIH

Mari kita lihat struktur operator SELECT (bagian opsional dari operator ditunjukkan dalam tanda kurung siku). Bahasa kueri 1C menyediakan berbagai alat untuk membuat sampel data.

PILIH [DIPERBOLEHKAN] [BERBEDA] [PERTAMA A] [Field1] [AS Alias1], [Field2] [AS Alias2], ... [FieldM] [AS AliasB] [PUT TemporaryTableName] [DARI Tabel1 AS AliasTableTable1 [[INNER JOIN ][LEFT JOIN][FULL JOIN] Table2 AS Alias ​​​​Table2 [[INNER JOIN] [LEFT JOIN] [FULL JOIN] TableC AS Alias ​​​​TablesC BY Expression1 [Dan Expression2]...[And ExpressionD]] .. ... OLEH Ekspresi1 [Dan Ekspresi2]...[Dan EkspresiE]] ... [TabelF SEBAGAI TabelF Alias] ... ] [GROUP BY GroupingField1[,] ... [GroupingFieldG]] [WHERE Ekspresi1 [DAN Ekspresi2] ... [DAN EkspresiH]] [UNITE ALL...] [; ...% Bidang Pengelompokan1][,] ... [Bidang Pengelompokanj]]

Kata kunci dan blok untuk bekerja dengan bidang

  • MEMILIH— kata kunci yang menunjukkan awal operator;
  • DIIZINKAN menunjukkan bahwa pilihan harus menyertakan catatan tabel yang memiliki akses baca untuk pengguna tertentu;
  • BERMACAM-MACAM menunjukkan bahwa sampel harus mencakup hanya aliran yang berbeda (di semua bidang). Dengan kata lain, baris duplikat akan dikeluarkan dari sampel;
  • PERTAMA A jika Anda menentukan kata kunci ini, maka hanya A pertama dari baris yang dipilih oleh kueri yang akan disertakan dalam pilihan, di mana A adalah bilangan asli;
  • Blok lapangan— blok ini menunjukkan bidang yang perlu disertakan dalam pilihan. Bidang ini akan menjadi kolom yang dipilih. Di bagian paling atas kasus sederhana bidangnya terlihat seperti ini: Tabel Alias.TableFieldName AS Bidang Alias

    Dengan cara ini kami menunjukkan dari tabel mana kami mengambil bidang ini. Bahasa kueri 1C memungkinkan Anda menentukan alias apa pun, tetapi alias tersebut tidak boleh diulang dalam pernyataan SELECT yang sama. Bidang bisa lebih kompleks, terdiri dari berbagai kombinasi bidang tabel, fungsi bahasa kueri, dan fungsi agregat, namun kami tidak akan membahas kasus tersebut dalam tutorial ini;

Kata kunci dan blok untuk bekerja dengan tabel

  • PUT NamaTabel Sementara- kata kunci TEMPAT dimaksudkan untuk membuat tabel sementara dengan nama tertentu, yang akan disimpan memori akses acak dalam sesi 1C 8 ini hingga berakhir atau hingga tabel sementara dihancurkan. Perlu dicatat bahwa nama tabel sementara dalam satu sesi 1C 8 tidak boleh diulang;
  • Blok tabel dan hubungan— blok menunjukkan semua tabel yang digunakan permintaan ini, serta hubungan di antara mereka. Blok dimulai dengan kata kunci DARI, diikuti dengan nama dan alias tabel pertama. Jika tabel ini terkait dengan tabel lain, maka hubungannya ditunjukkan. Bahasa kueri 1C berisi kumpulan jenis koneksi berikut:
    • GABUNG DALAM— record dari tabel kiri akan dimasukkan dalam pilihan hanya jika kondisi koneksi terpenuhi, record dari tabel kanan akan dimasukkan dalam pilihan hanya jika kondisi koneksi terpenuhi;
    • KONEKSI KIRI— catatan dari tabel kiri akan disertakan dalam pemilihan dalam hal apa pun, catatan dari tabel kanan akan disertakan dalam pemilihan hanya jika kondisi koneksi terpenuhi;
    • KONEKSI LENGKAP— record dari tabel sebelah kiri akan disertakan dalam pilihan terlebih dahulu, kemudian hanya jika kondisi koneksi terpenuhi, record dari tabel kanan akan disertakan dalam pilihan terlebih dahulu, kemudian hanya jika kondisi koneksi bertemu. Dalam hal ini, baris duplikat yang dihasilkan dikeluarkan dari sampel.

    Setelah jenis koneksi, nama dan alias tabel kedua ditunjukkan. Berikutnya adalah kata kunci OLEH, diikuti dengan kondisi komunikasi yang dihubungkan satu sama lain oleh operator logika DAN, ATAU. Setiap ekspresi dalam kondisi harus mengembalikan nilai Boolean (Benar, Salah). Jika tabel pertama terhubung ke beberapa tabel selain tabel kedua, maka jenis koneksi akan ditunjukkan lagi, dan seterusnya. Setiap tabel yang berpartisipasi dalam koneksi, pada gilirannya, dapat dihubungkan ke tabel lain, hal ini ditunjukkan dalam diagram struktur kueri. Jika tabel tidak berhubungan dengan tabel pertama, maka tabel tersebut ditunjukkan tanpa jenis koneksi, maka koneksinya dapat mengikuti, dan seterusnya;

Kata kunci dan blok konversi data

  • Blok grup— blok ini digunakan untuk mengelompokkan baris tabel. Baris digabungkan menjadi satu jika nilai bidang ditentukan setelah kata kunci KELOMPOK OLEH ternyata sama. Dalam hal ini, semua bidang lainnya dijumlahkan, dirata-ratakan, dimaksimalkan, atau diminimalkan menggunakan fungsi agregat. Fungsi agregat digunakan dalam blok bidang. Contoh: Maksimum(TableAlias.TableFieldName) SEBAGAI FieldAlias
  • Blok kondisi- di blok ini setelah kata kunci DI MANA ekspresi kondisional yang dipisahkan oleh operator logika ditunjukkan DAN, ATAU, agar salah satu baris yang dipilih dapat dimasukkan ke dalam sampel, semua kondisi dalam agregat harus memiliki nilai BENAR.
  • GABUNGKAN SEMUANYA— kata kunci ini digunakan untuk menggabungkan kueri (operator MEMILIH). Bahasa kueri 1C memungkinkan Anda menggabungkan beberapa kueri menjadi satu. Agar kueri dapat digabungkan, kueri tersebut harus memiliki kumpulan bidang yang sama;
  • «;» - titik koma digunakan untuk memisahkan pernyataan yang tidak bergantung satu sama lain MEMILIH;
  • INDEKS OLEH— kata kunci digunakan untuk mengindeks bidang yang ditentukan setelahnya;
  • Blok ringkasan— digunakan untuk membuat sampel mirip pohon. Untuk setiap bidang pengelompokan yang ditentukan setelah kata kunci OLEH, baris terpisah akan dibuat dalam pilihan. Di baris ini, menggunakan fungsi agregat, nilai total bidang yang ditentukan setelah kata kunci akan dihitung HASIL.

Apakah Anda ingin terus mempelajari bahasa kueri 1C 8? Kemudian baca artikel selanjutnya.

   

17 aturan untuk menyusun QUERY optimal untuk data database 1C

Untuk menghasilkan dan mengeksekusi kueri ke tabel database di platform 1C, objek bahasa pemrograman khusus digunakan Meminta. Objek ini dibuat dengan memanggil konstruk Permintaan baru. Kueri ini mudah digunakan saat Anda perlu mendapatkan sampel data yang kompleks, mengelompokkan dan mengurutkannya sesuai kebutuhan. Contoh klasik penggunaan kueri adalah untuk mendapatkan ringkasan status register akumulasi pada titik waktu tertentu. Selain itu, mekanisme query memudahkan perolehan informasi dalam periode waktu yang berbeda.

Badan permintaan adalah instruksi yang dengannya permintaan harus dieksekusi. Badan permintaan menjelaskan:

  • tabel infobase digunakan sebagai sumber data kueri;
  • bidang tabel yang perlu diproses dalam query;
  • aturan pengelompokan;
  • hasil penyortiran;
  • dll.

Instruksi dikompilasi dalam bahasa khusus - bahasa kueri dan terdiri dari bagian-bagian terpisah - bagian, kalimat, kata kunci, fungsi, operator aritmatika dan logika, komentar, konstanta, dan parameter.

Bahasa kueri platform 1C sangat mirip dengan sintaks bahasa SQL lainnya, tetapi terdapat perbedaan. Keuntungan utama dari bahasa kueri bawaan adalah: dereferensi bidang, keberadaan tabel virtual, kemudahan penggunaan hasil, bidang yang tidak diketik dalam kueri.

Rekomendasi untuk menulis kueri database dalam bahasa kueri platform 1C:

1) Badan permintaan mungkin berisi data konfigurasi yang telah ditentukan sebelumnya, seperti:

  • nilai enum;
  • data yang telah ditentukan:
  • buku referensi;
  • rencana jenis karakteristik;
  • bagan akun;
  • rencana jenis perhitungan;
  • tautan kosong;
  • nilai titik rute proses bisnis.

Selain itu, teks permintaan dapat berisi nilai enumerasi sistem yang dapat ditetapkan ke bidang tabel database: Tipe Pergerakan Akumulasi, Tipe Rekening, dan Tipe Pergerakan Akuntansi. Dalam kueri, data konfigurasi yang telah ditentukan sebelumnya dan nilai enumerasi sistem diakses menggunakan literal tipe fungsi VALUE. Literal ini memungkinkan Anda meningkatkan keterbacaan kueri dan mengurangi jumlah parameter kueri.

Contoh penggunaan literal ARTI:

  • WHERE Kota = NILAI(Direktori.Kota.Moskow)
  • WHERE Kota = VALUE(Direktori.Kota.EmptyLink)
  • WHEREProductType = VALUE(Enumeration.ProductTypes.Service)
  • WHEREMovementType = VALUE(MovementTypeAccumulation.Masuk)
  • DIMANA RoutePoint = NILAI(BusinessProcess.BusinessProcess1.RoutePoint.Action1

2) Menggunakan instruksi PESANAN OTOMATIS Kueri bisa memakan waktu lama untuk diselesaikan, jadi jika penyortiran tidak diperlukan, lebih baik tidak menggunakannya sama sekali. Dalam kebanyakan kasus, yang terbaik adalah menggunakan penyortiran instruksi SORTIR DENGAN.

Pemesanan otomatis berfungsi berdasarkan prinsip berikut:

  • Jika klausa ORDER BY ditentukan dalam permintaan, maka setiap link ke tabel yang ditemukan dalam klausa ini akan diganti dengan kolom yang digunakan untuk mengurutkan tabel secara default (untuk buku referensi ini adalah kode atau nama, untuk dokumen – the tanggal dokumen). Jika bidang yang akan diurutkan mengacu pada direktori hierarki, maka pengurutan hierarki berdasarkan direktori ini akan diterapkan.
  • Jika kueri tidak memiliki klausa ORDER BY, namun memiliki klausa TOTAL, maka hasil kueri akan diurutkan berdasarkan kolom yang ada dalam klausa TOTAL setelah kunci perangkat lunak kata-kata, dalam urutan yang sama dan, jika total dihitung berdasarkan bidang referensi, maka berdasarkan bidang pengurutan default dari tabel yang memiliki tautan.
  • Jika query tidak memuat klausa ORDER BY dan TOTAL, tetapi terdapat klausa GROUP BY, maka hasil query akan diurutkan berdasarkan field-field yang ada pada klausa tersebut dengan urutan yang sama dan jika pengelompokan dilakukan berdasarkan field referensi. , lalu secara default mengurutkan tabel bidang yang direferensikan.
  • Jika kueri tidak berisi klausa ORDER BY, TOTAL, atau GROUP BY, hasilnya akan diurutkan berdasarkan bidang pengurutan default untuk tabel asal data yang dipilih, sesuai urutan kemunculannya dalam kueri.
  • Jika kueri berisi klausa TOTAL, setiap level total diurutkan secara terpisah.

3) Untuk menghindari pengulangan query ke database saat menampilkan hasil query kepada pengguna (misalnya membuat query atau menampilkan hasil query menggunakan dokumen spreadsheet), ada baiknya menggunakan instruksi Tautan PENDAHULUAN, yang memungkinkan Anda mendapatkan representasi nilai referensi. Contoh:

Dimungkinkan juga untuk menggunakan instruksi PERTUNJUKAN- dirancang untuk mendapatkan representasi string dari nilai tipe arbitrer. Perbedaan antara instruksi-instruksi ini adalah pada kasus pertama, jika instruksi meneruskan sebuah tautan, hasilnya akan berupa string, sedangkan dalam kasus lain, hasilnya akan menjadi nilai parameter yang diteruskan. Dalam kasus kedua, hasil instruksi akan selalu berupa string!

4) Jika permintaan berisi bidang dengan tipe komposit, maka untuk bidang tersebut perlu mengonversi nilai bidang ke tipe tertentu menggunakan instruksi CEPAT, yang memungkinkan Anda menghapus tabel yang tidak perlu dari gabungan kiri dengan bidang tipe data kompleks dan mempercepat eksekusi kueri. Contoh:

Terdapat register penimbunan Sisa Barang yang bidang Registrarnya bertipe komposit. Dalam permintaan, Tanggal dan Nomor Dokumen Penerimaan Barang dipilih, sedangkan ketika mengakses rincian dokumen melalui bidang Registrar, banyak koneksi kiri tabel register akumulasi dengan tabel dokumen registrar tidak terjadi.

Kode 1C v 8.x PILIH
EXPRESS(Sisa Barang. Pencatat SEBAGAI Dokumen. Penerimaan Barang). Nomor SEBAGAI Nomor Resi,
EXPRESS(Sisa Barang. Pendaftar SEBAGAI Dokumen. Penerimaan Barang). Tanggal SEBAGAI Tanggal Penerimaan
DARI
Daftar Akumulasi Sisa Barang SEBAGAI Barang Sisa

Jika suatu tipe cast dianggap tidak layak, maka hasil dari tipe cast tersebut akan menjadi nilainya BATAL.

5) Jangan lupa tentang instruksinya DIIZINKAN, yang berarti kueri hanya akan memilih rekaman yang haknya dimiliki oleh pengguna saat ini. Jika kata ini tidak ditentukan, maka jika permintaan memilih rekaman yang haknya tidak dimiliki pengguna, permintaan akan gagal.

6) Jika kueri menggunakan gabungan, dan beberapa bagian gabungan berisi tabel bersarang (dokumen dengan bagian tabel), dan beberapa tidak, daftar pilihan perlu dilengkapi dengan bidang - tabel bersarang kosong. Ini dilakukan dengan menggunakan kata kunci DAPAT DIKOSONGKAN, setelah itu alias bidang yang akan membentuk tabel bersarang ditunjukkan dalam tanda kurung. Contoh:

Kode 1C v 8.x // Pilih kolom Nomor dan Komposisi
// dari tabel virtual Dokumen.Pengeluaran
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.*

7) Untuk mencegah munculnya garis duplikat di hasil kueri, Anda harus menggunakan instruksi BERMACAM-MACAM, karena lebih visual dan mudah dipahami, serta petunjuknya KELOMPOK OLEH digunakan untuk pengelompokan menggunakan fungsi agregat. Ksati, saat menggunakan fungsi agregat, ada saran KELOMPOK OLEH mungkin tidak ditentukan sama sekali, tetapi semua hasil kueri akan dikelompokkan ke dalam satu baris. Contoh:

Kode 1C v 8.x // Penting untuk mengetahui rekanan yang mana
// barang dikirim untuk periode tersebut.
Pilih Beragam
Dokumen.Faktur.Counterparty

8) Instruksi KELOMPOK OLEH memungkinkan Anda mengakses bidang tingkat atas, tanpa mengelompokkan hasil berdasarkan bidang ini, jika fungsi agregat diterapkan ke bidang tabel bertumpuk. Meskipun bantuan 1C mengatakan bahwa ketika mengelompokkan hasil kueri, fungsi agregat harus ditentukan dalam daftar bidang pilihan, dan selain fungsi agregat dalam daftar bidang pilihan, diperbolehkan untuk menunjukkan hanya bidang tempat pengelompokan dilakukan. . Contoh:

Kode 1C v 8.x PILIH
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)

9) Instruksi TIDAK BOLEH dimaksudkan untuk menggantikan nilai BATAL ke nilai lain, namun jangan lupa bahwa parameter kedua akan diubah ke tipe pertama jika tipe parameter pertama adalah string atau angka.

10) Saat menghubungi meja utama Anda dapat mengakses data di tabel bawahan. Fitur ini disebut bidang dereferensi tabel bawahan.

Contoh (mencari dokumen yang berisi produk tertentu di bagian tabel):

Kelebihan query ini dibandingkan query pada tabel bawahan Receipt.Goods adalah jika terdapat duplikat pada dokumen maka hasil query hanya akan mengembalikan dokumen unik tanpa menggunakan kata kunci DIFFERENT.

11) Varian yang menarik dari operator B adalah memeriksa apakah suatu himpunan terurut termasuk dalam himpunan tersebut (Field1, Field2, ..., FieldN) B (Field1, Field2, ..., FieldN).

Kode 1C v 8.x PILIH
Rekanan. Tautan
DI MANA
(Counterparty.Link, Produk.Link) B
(PILIH Penjualan.Pelanggan, Penjualan.Produk
DARI DaftarAkumulasi.Penjualan SEBAGAI Penjualan)
DARI
Direktori.Rekanan,
Direktori.Produk

12) Gunakan tabel kueri virtual bila memungkinkan. Saat membuat kueri, sistem menyediakan sejumlah tabel virtual sebagai sumber data - ini adalah tabel yang juga merupakan hasil kueri yang dihasilkan sistem pada saat bagian kode terkait dijalankan.

Pengembang dapat secara mandiri memperoleh data yang sama yang diberikan sistem kepadanya sebagai tabel virtual, namun algoritme untuk memperoleh data ini tidak akan dioptimalkan karena:

Semua tabel virtual diparameterisasi, mis. pengembang diberi kesempatan untuk mengatur beberapa parameter yang akan digunakan sistem saat membuat permintaan untuk membuat tabel virtual. Bergantung pada parameter tabel virtual yang ditentukan oleh pengembang, sistem dapat menghasilkan BERMACAM-MACAM kueri untuk mendapatkan tabel virtual yang sama, dan kueri tersebut akan dioptimalkan dalam hal parameter yang diteruskan.

Tidak selalu mungkin bagi pengembang untuk mendapatkan akses ke data yang dapat diakses oleh sistem.

13) Dalam mode operasi client-server, fungsinya SUBSTRING() diimplementasikan menggunakan fungsi SUBSTRING() dari pernyataan SQL terkait yang diteruskan ke server database SQL Server, yang menghitung jenis hasil fungsi SUBSTRING() menggunakan aturan kompleks bergantung pada jenis dan nilai parameternya, sebagai serta tergantung pada konteks penggunaannya. Dalam kebanyakan kasus, aturan ini tidak berpengaruh pada eksekusi kueri, namun ada kalanya panjang baris hasil maksimum yang dihitung oleh SQL Server penting untuk eksekusi kueri. Penting untuk diingat bahwa dalam beberapa konteks saat menggunakan fungsi SUBSTRING(), panjang maksimum hasilnya mungkin sama dengan panjang maksimum string dengan panjang terbatas, yang di SQL Server adalah 4000 karakter. Hal ini dapat menyebabkan kueri mogok secara tidak terduga:

Penyedia Microsoft OLE DB untuk SQL Server: Peringatan: Pemroses kueri tidak dapat menghasilkan rencana kueri dari pengoptimal karena panjang total semua kolom dalam klausa GROUP BY atau ORDER BY melebihi 8000 byte.

HRESULT=80040E14, SQLSTATE=42000, asli=8618

14) Gunakan dengan hati-hati ATAU dalam desain DI MANA, karena penggunaan kondisi OR dapat membuat kueri menjadi lebih berat secara signifikan. Masalahnya bisa diselesaikan dengan desain GABUNGKAN SEMUANYA. Contoh:

Kode 1C v 8.x PILIH

DARI

DI MANA
_Demo Kontraktor.Link =Link1
GABUNGKAN SEMUANYA
MEMILIH
_Kontraktor Demo.Nama Lengkap
DARI
Direktori._Demo Counterparty CARA _Demo Counterparty
DI MANA
_Demo Kontraktor.Link = Link2

15) Kondisi TIDAK DALAM dalam desain DI MANA meningkatkan waktu eksekusi kueri, karena ini adalah sejenis BUKAN (ATAU1 ATAU2...ATAUn), jadi untuk tabel besar coba gunakan KIRI BERGABUNG dengan kondisi IS NULL. Contoh:

Kode 1C v 8.x PILIH
_Demo Kontraktor.Link
DARI
Direktori._Demo Counterparty CARA _Demo Counterparty
Dokumen SAMBUNGAN KIRI._Pesanan Demo Pembeli CARA _Pesanan Demo Pembeli
Software _Demo Counterparty.Link = _Demo Pesanan Pembeli.Counterparty
DI MANA
_Pesanan Demo Pembeli. Pihak lawan adalah NULL

16) Saat menggunakan Tabel sementara Anda perlu mengindeks kondisi dan menggabungkan bidang dalam tabel ini, TETAPI, saat menggunakan indeks, kuerinya bisa lebih lambat. Oleh karena itu, perlu dilakukan analisis setiap query dengan dan tanpa indeks, mengukur kecepatan eksekusi query dan mengambil keputusan akhir.

Jika Anda menempatkan data dalam tabel sementara yang awalnya diindeks oleh beberapa bidang, maka tabel sementara tidak akan lagi memiliki indeks pada bidang tersebut.

17) Jika Anda tidak menggunakan Manajer Meja Sementara, maka tidak perlu menghapus tabel sementara secara eksplisit, tabel tersebut akan dihapus setelah kueri batch selesai, jika tidak, Anda harus menghapus tabel sementara menggunakan salah satu metode berikut: perintah MENGHANCURKAN dalam permintaan, panggil metodenya TemporaryTableManager.Tutup().

Dan selain video dari Evgeny Gilev: Kesalahan umum saat menulis kueri di 1C:

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. DI DALAM 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
PenerimaanT&U.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 CARA Kwitansi dan Spesifikasi Barang
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 (mengelompokan bidang) menurut spesifik fitur umum(bidang yang dikelompokkan). 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 yang mirip 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.
  • "Tambahan" - Opsi tambahan permintaan, seperti kata kunci dari 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 .

20.09.2014

Ada arahan "Diizinkan" dalam bahasa kueri. Ini dirancang untuk memungkinkan platform memfilter catatan yang haknya tidak dimiliki pengguna saat menetapkan batasan pada tingkat catatan database.

Tampaknya lebih baik untuk selalu menggunakan arahan ini dalam kueri. Saya berpendapat bahwa hal ini tidak benar. Saya juga berpendapat bahwa, jika memungkinkan, Anda harus menghindari penggunaannya, inilah alasannya.

Katakanlah kita membuat laporan tentang penyelesaian bersama individu. Pengguna memiliki hak atas satu organisasi, terdapat lebih dari satu organisasi dalam database, dan database mengaktifkan pembatasan tingkat rekaman. Selain itu, dalam database terdapat register “Pemukiman Bersama” dengan dimensi “Organisasi” dan “Individu”. Jika ada permintaan di sistem

"Memilih

Organisasi,

Individu

dan itu akan dieksekusi atas nama pengguna dengan izin untuk satu organisasi, maka permintaan tidak akan dieksekusi jika ada catatan organisasi lain dalam register ini. Kesalahan akan terjadi, dan deskripsi kesalahannya adalah “Pengguna tidak memiliki hak yang memadai untuk menyelesaikan permintaan!” dan ini benar, platform ini tidak menipu, karena tidak memiliki hak atas catatan organisasi lain dalam daftar ini.

Apa yang harus dilakukan dalam kasus ini, gunakan arahan “Diizinkan”? Menurut saya itu tidak sepadan. Anda hanya perlu mengatur pilihan berdasarkan organisasi dan pengguna akan dapat membuat laporan. Kueri laporan dengan komposisi data akan terlihat seperti ini

"Memilih

Organisasi,

Individu

(Memilih

Organisasi

Individu)

Dari Daftar Akumulasi Pemukiman bersama

(Di mana

Organisasi

Individu)

Jika pengguna menjalankan kueri pada tabel tanpa pilihan, laporan tidak akan dibuat, dan pengguna tidak akan mengenali data untuk organisasi lain, tetapi jika dia memilih untuk organisasinya, maka akan dihasilkan dengan data yang benar.

Anda dapat bertanya lagi - “Mengapa Anda tidak menggunakan direktif Allowed?” ini akan langsung menentukan pilihan dan akan melindungi pengguna dari pesan yang tidak diperlukan!

Jawaban atas pertanyaan ini adalah bagaimana dalam hal ini pengguna mengetahui bahwa semua data yang diperlukan disertakan dalam laporan. Katakanlah sebelumnya pengguna ini bekerja dengan hak penuh dan membuat kesalahan dan memilih individu dari organisasi lain dalam dokumen. Mungkin juga ada situasi ketika data diunduh - dan divisi dari organisasi lain dicatat dalam dokumen organisasi (ZUP juga memberlakukan batasan pada pemiliknya). Dalam hal ini, arahan "Diizinkan" akan memotong data terlarang tanpa pesan apa pun kepada pengguna, dan dia tidak akan mengetahui bahwa tidak semua yang harus disertakan dalam laporan.

Oleh karena itu, Anda tidak boleh sembarangan menyertakan arahan ini dalam permintaan konfigurasi standar, mengingat ini adalah kesalahan. Sangat tidak disarankan untuk melakukan hal ini dalam permintaan pelaporan yang diatur. Anda juga tidak boleh melakukan hal ini dalam laporan dan dokumen lain yang memerlukan keakuratan informasi.

Tetapi bagaimana Anda bisa menghindari kesalahan program “crash” jika Anda tidak memiliki cukup hak?

Ya, sederhana sekali, Anda perlu menggunakan perintah “Coba”, berikut contohnya:

Percobaan

Permintaan.Jalankan();

Pengecualian

Laporan(ErrorDescription());

Percobaan Akhir;

Dalam laporan dari menggunakan ACS Kode program untuk melaksanakan laporan harus ditulis secara manual, juga melalui upaya.

Akibatnya, pengguna tidak akan menerima data yang salah dan akan menerima pesan kesalahan yang wajar.

Anda dapat membiasakan diri dengan nuansa pengaturan RLS di divisi terpisah di artikel kami.

Objek konfigurasi “peran” memberikan serangkaian hak atas operasi (tindakan) pada objek konfigurasi.

Peran "Hak Penuh".

Ini hanyalah sebuah peran (tidak ditentukan sebelumnya) di mana semua jenis hak atas semua objek konfigurasi diperiksa.

Yang membedakan dengan peran lainnya adalah adanya hak “Administrasi”.

Jika setidaknya satu pengguna dibuat, sistem mulai memeriksa keberadaan hak "Administrasi" - setidaknya satu pengguna harus memilikinya.

Pembatasan akses tingkat rekor

Keamanan Tingkat Baris (RLS) – pembatasan tingkat rekor.

Mekanisme pembatasan akses data memungkinkan Anda mengelola hak akses tidak hanya pada level objek metadata, tetapi juga pada level objek database. Objek berikut dapat digunakan untuk membatasi akses ke data:

  • peran,
  • parameter sesi,
  • pilihan fungsional,
  • modul bersama yang memiliki hak istimewa,
  • kata kunci DIPERBOLEHKAN dalam bahasa kueri.

Mekanisme ini dirancang untuk membatasi akses ke catatan tabel objek metadata berdasarkan kondisi sewenang-wenang yang dikenakan pada nilai bidang baris tabel tersebut. Misalnya, untuk melihat catatan hanya untuk rekanan “Anda”, organisasi, dll.

Implementasi teknis pembatasan akses di 1C

1C menghasilkan permintaan ke DBMS. Cluster server menambahkan bagian WHERE ke permintaan, yang berisi teks kondisi untuk membatasi akses melalui RLS, kemudian permintaan ini dikirim ke DBMS, data yang diekstraksi dikembalikan ke klien 1C.


Mekanisme ini akan berfungsi untuk setiap permintaan dari klien:

  • dalam laporan,
  • dalam daftar dinamis dan dalam bentuk daftar reguler
  • dalam kueri khusus.

Penerapan mekanisme seperti itu sangat mempengaruhi kinerja.

Cara untuk melewati batasan akses.

Dalam operasi besar yang membutuhkan banyak sumber daya (misalnya, memproses pengeposan ulang dokumen), sebagian kode dapat dipindahkan ke modul yang memiliki hak istimewa.

A) Modul istimewa adalah modul umum dengan tanda “Istimewa” di propertinya.

Keunikannya adalah kode di dalamnya dieksekusi tanpa kontrol hak akses apa pun, termasuk RLS.


B) Juga istimewa modenya dapat diaktifkan untuk modul objek dokumen. Ini dilakukan di properti dokumen, tandai

  • Perlakuan istimewa saat melakukan
  • Mode istimewa saat membatalkan transaksi


B) Metode SetelMode Istimewa()

Perintah sistem memungkinkan Anda menjadikan bagian kode modul apa pun sebagai hak istimewa.

Dari baris kode berikutnya, mode eksekusi istimewa akan beroperasi.

Ini akan beroperasi hingga baris untuk menonaktifkan mode ini atau hingga akhir prosedur/fungsi

(BENAR);

// kode apa pun di sini akan dieksekusi tanpa kontrol hak dan RLS

Setel Mode Istimewa(Berbohong ); // atau akhir prosedur/fungsi

Berapa kali mode istimewa diaktifkan harus sesuai dengan berapa kali mode tersebut dinonaktifkan. Namun, jika dalam suatu prosedur atau fungsi mode istimewa diaktifkan (sekali atau lebih), tetapi tidak dimatikan, maka sistem akan mati secara otomatis sebanyak ada pengaktifan yang tidak lengkap pada prosedur atau fungsi yang ditinggalkan.

Jika dalam suatu prosedur atau fungsi memanggil suatu metode Setel Mode Istimewa(Salah) melakukan lebih dari sekadar pemanggilan metode Setel Mode Istimewa(True ), maka pengecualian akan dilempar

Fungsi Mode Istimewa() mengembalikan True jika mode istimewa masih diaktifkan, dan False jika dinonaktifkan sepenuhnya. Ini tidak menganalisis jumlah pengaturan mode istimewa dalam fungsi tertentu.

Semua prosedur dan fungsi yang dipanggil juga akan dijalankan dalam mode istimewa.


Dimungkinkan juga untuk memulai sesi istimewa. Ini adalah sesi di mana mode istimewa ditetapkan sejak awal sistem. Apalagi selama pengoperasian metode tersebut Mode Istimewa() akan selalu mengembalikan True, dan kemampuan untuk menonaktifkan mode istimewa tidak didukung. Hanya pengguna yang memiliki hak administratif (hak Administratif) yang dapat memulai sesi istimewa. Anda dapat memulai sesi menggunakan kunci garis komando meluncurkan aplikasi klien UsePrivilegedMode atau parameter string koneksi dengan basis informasi prmod.


Pertanyaan yang tentu saja muncul: Mengapa harus menetapkan pembatasan akses jika hal tersebut dapat dengan mudah dilewati?

Mode aman.

Ya, Anda dapat menulis pemrosesan eksternal dengan mode eksekusi istimewa dan membongkar/merusak data. Untuk mencegah hal ini, sistem memiliki metode konteks global

Setel Mode Aman().

Mode aman, antara lain, mengabaikan mode istimewa.

Ini harus diinstal sebelum memanggil prosesor eksternal secara terprogram atau mengekspor prosedur dan fungsi dari modulnya.

Saat melakukan operasi terlarang, pengecualian diberikan saat runtime.

Selain itu, pada tingkat pengaturan peran, Anda dapat menonaktifkan kemampuan pengguna untuk meluncurkan laporan dan pemrosesan eksternal secara interaktif.

Menyiapkan pembatasan akses

RLS hanya dapat dikonfigurasi untuk hak:

  • baca (pilih)
  • menambahkan (memasukkan)
  • perubahan (perbarui)
  • menghapus

Untuk operasi baca dan penghapusan, suatu objek yang berada dalam database harus mematuhi batasan akses data.

Untuk operasi penambahan Pembatasan akses data harus sesuai dengan objek yang direncanakan untuk ditulis ke database.

Untuk operasi perubahan pembatasan akses data harus sesuai dengan objek baik sebelum perubahan (agar objek terbaca) maupun setelah perubahan (agar objek ditulis).

Untuk semua hak lainnya tidak ada pilihan seperti itu.

Mari kita tambahkan batasan baru untuk hak “baca” pada direktori “Nomenklatur”. Daftar bidang yang dapat Anda konfigurasikan batasan tambahannya akan terbuka.

Artinya, jika Anda mencoba mengakses kolom yang dicentang, pembatasan akan terpicu, namun jika Anda mencoba mengakses kolom yang tidak dicentang, pembatasan tidak akan berfungsi.

Jika Anda memilih bendera " Bidang lainnya", pembatasan akan dikonfigurasi untuk semua bidang tabel, kecuali bidang yang pembatasannya ditetapkan secara eksplisit.


*Fitur: untuk hak menambah, mengubah, menghapus:

  • Pembatasan ini hanya dapat dikonfigurasi untuk semua bidang.
  • Hanya ada satu batasan.

Untuk hak “Baca”, Anda dapat mengonfigurasi beberapa kondisi; kondisi tersebut akan digabungkan dengan operator logika “DAN”.

Tidak semua bidang objek data batasan utama dapat digunakan dalam pembatasan tipe objek database berikut:

  • dalam register akumulasi, pembatasan akses hanya dapat memuat pengukuran objek utama pembatasan;
  • dalam register akuntansi, pembatasan hanya dapat menggunakan pengukuran neraca dari objek utama pembatasan

Jika, dalam kondisi akses data yang terbatas daftar yang bisa dinegosiasikan akumulasi, pengukuran yang tidak termasuk dalam total digunakan, kemudian ketika mengakses tabel putaran virtual, total yang disimpan tidak digunakan dan query dijalankan seluruhnya sesuai dengan tabel pergerakan.

Mekanisme untuk memberlakukan pembatasan akses.

Setiap operasi pada data yang disimpan dalam database di 1C:Enterprise pada akhirnya mengarah ke panggilan ke database dengan beberapa permintaan untuk membaca atau mengubah data. Dalam proses mengeksekusi kueri ke database, mekanisme internal 1C:Enterprise memberlakukan pembatasan akses. Di mana:

  • Daftar hak dihasilkan(baca, tambah, ubah, hapus), daftar tabel database, dan daftar bidang yang digunakan oleh kueri ini.
  • Dari semua peran pengguna saat ini pembatasan akses dipilih ke data untuk semua hak, tabel, dan bidang yang terlibat dalam permintaan. Selain itu, jika suatu peran tidak mengandung batasan akses ke data tabel atau bidang, ini berarti bahwa nilai bidang yang diperlukan dari catatan mana pun tersedia di tabel ini. Dengan kata lain, tidak adanya pembatasan akses data berarti adanya pembatasan DI MANA Kebenarannya.
  • Mengambil nilai saat ini dari semua parameter sesi dan opsi fungsional berpartisipasi dalam pembatasan yang dipilih.

Untuk mendapatkan nilai parameter sesi atau pilihan fungsional Pengguna saat ini tidak diharuskan memiliki izin untuk mengambil nilai ini. Namun, jika nilai beberapa parameter sesi belum ditetapkan, kesalahan akan terjadi dan kueri database tidak akan dijalankan.

Batasan yang berasal dari satu peran digabungkan menggunakan operasi AND.

Batasan yang berasal dari peran berbeda digabungkan menggunakan operasi OR.

Kondisi yang dibangun ditambahkan ke kueri SQL yang digunakan 1C:Enterprise untuk mengakses DBMS. Saat mengakses data dari kondisi pembatasan akses, pemeriksaan hak tidak dilakukan (baik untuk objek metadata maupun objek database). Selain itu, mekanisme penambahan ketentuan bergantung pada metode pengoperasian pembatasan “semua” atau “diizinkan” yang dipilih.


*Fitur: Jika pengguna memiliki akses ke beberapa peran dengan pembatasan yang dikonfigurasi pada tingkat rekaman untuk satu objek, maka dalam hal ini ketentuan pembatasan ditambahkan menggunakan operasi logika “ATAU”. Dengan kata lain, kekuasaan pengguna bersifat kumulatif.

Hal ini mengarah pada kesimpulan berikut: jangan biarkan kondisi untuk membatasi akses ke satu objek dengan peran berbeda berpotongan, karena dalam hal ini teks permintaan akan sangat rumit dan ini akan mempengaruhi kinerja.

Metode "Semuanya".

Saat menerapkan pembatasan menggunakan metode "semua", kondisi dan bidang ditambahkan ke kueri SQL sehingga 1C:Enterprise dapat memperoleh informasi tentang apakah data yang dilarang untuk pengguna tertentu digunakan selama eksekusi kueri database atau tidak. Jika data terlarang digunakan, permintaan akan terhenti karena pelanggaran akses.

Pemberlakuan pembatasan akses menggunakan metode “semua” disajikan secara skematis pada gambar:


Metode “Diizinkan”.

Saat menerapkan pembatasan menggunakan metode "diizinkan", ketentuan ditambahkan ke kueri SQL sehingga catatan yang dilarang untuk pengguna saat ini tidak memengaruhi hasil kueri. Dengan kata lain, ketika pembatasan diberlakukan dalam mode "diizinkan", catatan yang dilarang untuk pengguna tertentu dianggap hilang dan tidak mempengaruhi hasil operasi, yang secara skematis disajikan pada gambar:


Pembatasan akses data diberlakukan pada objek database pada saat 1C:Enterprise mengakses database.

Dalam versi klien-server 1C:Enterprise, pembatasan diterapkan pada server 1C:Enterprise.

Namun, opsi ini (DIPERBOLEHKAN) tidak akan berfungsi jika dalam kueri kita merujuk ke tabel yang batasan aksesnya tidak dikonfigurasi, tetapi berisi referensi ke baris tabel dengan batasan yang dikonfigurasi. Dalam hal ini, hasil kueri akan menampilkan “<Объект не найден>......" alih-alih nilai bidang referensi.


Jika Anda mengembangkan laporan atau pemrosesan menggunakan kueri konfigurasi standar atau kustom, selalu centang tanda "Diizinkan". agar laporan dapat berfungsi di bawah pengguna mana pun dengan serangkaian hak apa pun.

Dalam kasus pembacaan objek data dari database, tidak mungkin untuk menyetel tanda “Diizinkan”. Oleh karena itu perlu konfigurasikan pilihan untuk membaca objek, dengan mempertimbangkan kemungkinan pembatasan hak akses untuk pengguna. Tidak ada cara untuk hanya memperoleh data yang diizinkan dalam teknologi objek.

Penting bahwa jika kueri tidak menentukan kata kunci ALLOWED, maka semua pilihan yang ditentukan dalam kueri tersebut tidak boleh bertentangan dengan pembatasan baca apa pun pada objek database yang digunakan dalam kueri. Selain itu, jika kueri menggunakan tabel virtual, maka pilihan terkait harus diterapkan ke tabel virtual itu sendiri.

Latihan 1. Pembuat kueri dalam pengaturan RLS.

Mari kita buat teks bagian “WHERE” dalam kueri ke direktori. Anda dapat menggunakan pembuat kueri.
Perancangnya memiliki penampilan yang dipreteli.


Tab “Tabel”.

Tabel utama akan menjadi tabel objek yang batasannya sedang dikonfigurasi.

Anda juga dapat memilih tabel lain dan mengatur berbagai koneksi di antara tabel tersebut di tab “Relasi”.

Tab "Kondisi"

Di sini Anda dapat mengonfigurasi kondisi pembatasan akses sebenarnya

Mari tambahkan ketentuan ke atribut "Harga" pada direktori nomenklatur untuk hak "membaca" ke semua bidang tabel.

“Nomenklatur DI MANA Nomenklatur.Harga > 500”

Mari kita lihat cara kerja aturan sederhana ini. Tabel direktori berisi elemen-elemen berikut:


Setelah mengatur pembatasan akses, tabel hanya akan menampilkan elemen yang memenuhi ketentuan:


Grup juga menghilang. Mari kita ubah teks pembatasannya

“Nomenklatur WHERE Nomenklatur.Harga > 500

ATAU Nomenklatur. Ini adalah Grup"

Nah, sekarang itulah yang Anda butuhkan.


Jika Anda menghapus tampilan bidang "kode" dalam pengaturan daftar, semua elemen direktori akan ditampilkan, mis. pembatasan itu tidak berhasil. Jika Anda mengatur kolom “Kode” untuk ditampilkan, pembatasan akan berfungsi.


Dalam hal ini, meskipun elemen direktori terlihat di bidang daftar, formulirnya tidak dapat dibuka karena pembatasan atribut telah dikonfigurasi. Hal yang sama terjadi dalam permintaan sewenang-wenang: ketika Anda mencoba untuk mendapatkan properti "dibatasi", akan terjadi kesalahan akses.


Jika Anda mencoba mendapatkan kredensial "terbatas" secara terprogram, kesalahan akses juga akan terjadi.


Selain itu, tidak mungkin mengakses bidang apa pun dari suatu objek melalui tautan, karena ketika menerima tautan, sistem membaca seluruh objek, dan jika berisi detail yang "dibatasi", objek tersebut tidak akan dibaca.

Oleh karena itu, ketika bekerja secara terprogram dengan objek database, Anda perlu mengingat kemungkinan pembatasan pada tingkat rekaman dan mendapatkan semua data objek yang diperlukan berdasarkan permintaan dan kemudian menempatkannya dalam struktur atau mengeksekusi sebagian kode dalam modul yang memiliki hak istimewa.

Setelah mengatur pembatasan akses, tampilan baris dalam daftar hak berubah - menjadi abu-abu dan sebuah ikon muncul.

Pembatasan saat mengatur akses (RLS).

  • Tidak ada bagian Ringkasan;
  • Tabel register virtual tidak dapat diakses;
  • Anda tidak dapat menggunakan parameter secara eksplisit;
  • Dapat digunakan dalam kueri bersarang any>/span> alat bahasa kueri kecuali:
    • operator DALAM HIERARKI;
    • proposal HASIL;
    • hasil kueri bersarang tidak boleh mengandung bagian tabel>/span>;
    • tabel virtual, khususnya Saldo dan Perputaran

Latihan 2. Tata nama dengan harga saat ini.

Buat pembatasan akses jika Anda perlu menampilkan item dengan harga saat ini lebih besar dari nilai tertentu, misalnya 100.

Larutan:

Kami menambahkan aturan pembatasan akses baru untuk direktori “Nomenklatur” dengan hak “baca”.
Pilih “bidang lain”.
Di konstruktor kami menambahkan kueri bersarang. Di dalamnya, pilih tabel register informasi “Harga barang”.
Tidak ada tab "pesanan" - ini adalah fitur perancang kueri untuk membuat permintaan pembatasan akses.
Pada tab “Advanced”, atur “first 999999999”, tab “order” akan muncul.
Kami mengatur pengurutan berdasarkan bidang "Periode" dalam urutan menurun.
Kemudian kita mengatur koneksi antara tabel utama dan subquery dengan referensi.


Akses Templat Pembatasan.

Latihan 3. Pembatasan “pihak lawan” berdasarkan nilai dalam suatu konstanta.

Mari kita atur pembatasan akses untuk direktori Counterparty berdasarkan nilai yang disimpan di Constant.

Selain itu, Anda perlu mengatur batasan untuk semua objek yang menggunakan direktori “Counterparty” secara detail.

Larutan

Untuk direktori “Counterparty”, kami akan menetapkan batasan untuk hak “baca” dengan menambahkan kueri bersarang ke konstanta di bagian “Kondisi”. Jangan lupa Ini Grup.

Kami melihat ada masalah, direktori Counterparty difilter dengan benar, dan semua dokumen dengan atribut “Counterparty” ditampilkan, beberapa dengan tautan “rusak” di atribut “Counterparty”.

Sekarang Anda perlu mengonfigurasi pembatasan akses untuk semua objek yang menggunakan tautan ke “Akun”. Mari kita temukan mereka menggunakan layanan "mencari tautan ke suatu objek".

Mari salin dan ubah sedikit teks kondisi RLS dari direktori “Counterparty”. Ini harus dilakukan sebanyak ada benda yang ditemukan.

Atau gunakan pola pembatasan akses untuk menghindari masalah duplikasi kode.

Templat pembatasan akses dikonfigurasikan pada tingkat peran dan dapat digunakan untuk objek apa pun dalam peran yang diedit.

Anda dapat menambahkan teks pembatasan akses apa pun ke templat. Templat dipanggil menggunakan simbol “#”. Misalnya, #TemplateCounterparty.

Melalui # dalam 1C, instruksi ditulis ke praprosesor. Dalam konteks menjalankan pengaturan pembatasan akses, platform mengganti teks panggilan templat dengan teks templat.

Mari tambahkan teks setelah kata WHERE ke template “Contractor Template”, kecuali teks tentang EtoGroup.

Parameter dalam templat pembatasan akses.

Mari kita lanjutkan menyelesaikan masalah 2.

Masalahnya sekarang tabel utama di direktori itu disebut "counterparty", di dokumen "Receipt invoice". Bidang yang diperiksa di direktori disebut "tautan", dalam dokumen disebut "Counterparty".

Mari kita ubah nama tabel utama di teks template menjadi “#CurrentTable”

"#CurrentTable" adalah parameter yang telah ditentukan sebelumnya.

Dan melalui titik kami menunjukkan nomor parameter input - “.#Parameter(1)

“#Parameter” juga merupakan nilai yang telah ditentukan sebelumnya. Dapat berisi sejumlah parameter masukan yang berubah-ubah. Mereka dialamatkan berdasarkan nomor seri.

Dalam teks pembatasan akses untuk direktori, kami menunjukkan hal berikut:

Untuk dokumennya sebagai berikut:

“Penjualan Barang DI MANA #TemplateCounterparty (“Counterparty”)”

Saat memanggil templat pembatasan akses, parameter harus diteruskan hanya sebagai String, yaitu dalam tanda kutip.

Tabel utama - Nomenklatur

Teks templatnya adalah:

#CurrentTable DIMANA #CurrentTable.#Parameter(1) = #Parameter(2)

Teks templat berisi bagian teks dalam bahasa pembatasan akses data dan mungkin berisi parameter yang disorot menggunakan simbol “#”.

Simbol "#" dapat diikuti oleh:

  • Salah satu kata kuncinya:
    • Parameter yang diikuti dengan nomor parameter dalam template dalam tanda kurung;
    • CurrentTable – menunjukkan penyisipan ke dalam teks nama lengkap tabel yang batasannya sedang dibuat;
    • Nama Tabel Saat Ini– menunjukkan penyisipan ke dalam teks nama lengkap tabel (sebagai nilai string, dalam tanda kutip) di mana instruksi diterapkan, dalam versi bahasa bawaan saat ini;
    • NamaSaat IniAksesKanan– berisi nama hak yang pembatasannya saat ini dijalankan: BACA, TAMBAH, MASUKKAN, UBAH, UPDATE, HAPUS;
  • nama parameter templat – berarti penyisipan batasan parameter templat yang sesuai ke dalam teks;
  • simbol “#” – menunjukkan penyisipan satu karakter “#” ke dalam teks.

Ekspresi pembatasan akses mungkin berisi:

  • Templat pembatasan akses, yang ditentukan dalam format #TemplateName("Nilai parameter template 1", "Nilai parameter template 2",...). Setiap parameter template diapit tanda kutip ganda. Jika Anda perlu menentukan karakter tanda kutip ganda di teks parameter, Anda harus menggunakan dua tanda kutip ganda.
  • Fungsi StrContains(WhereWeLook, WhatWeLook). Fungsi ini dirancang untuk mencari kemunculan string WhatWeLook di string WhereWeLook. Mengembalikan True jika kemunculannya ditemukan dan False jika sebaliknya.
  • Operator + untuk penggabungan string.

Untuk mempermudah mengedit teks templat, pada tab Templat pembatasan di formulir peran, klik tombol Atur teks templat. Pada dialog yang terbuka, masukkan teks template dan klik OK.

Mereka tidak dapat diinstal menggunakan SetParameter() atau sesuatu yang serupa.

Parameter dalam hal ini adalah:

  • Opsi Sesi
  • Opsi fungsional

Pembacaan parameter sesi dalam permintaan pembatasan akses terjadi dalam mode istimewa, yaitu, tanpa mengontrol hak untuk mengoperasikannya.

Latihan 4. Akses ke rekanan “Anda”.

Penting untuk mengonfigurasi pembatasan akses pengguna saat ini ke rekanan “mereka”.

Ada direktori “Pengguna”, direktori “Counterparty”, dokumen dengan detail “Counterparty”.

Pengguna saat ini harus melihat data hanya untuk rekanan yang telah menjalin koneksi dengannya.

Komunikasi juga perlu dikonfigurasi.

Opsi yang memungkinkan:

Membangun hubungan antara pengguna dan rekanan

  • Detailnya ada di direktori rekanan
  • Daftar informasi

Solusi yang mungkin untuk masalah ini:

  • Menyimpan pengguna dalam sebuah konstanta adalah pilihan yang buruk; konstanta tersebut tersedia untuk semua pengguna.
  • Menyimpan array tetap dari rekanan pengguna saat ini dalam parameter sesi tidaklah baik pilihan yang bagus, mungkin ada banyak rekanan
  • Menyimpan parameter sesi pengguna saat ini, lalu meminta daftar rekanan "nya" adalah opsi yang dapat diterima.
  • Pilihan lain.

Larutan.

Mari buat parameter sesi baru "Pengguna Saat Ini" dan isi di modul sesi.

Mari buat daftar informasi “Kepatuhan manajer dan kontraktor”

Mari buat peran baru dan di dalamnya ada pembatasan akses baru untuk dokumen "Faktur".

Dalam teks permintaan, kami akan menghubungkan tabel utama dengan informasi register untuk Akun = Akun dan Manajer = &Pengguna Saat Ini. Jenis koneksi Internal.

Jika memungkinkan, lebih baik menghindari kueri bersarang dalam teks pembatasan akses, karena akan dieksekusi setiap kali data dibaca dari objek ini dari database.

Memeriksa - pembatasan berfungsi

*Fitur: Jika Anda mengubah daftar rekanan pengguna di register, pembatasan akses akan segera berlaku tanpa memulai ulang sesi pengguna.

Latihan 5. Tanggal larangan perubahan.

Penting untuk menerapkan pembatasan pengeditan data sebelum tanggal yang ditetapkan untuk melarang perubahan.
Anda perlu membatasinya untuk pengguna.

Mari kita buat daftar informasi “Tanggal Larangan Perubahan” dengan dimensi Pengguna, sumber daya Tanggal Larangan.

Mari kita bangun logika solusinya dengan cara ini:

  • jika pengguna tidak ditentukan, maka larangan tersebut berlaku untuk semua pengguna
  • apabila terdapat pembatasan bagi seluruh pengguna dan pembatasan bagi pengguna tertentu, maka pembatasan tersebut berlaku bagi pengguna tertentu, dan bagi pengguna lain menurut asas umum.

Jelasnya, batasan seperti itu dapat dikonfigurasi untuk objek database yang memiliki posisi tertentu pada sumbu waktu. Itu bisa saja

  • Dokumentasi
  • Register informasi berkala

Mari buat peran baru “Pembatasan Berdasarkan Tanggal Larangan Perubahan”.

Di dalamnya, untuk dokumen “Faktur” untuk “perubahan” yang tepat kami akan menambahkan pembatasan akses baru.

Kami menentukan pengaturan untuk semua bidang.

Teks pembatasannya adalah:

Faktur Penerimaan DARI Dokumen. Faktur Penerimaan SEBAGAI Faktur Penerimaan

Ubah Tanggal Larangan.Tanggal Larangan SEBAGAI Tanggal Larangan
DARI

GABUNG DALAM (PILIH
MAX (Ubah Tanggal Terlarang.Pengguna) SEBAGAI Pengguna
DARI
Daftar Informasi Tanggal Larangan Perubahan SEBAGAI Tanggal Larangan Perubahan
DI MANA
(Ubah Tanggal Terlarang.User = &CurrentUser
ATAU Tanggal Dilarang Perubahan.User = VALUE(Directory.users.EmptyLink))) AS VZ_User
MENURUT Tanggal Larangan Perubahan.User = VZ_User.User) SEBAGAI NestedQuery
Faktur Penerimaan Perangkat Lunak.Tanggal > Kueri Bersarang.Tanggal Larangan

Mari kita periksa apakah pembatasannya berhasil.

Menggunakan Instruksi Praprosesor

#Jika Kondisi1 #Lalu

Permintaan fragmen 1

#ElseIf Kondisi2 #Lalu

Permintaan fragmen 2

#Jika tidak

Permintaan fragmen 3

#Berakhir jika

Dalam kondisi, Anda dapat menggunakan operasi logis (dan, atau, tidak, dll.) dan akses ke parameter sesi.

Pendekatan dalam konteks membangun pembatasan akses ini nyaman karena, bergantung pada kondisi, teks permintaan yang lebih pendek akan dikompilasi. Kueri yang lebih sederhana memuat lebih sedikit sistem.

Kelemahannya adalah konstruktor kueri tidak akan bekerja dengan teks seperti itu.

*Kekhasan :

Berbeda dengan instruksi ke praprosesor bahasa bawaan dalam teks pembatasan akses, sebelum operator Kemudian Anda perlu memasukkan hash - #Lalu

Latihan 6. Ganti “Gunakan RLS”

Mari kita lengkapi sistem pembatasan kita dengan tombol yang mengaktifkan/menonaktifkan penggunaan pembatasan pada tingkat rekor.

Untuk melakukan ini, kami akan menambahkan Konstanta dan parameter sesi bernama “UseRLS”.

Mari kita tulis di Modul Sesi untuk mengatur nilai parameter sesi dari nilai konstanta.

Mari tambahkan kode berikut ke semua teks pembatasan akses:

“#Jika &GunakanRLS #Kemudian….. #EndIf”

Kami memeriksa - semuanya berfungsi.

Namun, kini setelah tanda “gunakan radar” diaktifkan, perubahan tersebut tidak akan langsung berlaku. Mengapa?

Karena parameter sesi disetel saat sesi dimulai.

Dimungkinkan untuk mengatur nilai parameter sesi agar disetel ulang ketika nilai konstanta baru ditulis, tetapi ini hanya akan berfungsi untuk sesi pengguna saat ini. Pengguna lain harus diminta untuk me-restart sistem.


Akhir dari bagian pertama.

Pilihan Editor
Otot-otot telapak kaki, lapisan kedua (tampak bawah). Fleksor digitorum brevis dibedah Otot-otot telapak kaki, lapisan kedua (tampak bawah). Urat daging...

Belakangan ini, penyakit liver menjadi hal yang lumrah. Penyakit-penyakit ini menyebabkan rasa sakit, masalah kesehatan yang serius dan...

Catatan kuliah | Ringkasan kuliah | Tes interaktif | Download abstrak » Organisasi struktural otot rangka » Molekuler...

09 Jul 2014 Pada tubuh manusia, sendi lututlah yang memiliki ukuran paling besar. Struktur sendi lutut sangat kompleks dan...
Nama hormonnya adalah somatropin. Hanya pada masa remaja dan masa kanak-kanak barulah bermanfaat untuk pertumbuhan. Hormon ini sangat penting bagi manusia. Selama...
Saat ini, penyakit pada sistem hepatobilier menjadi temuan diagnostik yang semakin umum bagi dokter dari berbagai...
Peternakan lebah merupakan industri penting tidak hanya dalam perekonomian nasional. Turunan dari sarangnya banyak digunakan dalam pengobatan. Bersama dengan madu, lilin,...
Antidepresan sering diresepkan untuk VSD untuk mengurangi manifestasinya yang tidak menyenangkan, terutama suasana hati depresi,...
Ada anggapan bahwa perban dapat melindungi lutut Anda dari cedera. Hal ini tidak sepenuhnya benar. Dalam praktiknya, perban di lutut memperbaiki...