Cara keluar dari 1s. Interupsi loop. menggabungkan kondisi. Tombol "Panas": bekerja dengan daftar dan pohon

Perhatian! Di akhir artikel terdapat link ke video tutorial.
Jika Anda belum pernah menemukan pemrograman sebelumnya, kebutuhan untuk menggunakan siklus dalam program 1C mungkin tidak sepenuhnya jelas. Pada artikel ini, saya akan berbicara tentang pernyataan loop, serta tujuan utamanya.

Namun pertama-tama, untuk lebih jelasnya, berikut beberapa penjelasan tentang ungkapan-ungkapan yang digunakan dalam artikel tersebut:
Pengulangan adalah pengulangan.
Tanda kurung operator merupakan kata-kata khusus yang selalu ditulis berpasangan, yaitu pernyataan pembuka dan pernyataan penutup. Misalnya: Fungsi - EndFunction, If - EndIf, For - EndCycle, dll.
Badan lingkaran- kode program yang terletak di dalam tanda kurung operator siklus.
Siklus adalah konstruksi yang mengulangi eksekusi garis-garis yang terletak pada badan perulangan, banyaknya pengulangan tergantung pada hasil kondisi di awal perulangan.

Jika operator ini tidak ada, maka kode di dalam loop harus ditulis sebanyak yang kita perlukan untuk diulang. Bayangkan jika ada 100 baris dalam sebuah dokumen dan Anda perlu mengurutkannya dan, katakanlah, mengubah nilainya, dan jika pada saat yang sama jumlahnya berubah secara berkala, mis. mereka ditambahkan dan dihapus. Itu tidak mudah.
Perulangan memungkinkan Anda menyederhanakan tugas mengeksekusi baris kode berulang.
Dalam program 1C 8.1, ada tiga konstruksi loop:
"For.. To.. Loop" - mengulangi jumlah loop dari nilai awal penghitung ke nilai akhir yang ditentukan, menambahkan 1 ke variabel penghitung pada setiap iterasi. Digunakan ketika jumlah iterasi diketahui.

Siklus 1C Untuk

Untuk Penghitung = 1 Kali 3 Loop // Badan Loop Loop Akhir;

Siklus 1C Sampai jumpa

"While... Loop" - dijalankan saat nilai yang dihitung adalah True. Ini dapat digunakan ketika variabel untuk menghitung ekspresi diubah di badan perulangan, atau jika koleksi diulangi dan memiliki metode terkait yang mengembalikan boolean, yang dipanggil di awal perulangan.

While Selection.Next() Loop //Badan Loop EndCycle;

Siklus 1C Untuk masing-masing

"Untuk Setiap...Dari...Loop" menelusuri koleksi dari elemen pertama hingga terakhir. Menulis ke variabel (dalam contoh: CurrentElement ) nilai elemen.

Untuk Setiap Elemen Saat Ini Dari ArrayElements Loop // Loop Body End Loop;

Siklus terbalik 1C

Ada juga loop terbalik yang dapat digunakan untuk melintasi koleksi dalam urutan terbalik yaitu. dari bawah ke atas (dari ujung). Metode ini mungkin diperlukan jika Anda perlu menghapus elemen koleksi

Jumlah Item = Array Item.Quantity(); Untuk ReverseIndex = 1 Berdasarkan Jumlah Item Loop CurrentItem = Array Item[Jumlah Item - ReverseIndex]; Siklus Akhir;

Lanjutkan dan batalkan operator tercakup dalam video, tautan di bawah.

Algoritme dari banyak program sering kali melibatkan pengulangan siklus dari tindakan tertentu. 1C dalam hal ini tidak terkecuali. Siklus dalam 1C memungkinkan Anda untuk:

  • Ulangi elemen direktori;
  • Isi area tata letak;
  • Melakukan tindakan tertentu dengan pilihan dokumen;
  • Dan masih banyak lagi lainnya.

Jenis lingkaran

Dalam 1C, merupakan kebiasaan untuk membedakan tiga jenis siklus tergantung pada kumpulan kata yang termasuk dalam konstruksi:

  1. Untuk setiap "Variabel" dari "Kumpulan Nilai";
  2. Untuk "Variabel" = "Mulai. nilai "Menurut" Kon. Arti";
  3. Sedangkan "Ekspresi".

Mari kita pertimbangkan lebih detail.

Untuk masing-masing

Crawler ini cocok untuk kumpulan nilai (pemilihan dokumen atau item referensi, stok). Eksekusi akan berlanjut hingga elemen terakhir dari koleksi telah dilalui. Baris tersebut harus berisi:

  • Variabel yang menentukan elemen koleksi saat ini;
  • Mendefinisikan kumpulan nilai.

Kesalahan paling umum dalam kasus ini ditunjukkan pada Gambar 1

Paling sering, ini terjadi ketika seorang programmer tidak sepenuhnya memahami perbedaan antara suatu objek (dokumen, direktori) dan kumpulan (pilihan) nilai yang diperoleh menggunakan operator Select().

Untuk oleh

Dalam hal ini, parameter yang diteruskan ke string adalah:

  1. Nama variabelnya adalah iterator;
  2. Nilai awal variabel;
  3. Nilai akhir variabel.

Blok pernyataan yang termasuk dalam badan perulangan akan diulang hingga variabel sama atau melebihi nilai akhir untuk pertama kalinya. Dalam hal ini, iterator akan bertambah 1 setiap langkahnya, dan nilainya dibandingkan sebelum langkah berikutnya dilakukan.

Konstruksi ini sangat sering digunakan saat melewati bagian tabel.

Saat menggunakan crawler ini, penting untuk membedakan antara jumlah baris di bagian tabel dan indeks dari satu baris yang diambil. Dalam kasus pertama, nilai awal akan sama dengan 1, nilai akhir dapat diperoleh dengan menggunakan operator Quantity(). Indeks dimulai dari 0 dan berakhir pada Hitungan()-1. Jika tidak, Anda bisa mendapatkan kesalahan (Gbr.2).

Selamat tinggal

Hanya ada satu parameter di sini - ekspresi logis, yang diperiksa kebenarannya sebelum setiap langkah perulangan berikutnya. Segera setelah ekspresi boolean gagal, handler akan menyelesaikan traversal.

Sangat penting untuk dipahami bahwa dalam beberapa kasus ekspresi yang diuji mungkin selalu Benar, sehingga traversal akan dilakukan berkali-kali, sehingga sistem terhenti.

Dalam kasus seperti itu, perlu untuk mendaftarkan salah satu dari dua opsi untuk menghentikan eksekusi di dalam badan perulangan.

Kadang-kadang situasi mungkin muncul ketika kebenaran dari ekspresi yang dicentang tidak akan pernah datang. Hal ini dapat menyebabkan pencarian kesalahan dalam kode tidak berguna dan membuang-buang waktu.

Interupsi eksekusi dengan menekan kombinasi tombol

Jika Anda menulis prosedur UserInterrupt Handling() di badan loop, maka kapan saja selama eksekusi, dengan menekan kombinasi tombol Ctrl + PauseBreak, Anda dapat menghentikan pekerjaannya. Dalam hal ini, sebuah baris akan ditampilkan di jendela pesan (Gbr. 3).

Untuk menghindari konsekuensi yang tidak menyenangkan dari aktivitas mereka, sangat berguna bagi pemrogram untuk membiasakan diri mendaftarkan prosedur ini di badan pemrosesan.

Interupsi bersyarat

Seringkali, algoritma program melibatkan penghentian pemrosesan siklik jika kondisi tertentu terpenuhi. Anda dapat meletakkan prosedur ini di badan perulangan menggunakan pernyataan Break.

Ditulis dengan benar ke dalam kode program, pernyataan ini disorot dengan warna merah.

Melompati beberapa operasi loop

Seringkali dalam satu perulangan perlu untuk memeriksa pemenuhan suatu kondisi dan, jika kondisi ini tidak terpenuhi, lewati pengendali utama. Struktur tersebut dapat diimplementasikan dengan dua cara:

  • Pada metode pertama, kita menetapkan kondisi dan di dalam If Then End Jika kita menulis kode yang dapat dieksekusi, jika kondisi tidak terpenuhi, kode tidak akan dieksekusi sebagaimana mestinya. Kerugian yang jelas dari pendekatan ini adalah bahwa pendekatan ini cukup rumit dan dalam kasus sejumlah besar kondisi, mudah untuk membuat kesalahan di mana satu "Jika" dimulai dan di mana yang lain berakhir;
  • Jauh lebih tepat untuk menggunakan konstruksi yang, alih-alih menyatakan suatu kondisi, diambil negasinya (daripada sama, diambil tidak sama, dll.) dan lokasi operator Lanjutkan di dalam konstruksi;

Pernyataan "Lanjutkan" di badan kode disorot dengan warna merah dan memindahkan eksekusi loop ke awal.

Keterangan:

Operator siklus For ditujukan untuk pengulangan siklik dari operator yang terletak di dalam konstruksi Cycle - EndCycle.

Sebelum perulangan dimulai, nilai Ekspresi 1 ditetapkan ke variabel VariableName . Nilai VariableName secara otomatis bertambah pada setiap iterasi perulangan. Nilai kenaikan counter setiap kali loop dijalankan adalah 1.

Perulangan dijalankan selama nilai variabel VariableName kurang dari atau sama dengan nilai Ekspresi 2 . Kondisi eksekusi loop selalu diperiksa di awal, sebelum loop dieksekusi.

Sintaksis:

Pilihan:

Nama_Variabel Pengenal suatu variabel (penghitung perulangan) yang nilainya secara otomatis bertambah 1 setiap kali perulangan diulang. Yang disebut penghitung siklus.Ekspresi 1 Ekspresi numerik yang menentukan nilai awal yang ditetapkan ke penghitung loop pada iterasi pertama loop.Oleh Tautan sintaksis untuk parameter Ekspresi 2.Ekspresi 2 Nilai maksimum dari penghitung loop. Ketika variabel VariableName menjadi lebih besar dari Ekspresi 2, eksekusi pernyataan perulangan For berhenti.Loop Pernyataan yang mengikuti kata kunci Loop dijalankan selama nilai variabel VariableName kurang dari atau sama dengan nilai Ekspresi 2.

Siklus Untuk Semua Orang

Keterangan:

Pernyataan For every loop adalah untuk mengulang kumpulan nilai. Setiap iterasi dari loop mengembalikan elemen baru dari koleksi. Penelusuran berlanjut hingga semua elemen koleksi telah diiterasi.

Sintaksis:

Pilihan:

Variable_name_1 Variabel yang diberi nilai elemen koleksi berikutnya setiap kali perulangan diulang.Dari tautan Sintaks untuk parameter nama_variabel_2.variabel_nama_2 Variabel atau ekspresi yang mewakili koleksi. Elemen koleksi ini akan ditetapkan ke parameter nama_variabel_1.Loop Pernyataan yang mengikuti kata kunci Loop dieksekusi untuk setiap elemen koleksi.// Pernyataan Pernyataan yang akan dieksekusi, atau rangkaian pernyataan tersebut.Abort Memungkinkan Anda membatalkan loop kapan saja. Setelah eksekusi pernyataan ini, kontrol ditransfer ke pernyataan setelah kata kunci End of Loop.Lanjutkan Segera mentransfer kendali ke awal perulangan, tempat kondisi eksekusi perulangan dievaluasi dan diperiksa. Pernyataan yang mengikutinya di badan perulangan tidak dieksekusi pada iterasi traversal ini.EndLoop Kata kunci yang mengakhiri struktur pernyataan loop.

Siklus Sampai jumpa

Keterangan:

Pernyataan perulangan while ditujukan untuk pengulangan siklik pernyataan-pernyataan yang ada di dalam struktur Lingkaran - Lingkaran Akhir. Perulangan dijalankan saat ekspresi logisnya BENAR. Kondisi eksekusi loop selalu diperiksa terlebih dahulu, sebelum loop dieksekusi.

Sintaksis:

Pilihan:

ekspresi boolean ekspresi Boolean.Loop Pernyataan yang mengikuti kata kunci Loop dieksekusi selama hasil dari ekspresi logikanya adalah BENAR. // Pernyataan Pernyataan yang akan dieksekusi, atau rangkaian pernyataan tersebut.Abort Memungkinkan Anda membatalkan loop kapan saja. Setelah eksekusi pernyataan ini, kontrol ditransfer ke pernyataan setelah kata kunci End of Loop.Lanjutkan Segera mentransfer kendali ke awal perulangan, tempat kondisi eksekusi perulangan dievaluasi dan diperiksa. Pernyataan yang mengikutinya di badan perulangan tidak dieksekusi pada iterasi traversal ini.EndLoop Kata kunci yang mengakhiri struktur pernyataan loop.
12 Desember 2014 pukul 13:13

Siklus mana yang lebih cepat? Pengujian 1C

  • Kinerja tinggi,
  • pemrograman tidak normal,
  • Pemrograman

Saya telah memprogram 1C selama beberapa tahun, dan kemudian muncul pemikiran - “Mengapa tidak mengikuti kursus pelatihan, tiba-tiba ada kesenjangan pengetahuan yang bahkan tidak saya duga sebelumnya”? Tidak lama setelah diucapkan, dilakukan. Saya duduk, mendengarkan kursus, menjangkau operator siklik dan kemudian berpikir dua kali (ya, mereka tidak sering muncul di hadapan saya) - “Siklus mana yang lebih cepat?” Kita harus memeriksanya.
Jadi saya menemukan lima cara bagaimana Anda dapat mengatur siklus menggunakan 1C.

Jenis siklus yang pertama, sebut saja secara kondisional "Untuk Po" terlihat seperti itu:

Untuk n = 0 berdasarkan Jumlah Iterasi Loop SomeAction(); Siklus Akhir;
Pandangan kedua "Untuk setiap":

Untuk Setiap ItemCollection Dari Collection Loop SomeAction(); Siklus Akhir;
Ketiga "Selamat tinggal":

Sampai jumpa n<>NumberIterations Loop SomeAction(); n = n + 1; Siklus Akhir;
Lalu saya teringat masa muda perakit - siklusnya "Jika":

~LoopStart: Jika n<>NumberIterations Lalu SomeAction(); n = n + 1; Lompat ~MulaiSiklus; Berakhir jika;
Dan akhirnya "Pengulangan"

Prosedur RecursiveLoop(n, JumlahIterasi) SomeAction(); Jika n<>Jumlah Iterasi Kemudian Loop Rekursif(n+1, Jumlah Iterasi); Berakhir jika; Prosedur Akhir
Tentu saja, tidak sepenuhnya benar untuk mengaitkan rekursi dengan siklus, namun demikian, dengan bantuannya, Anda dapat mencapai hasil yang serupa. Saya akan segera membuat reservasi bahwa rekursi tidak berpartisipasi dalam pengujian lebih lanjut. Pertama, semua pengujian dilakukan pada 1.000.000 iterasi, dan rekursi sudah mencapai 2.000. Kedua, kecepatan rekursi sepuluh kali lebih kecil dari kecepatan loop lainnya.

Retret terakhir. Salah satu syaratnya adalah pelaksanaan tindakan apa pun dalam siklus tersebut. Pertama, loop kosong jarang digunakan. Kedua, loop "Untuk Setiap" digunakan untuk beberapa koleksi, yang berarti bahwa loop lainnya harus bekerja dengan koleksi tersebut sehingga pengujian dilakukan dalam kondisi yang sama.

Kalau begitu, ayo pergi. Badan perulangan dibaca dari array yang telah diisi sebelumnya.


atau, saat menggunakan loop "ForEach".

Penerima TestValue = elemen;
Pengujian dilakukan pada platform 8.3.5.1231 untuk tiga jenis antarmuka (Aplikasi Reguler, Aplikasi Terkelola, dan Taksi).
Angka-angka tersebut adalah waktu dalam milidetik yang diperoleh dengan menggunakan fungsi tersebut Tanggal Universal Saat IniDalam Milidetik(), yang saya panggil sebelum loop dan setelahnya berakhir. Angka-angka tersebut merupakan pecahan karena saya menggunakan rata-rata aritmatika dari lima pengukuran. Mengapa saya tidak menggunakan Benchmarking? Saya tidak mempunyai tujuan untuk mengukur kecepatan setiap baris kode, hanya kecepatan siklus dengan hasil kerja yang sama.

Tampaknya itu saja, tapi - untuk menguji jadi uji!
Hasil untuk platform 8.2.19.106
Rata-rata platform 8.2 25% lebih cepat dari 8.3. Saya tidak mengharapkan perbedaan sedikit pun dan memutuskan untuk mengujinya di komputer lain. Saya tidak akan memberikan hasilnya, Anda dapat membuatnya sendiri menggunakan konfigurasi ini. Saya hanya bisa mengatakan bahwa 8,2 lebih cepat 20 persen.

Mengapa? Entahlah, membongkar kernel bukanlah bagian dari rencana saya, tapi saya tetap melihat pengukuran kinerjanya. Ternyata operasi siklik itu sendiri di 8.3 agak lebih cepat dibandingkan di 8.2. Tapi di telepon
Penerima TestValue = TestArray.Get(n);
yaitu, terdapat peningkatan kinerja yang signifikan ketika membaca item koleksi ke dalam variabel.

Pada akhirnya:
Mengapa semua ini? Bagi saya sendiri, saya menarik beberapa kesimpulan:

1. Jika memungkinkan untuk menggunakan loop khusus - "Untuk Masing-masing", maka lebih baik menggunakannya. Omong-omong, ini membutuhkan waktu lebih lama daripada loop lainnya, tetapi kecepatan akses ke elemen koleksi jauh lebih tinggi.
2. Jika Anda mengetahui jumlah iterasi sebelumnya, gunakan "Untuk". "Sampai jumpa" akan bekerja lebih lambat.
3. Jika Anda menggunakan loop "Jika", pemrogram lain jelas tidak akan memahami Anda.

Anda dapat keluar dari perulangan dan mentransfer kendali ke pernyataan pertama setelah perulangan dengan menggunakan pernyataan Break. Untuk melewati bagian dari pernyataan loop dan melanjutkan ke iterasi berikutnya, gunakan pernyataan Lanjutkan. Dalam hal ini, kendali dialihkan ke operator awal siklus, operator For atau While. Pernyataan Break dan Continue tidak digunakan secara terpisah, namun dibangun menjadi klausa "jika".

Contoh. Laporkan nilai konstanta non-periodik pertama bertipe numerik.

// Prosedur yang menampilkan nilai konstanta non-periodik pertama dari tipe numerik

// Dijalankan dari pemrosesan prosedur Probe Execute()

// bendera keluaran

totalConstant = Metadata.Constant(); untuk yin = 1 pada total loop konstan

jika Metadata.Constant(in).Periodic = 1 maka

melanjutkan; // Mentransfer kendali ke operator Untuk endIf;

jika Metadata.Constant(in).Type = "Number" lalu

ide = Metadata.Constant(in).Identifier;

Laporan(id + " " + Konstan.GetAttribute(id)); // Bendera keluaran BalanceDays 1 = 1;

mengganggu; // Keluar lebih awal dari loop For

berakhir jika; akhir siklus; // Untuk

jika tanda keluaran = 0 maka

endProcedures // Jalankan

Komentar. Terkadang pemrogram dalam perulangan For, alih-alih pernyataan Break, terpaksa mengubah nilai variabel perulangan di dalam. Jadi, dalam kasus kami, operator Abort dapat digantikan oleh operator

di = konstanta total;

Namun tindakan seperti itu tergolong gaya pemrograman yang buruk.

Beberapa pemrogram percaya bahwa operator interupsi loop (dalam 1C, ini adalah Lanjutkan dan Interupsi) memperburuk struktur program, dan oleh karena itu, jika mungkin, menolak untuk menggunakannya. Sebaliknya digunakan menggabungkan kondisi.

Mari ikuti prinsipnya pemrograman terstruktur, dengan menulis kode yang memecahkan masalah di atas, menggunakan gabungan kondisi. Dalam kode ini, kita harus meninggalkan perulangan For dan menggantinya dengan perulangan While.

// Prosedur yang menggunakan gabungan kondisi dan mengeluarkan nilai kondisi pertama

// konstanta non-periodik bertipe numerik. Dijalankan dari pemrosesan prosedur Probe Execute()

var totalConst, tanda keluaran, masuk, ide; ClearMessageWindow();

// bendera keluaran akan mengambil nilai 1 jika ditemukan

// konstanta non-periodik bertipe numerik OUTPUT flag = 0;

totalConstant = Metadata.Constant();

dalam = 1; // Jumlah konstanta sejauh ini (in<= всегоКонстант) и (флагВывода = 0) цикл

jika (Metadata.Constant(in).Periodic = 0) dan (Metadata.Constant(in).Type = "Number") maka

ide = Metadata.Constant(in).Identifier; Laporan(id + " " + Konstan.GetAttribute(id)); bendera keluaran = 1;

berakhir jika;

dalam = dalam + 1; // Jangan lupa untuk berpindah ke ujung konstan Loop berikutnya; // Untuk

jika tanda keluaran = 0 maka

Report("Tidak ada konstanta non-periodik bertipe numerik di konfigurator."); berakhir jika;

endProcedures // Jalankan

Pada kode di atas, kombinasi kondisi yang digunakan saat menulis LP dua kali: (in<= всегоКонстант) и (флагВывода = 0)

(Metadata.Constant(in).Periodic = 0) dan (Metadata.Constant(in).Type = "Number") Hal ini memungkinkan kami untuk menghilangkan pernyataan Lanjutkan dan Batalkan dari prosedur.

 
Artikel Oleh tema:
Sejarah mesin pencari
Halo semua! Hari ini akan ada artikel tentang mesin pencari dunia, apa saja yang ada secara umum, kapan muncul, apa yang mengemudi secara khusus di Rusia, dan apa yang ada di seluruh dunia. Artikelnya ternyata sangat besar, jadi duduklah dengan nyaman, sebaiknya setelah menyiapkannya
Cara menambah RAM komputer
Bagaimana saya tahu jika memori komputer saya dapat ditingkatkan? Ada saatnya Anda mulai menyadari bahwa komputer tidak mampu lagi menjalankan tugasnya, namun bukan berarti Anda perlu membeli yang baru, apalagi jika prosesor Anda baru berumur dua atau tiga tahun. Semua h
Mengapa panggilan penguntit Pripyat terbang keluar xray
Sejumlah besar pengguna produk Microsoft melaporkan hilangnya aktivasi Windows 10 dan konversi versi Pro ke Home. Pengguna diberi tahu tentang kunci yang kedaluwarsa, dan ketika mereka mencoba mengaktifkan kembali, mereka mendapatkan kesalahan 0x803fa067 untuk Windo
pemilih tipe elemen css
Apa yang dimaksud dengan pemilih di css adalah deskripsi elemen atau grup elemen yang memberi tahu browser elemen mana yang harus dipilih untuk menerapkan gaya padanya. Mari kita lihat penyeleksi CSS dasar.1) .x .topic-title ( background-color: yellow; )