1s ขอผลลัพธ์ด้วยเงื่อนไข การสร้างและทำงานกับแบบสอบถาม (สำหรับผู้เริ่มต้น)

ภาษาแบบสอบถามเป็นหนึ่งในกลไกพื้นฐานของ 1C 8.3 สำหรับนักพัฒนา ด้วยความช่วยเหลือของแบบสอบถาม คุณสามารถรับข้อมูลใด ๆ ที่จัดเก็บไว้ในฐานข้อมูลได้อย่างรวดเร็ว ไวยากรณ์ของมันคล้ายกับ SQL มาก แต่มีความแตกต่างบางประการ

ข้อได้เปรียบหลักของภาษาเคียวรี 1C 8.3 (8.2) บน SQL:

  • การอ้างอิงเขตข้อมูลอ้างอิง (เปลี่ยนหนึ่งจุดขึ้นไปเป็นแอตทริบิวต์ของวัตถุ);
  • การทำงานกับผลลัพธ์นั้นสะดวกมาก
  • ความสามารถในการสร้างตารางเสมือน
  • คำขอสามารถเขียนได้ทั้งภาษาอังกฤษและภาษารัสเซีย
  • ความสามารถในการบล็อกข้อมูลเพื่อหลีกเลี่ยงการหยุดชะงัก

ข้อเสียของภาษาแบบสอบถามใน 1C:

  • ซึ่งแตกต่างจาก SQL ในแบบสอบถาม 1C ไม่อนุญาตให้คุณเปลี่ยนข้อมูล
  • ขาดขั้นตอนการจัดเก็บ
  • ความเป็นไปไม่ได้ในการแปลงสตริงเป็นตัวเลข

พิจารณาบทช่วยสอนขนาดเล็กของเราเกี่ยวกับการสร้างพื้นฐานของภาษาคิวรี 1C

เนื่องจากคำขอใน 1C อนุญาตให้คุณรับข้อมูลได้เท่านั้น คำขอใด ๆ จะต้องขึ้นต้นด้วยคำว่า "SELECT" หลังจากคำสั่งนี้ ฟิลด์ที่คุณต้องการรับข้อมูลจะถูกระบุ หากคุณระบุ "*" ช่องที่มีอยู่ทั้งหมดจะถูกเลือก สถานที่ที่จะเลือกข้อมูล (เอกสาร ทะเบียน ไดเร็กทอรี ฯลฯ) จะถูกระบุหลังคำว่า "FROM"

ในตัวอย่างด้านล่าง ชื่อของระบบการตั้งชื่อทั้งหมดจะถูกเลือกจากหนังสืออ้างอิง "ระบบการตั้งชื่อ" หลังจากคำว่า "HOW" จะมีการระบุนามแฝง (ชื่อ) สำหรับตารางและฟิลด์

เลือก
Nomenclature.Name AS NameNomenclature
จาก
สารบบ. ระบบการตั้งชื่อ AS ระบบการตั้งชื่อ

ถัดจากคำสั่ง "SELECT" คุณสามารถระบุคำสำคัญ:

  • หลากหลาย. แบบสอบถามจะเลือกเฉพาะแถวที่แตกต่างกันอย่างน้อยหนึ่งฟิลด์ (โดยไม่ซ้ำกัน)
  • ครั้งแรก, ที่ไหน – จำนวนแถวจากจุดเริ่มต้นของผลลัพธ์ที่จะเลือก บ่อยครั้งที่โครงสร้างนี้ใช้ร่วมกับการเรียงลำดับ (ORDER BY) ตัวอย่างเช่น เมื่อคุณต้องการเลือกเอกสารล่าสุดจำนวนหนึ่งตามวันที่
  • อนุญาต. การออกแบบนี้อนุญาตให้คุณเลือกจากฐานข้อมูลเฉพาะเรคคอร์ดที่มีให้สำหรับผู้ใช้ปัจจุบัน หากใช้คีย์เวิร์ดนี้ ผู้ใช้จะได้รับข้อความแสดงข้อผิดพลาดหากพยายามค้นหาเรกคอร์ดที่ไม่สามารถเข้าถึงได้

คำหลักเหล่านี้สามารถใช้ร่วมกันหรือแยกกันได้

เพื่อการเปลี่ยนแปลง

ข้อนี้ล็อคข้อมูลเพื่อหลีกเลี่ยงความขัดแย้ง ข้อมูลที่ถูกล็อคจะไม่ถูกอ่านจากการเชื่อมต่ออื่นจนกว่าจะสิ้นสุดการทำธุรกรรม ในข้อนี้ คุณสามารถระบุตารางเฉพาะที่คุณต้องการล็อกได้ มิฉะนั้นจะถูกบล็อกทั้งหมด การออกแบบเกี่ยวข้องกับโหมดการปิดกั้นอัตโนมัติเท่านั้น

ส่วนใหญ่มักใช้คำสั่ง "FOR CHANGE" เมื่อได้รับยอดคงเหลือ เมื่อผู้ใช้หลายคนทำงานในโปรแกรมพร้อมกัน ในขณะที่คนหนึ่งได้รับยอดคงเหลือ อีกคนสามารถเปลี่ยนได้ ในกรณีนี้ ยอดคงเหลือที่ได้จะไม่ถูกต้องอีกต่อไป หากคุณบล็อกข้อมูลด้วยข้อเสนอนี้ จนกว่าพนักงานคนแรกจะได้รับยอดคงเหลือที่ถูกต้องและดำเนินการจัดการที่จำเป็นทั้งหมด พนักงานคนที่สองจะต้องรอ

เลือก
การตั้งถิ่นฐานร่วมกัน พนักงาน
การตั้งถิ่นฐานร่วมกัน จำนวนเงิน การชำระหนี้ร่วมกัน ยอดคงเหลือ
จาก
ทะเบียนสะสม การตกลงร่วมกันกับพนักงาน ยอดคงเหลือ AS การชำระบัญชีร่วมกัน
เพื่อการเปลี่ยนแปลง

ที่ไหน

การก่อสร้างเป็นสิ่งจำเป็นสำหรับการกำหนดการเลือกใด ๆ กับข้อมูลที่ไม่ได้โหลด ในบางกรณีของการได้รับข้อมูลจากรีจิสเตอร์ การกำหนดเงื่อนไขการเลือกในพารามิเตอร์ของตารางเสมือนนั้นเหมาะสมกว่า เมื่อใช้ "WHERE" ระเบียนทั้งหมดจะได้รับก่อน จากนั้นจะใช้การเลือกเท่านั้น ซึ่งจะทำให้การสืบค้นช้าลงอย่างมาก

ต่อไปนี้คือตัวอย่างคำขอรับผู้ติดต่อกับตำแหน่งเฉพาะ พารามิเตอร์การเลือกมีรูปแบบดังต่อไปนี้: &ParameterName (ชื่อพารามิเตอร์เป็นชื่อที่กำหนดเองได้)

การเลือก (กรณี)

โครงสร้างช่วยให้คุณสามารถระบุเงื่อนไขได้โดยตรงในเนื้อหาคำขอ

ในตัวอย่างด้านล่าง "ฟิลด์เพิ่มเติม" จะมีข้อความขึ้นอยู่กับว่ามีการโพสต์เอกสารหรือไม่:

เลือก
AdmissionT&U.Link,
ทางเลือก
เมื่อไร
แล้ว "เอกสารโพสต์!"
อื่น "ไม่ได้โพสต์เอกสาร..."
สิ้นสุดเป็นฟิลด์เพิ่มเติม
จาก
เอกสารการรับสินค้าบริการ AS ReceiptT&C

เข้าร่วม

รวมลิงก์สองตารางตามเงื่อนไขลิงก์ที่กำหนด

เข้าร่วมซ้าย / ขวา

สาระสำคัญของการรวม LEFT คือตารางที่ระบุแรกนั้นถูกนำมาใช้อย่างสมบูรณ์และตารางที่สองจะถูกแนบตามเงื่อนไขของการเชื่อมต่อ หากไม่มีระเบียนที่ตรงกับตารางแรกในตารางที่สอง ค่า NULL จะถูกแทนที่ด้วยค่า พูดง่ายๆ คือ ตารางหลักคือตารางแรกที่ระบุ และข้อมูลของตารางที่สอง (ถ้ามี) จะถูกแทนที่ด้วยข้อมูลแล้ว

ตัวอย่างเช่น คุณต้องรับรายการสินค้าจากเอกสาร "การรับสินค้าและบริการ" และราคาจากการลงทะเบียนข้อมูล "ราคาสินค้า" ในกรณีนี้ หากไม่พบราคาของตำแหน่งใดๆ ให้แทนที่ NULL แทน รายการทั้งหมดจากเอกสารจะถูกเลือกไม่ว่าจะมีราคาหรือไม่ก็ตาม

เลือก
ใบเสร็จรับเงินของ T&U ระบบการตั้งชื่อ
ราคาราคา
จาก
เอกสารการรับสินค้าบริการสินค้าเป็นใบเสร็จรับเงินT&C
เข้าร่วมภายใน
ON การรับ Q&A.Nomenclature = ราคา.Nomenclature

ในทางขวา ทุกอย่างตรงกันข้าม

การเชื่อมต่อเต็มรูปแบบ

การรวมประเภทนี้แตกต่างจากก่อนหน้านี้ตรงที่เร็กคอร์ดทั้งหมดของทั้งตารางแรกและตารางที่สองจะถูกส่งกลับเป็นผลลัพธ์ หากไม่พบระเบียนในตารางแรกหรือตารางที่สองสำหรับเงื่อนไขลิงก์ที่ระบุ ระบบจะส่งคืนค่า NULL แทน

เมื่อใช้การรวมแบบเต็มในตัวอย่างก่อนหน้านี้ รายการสินค้าทั้งหมดจากเอกสารการรับสินค้าและบริการและราคาล่าสุดทั้งหมดจากการลงทะเบียนราคาสินค้าจะถูกเลือก ค่าของระเบียนที่ไม่พบทั้งในตารางแรกและตารางที่สองจะเป็น NULL

เข้าร่วมภายใน

ข้อแตกต่างระหว่างการรวม INNER และการรวมแบบเต็มคือ หากไม่พบเรกคอร์ดในตารางอย่างน้อยหนึ่งตาราง แบบสอบถามจะไม่แสดงเลย ด้วยเหตุนี้ จะมีการเลือกเฉพาะรายการสินค้าเหล่านั้นจากเอกสารการรับสินค้าและบริการซึ่งมีรายการอยู่ในการลงทะเบียนข้อมูลราคาสินค้า หากในตัวอย่างก่อนหน้านี้ เราแทนที่ FULL ด้วย INTERNAL

กลุ่มโดย

การจัดกลุ่มในแบบสอบถาม 1C ช่วยให้คุณสามารถยุบแถวของตาราง (ฟิลด์การจัดกลุ่ม) ตามคุณลักษณะทั่วไปบางอย่าง (ฟิลด์การจัดกลุ่ม) ฟิลด์การจัดกลุ่มสามารถแสดงได้โดยใช้ฟังก์ชันรวมเท่านั้น

ผลลัพธ์ของการค้นหาถัดไปจะเป็นรายการประเภทรายการที่มีราคาสูงสุด

เลือก
,
MAX(ราคา.ราคา) AS ราคา
จาก

กลุ่มโดย
ราคา การตั้งชื่อ ประเภทการตั้งชื่อ

ผล

ซึ่งแตกต่างจากการจัดกลุ่ม เมื่อใช้ผลรวม ระเบียนทั้งหมดจะแสดงขึ้นและแถวทั้งหมดจะถูกเพิ่มเข้าไปแล้ว การจัดกลุ่มจะแสดงเฉพาะเรกคอร์ดทั่วไปเท่านั้น

สามารถสรุปผลลัพธ์สำหรับตารางทั้งหมด (โดยใช้คำหลัก "ทั่วไป") สำหรับหลายฟิลด์ สำหรับฟิลด์ที่มีโครงสร้างแบบลำดับชั้น (คำหลัก "ลำดับชั้น", "ลำดับชั้นเท่านั้น") เมื่อสรุปแล้วไม่จำเป็นต้องใช้ฟังก์ชันรวม

พิจารณาตัวอย่างที่คล้ายกับตัวอย่างด้านบนโดยใช้การจัดกลุ่ม ในกรณีนี้ ผลการสืบค้นจะไม่เพียงส่งคืนฟิลด์ที่จัดกลุ่มเท่านั้น แต่ยังส่งบันทึกโดยละเอียดอีกด้วย

เลือก
ราคา การตั้งชื่อ ประเภทของระบบการตั้งชื่อ AS ประเภทของระบบการตั้งชื่อ
ราคาราคา AS ราคา
จาก
RegisterInformation.PricesNomenclature.SliceLast AS ราคา
ผล
สูงสุด (ราคา)
บน
ประเภท การตั้งชื่อ

มี

ตัวดำเนินการนี้คล้ายกับตัวดำเนินการ WHERE แต่ใช้สำหรับฟังก์ชันรวมเท่านั้น ต้องจัดกลุ่มฟิลด์อื่นนอกเหนือจากที่ใช้โดยโอเปอเรเตอร์นี้ ตัวดำเนินการ "WHERE" ใช้ไม่ได้กับฟังก์ชันรวม

ในตัวอย่างด้านล่าง ราคาสินค้าสูงสุดจะถูกเลือกหากเกิน 1,000 โดยจัดกลุ่มตามประเภทสินค้า

เลือก

MAX(ราคา.ราคา) AS ราคา
จาก
RegisterInformation.PricesNomenclature.SliceLast AS ราคา
กลุ่มโดย
ราคา การตั้งชื่อ ประเภทการตั้งชื่อ
มี
MAX(ราคา.ราคา) > 1,000

จัดเรียงตาม

ตัวดำเนินการ "ORDER BY" จัดเรียงผลลัพธ์การค้นหา เพื่อให้แน่ใจว่าระเบียนส่งออกตามลำดับที่สอดคล้องกัน จึงใช้ AUTO-ORDER ประเภทดั้งเดิมถูกจัดเรียงตามกฎปกติ ประเภทการอ้างอิงจัดเรียงตาม GUID

ตัวอย่างการรับรายชื่อพนักงานเรียงตามชื่อ:

เลือก
ชื่อพนักงาน AS Name
จาก
Directory. พนักงาน AS พนักงาน
จัดเรียงตาม
ชื่อ
การสั่งซื้ออัตโนมัติ

โครงสร้างอื่น ๆ ของภาษาแบบสอบถาม 1C

  • รวมกัน- ผลลัพธ์ของสองแบบสอบถามในหนึ่งเดียว
  • รวมกันทั้งหมด– คล้ายกับ JOIN แต่ไม่มีการจัดกลุ่มแถวที่เหมือนกัน
  • โต๊ะว่าง- บางครั้งใช้เมื่อเข้าร่วมแบบสอบถามเพื่อระบุตารางที่ซ้อนกันว่างเปล่า
  • ใส่- สร้างตารางชั่วคราวเพื่อเพิ่มประสิทธิภาพการสืบค้น 1C ที่ซับซ้อน คำขอดังกล่าวเรียกว่าคำขอเป็นชุด

คุณสมบัติภาษาแบบสอบถาม

  • สตริงย่อยตัดทอนสตริงจากตำแหน่งที่ระบุตามจำนวนอักขระที่ระบุ
  • ปี…วินาทีช่วยให้คุณได้รับค่าที่เลือกของประเภทตัวเลข พารามิเตอร์อินพุตคือวันที่
  • จุดเริ่มต้นของช่วงเวลาและจุดสิ้นสุดของช่วงเวลาใช้เมื่อทำงานกับวันที่ ประเภทระยะเวลา (วัน เดือน ปี ฯลฯ) ถูกระบุเป็นพารามิเตอร์เพิ่มเติม
  • เพิ่มให้คุณเพิ่มหรือลบวันที่และเวลาที่ระบุของประเภทใดประเภทหนึ่ง (วินาที นาที วัน ฯลฯ)
  • ความแตกต่างของวันที่กำหนดความแตกต่างระหว่างวันที่สองวัน โดยระบุประเภทของค่าเอาต์พุต (วัน ปี เดือน ฯลฯ)
  • เป็นโมฆะแทนที่ค่าที่หายไปด้วยนิพจน์ที่ระบุ
  • การนำเสนอและลิงก์การนำเสนอรับการแสดงสตริงของฟิลด์ที่ระบุ ใช้สำหรับค่าใด ๆ และเฉพาะค่าอ้างอิงตามลำดับ
  • ประเภท ประเภทมูลค่าใช้เพื่อกำหนดประเภทของพารามิเตอร์อินพุต
  • ลิงค์เป็นตัวดำเนินการเปรียบเทียบเชิงตรรกะสำหรับประเภทค่าแอตทริบิวต์
  • ด่วนใช้ในการแปลงค่าเป็นประเภทที่ต้องการ
  • วันเวลารับค่าประเภท "วันที่" จากค่าตัวเลข (ปี เดือน วัน ชั่วโมง นาที วินาที)
  • ความหมายในคำขอ 1C ใช้เพื่อระบุค่าที่กำหนดไว้ล่วงหน้า - ไดเร็กทอรี, การแจงนับ, แผนสำหรับประเภทของคุณสมบัติ ตัวอย่างการใช้งาน: " โดยที่ LegalIndividual = Value(Enumeration.LegalIndividual.Individual)«.

ตัวสร้างแบบสอบถาม

ในการสร้างแบบสอบถามด้วย 1C มีกลไกในตัวที่สะดวกมาก - ตัวออกแบบแบบสอบถาม ประกอบด้วยแท็บหลักดังต่อไปนี้:

  • "ตารางและฟิลด์" - ประกอบด้วยฟิลด์ที่จะเลือกและแหล่งที่มา
  • "ลิงค์" - อธิบายเงื่อนไขสำหรับโครงสร้างการเชื่อมต่อ
  • "การจัดกลุ่ม" - ประกอบด้วยคำอธิบายของการจัดกลุ่มและฟิลด์สรุปโดยพวกเขา
  • "เงื่อนไข" - รับผิดชอบในการเลือกข้อมูลในคำขอ
  • "ขั้นสูง" - พารามิเตอร์การค้นหาเพิ่มเติม เช่น คีย์เวิร์ดของคำสั่ง "SELECT" เป็นต้น
  • “การรวม / นามแฝง” - ความเป็นไปได้ของการรวมตารางจะถูกระบุและนามแฝงถูกตั้งค่า (โครงสร้าง “HOW”)
  • "Order" - รับผิดชอบในการเรียงลำดับผลลัพธ์ของการค้นหา
  • "ผลรวม" - คล้ายกับแท็บ "การจัดกลุ่ม" แต่ใช้สำหรับการสร้าง "ผลรวม"

สามารถดูข้อความของคำขอได้โดยคลิกที่ปุ่ม "ร้องขอ" ที่มุมล่างซ้าย ในแบบฟอร์มนี้สามารถแก้ไขด้วยตนเองหรือคัดลอกได้


คอนโซลแบบสอบถาม

หากต้องการดูผลลัพธ์ของการค้นหาอย่างรวดเร็วในโหมด "องค์กร" หรือเพื่อแก้ไขข้อบกพร่องของการค้นหาที่ซับซ้อน ให้ใช้ มีการเขียนข้อความค้นหา ตั้งค่าพารามิเตอร์ และแสดงผลลัพธ์

คุณสามารถดาวน์โหลดคอนโซลแบบสอบถามบนดิสก์ ITS หรือโดย

ฉันตัดสินใจร่วมให้ข้อมูลและอธิบายลักษณะของภาษาที่ไม่ได้พิจารณาในบทความข้างต้น บทความนี้มุ่งเป้าไปที่นักพัฒนามือใหม่

1. การก่อสร้าง "จาก"

ในการรับข้อมูลจากฐานข้อมูล ไม่จำเป็นต้องใช้โครงสร้าง "FROM"
ตัวอย่าง: เราจำเป็นต้องเลือกข้อมูลทั้งหมดเกี่ยวกับธนาคารจากไดเร็กทอรีธนาคาร
ขอ:

เลือก Directory.Banks.*

เลือกฟิลด์ทั้งหมดจากไดเร็กทอรี Banks และคล้ายกับคำถาม:

เลือกธนาคาร * จากไดเรกทอรี ธนาคารเป็นธนาคาร

2. ข้อมูลการสั่งซื้อตามฟิลด์อ้างอิง

เมื่อเราต้องการเรียงลำดับข้อมูลคิวรีตามประเภทดั้งเดิม: "สตริง", "ตัวเลข", "วันที่" ฯลฯ ทุกอย่างจะแก้ไขได้โดยใช้โครงสร้าง "ORDER BY" หากคุณต้องการเรียงลำดับข้อมูลตามฟิลด์อ้างอิง ช่องอ้างอิงคือลิงค์ ตัวระบุเฉพาะ เช่น พูดอย่างคร่าว ๆ ชุดอักขระตามอำเภอใจและการเรียงลำดับตามปกติอาจไม่ให้ผลลัพธ์ตามที่คาดหวัง สำหรับฟิลด์อ้างอิงการสั่งซื้อ จะใช้โครงสร้าง "AUTOORDER" ในการดำเนินการนี้ ก่อนอื่นคุณต้องเรียงลำดับข้อมูลโดยตรงตามประเภทการอ้างอิงโดยใช้โครงสร้าง "ORDER BY" จากนั้นตามด้วยโครงสร้าง "AUTOORDER"

ในกรณีนี้ สำหรับเอกสาร การสั่งซื้อจะเกิดขึ้นตามลำดับ "วันที่-> หมายเลข" สำหรับไดเร็กทอรี - โดย "มุมมองหลัก" หากการจัดลำดับไม่ได้อิงตามฟิลด์อ้างอิง ไม่แนะนำให้ใช้โครงสร้าง "AUTOORDER"

ในบางกรณี โครงสร้าง "AUTOORDER" อาจทำให้กระบวนการสุ่มตัวอย่างช้าลง ในทำนองเดียวกัน คุณสามารถเขียนใหม่โดยไม่ต้องจัดเรียงเอกสารโดยอัตโนมัติ:

3. รับการแสดงข้อความของประเภทการอ้างอิง การก่อสร้าง "การนำเสนอ"

เมื่อคุณต้องการแสดงฟิลด์ประเภทการอ้างอิงเพื่อแสดง ตัวอย่างเช่น ฟิลด์ "ธนาคาร" ซึ่งเป็นลิงก์ไปยังองค์ประกอบของไดเร็กทอรี "ธนาคาร" คุณต้องเข้าใจว่าเมื่อฟิลด์นี้ปรากฏขึ้น ข้อความค้นหาย่อยไปยัง ไดเร็กทอรี "Banks" จะถูกดำเนินการโดยอัตโนมัติเพื่อรับการค้นหาไดเร็กทอรี สิ่งนี้จะทำให้เอาต์พุตข้อมูลช้าลง เพื่อหลีกเลี่ยงปัญหานี้ จำเป็นต้องใช้โครงสร้าง "REPRESENTATION" ในคำขอเพื่อรับการแสดงวัตถุในทันทีและแสดงไว้ให้ดูแล้ว

ในระบบองค์ประกอบข้อมูล กลไกนี้ถูกใช้โดยค่าเริ่มต้น แต่เมื่อสร้างเลย์เอาต์ในเซลล์ คุณควรระบุการแสดงฟิลด์อ้างอิง และยกตัวอย่างเช่น ใส่ลิงก์ในการถอดเสียง

4. เงื่อนไขการสุ่มตัวอย่างข้อมูลตามแม่แบบ

ตัวอย่างเช่น คุณต้องได้รับโทรศัพท์มือถือของพนักงานในแบบฟอร์ม (8 -123-456-78-912) ในการทำเช่นนี้ คุณต้องใส่เงื่อนไขต่อไปนี้ในคำขอ:

เลือก Employee.Name, Employee.Phone เป็นโทรศัพท์จาก Directory.Employees เป็นพนักงาน โดยที่ Phone LIKE "__-___-___-__-__"

อักขระ "_" คือบริการและแทนที่อักขระใดๆ

5. การใช้ผลรวมและการจัดกลุ่มพร้อมกัน


ผลรวมมักจะใช้ร่วมกับการจัดกลุ่ม ซึ่งในกรณีนี้สามารถละเว้นฟังก์ชันการรวมในผลรวมได้

SELECT Services.Organization AS Organization, Services.Nomenclature AS Nomenclature, SUM(Services.Document Amount) AS Document Sum FROM Document.Services AS Services GROUPS BY Services.Organization, Services.Nomenclature RESULTS BY GENERAL, Organization, Nomenclature

ในกรณีนี้ คำขอจะกลับมาเกือบเหมือนกับคำขอนี้:

เลือกบริการ องค์กร AS องค์กร บริการ ระบบการตั้งชื่อ AS ระบบการตั้งชื่อ บริการ จำนวนเอกสาร AS จำนวนเอกสาร FROM เอกสาร

เฉพาะข้อความค้นหาแรกเท่านั้นที่จะยุบระเบียนที่มีระบบการตั้งชื่อเดียวกัน

6. เขตข้อมูลอ้างอิง

การอ้างอิงฟิลด์ผ่านจุดเรียกว่าการดำเนินการอ้างอิงฟิลด์อ้างอิง ตัวอย่างเช่น การจ่ายเงิน.หน่วยงาน.หน่วยงานปกครอง. ในกรณีนี้ ในฟิลด์อ้างอิง "องค์กร" ของเอกสาร "การชำระเงิน" จะอ้างอิงถึงตาราง "องค์กร" อื่น ซึ่งจะได้รับค่าของแอตทริบิวต์ "หน่วยการดูแลระบบ" สิ่งสำคัญคือต้องเข้าใจว่าเมื่อเข้าถึงฟิลด์ผ่านจุด แพลตฟอร์มจะสร้างคิวรีย่อยและรวมตารางเหล่านี้โดยปริยาย

ขอ:

สามารถแสดงเป็น:

เลือก Payment.Link, Payment.Organization, Payment.Organization, Organizations AdministrativeUnit FROM Document.Payment AS Payment LEFT JOIN Directory.Organizations AS Organizations Software Payment.Organization = Organizations.Link

เมื่อแยกการอ้างอิงฟิลด์อ้างอิงของประเภทคอมโพสิต กรอบงานจะพยายามสร้างการรวมโดยปริยายกับตารางทั้งหมดที่เป็นส่วนหนึ่งของประเภทฟิลด์ ในกรณีนี้ Query จะไม่เหมาะสม หากทราบอย่างชัดเจนว่าฟิลด์ประเภทใดจำเป็นต้องจำกัดฟิลด์ดังกล่าวตามประเภทด้วยการสร้าง ด่วน().

ตัวอย่างเช่นมีการลงทะเบียนการสะสม "การชำระเงินที่ไม่ได้ปันส่วน" ซึ่งเอกสารหลายฉบับสามารถทำหน้าที่เป็นผู้รับจดทะเบียนได้ ในกรณีนี้การรับค่าของรายละเอียดผู้รับจดทะเบียนไม่ถูกต้องด้วยวิธีนี้:

เลือก Unallocated Payments.Registrar.Date, ..... จาก Accumulation Register.Unallocated Payments AS Unallocated Payments

คุณควรจำกัดประเภทของตัวบันทึกฟิลด์คอมโพสิต:

SELECT EXPRESS(Unallocated Payments. Registrar AS Document. Payment). วันที่, ..... จาก Accumulation Register. Unallocated Payments AS Unallocated Payments

7. การก่อสร้าง "ที่ไหน"

ด้วยการรวมด้านซ้ายของสองตาราง เมื่อคุณกำหนดเงื่อนไข "WHERE" บนตารางด้านขวา เราจะได้ผลลัพธ์ที่คล้ายกับผลลัพธ์ที่มีการรวมตารางด้านใน

ตัวอย่าง. จำเป็นต้องเลือกลูกค้าทั้งหมดจากไดเรกทอรีลูกค้า และสำหรับลูกค้าที่มีเอกสารการชำระเงินที่มีค่าแอตทริบิวต์ "องค์กร" = &องค์กร ให้แสดงเอกสาร "การชำระเงิน" สำหรับผู้ที่ไม่มี ไม่ต้องแสดง

ผลลัพธ์ของคิวรีจะส่งคืนเรกคอร์ดเฉพาะสำหรับลูกค้าที่มีการชำระเงินตามองค์กรในพารามิเตอร์ และจะกรองลูกค้ารายอื่นออก ดังนั้นก่อนอื่นคุณต้องได้รับการชำระเงินทั้งหมดสำหรับองค์กร "ดังกล่าวและดังกล่าว" ในตารางชั่วคราว จากนั้นเชื่อมต่อกับไดเร็กทอรี "ไคลเอนต์" ด้วยการรวมด้านซ้าย

เลือก Payment.Reference AS Payment, Payment.Shareholder AS Client PUT topayments FROM Document.Payment AS Payment WHERE Payment.Department = &Department; //////////////////////////////////////////////////////// / ////////////////////////////// SELECT Clients.Reference AS Client, ISNULL(topayments.Payment, "") เป็นการชำระเงินจาก ไดเร็กทอรี .Clients เป็นไคลเอนต์ที่เหลือเข้าร่วม

คุณสามารถหลีกเลี่ยงเงื่อนไขนี้ได้อีกทางหนึ่ง จำเป็นต้องกำหนดเงื่อนไข "WHERE" โดยตรงในความสัมพันธ์ของตารางทั้งสอง ตัวอย่าง:

เลือก Clients.Reference, Payment.Reference FROM Directory.US_Subscribers AS ST_Subscribers LEFT JOIN Document.Payment AS Payment SOFTWARE (Clients.Reference = Payment.Client AND Payment.Client.Name LIKE "Sugar Bag") GROUP BY Clients.Reference, Payment. ลิงค์

8. เข้าร่วมกับตารางที่ซ้อนกันและเสมือน

ข้อความค้นหาย่อยมักจำเป็นต้องเลือกข้อมูลตามเงื่อนไขบางประการ หากคุณใช้ร่วมกับตารางอื่น การทำเช่นนี้อาจทำให้การดำเนินการค้นหาช้าลงอย่างมาก

ตัวอย่างเช่น เราจำเป็นต้องได้รับยอดดุลสำหรับวันที่ปัจจุบันสำหรับลูกค้าบางราย

SELECT UnallocatedPayBalances.Customer, UnallocatedPaymentsRemains.AmountBalance FROM (SELECT Clients.Reference AS Reference FROM Directory.Clients AS Clients WHERE Clients.Reference B(&Clients)) AS NestedQuery

เมื่อดำเนินการค้นหาดังกล่าว เครื่องมือเพิ่มประสิทธิภาพ DBMS มีแนวโน้มที่จะสร้างข้อผิดพลาดเมื่อเลือกแผน ซึ่งจะนำไปสู่การดำเนินการค้นหาที่ไม่เหมาะสม เมื่อรวมตารางสองตาราง เครื่องมือเพิ่มประสิทธิภาพ DBMS จะเลือกอัลกอริทึมสำหรับการรวมตารางตามจำนวนระเบียนในทั้งสองตาราง ในกรณีของคิวรีที่ซ้อนกัน เป็นการยากมากที่จะกำหนดจำนวนเรกคอร์ดที่คิวรีที่ซ้อนกันจะส่งกลับ ดังนั้น แทนที่จะใช้คิวรีแบบซ้อน คุณควรใช้ตารางชั่วคราวเสมอ ลองเขียนแบบสอบถามใหม่

เลือก Clients.Link เป็น Link ใส่ Clients จาก Directory.Clients as Clients WHERE
Clients.Link B (&ลูกค้า) ; //////////////////////////////////////////////////////// / ////////////////////// เลือก tClients.Reference, UnallocatedPaymentsBalances.SumBalance จาก tClients เป็น tClients ซ้าย เข้าร่วม Accumulation Register.UnallocatedPayments.Balances (, Client IN (SELECT tClients.Reference จาก tClients)) AS UnallocatedPaymentsBalances ON tClients.Reference = UnallocatedPaymentsBalances.Clients

ในกรณีนี้ เครื่องมือเพิ่มประสิทธิภาพจะสามารถกำหนดจำนวนบันทึกที่ tClients ตารางชั่วคราวใช้ และจะสามารถเลือกอัลกอริทึมการรวมตารางที่เหมาะสมที่สุด

ตารางเสมือนจริง ช่วยให้คุณได้รับข้อมูลเกือบสำเร็จรูปสำหรับงานแอปพลิเคชันส่วนใหญ่ (Slice of the First, Slice of the Last, Residuals, Turnovers, Residuals and Turnovers) คีย์เวิร์ดที่นี่เป็นเสมือน ตารางเหล่านี้ไม่ได้มีอยู่จริง แต่ประกอบขึ้นโดยระบบในทันที เช่น เมื่อได้รับข้อมูลจากตารางเสมือน ระบบจะรวบรวมข้อมูลจากตารางสุดท้ายของการลงทะเบียน เขียน จัดกลุ่ม และปัญหาให้กับผู้ใช้

เหล่านั้น. เมื่อคุณเข้าร่วมกับตารางเสมือน คุณจะเข้าร่วมกับแบบสอบถามย่อย ในกรณีนี้ เครื่องมือเพิ่มประสิทธิภาพ DBMS อาจเลือกแผนการเข้าร่วมที่ไม่เหมาะสม หากคิวรีไม่ได้ถูกสร้างอย่างรวดเร็วพอ และคิวรีใช้การรวมในตารางเสมือน ขอแนะนำให้โอนสิทธิ์เข้าถึงตารางเสมือนไปยังตารางชั่วคราว จากนั้นจึงทำการรวมระหว่างสองตารางชั่วคราว ลองเขียนแบบสอบถามก่อนหน้านี้ใหม่

เลือก Clients.Link เป็น Link ใส่ Clients จาก Directory.Clients เป็น Clients INDEX BY Link WHERE
Clients.Link B (&ลูกค้า) ; //////////////////////////////////////////////////////// / ////////////////////////////// เลือก UnallocatedPayments.AmountBalance, UnallocatedPayments.Customer AS ลูกค้าใส่ยอดคงเหลือจาก Accumulation Register.UnallocatedPayments ยอดคงเหลือ (, ลูกค้าใน (เลือก tClients.Reference จาก tClients)) AS UnallocatedPaymentsBalances; //////////////////////////////////////////////////////// / ////////////////////////////// เลือก tClients.Reference แล้ว Remains.SumRemainder เป็น SumRemainder จาก tClients เป็น tClients tClients.Reference = tRemainders .ลูกค้า

9. ตรวจสอบผลลัพธ์ของแบบสอบถาม

ผลลัพธ์ของการดำเนินการค้นหาอาจว่างเปล่า หากต้องการตรวจสอบค่าว่าง ให้ใช้โครงสร้าง:

RequestRes = คำขอดำเนินการ (); ถ้า reQuery.Empty() แล้ว Return; สิ้นสุดถ้า;

วิธี ว่างเปล่า()ควรใช้วิธีก่อน เลือก()หรือ ยกเลิกการโหลด ()เนื่องจากต้องใช้เวลาในการรวบรวม

ไม่ใช่การค้นพบสำหรับใครก็ตามที่ไม่พึงปรารถนาอย่างยิ่งที่จะใช้การสืบค้นในวัฏจักร สิ่งนี้อาจส่งผลกระทบอย่างมากต่อเวลาการทำงานของฟังก์ชันเฉพาะ เป็นที่พึงปรารถนาอย่างยิ่งที่จะรับข้อมูลทั้งหมดในคำขอ จากนั้นจึงประมวลผลข้อมูลในลูปเท่านั้น แต่บางครั้งก็มีบางกรณีที่ไม่สามารถนำคำขอออกจากลูปได้ ในกรณีนี้ เพื่อการเพิ่มประสิทธิภาพ คุณสามารถย้ายการสร้างคิวรีออกไปนอกลูป และแทนที่พารามิเตอร์ที่จำเป็นในลูปและดำเนินการคิวรี

คำขอ = คำขอใหม่; Query.Text = "SELECT | Clients.Link, | Clients.Date of Birth |FROM | Directory.Clients AS Clients |WHERE | Clients.Link = &Client"; สำหรับแต่ละแถวจาก TableClients Loop Query.SetParameter("Client", Client); QueryResult = Query.Execute().เลือก(); EndCycle;

สิ่งนี้จะช่วยไม่ให้ระบบแยกวิเคราะห์คำขอในลูป

11. การก่อสร้าง "มี"

การสร้างที่ค่อนข้างหายากในการค้นหา ให้คุณกำหนดเงื่อนไขกับค่าของฟังก์ชันรวม (SUM, MINIMUM, AVERAGE เป็นต้น) ตัวอย่างเช่น คุณต้องเลือกเฉพาะลูกค้าที่มีจำนวนการชำระเงินในเดือนกันยายนมากกว่า 13,000 รูเบิล หากคุณใช้เงื่อนไข "WHERE" อันดับแรก คุณจะต้องสร้างตารางชั่วคราวหรือแบบสอบถามที่ซ้อนกัน จัดกลุ่มบันทึกที่นั่นตามจำนวนเงินที่ชำระ แล้วจึงกำหนดเงื่อนไข โครงสร้าง "HAVING" จะช่วยหลีกเลี่ยงสิ่งนี้

เลือก Payment.Customer, SUM(Payment.Amount) AS Amount FROM Document.Payment AS Payment WHERE MONTH(Payment.Date) = 9 GROUP BY Payment.Customer HAVING AMOUNT(Payment.Amount) > 13000

ในคอนสตรัคเตอร์ สิ่งที่คุณต้องทำคือไปที่แท็บ "เงื่อนไข" เพิ่มเงื่อนไขใหม่และทำเครื่องหมายที่ช่องทำเครื่องหมาย "กำหนดเอง" จากนั้นเพียงแค่เขียน จำนวนเงิน(Payment.Amount) > 13000


12. ค่า Null

ฉันจะไม่อธิบายหลักการของตรรกะสามค่าที่นี่ในฐานข้อมูลมีบทความมากมายในหัวข้อนี้ เพียงแวบเดียวของวิธีการ โมฆะอาจส่งผลต่อผลลัพธ์ของแบบสอบถาม ค่า NULL ไม่ใช่ค่าจริง ๆ และไม่ทราบข้อเท็จจริงที่ว่าค่านั้นไม่ได้กำหนดไว้ ดังนั้น การดำเนินการใดๆ บน NULL จะส่งกลับค่า NULL ไม่ว่าจะเป็นการบวก การลบ การหาร หรือการเปรียบเทียบ ค่า NULL ไม่สามารถเปรียบเทียบกับค่า NULL ได้ เพราะเราไม่รู้ว่าจะเปรียบเทียบอะไร เหล่านั้น. การเปรียบเทียบทั้งสองนี้: NULL = NULL, NULL<>NULL ไม่เป็น True หรือ False ซึ่งไม่เป็นที่รู้จัก

ลองดูตัวอย่าง

สำหรับลูกค้าที่ไม่มีการชำระเงิน เราจำเป็นต้องแสดงฟิลด์ "แอตทริบิวต์" ด้วยค่า "ไม่มีการชำระเงิน" และเรารู้แน่นอนว่าเรามีลูกค้าดังกล่าว และเพื่อให้สะท้อนถึงแก่นแท้ของสิ่งที่ผมเขียนไว้ข้างต้น ลองทำวิธีนี้ดู

เลือก "ไม่มีการชำระเงิน" เป็นแอตทริบิวต์ NULL เป็นเอกสารใส่การชำระเงิน //////////////////////////////////////////////////////// / ////////////////////////////////// เลือก Clients.Link AS Client, Payment.Link AS Payment ใส่ tClientPayment จาก Directory.Clients AS Clients LEFT JOIN Document.Payment AS ซอฟต์แวร์การชำระเงิน Clients.Link = Payment.Shareholder; //////////////////////////////////////////////////////// / /////////////////////////////// เลือก tClientPayment.Customer จาก tClientPay AS tClientPayment INTERNAL JOIN topayments AS topayments BY tClientPayment.Payment = topayments. เอกสาร

ให้ความสนใจกับตารางชั่วคราวที่สอง tCustomerPayment ด้วยการเข้าร่วมด้านซ้าย ฉันเลือกลูกค้าทั้งหมดและการชำระเงินทั้งหมดสำหรับลูกค้าเหล่านี้ สำหรับลูกค้าที่ไม่มีการชำระเงิน ช่อง "ชำระเงิน" จะเป็นโมฆะ ตามตรรกะในตารางชั่วคราวแรก "topayments" ฉันกำหนด 2 ฟิลด์ หนึ่งในนั้นคือ NULL ส่วนที่สองคือบรรทัด "ไม่มีการชำระเงิน" ในตารางที่สาม ฉันเข้าร่วมตาราง "tClientPayment" และ "tPayment" โดยช่อง "การชำระเงิน" และ "เอกสาร" ด้วยการรวมภายใน เรารู้ว่าในตารางแรกฟิลด์ "เอกสาร" เป็นโมฆะและในตารางที่สองผู้ที่ไม่มีการชำระเงินในฟิลด์ "การชำระเงิน" จะเป็นโมฆะเช่นกัน อะไรจะคืนความสัมพันธ์ดังกล่าวให้กับเรา? และจะไม่ได้อะไรกลับมา เนื่องจากการเปรียบเทียบ NULL = NULL ไม่ได้ประเมินเป็น True

เพื่อให้แบบสอบถามส่งคืนผลลัพธ์ที่คาดไว้ให้เรา เราเขียนใหม่:

เลือก "ไม่มีการชำระเงิน" AS Sign, VALUE(Document. Payment. Empty Reference) AS Document PUT to Payments; //////////////////////////////////////////////////////// / ////////////////////////////////// SELECT Clients.Reference AS Client, ISNULL(Payment.Reference, VALUE(Document.Payment .EmptyReference )) วิธีใส่ tClientPayment จาก Directory.Clients AS Clients LEFT JOIN Document.Payment AS Payment ON Clients.Reference = Payment.Shareholder; //////////////////////////////////////////////////////// / /////////////////////////////// เลือก tClientPayment.Customer จาก tClientPay AS tClientPayment INTERNAL JOIN topayments AS topayments BY tClientPayment.Payment = topayments. เอกสาร

ตอนนี้ในตารางชั่วคราวที่สอง เราได้ระบุว่าหากฟิลด์ "การชำระเงิน" เป็นโมฆะ ฟิลด์นี้ = การอ้างอิงที่ว่างเปล่าไปยังเอกสารการชำระเงิน ในตารางแรก เรายังแทนที่ NULL ด้วยการอ้างอิงที่เป็นค่าว่าง ขณะนี้ฟิลด์ที่ไม่ใช่ค่า NULL มีส่วนเกี่ยวข้องในการเชื่อมต่อ และแบบสอบถามจะส่งคืนผลลัพธ์ที่คาดไว้

คำขอทั้งหมดที่อยู่ในบทความสะท้อนถึงสถานการณ์ที่ฉันต้องการพิจารณาและไม่มีอะไรเพิ่มเติม อ พวกเขาไม่สามารถบ้าหรือไม่ดีที่สุดสิ่งสำคัญคือการสะท้อนถึงสาระสำคัญของตัวอย่าง

13. คุณลักษณะการออกแบบที่ไม่มีเอกสาร "เลือกเมื่อ...แล้ว....จบ"

ในกรณีที่จำเป็นต้องอธิบายโครงสร้าง "เงื่อนไข" ในคำขอ เราจะใช้ไวยากรณ์มาตรฐาน:

เลือกตัวเลือกเมื่อ Users.Name = "Vasya Pupkin" จากนั้นเลือก "พนักงานคนโปรดของเรา" มิฉะนั้น "เราไม่ทราบสิ่งนี้" สิ้นสุดเป็น Field1 จาก Directory.Users เป็น Users

แต่ถ้าเราต้องการได้รับชื่อเดือนในแบบสอบถามล่ะ การเขียนโครงสร้างขนาดใหญ่ในคิวรีนั้นน่าเกลียดและใช้เวลานาน ดังนั้นรูปแบบสัญกรณ์ด้านบนนี้สามารถช่วยเราได้:

เลือกเดือน(US_Consumption Calculation_Turnover Schedule.Calculation Period) 1 ต่อ "มกราคม" 2 ต่อ "กุมภาพันธ์" 3 ต่อ "มีนาคม" 4 ต่อ "เมษายน" 5 5 ต่อ "พฤษภาคม" 6 ต่อ "มิถุนายน" 7 ต่อ " กรกฎาคม" เมื่อ 8 ถึง "สิงหาคม" เมื่อ 9 ถึง "กันยายน" เมื่อ 10 แล้ว "ตุลาคม" เมื่อ 11 ถึง "พฤศจิกายน" เมื่อ 12 แล้ว "ธันวาคม" จะสิ้นสุดเป็นเดือน

ตอนนี้การออกแบบดูไม่ยุ่งยากและรับรู้ได้ง่าย

14. การดำเนินการค้นหาแบบกลุ่ม


เพื่อไม่ให้สร้างคำขอ คุณสามารถสร้างคำขอขนาดใหญ่หนึ่งคำขอ แบ่งเป็นแพ็คเกจและทำงานกับมันได้แล้ว
ตัวอย่างเช่น ฉันต้องการรับฟิลด์จากไดเร็กทอรี "ผู้ใช้": "วันเกิด" และบทบาทที่มีให้สำหรับผู้ใช้แต่ละราย เพื่อยกเลิกการโหลดลงในส่วนต่างๆ ของตารางในแบบฟอร์ม แน่นอน คุณสามารถทำได้ในแบบสอบถามเดียว จากนั้นคุณต้องวนซ้ำระเบียนหรือยุบ หรือคุณสามารถทำเช่นนี้:

เลือก Users.Link AS Name, Users.Date of Birth, Users.Role ENTER Users from Directory.Users AS Users; //////////////////////////////////////////////////////// / ////////////////////////////////// เลือก tuUsers.Name, tuUsers.วันเกิดจาก tuUsers AS tuUsers GROUP BY tuUsers ชื่อผู้ใช้ วันเดือนปีเกิด; //////////////////////////////////////////////////////// / ////////////////////////////////// เลือก wUsers.Name, wUsers.Role จาก wUsers เป็น wUsers GROUP โดย wUsers.Name, ผู้ใช้ วันเดือนปีเกิด

tPackage = Request.ExecutePackage();

TP_BirthDate = tPackage.Unload();
TP_Roles = tPackage.Unload();

อย่างที่เราเห็น แบบสอบถามสามารถดำเนินการเป็นชุดและทำงานกับผลลัพธ์เป็นอาร์เรย์ ในบางกรณีสะดวกมาก

15. เงื่อนไขในคำขอแบทช์

ตัวอย่างเช่น เรามีคำขอเป็นชุด ซึ่งก่อนอื่นเราได้รับฟิลด์: "ชื่อ วันเกิด รหัส" จากไดเร็กทอรี "ผู้ใช้" และต้องการรับเร็กคอร์ดที่มีเงื่อนไขในฟิลด์เหล่านี้จากไดเร็กทอรี "บุคคล"

เลือก Users.Individual.Name AS Name, Users.Individual.Date of Birth AS Date of Birth, Users.Individual.Code AS Code PUT in Users FROM Directory.Users AS Users; //////////////////////////////////////////////////////// / ////////////////////////////// เลือกบุคคลเชื่อมโยงเป็นบุคคลจากไดเร็กทอรี บุคคลเป็นบุคคล

คุณสามารถใช้เงื่อนไขเช่นนี้:

WHERE Individuals.Code At (เลือก TueUsers.Code จาก TuUsers) และ Individuals.Name At (เลือก TueUsers.Code FROM TuUUsers) AND Individuals.Date of Birth At (เลือก TueUsers.Date of Birth FROM TuUsers)

และเป็นไปได้เช่นนี้:

WHERE (Individuals.Code, Individuals.Name, Individuals.Date of Birth) AT (เลือก TueUsers.Code, TueUsers.Name, TueUsers.Date of Birth FROM TueUsers)

และอย่าลืมปฏิบัติตามกฎ

16. เรียก Query Builder สำหรับ "เงื่อนไข" ใน Batch Query

เมื่อคุณต้องการกำหนดเงื่อนไขตามตัวอย่างด้านบน คุณสามารถลืมวิธีการเรียกฟิลด์นี้หรือฟิลด์นั้นในตารางเสมือนได้
ตัวอย่างเช่น คุณต้องกำหนดเงื่อนไขในฟิลด์ "วันเกิด" และในตารางเสมือนฟิลด์นี้เรียกว่า "วันเกิดของลูกหนี้" และหากคุณลืมชื่อ คุณจะต้องออกจากการแก้ไข เงื่อนไขโดยไม่ต้องบันทึกและดูที่ชื่อฟิลด์ เพื่อหลีกเลี่ยงปัญหานี้ คุณสามารถใช้เคล็ดลับต่อไปนี้

จำเป็นต้องใส่วงเล็บหลังโครงสร้าง "B" และเว้นช่องว่าง (ช่องว่าง) ระหว่างวงเล็บ เลือกสถานที่นี้แล้วเรียกตัวสร้างคิวรี ตัวสร้างจะสามารถเข้าถึงตารางคิวรีแบบกลุ่มทั้งหมดได้ แผนกต้อนรับทำงานได้ทั้งในตารางเสมือนของการลงทะเบียนและสำหรับแท็บ "เงื่อนไข" ในกรณีหลังนี้ จำเป็นต้องทำเครื่องหมายในช่องทำเครื่องหมาย "A (เงื่อนไขโดยพลการ)" และเข้าสู่โหมดการแก้ไข "F4"

ข้อความค้นหามักสร้างขึ้นในระหว่างการเดินทางและพวกเขาเพียงแค่แสดง "เคล็ดลับ" ที่ฉันกำลังพิจารณาอยู่

ฉันต้องการพิจารณาการใช้ดัชนีในการค้นหา แต่เป็นหัวข้อที่ครอบคลุมอย่างเจ็บปวด ฉันจะใส่ไว้ในบทความแยกต่างหากหรือเพิ่มในภายหลังที่นี่

อัพ1. วรรค 11,12
อัพ2. รายการที่ 13,14,15,16

หนังสือมือสอง:
1C:Enterprise 8 ภาษาสืบค้น - E.Yu ครุสทาเลฟ
การพัฒนาอย่างมืออาชีพในระบบ 1C: Enterprise 8

ความสนใจ! ต่อไปนี้เป็นบทเรียนเวอร์ชันทดลอง เนื้อหาอาจไม่สมบูรณ์

เข้าสู่ระบบในฐานะนักเรียน

ลงชื่อเข้าใช้ในฐานะนักเรียนเพื่อเข้าถึงเนื้อหาของโรงเรียน

ภาษาแบบสอบถาม 1C 8.3 สำหรับโปรแกรมเมอร์เริ่มต้น: ตัวดำเนินการแบบมีเงื่อนไข

คำสั่งเงื่อนไขในแบบสอบถาม

ลองเขียนแบบสอบถามที่ได้รับชื่อและแคลอรี่ของอาหาร:

และตอนนี้เรามาเพิ่มคอลัมน์ในผลการค้นหา ซึ่งเราจะแสดงปริมาณไขมันของอาหารตามกฎต่อไปนี้:

  • หากปริมาณแคลอรี่น้อยกว่า 100 แสดงว่าปริมาณไขมันต่ำ
  • หากปริมาณแคลอรี่อยู่ระหว่าง 100 ถึง 200 แสดงว่าปริมาณไขมันเป็นปกติ
  • หากปริมาณแคลอรี่มากกว่า 200 แสดงว่ามีไขมันสูง

วิธีนี้สามารถทำได้เพราะในตาราง Directory.อาหารไม่มีคอลัมน์ ปริมาณไขมัน?

ปรากฎว่าเราสามารถเพิ่มคอลัมน์นี้ได้เองโดยใช้ตัวดำเนินการเงื่อนไขภายในแบบสอบถาม:

มาดูข้อความคำขอให้ละเอียดยิ่งขึ้น:

ในส่วน เลือกฟิลด์การเลือกจะแสดงรายการ: ชื่อ, แคลอรี่จากนั้นแทนที่จะเป็นฟิลด์ที่สามมีการสร้างตัวดำเนินการตามเงื่อนไขซึ่งผลลัพธ์จะอยู่ในคอลัมน์ที่สาม

เงื่อนไขการใช้งาน ประมวลผลตามลำดับ. หากหนึ่งในนั้นกลายเป็นจริง ค่าที่สอดคล้องกันจะถูกส่งกลับเป็นผลลัพธ์ หากไม่ตรงตามเงื่อนไข ระบบจะส่งคืนค่าจากส่วน มิฉะนั้น.

ดังนั้นแบบสอบถามใหม่จะส่งคืนตารางต่อไปนี้:

ล่าถอย

โปรดทราบว่ามีการเรียกใช้คอลัมน์ที่สามในตารางที่ส่งคืนโดยแบบสอบถาม สนาม1. ชื่อนี้ถูกสร้างขึ้นโดยอัตโนมัติโดยระบบ เนื่องจากคอลัมน์ที่สามไม่ตรงกับฟิลด์จริงใดๆ ในตาราง Directory.อาหารจากที่มันเป็นไปได้ที่จะได้รับชื่อนี้

แต่อยู่ในอำนาจของเราที่จะตั้งชื่อนี้ให้เธอ ในการดำเนินการนี้ คุณต้องเขียนคำหลักทันทีหลังจากคำอธิบายฟิลด์ อย่างไรและหลังจากนั้นให้ระบุชื่อตัวเองโดยคั่นด้วยช่องว่าง คุณกำลังอ่านบทเรียนเวอร์ชันทดลอง บทเรียนฉบับเต็มจะอยู่ ชื่อนี้จะถูกเรียก นามแฝงของฟิลด์.

สามารถกำหนดนามแฝงให้กับฟิลด์ใดก็ได้ รวมถึงนามแฝงที่มีชื่ออยู่แล้ว มาสร้างนามแฝงกันเถอะ อาหารสำหรับสนาม ชื่อ:

ตัวอย่างการใช้งานฟังก์ชั่น สตริงย่อย:

SELECT Name, SELECT WHEN SUBSTRING(Name, 1 , 3 ) = "Ban" ตามด้วย "This is a banana" เมื่อ SUBSTRING(Name, 1 , 2 ) = "Chi" ตามด้วย "This is a banana" อื่น ๆ "อย่างอื่น" สิ้นสุด ไดเร็กทอรี . อาหาร

ผลลัพธ์ตามเงื่อนไขที่ซับซ้อนยิ่งขึ้น

ผลลัพธ์ของตัวดำเนินการตามเงื่อนไขสามารถเป็นได้ทั้งสตริง แต่ยังเป็นตัวเลข วันที่ บูลีน หรือประเภทการอ้างอิงอีกด้วย อาจเป็นค่าคงที่ของประเภทที่แสดงด้านบนหรือช่องตารางก็ได้ คุณกำลังอ่านบทเรียนเวอร์ชันทดลอง บทเรียนฉบับเต็มจะอยู่

นี่คือตัวอย่างทั่วไปที่แสดงให้เห็นถึงตัวเลือกเหล่านี้ทั้งหมด:

ทำแบบทดสอบ

เริ่มการทดสอบ

1. เงื่อนไขของคำสั่ง select (ตามที่เรียกว่า) ได้รับการประมวลผล

2. ตัวดำเนินการตามเงื่อนไขจะส่งกลับเสมอ

3. หากไม่มีเงื่อนไขใดทำงาน คำสั่ง select จะส่งกลับค่า

4. ส่วน ELSE ในคำสั่งเงื่อนไข

5. ในเงื่อนไขของคำสั่งการเลือกสามารถใช้ได้

วิธีตั้งค่าตัวกรองตามประเภทเอกสาร
จะระบุเงื่อนไขสำหรับการเลือกค่าที่ไม่ได้กำหนดได้อย่างไร?
จะเลือกค่าว่างในภาษาแบบสอบถาม 1C ได้อย่างไร
ควรระบุเงื่อนไขใดในคำขอหลังคำหลัก "WHERE" เมื่อจำเป็นต้องทำการเลือกในฟิลด์ว่าง

รหัส 1C v 8.x Request.Text =
"เลือก
| usStorageUnits.Reference
| จาก
| Reference.usStorageUnit AS usStorageUnit"

// ตัวอย่างที่ 1 เปรียบเทียบกับค่าบูลีนว่าง:
|ที่ไหน
| setStorageUnit.Allow SelectionFromStandbyZone = False

// ตัวอย่างที่ 2 แต่ถ้ากำหนดบูลีนนี้ จะดีกว่า: // เงื่อนไขบนบูลีนเชิงลบ:
|ที่ไหน
| ไม่ใช่กับ StorageUnits อนุญาตการถอนจาก StandbyZone

// ตัวอย่างที่ 3. การเลือกตามเงื่อนไขของฟิลด์ว่างประเภท "อ้างอิงประเภทคอนกรีต"
|ที่ไหน
| setStorageUnit.ActiveFilterRegion = VALUE (Catalog.FilterRegion us.NullReference)

// ตัวอย่างที่ 3ก. การเลือกตามเงื่อนไขของฟิลด์ว่างประเภท "เอกสารประเภทเฉพาะ"
|ที่ไหน
| OurInformationRegister.Document = VALUE(Document.OurDocument.EmptyReference)

// ตัวอย่างที่ 3b. การเลือกตามเงื่อนไขของฟิลด์ว่างประเภท "เอกสารประเภทต่างๆ" (ฟิลด์ผสม)
|ที่ไหน
| (OurInformationRegister.Document = VALUE(Document.YourDocument1.EmptyReference)
| หรือทะเบียนข้อมูลเอกสารของเรา = VALUE(Document.OurDocument2.EmptyReference)
| หรือ...(ฯลฯ - แสดงรายการเงื่อนไขสำหรับฟิลด์ผสมนี้ทุกประเภทที่เป็นไปได้ตามลำดับ))

// ตัวอย่างที่ 4 หรือในทางกลับกัน หากคุณต้องการเลือกค่าที่เติมของประเภท "สตริง" เงื่อนไขจะช่วย:
|ที่ไหน
| usStorageUnits.Name > """"

// ตัวอย่างที่ 5 หากคุณต้องการเลือกเอกสารประเภทเฉพาะด้วยประเภทข้อมูลผสมเช่นในการลงทะเบียน "Executed Tasks" ทรัพยากร "Task" จะมีประเภทคอมโพสิตซึ่งอยู่ในค่าต่างๆ เอกสาร "การเลือก" ได้
|ที่ไหน
| EXPRESS(InformationRegisterJobs to be operation.Job AS Document.Filter) REF Document.Filter

// ตัวอย่างที่ 5a อีกตัวอย่างที่คล้ายกันเมื่อคุณต้องการเลือกเอกสารประเภทใดประเภทหนึ่ง
| ทางเลือก
| เมื่อใดที่จะแสดง(ar การโต้ตอบของเอกสารDocumentBU AS Document.Incoming Goods of Services) เอกสารอ้างอิง.สินค้าขาเข้าของบริการ
| จากนั้น ""สินค้า/บริการที่เข้ามา""
| เมื่อใดที่จะแสดง (ar การโต้ตอบของเอกสารDocumentBU AS Document.Sales of Goods of Services) เอกสารอ้างอิงการขายสินค้าบริการ
| แล้ว ""การรับรู้ของสินค้าและบริการ""
| มิฉะนั้น """"
| สิ้นสุดเป็น KindDocument

// ตัวอย่างที่ 6. การเลือกตามเงื่อนไขของค่าที่ไม่ได้กำหนด:
|ที่ไหน
| SavedSettings.User = ไม่ได้กำหนด

// ตัวอย่างที่ 7. การเลือกตามประเภทของการเคลื่อนไหว "ขาเข้า" ของการลงทะเบียนสะสม "ค่าใช้จ่าย" - ในทำนองเดียวกัน):
|ที่ไหน
| RegGoodsRetail.MovementType = VALUE(MovementAccumulationType.Income)

// ตัวอย่างที่ 8 วิธีระบุในคำขอว่าไม่จำเป็นต้องดำเนินการตามคำขอ (เช่น จำเป็นโดยทางโปรแกรม ทั้งนี้ขึ้นอยู่กับบาง
// เงื่อนไขเพื่อส่งคืนผลลัพธ์การค้นหาที่ว่างเปล่า -
// Query.Text = StrReplace(Query.Text, "WHERE Document.Link = &DocumentLink", "WHERE FALSE");).
// ในการทำเช่นนี้ เพียงเพิ่มเงื่อนไข "Where is False"
// อย่างไรก็ตาม โดยไม่คำนึงถึงจำนวนข้อมูลที่ร้องขอในตัวอย่าง คำขอดังกล่าวจะถูกดำเนินการทันที
|จะนอนที่ไหน

// ตัวอย่างที่ 9 การตรวจสอบว่าผลการสืบค้นมีข้อมูลหรือไม่:
ถ้าไม่ Request.Run().Empty() แล้วก็

// ตัวอย่างที่ 10. การเลือกตามเงื่อนไขของวันที่ว่าง:
|ที่ไหน
| tbRows.CancellationDate = DATETIME(1, 1, 1)

บทความนี้มีเคล็ดลับที่เป็นประโยชน์เมื่อทำงานกับข้อความค้นหา 1C v.8.2 รวมถึงข้อมูลที่ไม่ค่อยเป็นที่รู้จักเกี่ยวกับภาษาข้อความค้นหา ฉันไม่ต้องการให้คำอธิบายที่สมบูรณ์ของภาษาที่ใช้ค้นหา แต่ฉันต้องการที่จะอยู่เฉพาะในบางประเด็นที่อาจเป็นประโยชน์กับบางคน

มาเริ่มกันเลย คำขอเป็นวัตถุพิเศษใน 1C 8.2ที่ใช้ในการจัดรูปแบบและดำเนินการค้นหากับตารางฐานข้อมูลในระบบ ในการเรียกใช้คิวรี คุณต้องเขียนข้อความคิวรีที่อธิบายว่าตารางใดจะถูกใช้เป็นแหล่งข้อมูลคิวรี ฟิลด์ที่จะเลือก การเรียงลำดับและการจัดกลุ่มที่จะใช้ ฯลฯ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับแบบสอบถามได้ในหนังสือ "1C 8.2 Developer's Guide" ภาษาเคียวรี 1C 8.2 นั้นคล้ายกันมากในไวยากรณ์กับภาษาเคียวรีฐานข้อมูล SQL อื่นๆ แต่มีความแตกต่าง ข้อดีหลัก ๆ ของภาษาเคียวรีในตัว เป็นสิ่งที่ควรค่าแก่การสังเกตจากการอ้างอิงฟิลด์ การมีอยู่ของตารางเสมือน การทำงานที่สะดวกกับผลรวม และฟิลด์ที่ไม่ได้พิมพ์ในเคียวรี ข้อเสีย - คุณไม่สามารถใช้คิวรีเป็นฟิลด์เอาต์พุตได้ ไม่สามารถใช้โพรซีเดอร์ที่เก็บไว้ได้ คุณไม่สามารถแปลงสตริงเป็นตัวเลขได้

ฉันจะให้ข้อมูลและคำแนะนำเกี่ยวกับภาษาที่ใช้ค้นหาทีละจุด:
1. เพื่อเพิ่มความสามารถในการอ่านของแบบสอบถามและลดจำนวนของพารามิเตอร์แบบสอบถาม คุณสามารถใช้การเข้าถึงข้อมูลการกำหนดค่าที่กำหนดไว้ล่วงหน้าในการเข้าถึงแบบสอบถามโดยใช้ตัวอักษร มูลค่า (ตัวแทนมูลค่า)เป็นตัวแทนของค่า, ค่าของการแจงนับ, ข้อมูลที่กำหนดไว้ล่วงหน้าของหนังสืออ้างอิง, แผนประเภทการคำนวณ, แผนประเภทลักษณะ, ผังบัญชี, การอ้างอิงที่ว่างเปล่า, ค่าของจุดอ้างอิง, ค่าของการแจงนับระบบ (ตัวอย่างเช่น , AccumulationMovementType, AccountType) สามารถใช้ได้
ตัวอย่าง:

WHERE เมือง = VALUE(Directory.Cities.Moscow)
WHERE City = VALUE(Reference.Cities.EmptyReference)
WHEREItemType = VALUE(การแจงนับ ProductTypes.Service)
WHEREMovementType = VALUE(MovementTypeAccumulation.Income)
WHERERoutePoint =
VALUE(BusinessProcess.Consent.RoutePoint.Consent)

นิพจน์ที่อยู่ในวงเล็บจะเริ่มต้นด้วยคำเอกพจน์ (Directory, Enumeration เป็นต้น) ที่ตรงกับประเภทของค่าที่กำหนดไว้ล่วงหน้าเสมอ

2. การสั่งซื้ออัตโนมัติในแบบสอบถามอาจทำให้กระบวนการช้าลงอย่างมาก หากไม่ต้องการการเรียงลำดับ จะเป็นการดีกว่าที่จะไม่ใช้เลย ในหลายกรณี การเขียนการเรียงลำดับด้วยคีย์เวิร์ดจะมีประสิทธิภาพมากกว่า จัดเรียงตาม.

3. ต้องใช้ความระมัดระวังที่จะไม่สร้างฟิลด์ที่ไม่ชัดเจนเมื่อใช้นามแฝง มิฉะนั้นระบบจะไม่เข้าใจว่าควรเข้าถึงวัตถุใด
ตัวอย่างของแบบสอบถามที่มีฟิลด์กำกวม:
เลือก
ระบบการตั้งชื่อ ลิงค์
สินค้าคงเหลือ จำนวนคงเหลือ จำนวนคงเหลือ
จาก
สารบบ. ระบบการตั้งชื่อ AS ระบบการตั้งชื่อ
ซ้ายเข้าร่วม
ซากซอฟต์แวร์ของสินค้าคงเหลือ
จำเป็นต้องแก้ไขนามแฝงของตาราง ตัวอย่างเช่น "Directory.Nomenclature AS Nomenclature1" และ "Nomenclature.Reference" ตามลำดับ แก้ไขเป็น "Nomenclature1.Reference"

4. บางครั้ง การแสดงฟิลด์อ้างอิงด้วยคำหลักก็มีประโยชน์ ประสิทธิภาพพร้อมกับลิงก์เพื่อไม่ให้มีการเข้าถึงฐานข้อมูลซ้ำ สิ่งนี้มีประโยชน์เมื่อแสดงผลของแบบสอบถามในตาราง
ตัวอย่าง:
เลือก
ตัวแทน (Document.Contractor) เป็นผู้รับ
ตัวแทน (Document.Base)
จาก
Document.Invoice เป็นเอกสาร

5. การใช้งานตามคำขอ EXPRESS (ฟิลด์ AS ประเภท)ช่วยให้คุณสามารถลบตารางที่ไม่จำเป็นออกจากการเชื่อมต่อกับเขตข้อมูลของประเภทข้อมูลผสม สิ่งนี้จะช่วยเร่งการดำเนินการตามคำขอ
ตัวอย่าง (นายทะเบียนเป็นฟิลด์ที่มีประเภทผสมสำหรับตารางทางกายภาพของการลงทะเบียนการสะสมของสินค้าคงเหลือ เลือกวันที่และหมายเลขของเอกสารการรับสินค้าในขณะที่เข้าถึงรายละเอียดของเอกสารวันที่ และหมายเลขผ่านนายทะเบียน ไม่มีการเชื่อมต่อหลายรายการของตารางทะเบียนกับตารางเอกสารที่เป็นนายทะเบียนสำหรับทะเบียนซากสินค้า ):
เลือกที่แตกต่างกัน[b] EXPRESS(สินค้าคงค้าง.นายทะเบียนเป็นเอกสาร.รับสินค้า).หมายเลข AS RECEIVED NUMBER,
[b]EXPRESS(สินค้าคงคลัง.นายทะเบียนเป็นเอกสารรับสินค้า).วันที่เป็นวันที่ได้รับ
[b] จาก ทะเบียนสะสมของคงเหลือ AS สินค้าคงเหลือ ที่ไหน (EXPRESS(Remains of Goods.Registrar AS Document.Incoming Goods) ไม่เป็นโมฆะ)

6. เมื่อมีผู้ใช้ในคอนฟิกูเรชัน 1C ที่มีสิทธิ์จำกัดเฉพาะอ็อบเจกต์คอนฟิกูเรชันบางอย่าง ต้องใช้คีย์เวิร์ดในการร้องขอไปยังอ็อบเจกต์ดังกล่าว อนุญาตเพื่อให้แบบสอบถามเสร็จสมบูรณ์โดยไม่มีข้อผิดพลาด (เลือกอนุญาต...)

7. เมื่อรวมตารางที่มีตารางซ้อนกัน (เช่น เอกสารที่มีส่วนตาราง) คำหลักจะมีประโยชน์ ตารางว่างตัวอย่างเช่น เมื่อหนึ่งในเอกสารไม่มีส่วนตาราง
ตัวอย่าง:
เลือก Reference.Number, EMPTYTABLE.(Nom, Tov, Qty) เป็นองค์ประกอบ

รวมกันทั้งหมด
เลือก Reference.Number, Composition.(LineNumber, Nomenclature, Quantity)
จาก Document.Invoice

8. เมื่อทำงานกับการรวมตารางที่มีแถวละหนึ่งแถว อาจจำเป็นต้องติดกาวแถวของตาราง (ในเวลาเดียวกัน ทั้งสองตารางไม่มีเขตข้อมูลที่สามารถรวมเข้าด้วยกันได้) สามารถทำได้โดยใช้ " FULL JOIN ตารางโดย TRUE". หากตารางมีมากกว่าหนึ่งแถว ผลลัพธ์จะเป็นจำนวนแถวเท่ากับผลคูณของจำนวนแถวในทั้งสองตาราง หากมีแถว O ในตารางหนึ่ง จำนวนแถวในตารางผลลัพธ์จะเท่ากับจำนวนแถวในตารางที่สอง นอกจากนี้ ในการรวมตารางดังกล่าว คุณสามารถใช้ผลคูณคาร์ทีเซียนของตาราง ซึ่งตารางผลลัพธ์จะมีชุดค่าผสมของแถวทั้งหมดจากทั้งสองตาราง เราต้องจำไว้ว่าหากหนึ่งในตารางมี 0 แถว ผลคูณคาร์ทีเซียนจะเป็น 0 ดังนั้นการรวมแบบเต็มจะดีกว่า โดยทั่วไปแทนที่จะเป็นการเชื่อมต่อแบบเต็ม บนจริงคุณสามารถใช้การรวมประเภทอื่นก็ได้ แต่ในกรณีนี้ เป็นไปได้เช่นกันที่ตารางผลลัพธ์จะมี 0 แถว แม้ว่าตารางใดตารางหนึ่งจะมีจำนวนแถวที่ไม่เป็นศูนย์ก็ตาม ในกรณีของการรวมแบบเต็ม สถานการณ์นี้จะเกิดขึ้นในกรณีเดียวเท่านั้น ถ้าจำนวนแถวในตารางทั้งสองเป็น 0 หากคุณทราบว่ามีอย่างน้อยหนึ่งแถวในตารางพอดี คุณสามารถใช้ ซ้ายเข้าร่วมกับโต๊ะอื่นที่มีเงื่อนไข บนจริง.
ตัวอย่าง (แม้ว่าจะประดิษฐ์ขึ้นสำหรับการเชื่อมต่อแบบเต็ม):
เลือก
อันดับแรก 1
เพศลิงค์,
K.ผู้รับเหมา
จาก
Enum เพศ AS เพศ
FULL JOIN (เลือก 1 D.ผู้รับเหมาจากเอกสารการขายสินค้า HOW TO สั่งซื้อโดย D.Point In Time) HOW TO
เปิด (จริง)

9. เพื่อให้ได้ระเบียนเฉพาะสำหรับบางฟิลด์ การใช้คำหลักแทนการจัดกลุ่มจะถูกต้องกว่า หลากหลายในแบบสอบถามเนื่องจากโครงสร้างดังกล่าวมีความชัดเจนและคำหลัก กลุ่มโดยมีแอปพลิเคชันที่กว้างกว่าและมักใช้หากจำเป็นเพิ่มเติมในการคำนวณฟังก์ชันรวมตามการจัดกลุ่ม ในบางกรณี จำเป็นต้องแสดงจำนวนบรรทัดที่จำกัด ในการทำเช่นนี้ ในรายละเอียดของคำขอ คุณต้องระบุคำหลักในคำอธิบายคำขอ แรกและหลังจากนั้น - จำนวนบรรทัดที่ต้องการ
ตัวอย่างสำหรับ แรก:
เลือกอันดับแรก 5
ทำเนียบ. นาม. ชื่อ,
Directory.Nomenclature.PurchasePrice
เรียงตาม
Directory.Nomenclature.PurchasingDesc.ราคา
ตัวอย่างสำหรับ หลากหลาย:
เลือก ต่างๆ
เอกสาร.รายจ่าย.คู่สัญญา

ฟังก์ชัน 10.Aggregate ในแบบสอบถามสามารถใช้ได้โดยไม่ต้องใช้คำหลัก กลุ่ม. ในกรณีนี้ ผลลัพธ์ทั้งหมดจะถูกจัดกลุ่มเป็นหนึ่งบรรทัด
ตัวอย่าง:
เลือก
จำนวนเงิน (Invoice.Amount) เป็นจำนวนเงิน
จาก
Document.Invoice.Composition As Invoice

11.ในแบบสอบถามในช่องการเลือก คุณสามารถเข้าถึงรายละเอียดของช่องการเลือกได้อย่างอิสระ คุณลักษณะนี้เรียกว่าการยกเลิกการอ้างอิงฟิลด์การเลือก หากแหล่งข้อมูลเป็นตารางที่ซ้อนกัน (ส่วนตารางของเอกสาร) จากนั้นในฟิลด์การเลือก คุณยังสามารถอ้างอิงถึงฟิลด์ของตารางหลัก (ตัวอย่างเช่น ผ่านฟิลด์ลิงก์ เข้าถึงฟิลด์ของคู่สัญญาของตารางหลัก)
ตัวอย่าง:
เลือก[ข] การรับสินค้า และบริการ สินค้า จำนวน AS จำนวน การรับสินค้าและบริการ สินค้า. ลิงค์. คู่สัญญา จาก ที่ไหน
มีลักษณะเฉพาะประการหนึ่งของการใช้ฟิลด์ dereferencing หากมีการจัดกลุ่มในคำขอ ในการสอบถามใดๆ ที่มีการจัดกลุ่มในรายการของฟิลด์การสืบค้น คุณสามารถเข้าถึงรายละเอียดของฟิลด์การจัดกลุ่มได้อย่างอิสระ
ตัวอย่าง:
เลือก
การรับสินค้าและบริการ ระบบการตั้งชื่อ
การรับสินค้าและบริการ Goods.Nomenclature.Code,
SUM (สินค้าและบริการขาเข้า ปริมาณ) AS ปริมาณ
การรับสินค้าและบริการ สินค้า อ้างอิง คู่สัญญา
การรับสินค้าและบริการ สินค้า. อ้างอิง. วันที่
จาก
เอกสาร การรับสินค้าและบริการ Goods AS การรับสินค้าและบริการ
ที่ไหน
ใบเสร็จรับเงินสินค้าและบริการ Link = & Link
กลุ่มโดย
การรับสินค้าและบริการ ระบบการตั้งชื่อ
การรับสินค้าและบริการ ลิงค์
วิธีใช้ 1C บอกว่าหากมีการจัดกลุ่ม เฉพาะฟิลด์การจัดกลุ่มและฟังก์ชันรวมตามฟิลด์ที่เลือกเท่านั้นที่สามารถเข้าร่วมในฟิลด์การเลือกคิวรีได้ มีข้อยกเว้นอย่างหนึ่งเมื่อนำฟังก์ชันการรวมไปใช้กับเขตข้อมูลของตารางที่ซ้อนกัน ในกรณีนี้ ในรายการของฟิลด์การเลือก คุณสามารถอ้างถึงฟิลด์ของตารางระดับบนสุด โดยไม่ต้องจัดกลุ่มผลลัพธ์ตามฟิลด์เหล่านี้
ตัวอย่าง:
เลือก
การรับสินค้าและบริการ สินค้า. (SUM (ปริมาณ), ระบบการตั้งชื่อ),
การรับสินค้าและบริการ ลิงค์
การรับสินค้าและบริการ คู่สัญญา
จาก
เอกสาร การรับสินค้าและบริการ AS การรับสินค้าและบริการ
กลุ่มโดย
การรับสินค้าและบริการ สินค้า. (ระบบการตั้งชื่อ)

12. บางครั้ง แทนที่จะระบุฟิลด์ในการจัดกลุ่ม การใส่พารามิเตอร์ลงในฟิลด์การเลือกคิวรีจะมีประโยชน์:
เลือก DocGoods ระบบการตั้งชื่อ &ผู้รับเหมา &ระยะเวลา, SUM(DocProducts.Quantity * DocProducts.K) AS ปริมาณ SUM(DocProducts.Sum) เป็นผลรวม จาก Document.Receipt.Goods AS DocGoods ที่ไหน DocProducts.Link = &ลิงก์
กลุ่มโดย DocProducts.Nomenclature
จากนั้นตั้งค่าพารามิเตอร์ในเนื้อหาคำขอ:
Query.SetParameter("&บัญชี", SelectAccount);
Query.SetParameter("&ระยะเวลา", วันที่);

13. ในแบบสอบถามสากล พารามิเตอร์สามารถใช้ในคำอธิบายของแหล่งข้อมูลแบบสอบถามในเงื่อนไข ที่ไหน,ในเงื่อนไขการเข้าร่วมตารางและการตั้งค่าตารางเสมือน มีสองเทคนิคในการสร้างข้อความค้นหาทั่วไป:
ก) ใช้กลไกการต่อข้อความสตริง เพิ่มตัวแปรให้กับข้อความค้นหา
ตัวอย่างที่ 1:

OrderType = ?(SOMEVARIABLE,"","DESC");
Query.Text = "เลือก... สั่งซื้อซอฟต์แวร์ Field1 " + OrderingType + "...";
ตัวอย่างที่ 2:
Query.Text = "เลือกฟิลด์ 1...";

ถ้า SOMEVARIABLE = 1 แล้ว
Request.Text = Request.Text + ",Field2 ...";
สิ้นสุดถ้า;
B) ใช้พารามิเตอร์ในส่วนต่างๆ ของคิวรี (เช่น ในส่วนแหล่งข้อมูลของคิวรี) จากนั้นใช้เมธอดภาษาในตัว - สเตรเพลส()เมื่อออกแบบแบบสอบถามทั่วไป การอ้างถึงคุณสมบัติของวัตถุจะเป็นประโยชน์ ข้อมูลเมตา()ซึ่งคุณสามารถกำหนดชื่อตารางสำหรับบางลิงค์ได้ (เช่น สำหรับเอกสาร จะเป็นแบบนี้ - ลิงค์ . METADATA().NAME) ผ่านพารามิเตอร์ไปยังขั้นตอนสากลบางอย่าง
ตัวอย่าง:
เลือก
Doc.Nomenclature,
...
จาก
&SomeDocTC เป็น DocTC
จากนั้นตั้งค่าพารามิเตอร์ในเนื้อหาคำขอ
Query.Text = StrReplace(Query.Text, "&SomeDocTCH", "Document."+Link.Metadata().Name+".สินค้า");

สามารถใช้พารามิเตอร์ในเงื่อนไขการสืบค้นเพื่อรวมเงื่อนไขเพิ่มเติม &พารามิเตอร์หรือไม่คุณสมบัติบางอย่าง:
Query.SetParameter(“&พารามิเตอร์”, “Account.Name=””Ivanov”””);
ด้วยอักษร จริงคุณสามารถลบตัวกรองบางอย่างในแบบสอบถามได้
Query.SetParameter("&พารามิเตอร์", จริง);

14. มีประโยชน์มากในตัวออกแบบแบบสอบถามคือคำสั่งเมนูบริบทตาราง - " เปลี่ยนชื่อตาราง..." ซึ่งคุณสามารถสร้างชื่อสามัญสำหรับแหล่งข้อมูลได้ หากต้องการสร้างคิวรีไปยังตารางประเภทเดียวกันที่มีโครงสร้างคล้ายกัน จะมีประโยชน์สำหรับตารางที่สองในการคัดลอกข้อความคิวรีของตารางแรก ไป ไปที่หน้าต่างตัวออกแบบแบบสอบถามและเลือกรายการในเมนูบริบทของตาราง - เปลี่ยนโต๊ะ...และเลือกตารางที่สอง

15. เมื่อทำงานกับการสร้างคิวรีที่ซ้อนกันในเงื่อนไขหรือพารามิเตอร์ของตารางเสมือนของตัวออกแบบคิวรี จะใช้เทคนิคการเน้นช่องว่างในวงเล็บ จากนั้นรายการ "ตัวสร้างคิวรี" จะปรากฏในเมนูบริบท และเมื่อแก้ไข ข้อความค้นหาที่ซ้อนกัน ข้อความค้นหาทั้งหมดในวงเล็บเหลี่ยมจะถูกเลือกในเงื่อนไข
ตัวอย่างแบบสอบถามย่อย:
รายการ B (เลือกระบบการตั้งชื่อ...)

16. เมื่อออกแบบรายงาน ACS ในแบบสอบถามเพื่อลงทะเบียนยอดคงเหลือ การใช้นิพจน์เป็นพารามิเตอร์ระยะเวลาจะสะดวกและถูกต้องกว่า AddKDate(ระยะเวลาสิ้นสุด(ระยะเวลา,วัน),วินาที,1)เนื่องจากจะได้รับยอดคงเหลือเสมือนจริงเมื่อต้นงวด ไม่รวมวินาทีสุดท้าย การรับ +1 วินาทีไม่สามารถใช้กับเอกสารได้: ตามวิธีการใหม่ในการโพสต์เอกสาร จะต้องได้รับยอดคงเหลือในการลงทะเบียนสำหรับระยะเวลาที่กำหนดโดยออบเจกต์ขอบเขตพร้อมเวลาของเอกสารรวมถึง (และไม่ใช่ในวันที่ของเอกสาร +1 วินาที! ) แต่ตามวิธีการโพสต์แบบเก่า - ณ เวลาของเอกสาร (ไม่ใช่ ณ วันที่ของเอกสาร!) เมื่อวิเคราะห์การหมุนเวียนหรือข้อมูลในช่วงเวลาหนึ่ง การเพิ่มพารามิเตอร์ด้วยประเภทจะสะดวก ระยะเวลามาตรฐาน(ในกรณีนี้ ไม่จำเป็นต้องระบุวันที่สุดท้ายของช่วงเวลาเมื่อสิ้นสุดวัน) ในช่องมาตรฐาน "StartPeriod" ในช่อง "Expression" คุณต้องเขียน "&ระยะเวลา วันที่เริ่มต้น". และสำหรับฟิลด์มาตรฐาน "EndPeriod" ในช่อง "Expression" ให้เขียน " &ระยะเวลาวันที่สิ้นสุด"ไม่พบข้อมูลที่เป็นประโยชน์มากมายเกี่ยวกับภาษาคิวรีในตัวช่วยไวยากรณ์ แต่อยู่ในความช่วยเหลือเต็มรูปแบบของเครื่องมือกำหนดค่า 1C 8.2 (ปุ่ม F1)

ฟังก์ชั่น 17.Inquiry โมฆะ(เขียนฉบับภาษาอังกฤษจะสะดวกกว่า เป็นโมฆะ) มักใช้เพื่อกำจัดค่า Null สำหรับฟิลด์เคียวรีที่เป็นตัวเลข ในบางกรณี เช่น การรวมสองตารางอย่างสมบูรณ์ ฟังก์ชัน IsNull (พารามิเตอร์ 1, พารามิเตอร์ 2)สามารถแทนที่การออกแบบได้สำเร็จ เลือกเมื่อ...แล้ว..อย่างอื่น....สิ้นสุดเมื่อสำหรับบางฟิลด์ ค่า NULL สามารถเป็นได้ทั้งในตารางแรกและตารางที่สอง (โครงสร้างนี้ช่วยให้คุณได้รับค่าที่ไม่ใช่ Null สำหรับฟิลด์) แต่เราต้องจำไว้ว่า ไม่เหมือนตัวดำเนินการตามเงื่อนไข ทางเลือกการทำงาน โมฆะโยนประเภทของอาร์กิวเมนต์ที่สองเป็นประเภทของอาร์กิวเมนต์แรก ซึ่งต้องนำมาพิจารณาหากประเภทของอาร์กิวเมนต์แตกต่างกัน!
ตัวอย่าง:
IsNull (Reg.Remainder,0)
IsNull(Doc.Item,Doc1.Nomenclature)

18. การก่อสร้างแบบมีเงื่อนไข ทางเลือกมีไวยากรณ์ทางเลือกสำหรับกรณีง่าย ๆ ของการตรวจสอบความเท่าเทียมกันกับค่าหนึ่ง ๆ แต่ไม่มีเอกสาร:
การแสดงออกของตัวเลือกเมื่อ 1 จากนั้น "สูงสุด" เมื่อ 2 จากนั้น "ปานกลาง" อื่น ๆ "ล่าง"

19.ตัวดำเนินการทดสอบ NULL โมฆะ(แนะนำให้ใช้ฉบับภาษาอังกฤษ เป็นโมฆะ). โครงสร้างนี้ปรากฏขึ้นเนื่องจากการดำเนินการเปรียบเทียบใดๆ ของค่าสองค่า อย่างน้อยหนึ่งค่าเป็น Null จะเป็นเท็จเสมอ เขียน โดยที่ Name = Nullไม่ถูก. แบบฟอร์มการปฏิเสธของตัวดำเนินการนี้ก็น่าสนใจเช่นกัน ไม่เป็นโมฆะ- ผิดแต่ถูก ไม่เป็นโมฆะหรือแบบ ไม่ใช่ (Field1 เป็นโมฆะ)- นี่เป็นข้อแตกต่างที่สำคัญจากตัวดำเนินการทั้งหมดที่ใช้ร่วมกับตัวดำเนินการ He

20. แบบฟอร์มตัวดำเนินการบางครั้งก็มีประโยชน์ ที่เพื่อตรวจสอบการจับคู่กับค่าใดค่าหนึ่งในรายการ
ตัวอย่าง:
...สินค้าอยู่ที่ไหนคำอธิบาย B ("เครื่องใช้ภายในบ้าน","คอมพิวเตอร์")
สำหรับไดเร็กทอรี แบบฟอร์มตัวดำเนินการจะมีประโยชน์ ที่การตรวจสอบความเป็นสมาชิกแบบลำดับชั้น
ตัวอย่าง:
...ระบบการตั้งชื่ออยู่ที่ไหนในลำดับชั้น (&กลุ่ม)
โอเปอเรเตอร์ ที่มักใช้เพื่อตรวจสอบว่ามีค่ารวมอยู่ในผลลัพธ์ของเคียวรีย่อยหรือไม่
ตัวอย่าง:
...ที่ Nomenclature.Reference In (เลือก Nomenclature.Reference...).
ในคิวรีแบบซ้อน คุณสามารถเข้าถึงฟิลด์ของคิวรีภายนอกในเงื่อนไข
ตัวอย่าง:
// เลือกชื่อผลิตภัณฑ์ที่มีอยู่
// ในใบแจ้งหนี้
เลือก
Products.Name
จาก
ไดเร็กทอรี. ระบบการตั้งชื่อ AS Goods
ที่ไหน
Products.Link B
(เลือก
ใบส่งสินค้าComposition.Nomenclature
จาก
Document.Invoice.Composition AS InvoiceContent
ที่ไหน
InvoiceContent.Nomenclature = Goods.Reference)
การดำเนินการ ที่สามารถใช้กับอาร์เรย์ รายการค่า ตารางค่า แบบสอบถามซ้อน ในกรณีนี้สามารถลดเงื่อนไขได้
ไวยากรณ์สำหรับแบบสอบถามย่อย
(expression1, expression2,...,expressionN) ถึง (เลือก expression1, expression2,...,expressionN ...)
ไวยากรณ์สำหรับตารางค่า
(expression1, expression2,...,expressionN) ใน (&TK) โดยที่ N คอลัมน์แรกใช้ในตารางค่า TK

20. มีเรื่องตลกบนอินเทอร์เน็ตเกี่ยวกับวิธีที่ตัวสร้างแบบสอบถามทำงานต่อไป ซ้ายการรวมตาราง (และสลับตาราง) ไม่ว่าเราจะระบุอย่างไร ขวา:
1C: องค์กรชอบ "ไปทางซ้าย"

21. สะดวกในการดีบักการสืบค้นที่ซับซ้อนในคอนโซลการสืบค้น มีมากมายบนอินเทอร์เน็ต หลังจากแก้จุดบกพร่องแบบสอบถามแล้ว สามารถคัดลอกได้ และมีปุ่มที่ยอดเยี่ยมในตัวสร้างแบบสอบถาม " ขอ” ซึ่งคุณสามารถวางลงในแบบฟอร์มเดียวกันและบันทึกได้ (ก่อนหน้านี้ทำได้เฉพาะในการคัดลอกในตัวกำหนดค่าและจัดรูปแบบคำขอโดยใช้อักขระตัวแบ่งบรรทัด) ในหน้าต่างที่เปิดขึ้นเมื่อคุณคลิกปุ่ม "ร้องขอ" คุณสามารถแก้ไขคำขอและดูผลการดำเนินการซึ่งค่อนข้างสะดวก

22. เมื่อออกแบบรายงาน ACS คุณต้องจำไว้ว่าหากคุณต้องการให้การกรองตามฟิลด์ใดฟิลด์หนึ่ง คุณไม่จำเป็นต้องเพิ่มพารามิเตอร์ลงในข้อความคำขอ ตัวสร้างแบบสอบถามมีแท็บ " เค้าโครงข้อมูล” ซึ่งคุณสามารถเพิ่มพารามิเตอร์ให้กับเงื่อนไขได้ นอกจากนี้ ที่ระดับรายงาน ACS ยังมีแท็บเงื่อนไขที่คุณสามารถเพิ่มเงื่อนไขตามอำเภอใจและบันทึกไว้ในการตั้งค่าด่วน ในกรณีนี้ เงื่อนไขจะเป็นแบบสากล (ความเสมอภาค ความไม่เท่าเทียมกัน การเป็นสมาชิก การรวมอยู่ในรายการ ฯลฯ)

23. เมื่อทำงานกับเอกสาร อาจจำเป็นต้องเพิ่มการเรียงลำดับตามฟิลด์ตารางเสมือน ช่วงเวลาแต่นั่นก็เป็นโชคร้าย - ในการสืบค้นแบบซ้อนกัน การเรียงลำดับตามฟิลด์นี้ทำงานไม่ถูกต้อง การเต้นรำกับแทมบูรีนช่วย: จัดเรียงตามสนามเสมือนจริง ช่วงเวลาถูกแทนที่ด้วยสองประเภท: ตามวันที่และตามการอ้างอิง คุณยังสามารถแก้ปัญหาผ่านตารางชั่วคราวได้ด้วยการโอนคิวรีที่ซ้อนกันไปยังคิวรีแยกต่างหาก สำหรับรุ่นต่างๆ ฟีเจอร์หรือจุดบกพร่องนี้ยังไม่ได้รับการแก้ไข
ตัวอย่างของแบบสอบถามที่ทำงานไม่ถูกต้องซึ่งได้รับเอกสารที่โพสต์ล่าสุดสำหรับคู่สัญญาที่ระบุ (หรือมากกว่านั้นคือส่วนตารางของเอกสาร):

เลือก
สินค้าอุปโภคบริโภคลิงค์
สินค้าอุปโภคบริโภค หมายเลขบรรทัด
สินค้าอุปโภค บริโภค สินค้า
สินค้าอุปโภคบริโภค ปริมาณ,
สินค้าอุปโภคบริโภค ราคา,
สินค้าอุปโภค บริโภค จำนวน
จาก

ที่ไหน
สินค้าอุปโภค บริโภค ลิงค์เข้า
(เลือกข้อ 1
ง. ลิงค์
จาก
เอกสารรายจ่าย AS D
ที่ไหน
ง. ลิงค์. ดำเนินการ

ORDER BY D.Ref.TimeDOWN)

การแก้ปัญหาที่เป็นไปได้:
ก) แทนที่ด้วย จัดเรียงตามบน
สั่งซื้อโดย D.DATE DESC
ORDER BY D.อ้างอิง DESC

B) คุณสามารถย้ายคิวรีซ้อนไปยังตารางชั่วคราวได้:
เลือกก่อน 1
ง. ลิงค์
สมัคร TKLink
จาก
เอกสารรายจ่าย AS D
ที่ไหน
ง. ลิงค์. ดำเนินการ
และ D.ผู้รับเหมา = &ผู้รับเหมา

จัดเรียงตาม
E.Ref.TimeDOWN
;

////////////////////////////////////////////////////////////////////////////////
เลือก
สินค้าอุปโภคบริโภคลิงค์
สินค้าอุปโภคบริโภค หมายเลขบรรทัด
สินค้าอุปโภค บริโภค สินค้า
สินค้าอุปโภคบริโภค ปริมาณ,
สินค้าอุปโภคบริโภค ราคา,
สินค้าอุปโภค บริโภค จำนวน
จาก
Document.Consumable.Goods AS ConsumableGoods
ที่ไหน
สินค้าอุปโภค บริโภค ลิงค์เข้า
(เลือก
ที.ลิงค์
จาก
TZLink AS T)
C) คุณสามารถอ้างถึงตารางหลักของเอกสาร จากนั้นไปที่ส่วนตารางเท่านั้น
เลือกก่อน 1
วัสดุสิ้นเปลืองลิงค์
วัสดุสิ้นเปลือง สินค้า (
ลิงค์
หมายเลขบรรทัด,
ผลิตภัณฑ์,
ปริมาณ,
ราคา,
ผลรวม
)
จาก
Document.Expenditure AS รายจ่าย
ที่ไหน
วัสดุสิ้นเปลืองผู้รับเหมา = &ผู้รับเหมา
และวัสดุสิ้นเปลือง ดำเนินการ

จัดเรียงตาม
สิ้นเปลือง ช่วงเวลาแห่งเวลาลดลง

24. เมื่ออ้างถึงตารางหลักของเอกสาร (หนังสืออ้างอิง) คุณสามารถอ้างถึงข้อมูลของตารางย่อย (ส่วนตาราง) ในเงื่อนไข ความเป็นไปได้นี้เรียกว่า การอ้างอิงเขตข้อมูลแบบตาราง. ตัวอย่างของงาน เราสามารถอ้างอิงงานค้นหาเอกสารที่มีผลิตภัณฑ์บางอย่างในส่วนตาราง
ตัวอย่าง:
เลือก Receipt.Reference จาก Document.Receipt โดยที่ Receipt.Goods.Nomenclature = &Nomenclature

ข้อดีของการสืบค้นนี้เหนือการสืบค้นในตารางที่ซ้อนกัน Receipt.Products คือหากมีเอกสารที่ซ้ำกัน ผลการสืบค้นจะส่งคืนเฉพาะเอกสารที่ไม่ซ้ำโดยไม่ต้องใช้คีย์เวิร์ด หลากหลาย.
เปรียบเทียบ:
เลือกสินค้าต่าง ๆ การอ้างอิงจากเอกสาร สินค้าขาเข้า สินค้าเป็นสินค้า โดยที่ Goods.Nomenclature = &Nomenclature
ที่นี่น่าจะเป็นทุกอย่าง เป็นที่ชัดเจนว่ายังมีคำถามอีกมากมายในภาษาแบบสอบถามที่ฉันยังไม่ได้กล่าวถึง ในการเขียนบทความ ฉันใช้ข้อมูลที่ได้รับหลังจากจบหลักสูตรพื้นฐาน 1C 8.2 spec8.ru รวมถึงจากหนังสือ "1C 8.2 Developer's Guide" และอินเทอร์เน็ต
ขอบคุณทุกคน!