Membuat dan mengerjakan permintaan (untuk pemula). Membuat dan mengerjakan permintaan (untuk pemula) 1s 8.3 jika dalam permintaan

Pemrograman 1C terdiri dari lebih dari sekedar menulis program. 1C adalah kumpulan tindakan dan data pengguna yang digunakannya.

Data disimpan dalam database. Kueri 1C adalah cara untuk mengambil data dari database untuk menampilkannya kepada pengguna dalam bentuk atau untuk memprosesnya.

Bagian mendasar dari laporan ini adalah permintaan 1C. Dalam hal laporan, ACS adalah bagian terbesar dari laporan tersebut.

Duduk. Mengambil napas. Tenang. Sekarang saya akan memberi tahu Anda beritanya.

Untuk memprogram dalam 1C, mengetahui bahasa pemrograman 1C saja tidak cukup. Anda juga perlu mengetahui bahasa kueri 1C.

Bahasa kueri 1C adalah bahasa yang benar-benar terpisah yang memungkinkan kita menentukan data apa yang perlu kita peroleh dari database.

Dia juga bilingual - yaitu, Anda bisa menulis dalam bahasa Rusia atau Inggris. Ini sangat mirip dengan bahasa query SQL dan mereka yang mengetahuinya dapat bersantai.

Bagaimana Permintaan 1C digunakan

Saat pengguna meluncurkan 1C dalam mode Perusahaan, tidak ada satu gram data pun di klien yang sedang berjalan. Oleh karena itu, ketika Anda perlu membuka direktori, 1C meminta data dari database, yaitu membuat permintaan 1C.

Kueri 1C adalah:

  • Kueri otomatis 1C
    Dihasilkan secara otomatis oleh sistem. Anda telah membuat formulir daftar dokumen. Menambahkan kolom. Artinya saat Anda membuka formulir ini dalam mode Perusahaan, akan ada kueri dan data untuk kolom ini akan diminta.
  • Kueri semi-otomatis 1C
    Ada banyak metode (fungsi) dalam bahasa 1C, ketika diakses, query dibuat ke database. Misalnya.GetObject()
  • Kueri manual 1C (ditulis oleh programmer khusus sebagai kueri)
    Anda dapat menulis sendiri permintaan 1C dalam kode dan menjalankannya.

Membuat dan menjalankan kueri 1C

Permintaan 1C adalah teks permintaan sebenarnya dalam bahasa permintaan 1C.
Teks dapat ditulis dengan pena. Artinya, ambil dan tulis (jika Anda tahu bahasa ini).

Karena 1C mempromosikan konsep pemrograman visual, di mana banyak atau hampir semuanya dapat dilakukan tanpa menulis kode dengan tangan, terdapat objek Konstruktor Kueri khusus yang memungkinkan Anda menggambar teks kueri tanpa mengetahui bahasa kueri. Namun, keajaiban tidak terjadi - untuk ini Anda perlu tahu cara bekerja dengan konstruktor.

Setelah teks permintaan 1C siap, teks tersebut harus dieksekusi. Untuk tujuan ini ada objek dalam kode 1C Permintaan(). Berikut ini contohnya:

Permintaan = Permintaan Baru();
Kueri.Teks = "PILIH
| Nomenklatur. Tautan
|DARI
| Direktori.Nomenklatur SEBAGAI Tata Nama
|DIMANA
| Tata Nama.Layanan";
Pilih = Kueri.Jalankan().Pilih();

Laporan(Pilihan.Tautan);
Siklus Akhir;

Seperti yang Anda lihat di contoh, setelah menjalankan permintaan 1C, hasilnya datang kepada kami dan kami harus memprosesnya. Hasilnya adalah satu atau beberapa baris tabel (dalam bentuk khusus).

Hasilnya dapat diunggah ke tabel biasa:
Ambil = Query.Run().Unload(); //Hasil – tabel nilai

Atau cukup telusuri baris demi baris.
Pilih = Kueri.Jalankan().Pilih();
Sementara Select.Next() Loop
//Lakukan sesuatu dengan hasil query
Siklus Akhir;

Bekerja dengan permintaan 1C

Prinsip dasar kueri 1C

Prinsip dasar membangun permintaan 1C –
PILIH Daftar Bidang DARI Judul Tabel DIMANA Kondisi

Contoh pembuatan permintaan 1C seperti itu:

MEMILIH
//daftar bidang yang akan dipilih
Tautan,
Nama,
Kode
DARI
//nama tabel tempat kita memilih data
//daftar tabel adalah daftar objek di jendela konfigurator
Direktori.Nomenklatur
DI MANA
//menunjukkan pilihan
Tipe Produk = &Layanan //pemilihan berdasarkan nilai eksternal
Atau Layanan // Atribut "Layanan" bertipe Boolean, dipilih berdasarkan nilai Benar
SORTIR DENGAN
//Penyortiran
Nama

Daftar tabel 1C

Anda dapat melihat nama tabel di jendela konfigurator. Anda hanya perlu menulis “Direktori” dan bukan “Direktori”, misalnya “Direktori.Nomenklatur” atau “Dokumen.Penjualan Barang dan Jasa” atau “Daftar Akumulasi.Penjualan”.

Ada tabel tambahan (virtual) untuk register yang memungkinkan Anda mendapatkan nomor akhir.

Information Register.RegisterName.Last Slice(&Date) – permintaan 1C dari register informasi, jika berkala, untuk tanggal tertentu

Daftar Akumulasi.Nama Daftar.Saldo(&Tanggal) – permintaan 1C dari daftar saldo untuk tanggal tertentu

Daftar Akumulasi.Nama Daftar.Perputaran (&Tanggal Mulai, &Tanggal Akhir) – permintaan 1C dari daftar perputaran untuk periode dari tanggal mulai hingga tanggal akhir.

Prinsip tambahan

Saat kami meminta daftar beberapa data, prinsip dasarnya berfungsi. Tapi kita juga bisa meminta nomor dan permintaan itu bisa menghitungnya untuk kita (tambahkan, misalnya).

MEMILIH
//Quantity(FieldName) – menghitung kuantitas
//Field AS OtherName – mengganti nama field
Kuantitas (Link) SEBAGAI Kuantitas Dokumen yang Diposting
DARI

DI MANA
Diadakan

Permintaan 1C ini akan mengembalikan jumlah total dokumen kepada kami. Namun, setiap dokumen memiliki bidang Organisasi. Katakanlah kita ingin menghitung jumlah dokumen untuk setiap organisasi menggunakan kueri 1C.

MEMILIH
//hanya bidang dokumen
Organisasi,
//hitung jumlahnya
Kuantitas(Tautan) SEBAGAI KuantitasBerdasarkan Organisasi
DARI
Dokumen Penjualan Barang dan Jasa
DI MANA
Diadakan
KELOMPOK OLEH

Organisasi

Permintaan 1C ini akan mengembalikan kepada kami jumlah dokumen untuk setiap organisasi (juga disebut “menurut organisasi”).

Mari kita hitung tambahan jumlah dokumen-dokumen ini menggunakan permintaan 1C:

MEMILIH
//hanya bidang dokumen
Organisasi,
//hitung jumlahnya

//hitung jumlahnya

DARI
Dokumen Penjualan Barang dan Jasa
DI MANA
Diadakan
KELOMPOK OLEH
//harus digunakan jika daftar bidang memiliki fungsi count() dan satu atau lebih bidang secara bersamaan - maka Anda perlu mengelompokkan berdasarkan bidang ini
Organisasi

Permintaan 1C ini juga akan mengembalikan sejumlah dokumen kepada kami.

MEMILIH
//hanya bidang dokumen
Organisasi,
//hitung jumlahnya
Kuantitas(Tautan) SEBAGAI KuantitasMenurut Organisasi,
//hitung jumlahnya
Jumlah(Jumlah Dokumen) SEBAGAI Jumlah
DARI
Dokumen Penjualan Barang dan Jasa
DI MANA
Diadakan
KELOMPOK OLEH
//harus digunakan jika daftar bidang memiliki fungsi count() dan satu atau lebih bidang secara bersamaan - maka Anda perlu mengelompokkan berdasarkan bidang ini
Organisasi
HASIL PO Umum

Bahasa kueri 1C sangat luas dan kompleks, dan kami tidak akan mempertimbangkan semua kemampuannya dalam satu pelajaran - baca pelajaran kami berikutnya.

Secara singkat tentang fitur tambahan bahasa kueri 1C:

  • Menggabungkan data dari beberapa tabel
  • Kueri Bersarang
  • Permintaan batch
  • Membuat tabel virtual Anda sendiri
  • Kueri dari tabel nilai
  • Menggunakan fungsi bawaan untuk mendapatkan dan memanipulasi nilai.

Pembuat Kueri 1C

Agar tidak menulis teks permintaan dengan tangan, ada perancang permintaan 1C. Cukup klik kanan di mana saja dalam modul dan pilih 1C Query Designer.

Pilih tabel yang diinginkan di sebelah kiri dalam perancang kueri 1C dan seret ke kanan.

Pilih bidang yang diperlukan dari tabel di perancang kueri 1C dan seret ke kanan. Jika Anda tidak hanya ingin memilih suatu bidang, tetapi juga menerapkan semacam fungsi penjumlahan padanya, setelah menyeret, klik bidang tersebut dua kali dengan mouse. Pada tab Pengelompokan, Anda kemudian perlu memilih (menyeret) bidang yang diperlukan untuk pengelompokan.

Pada tab Kondisi di perancang kueri 1C, Anda dapat memilih pilihan yang diperlukan dengan cara yang sama (dengan menyeret bidang yang akan Anda gunakan untuk membuat pilihan). Pastikan untuk memilih kondisi yang benar.

Pada tab Pesanan, penyortiran ditunjukkan. Pada tab Hasil – menyimpulkan hasilnya.

Dengan menggunakan perancang kueri 1C, Anda dapat mempelajari kueri apa pun yang ada. Untuk melakukan ini, klik kanan pada teks permintaan yang ada dan pilih juga perancang kueri 1C - dan permintaan akan dibuka di perancang kueri 1C.

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. Dalam kasus yang paling 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 dalam RAM pada sesi 1C 8 tertentu hingga berakhir atau hingga tabel sementara dimusnahkan. Perlu dicatat bahwa nama tabel sementara dalam satu sesi 1C 8 tidak boleh diulang;
  • Blok tabel dan hubungan— blok menunjukkan semua tabel yang digunakan dalam kueri ini, serta hubungan di antara tabel tersebut. 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 berikutnya.

Meminta . Teks = "MEMILIH | Unit Penyimpanan.Tautan |DARI | Directory.usStorageUnits BAGAIMANA menggunakanStorageUnits // Contoh 1: perbandingan dengan nilai boolean kosong: |DIMANA | StorageUnits.AllowSelectionFromReserveZone = Salah // Contoh 2. tetapi jika Boolean ini didefinisikan, sebaiknya seperti ini: // kondisi untuk Boolean negatif: |DIMANA | BUKAN Unit Penyimpanan Izinkan Pemilihan Dari Zona Cadangan // Contoh 3. pemilihan berdasarkan kondisi field kosong yang bertipe “direktori dengan tipe tertentu” |DIMANA | StorageUnits.ActiveSelectionArea = VALUE(Directory.usSelectionArea.EmptyRef) // Contoh 3a. pemilihan berdasarkan kondisi kolom kosong yang bertipe “dokumen tipe tertentu” |DIMANA | OurInformationRegister.Document = VALUE(Document.OurDocument.EmptyLink) // Contoh 3b. pemilihan berdasarkan kondisi kolom kosong yang bertipe “dokumen dengan tipe berbeda” ( bidang komposit) |DIMANA | (OurInformationRegister.Document = VALUE(Document.OurDocument1.EmptyLink) | OR OurInformationRegister.Document = VALUE(Document.OurDocument2.EmptyLink) | OR... (dll. - kami secara berurutan membuat daftar kondisi untuk semua kemungkinan jenis bidang gabungan ini) ) // Contoh 4. atau sebaliknya, jika Anda perlu memilih nilai yang diisi dari tipe "string", maka kondisinya akan membantu: |DIMANA | Nama Unit Penyimpanan > """" // Contoh 5. jika Anda perlu memilih dokumen dengan tipe tertentu, dengan tipe data komposit, misalnya, dalam register "RunningTasks", sumber daya "Tugas" memiliki tipe komposit, di antara nilainya adalah dokumen "Seleksi" dimungkinkan |DIMANA | EXPRESS(Daftar InformasiExecutedTasks.Tugas SEBAGAI Dokumen.Seleksi) LINK Dokumen.Seleksi // Contoh 5a. Contoh serupa lainnya ketika Anda perlu memilih dokumen dari jenis tertentu | PILIHAN | KAPAN EKSPRESIKAN (ag Korespondensi Dokumen. DokumenBU SEBAGAI Dokumen. Penerimaan Barang dan Jasa) LINK Dokumen Penerimaan Barang dan Jasa | LALU ""Penerimaan Barang dan Jasa"" | KAPAN MENGUNGKAPKAN (ag Korespondensi Dokumen. DokumenBU SEBAGAI Dokumen. Penjualan Barang dan Jasa) LINK Dokumen Penjualan Barang dan Jasa | LALU ""Penjualan Barang dan Jasa"" | LAINNYA """" | AKHIR SEBAGAI Tampilan Dokumen // Contoh 6. pemilihan berdasarkan kondisi nilai yang tidak ditentukan: |DIMANA | SavedSettings.User = TIDAK DITENTUKAN // Contoh 7. pemilihan berdasarkan jenis pergerakan "Masuk" dari register akumulasi, "Beban" - serupa): |DIMANA | RegProductsInRetail.MovementType = VALUE(MovementTypeAccumulation.Masuk) // Contoh 8. Cara menunjukkan dalam permintaan bahwa permintaan tidak perlu dijalankan (misalnya, Anda perlu secara terprogram, bergantung pada beberapa kondisi, mengembalikan hasil permintaan kosong - Request.Text = StrReplace(Request.Text, "WHERE Doc.Link = &DocumentLink" , "DIMANA KEBOHONGAN");). Untuk melakukan ini, cukup tambahkan kondisi “Where is False”. Omong-omong, berapa pun volume data yang diminta dalam sampel, permintaan seperti itu akan langsung dieksekusi. |DIMANA KEBOHONGANNYA // Contoh 9. Memeriksa apakah hasil query berisi data: Jika tidakMeminta.Menjalankan().Kosong() Kemudian // Contoh 10. pemilihan berdasarkan tanggal kosong: |DIMANA | tbStrings.CancellationDate = DATETIME(1, 1, 1)

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 | WHEN Sales.Registrar LINK Document.Expense | THEN EXPRESS(Sales.Registrar AS Document.Expense) | ELSE SELECT | KETIKA Sales.Registrar LINK Document.Implementation | KEMUDIAN EXPRESS(Penjualan.Registrar SEBAGAI Dokumen.Implementasi) | AKHIR | ... | AKHIR SEBAGAI Nomor | DARI | DaftarAkumulasi.Pembelian SEBAGAI Pembelian";

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

Contoh penggunaan:

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

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

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

Contoh penggunaan:

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

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

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

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

Contoh penggunaan:

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

Dibangun dalam bahasa kueri 1C

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

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

Contoh penggunaan:

Request.Text = //jika tipe nilai pencatat adalah dokumen Resi, //maka query akan mengembalikan "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 | PEMULIHAN PESANAN OTOMATIS";

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 | ProductsInWarehouses.Nomenclature SEBAGAI Nomenklatur, | ProductsInWarehouses.Warehouse, | SUM(GoodsInWarehouses.InStock) SEBAGAI INSTOCK |FROM | RegisterAccumulations.ProductsInWarehouses SEBAGAI ProductsInWarehouses | |GROUP BY | ProductsInWarehouses.Nomenclature, | ProductsIn Warehouses.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 |Place DataTz |FROM | Daftar Akumulasi.CompensationRP.Remains AS CompensationRPOstat ki |WHERE |CompensationRP ATAUTersisa.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 Pihak Lawan.

Pada artikel ini kita akan membahas topik tabel bersarang dalam bahasa query 1C.

Anda bisa menggunakan tabel sumber kueri bertumpuk di bidang pilihan kueri. Misalnya, dokumen “Penyediaan layanan” memiliki bagian tabel Layanan, sehingga bagian tabel ini juga dapat ditampilkan di bidang pilihan. Sekarang Anda akan melihat bagaimana hal ini dapat diterapkan.

Dalam database pelatihan saya, saya akan meluncurkan konsol kueri, membuka perancang kueri dan memilih tabel “Penyediaan Layanan”.

Mari kita perluas tabel ini

Dan di dalamnya kita melihat bagian tabel “Layanan”.

Mari kita pilih seluruh bagian tabel ini.

Seperti yang Anda lihat, seluruh bagian tabel layanan telah sepenuhnya masuk ke dalam bidang.

Harap dicatat bahwa bagian tabel, pada kenyataannya, hadir sebagai bidang terpisah yang disebut "Layanan" dan jenisnya adalah "Hasil Permintaan". Mari pelajari cara menggunakan tabel bersarang dalam kueri.

Mari tinggalkan tiga bidang tabel bersarang dan tambahkan beberapa bidang dari header dokumen.

Mari klik OK di desainer dan lihat seperti apa permintaan kita nantinya.

Seperti yang Anda lihat, dalam permintaan ada titik setelah bidang "Layanan", dan bidang yang dipilih dicantumkan dalam tanda kurung setelahnya.

Ayo penuhi permintaannya.

Pada gambar kita melihat bahwa semua bidang yang dipilih di bagian tabel dokumen dicantumkan dipisahkan dengan koma di bidang “Layanan”. Tidak semua konsol kueri memiliki tampilan seperti gambar di atas; terkadang hanya tertulis “ “.

Hal menarik lainnya: dalam tabel bersarang Anda dapat memberi tanda bintang sebagai ganti bidang, maka semua bidang bagian tabel akan muncul. Ini tidak dapat dilakukan di konstruktor, hanya secara manual di permintaan. Permintaan tersebut akan berbentuk sebagai berikut:

Mari kita lihat bagaimana permintaan tersebut akan dieksekusi.

Satu-satunya hal adalah tanda bintang ini tidak akan disimpan jika kita membuka konstruktor kueri.

Kita telah mempelajari cara membuat query dengan tabel bersarang di konsol, sekarang kita akan mempelajari cara menggunakan tabel bersarang dalam pilihan

Pada kenyataannya, tidak sulit untuk mengakses tabel bersarang saat memproses kueri. Anda cukup mengakses pilihan berdasarkan nama tabel Anda, dan mendapatkan variabel dengan tipe “Hasil Kueri”. Lalu Anda proses seperti hasil permintaan biasa: kalau mau ambil sampelnya, kalau mau unggah.

Di bawah ini adalah contoh kecil kode yang berfungsi dengan tabel bersarang:


&Di server
Prosedur IsiOnServer()
Permintaan = Permintaan Baru;
Meminta. Teks = "MEMILIH
| Penjualan Produk Tautan,
| Penjualan Produk.Produk.(
| Produk,
| Kuantitas
|DARI
| Dokumen Menjual Produk CARA Menjual Produk"
;
Ambil = Kueri. Berlari(). Memilih();
Selamat tinggal seleksi. Berikutnya() Lingkaran
TopLine of the Tree = Penjualan Produk. DapatkanItem();
Baris Baru = Pohon Baris Atas. Menambahkan();
Garis baru. Tautan = Seleksi. Tautan;
TabelProduk = Pilihan. Barang-barang;
Produk Seleksi = Produk Tabel. Memilih();
Sementara Pemilihan Produk. Berikutnya() Lingkaran
TreeChildRow = Baris Baru. DapatkanItem();
Baris Produk = Baris Pohon Anak. Menambahkan();
String Produk. Tautan = Pilihan Produk. Produk;
String Produk. Kuantitas = Item Sampel. Kuantitas ;
Siklus Akhir;
Siklus Akhir;
Akhir Prosedur

Izinkan saya menjelaskan kode di atas.

Pertama-tama, kita mendapatkan pilihan linier, dan kita melewati pilihan ini dalam satu lingkaran, di mana kita membuat baris teratas pohon nilai (ada di formulir), dan menulis tautan ke dokumen kita di dalamnya.

Dan hal yang paling menarik, Anda bahkan dapat melihatnya sendiri nanti di debugger, kita beralih ke bidang pilihan Produk, dan untuk kenyamanan, tulis bidang ini ke dalam variabel terpisah di TableProducts. Variabel ini bertipe “Hasil Kueri”. Dan Anda dapat dengan mudah mendapatkan contoh hasil ini. Itulah yang kami lakukan. Tetap melewati pilihan ini menggunakan fungsi berikutnya dan loop while.

Dan di dalam loop ini kita akan mengacu pada bidang pilihan sebagai bidang tabel bersarang, dan menuliskannya ke baris anak pohon dari formulir.

Ini adalah hasil yang akan dikembalikan oleh kode ini

Masih ada pertanyaan?

Anda akan menjawabnya sendiri ketika Anda mempelajari kursus saya “Pertanyaan dalam 1C untuk Pemula”. Dimana masalah ini dan banyak masalah lainnya dibahas secara lebih rinci. Semua informasi diberikan dalam bentuk yang sederhana dan mudah diakses serta dapat dipahami bahkan oleh mereka yang tidak terlalu paham dengan pemrograman di 1C.

Kode promo untuk diskon 20%: jamW0rl9Nnx

Dukung proyek saya dengan menyumbang berapa pun jumlahnya

Bergabunglah dengan grup saya.