1s 8 ตารางเสมือน

บทความนี้อธิบายการใช้งานทางกายภาพของตารางเสมือนของยอดการกำหนดค่าที่ทำงานในโหมดไคลเอนต์-เซิร์ฟเวอร์โดยใช้ตัวอย่างการใช้ MS DBMS เซิร์ฟเวอร์ SQL.

การบังคับใช้

บทความนี้กล่าวถึงแพลตฟอร์ม 1C:Enterprise เวอร์ชัน 8.3.5.1383 ในเวอร์ชันปัจจุบันของแพลตฟอร์ม อาจมีการเปลี่ยนแปลงข้อความที่อธิบายไว้ในเนื้อหาได้ แบบสอบถาม T-SQLดำเนินการบนฝั่งเซิร์ฟเวอร์ DBMS

อุปกรณ์ของตารางยอดคงเหลือเสมือน

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

เลือก
สินค้าคงเหลือสินค้าคงคลังสินค้า,
สินค้าคงเหลือคงเหลือคลังสินค้า,
สินค้าคงเหลือสินค้าคงคลังปริมาณคงเหลือ
จาก
ลงทะเบียนการสะสมสินค้าคงคลังคงเหลือ(&วันที่ , คลังสินค้า = &คลังสินค้า ) ยังไง
สินค้าคงเหลือคงเหลือ

ขั้นแรก ใช้วิธีบริบทสากล รับโครงสร้างการจัดเก็บฐานข้อมูล ()เราได้รับรายการตารางฐานข้อมูลที่เก็บข้อมูลการลงทะเบียนการสะสม "สินค้าคงคลังสินค้าโภคภัณฑ์":

องค์ประกอบของฟิลด์ในตารางหลักของทะเบียนการสะสมและตารางรวมแสดงไว้ด้านล่าง:

กำลังจัดเก็บผลรวมสำหรับ ของทะเบียนนี้กำหนดค่าในโหมด 1C:Enterprise 8 ดังนี้:

มากรอกพารามิเตอร์ในคำขอที่ต้องการดังต่อไปนี้:


แพลตฟอร์มจะแปลงข้อความคำขอเป็นคำขอต่อไปนี้ ซึ่งจะดำเนินการบนเซิร์ฟเวอร์ DBMS:

เลือก
Q_000_T_001.Fld82 ,
Q_000_T_001.Fld83 ,
Q_000_T_001.Fld84ยอดคงเหลือ
จาก
(เลือก FLd82,
Fld83,

จาก
(เลือก FLd82,
Fld83,
SUM (Fld84 ) AS Fld84ยอดคงเหลือ
จาก AccumRgT85
โดยที่ ระยะเวลา = DATETIME (3999, 11, 1)
และ ((Fld83 = ))
และ(Fld84<>0 ) และ (Fld84<> 0 )
จัดกลุ่มตาม Fld82 , Fld83
มี FLd84Balance<> 0
ยูเนี่ยนทั้งหมด
เลือก FLD82,
Fld83,
SUM (กรณีที่ RecordKind = 0 แล้ว – Fld84 มิฉะนั้น Fld84 END) AS Fld84Balance
จาก AccumRg81
โดยที่ ระยะเวลา >= DATETIME (2012, 9, 1)
และระยะเวลา< DATETIME (3999 , 11 , 1 )
และใช้งานอยู่
และ ((Fld83 = 9:))
จัดกลุ่มตาม Fld82 , Fld83
มี FLd84Balance<>0 ) ต
จัดกลุ่มตาม Fld82 , Fld83
มี FLd84Balance<>0 ) Q_000_T_001

ให้เราตรวจสอบคำขอที่ได้รับโดยละเอียดยิ่งขึ้น

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

โปรดทราบว่าการจัดกลุ่มจะดำเนินการตามมิติข้อมูลที่เลือกในข้อความคำขอ นั่นคือเหตุผลว่าทำไมจึงไม่จำเป็นต้องจัดกลุ่มเพิ่มเติมตามมิติข้อมูลในข้อความในภาษาคิวรี 1C:Enterprise

แบบสอบถามการรวมที่สองใช้ตารางการเคลื่อนไหวการลงทะเบียน AccumRg81 ขึ้นอยู่กับประเภทของการเคลื่อนไหว (หาก RecordKind เป็น 0 จะเป็นรายได้ มิฉะนั้นจะเป็นค่าใช้จ่าย) เครื่องหมายจะถูกแทรกในนิพจน์ แพลตฟอร์มจะเลือกข้อมูลสำหรับช่วงเวลานับจากวันที่ที่ระบุเป็นพารามิเตอร์ของตารางเสมือนจนถึงวันที่จัดเก็บผลรวมปัจจุบัน (11/01/3999)

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

หากใช้ MS SQL Server DBMS และออฟเซ็ตวันที่ถูกตั้งค่าเป็น 2000 สำหรับฐานข้อมูล วันที่ทั้งหมดจะถูกจัดเก็บด้วยออฟเซ็ตที่ระบุ เช่น แทนที่จะเป็น 01.11.3999 คุณจะเห็น 01.11.5999

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

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

เลือก
Q_000_T_001.Fld82 ,
Q_000_T_001.Fld83 ,
Q_000_T_001.Fld84ยอดคงเหลือ
จาก
(เลือก FLd82,
Fld83,
ผลรวม (Fld84Balance ) AS Fld84Balance
จาก
(เลือก FLd82,
Fld83,
SUM (Fld84 ) AS Fld84ยอดคงเหลือ
จาก AccumRgT85
โดยที่ ระยะเวลา = DATETIME (2012, 4, 1)
และ ((Fld83 = 9:))
และ(Fld84<> 0 )
และ(Fld84<> 0 )
จัดกลุ่มตาม Fld82 , Fld83
มี FLd84Balance<> 0
ยูเนี่ยนทั้งหมด
เลือก FLD82,
Fld83,
SUM (กรณีที่ RecordKind = 0 แล้ว Fld84 ELSE – Fld84 END ) AS Fld84Balance
จาก AccumRg81
โดยที่ ระยะเวลา >= DATETIME (2012, 4, 1)
และระยะเวลา< DATETIME (2012 , 9 , 1 )
และใช้งานอยู่
และ ((Fld83 = 9:))
จัดกลุ่มตาม Fld82 , Fld83
มี FLd84Balance<>0 ) ต
จัดกลุ่มตาม Fld82 , Fld83
มี FLd84Balance<>0 ) Q_000_T_001

โปรดทราบเงื่อนไขต่อไปนี้ในเนื้อหาคำขอ

หากสิ่งพิมพ์ของฉันมีประโยชน์สำหรับคุณอย่าลืมให้ข้อดี :-)

นี่คือเกณฑ์สำหรับงานทั้งหมดในคอลเลกชัน(หน้าที่มีลิงก์ไปยังกระทู้ฟอรั่มสำหรับแต่ละงาน)
http://chistov.spb.ru/forum/16-969-1

ตอนนี้การพัฒนาและบันทึกของฉันที่ฉันสร้างขึ้นระหว่างขั้นตอนการเตรียมการ
ฉันจะพยายามทำซ้ำให้น้อยที่สุดเท่าที่จะเป็นไปได้กับทั้งสองที่กล่าวมาข้างต้น ล่าสุดสิ่งพิมพ์

มาเริ่มกันเลย:


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

1. การขนถ่ายครั้งสุดท้าย ฐานข้อมูล(ไฟล์ DT)
2. หมายเหตุอธิบาย

ไม่ควรมีสิ่งใดอื่นใดอีก ห้ามคัดลอกระหว่างกลาง ฯลฯ

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

แต่คุณจะได้รับแจ้งเกี่ยวกับเรื่องนี้ในคำแนะนำที่คุณจะต้องอ่านก่อนสอบ
รู้ไว้ล่วงหน้าจะดีกว่า)


การใช้อักขระเครื่องหมายและในแบบสอบถาม

บางครั้งมันก็เร็วกว่าที่จะพิมพ์ด้วย แป้นพิมพ์เพิ่มเติมกว่าการสลับเค้าโครงกลับไปกลับมาช่วยประหยัดเวลา
& = Alt+38

*************************************************************************************************
การใช้ TimePoint() ในแบบสอบถาม

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

ช่วงเวลา = ?(โหมดการส่งผ่าน = โหมดการโพสต์เอกสาร การดำเนินการ, ไม่ได้กำหนด, ช่วงเวลาของเวลา ());

*************************************************************************************************
เมื่อสร้างการเคลื่อนย้ายเอกสารโดยการลงทะเบียน ที่จุดเริ่มต้นของขั้นตอนการประมวลผลการผ่านรายการ จำเป็นต้องล้างการเคลื่อนไหวของเอกสารปัจจุบันด้วยการลงทะเบียน

รหัสเป็นดังนี้:

Movement.RegisterName.Write = จริง; การเคลื่อนไหว RegisterName.Clear();

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

การเคลื่อนไหว RegisterName.Write();

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

แต่ทุกที่ฉันเพียงระบุการก่อสร้างสามบรรทัดนี้:

Movement.RegisterName.Write = จริง; การเคลื่อนไหว RegisterName.Clear(); การเคลื่อนไหว RegisterName.Write();

*************************************************************************************************
มีสองวิธีในการบล็อกข้อมูล ทางเลือกระหว่างนั้นขึ้นอยู่กับวิธีการ - เก่าหรือใหม่:

1) การบล็อกแบบควบคุมปกติ วิธีการประมวลผลเอกสารแบบเก่า (วัตถุการบล็อกข้อมูล)

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


ตัวอย่าง:

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


1. ตั้งค่าการล็อคโดยใช้วัตถุ Data Lock
2. อ่านส่วนที่เหลือ
3. เราตรวจสอบความเป็นไปได้ในการตัดจ่าย
4. เราสร้างความเคลื่อนไหว เช่น ตัดสินค้า
5. หลังจากการผ่านรายการเอกสาร การบล็อกจะถูกลบออกโดยอัตโนมัติ (การบล็อกนั้นใช้ได้เป็นส่วนหนึ่งของธุรกรรมการผ่านรายการ และระบบจะลบออกโดยอัตโนมัติ) นั่นคือไม่จำเป็นต้องปลดล็อควัตถุเป็นพิเศษ

2) วิธีใหม่ในการประมวลผลเอกสาร (โดยใช้คุณสมบัติ LockForChange = True)

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

ตัวอย่าง:
ลองพิจารณาการดำเนินการขายสินค้า
ในเอกสาร - ปริมาณ ในการลงทะเบียน - ปริมาณเท่านั้น
ดังนั้นเราจึงทราบปริมาณสินค้าจากเอกสาร
เราจัดทำความเคลื่อนไหวตามจำนวนที่ระบุในเอกสารและบันทึกไว้ ต่อไป เราจะอ่านทะเบียน ดูยอดคงเหลือ และวิเคราะห์ว่ามียอดติดลบหรือไม่ หากมี ให้แสดงข้อผิดพลาดและตั้งค่า Refusal = True

นั่นคือลำดับเป็นดังนี้:
1. หากต้องการเลื่อนผ่านรีจิสเตอร์ ให้ตั้งค่าคุณสมบัติ BlockForChange = True
2. เราสร้างการเคลื่อนไหว - ตัดสินค้า
3. บันทึกการเคลื่อนไหว
4. อ่านทะเบียนและตรวจสอบให้แน่ใจว่าไม่มียอดคงเหลือติดลบ หากมีก็ตัดส่วนที่เกินออก ถ้าไม่มีก็ไม่เป็นไร

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

ตัวเลือกนี้ (ที่สอง) ง่ายกว่าเรียกว่า "วิธีใหม่ในการประมวลผลเอกสาร" และ 1C แนะนำให้ใช้หากเป็นไปได้และหักคะแนนหากใช้ตัวเลือกแรก แต่ในบางกรณีก็ไม่สามารถใช้ตัวเลือกแรกได้และตัวเลือกแรกด้วย มีการใช้วัตถุ Data Locking (ดูตัวอย่างด้านบน)

ฉันยังทราบด้วยว่าไม่ว่าจะเลือกวิธีการใดก็ตาม จะต้องทำความสะอาดการเคลื่อนไหวก่อนใช้งาน (ดูคำแนะนำก่อนหน้า)

*************************************************************************************************
การบล็อกข้อมูล (วิธีการบล็อกหมายเลข 1 จากคำอธิบายข้างต้น)

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

มีลักษณะดังนี้:

ล็อค = NewDataLock; องค์ประกอบการล็อค = Locking.Add ("การสะสมทะเบียนสินค้าในคลังสินค้า"); LockElement.Mode = DataLockMode.พิเศษ; BlockingElement.DataSource = PM; การล็อค Element.UseFromDataSource("ระบบการตั้งชื่อ", "ระบบการตั้งชื่อ"); ล็อค.ล็อค();

*************************************************************************************************
เป็นการดีกว่าที่จะเรียกส่วนตารางของเอกสารว่า "TC"

มีเพียงส่วนตารางเดียวใน 99% ของเอกสาร เป็นชื่อที่รวมกันเป็นหนึ่ง ส่วนที่เป็นตารางจะช่วยให้คุณประหยัดเวลาได้มากเพราะ:
1) สั้นมาก - เขียนอย่างรวดเร็ว
2) เช่นเดียวกับเอกสารทั้งหมด คุณไม่จำเป็นต้องจำไว้ว่ามันเรียกว่าอะไรเมื่อเขียนโค้ด

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

โดยทั่วไปฉันใช้การสุ่มตัวอย่างในทุกงาน

การสุ่มตัวอย่างจะเหมาะสมที่สุดสำหรับระบบในแง่ของประสิทธิภาพ เนื่องจากจะมีการ "ทำให้คมชัดขึ้น" สำหรับการอ่านข้อมูลเท่านั้น (ต่างจาก TK)

แต่ไม่ว่าในกรณีใด ก่อนที่จะใช้เมธอด Select() จะเป็นการดีกว่าที่จะตรวจสอบผลลัพธ์การสืบค้นเพื่อหาความว่างเปล่า ซึ่งจะช่วยลดภาระในระบบได้อีก

ผลลัพธ์ = Query.Run(); หากไม่ใช่ Result.Empty() จากนั้นเลือก = Result.Select(TravelQueryResult.ByGrouping); ... สิ้นสุดถ้า;

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

ผลลัพธ์ = Query.Run(); หากไม่ใช่ Result.Empty() จากนั้นเลือก = Result.Select(); การเลือก ถัดไป(); วิธีตัดต้นทุน = ตัวอย่าง วิธีตัดต้นทุน สิ้นสุดถ้า;

*************************************************************************************************
เอกสาร "การดำเนินงาน" สำหรับงานบัญชี

จำเป็นต้องสร้างเอกสารการปฏิบัติงานสำหรับงานบัญชี

เราปิดการใช้งานการผ่านรายการทั้งหมด (ในคุณสมบัติ "การผ่านรายการ = ปฏิเสธ") ระบุว่ามีการเคลื่อนไหวในการลงทะเบียนทางบัญชีและลากการเคลื่อนไหวลงบนแบบฟอร์ม

*************************************************************************************************
การประมวลผลเอกสารทันที:

จะต้องเป็น รวมอยู่ด้วย:
ในการปฏิบัติงานและการบัญชี ต้องเปิดใช้งานการบัญชีสำหรับเอกสาร (ยกเว้นเอกสาร "การดำเนินการ" ดูด้านล่าง)

จะต้องเป็น ปิด:
ในงานการคำนวณมันไม่สมเหตุสมผลสำหรับเอกสารเงินเดือน

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

*************************************************************************************************
เงื่อนไขในการขอแบบ “ระบุชื่ออย่างใดอย่างหนึ่ง หรืออย่างใดอย่างหนึ่ง ถ้าไม่ระบุ”

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

ระบบการตั้งชื่อ = &ระบบการตั้งชื่อ หรือ &ระบบการตั้งชื่อ = ค่า(Directory.Nomenclature.EmptyLink)

แต่จะเหมาะสมกว่าและถูกต้องมากกว่าในการเปลี่ยนแปลงเงื่อนไขนี้ (ขอบคุณ yukon):


Request.Text = Request.Text + "WHERE Nomenclature = &Nomenclature";

สิ้นสุดถ้า;

ด้วยการมาถึงของโมเดลออบเจ็กต์เคียวรีใน 8.3.5 จะสามารถเพิ่มเงื่อนไขได้อย่างปลอดภัยยิ่งขึ้น:

ถ้า ValueFilled(ระบบการตั้งชื่อ) แล้ว
Query1.Selection.Add("Item = &ระบบการตั้งชื่อ");
Request.SetParameter("ระบบการตั้งชื่อ", ระบบการตั้งชื่อ);
สิ้นสุดถ้า;

*************************************************************************************************
เข้าร่วมตารางในแบบสอบถาม:

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

หากคุณต้องการแนบตารางโดยไม่มีเงื่อนไขใดๆ ให้เขียนเงื่อนไข "TRUE" บนแท็บเงื่อนไข
ในกรณีนี้ ตารางจะถูกรวมเข้าด้วยกันทุกประการ

*************************************************************************************************
การใช้แผนประเภทลักษณะ (PVC):

1. ใช้เป็นกลไกในการอธิบายคุณลักษณะของวัตถุ

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

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

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

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

2. การใช้พีวีซีเพื่อสร้างกลไกย่อยสำหรับทะเบียนการบัญชี .

2.1. เราสร้าง PVC TypesSubconto

2.2. เราสร้างไดเร็กทอรีรอง ValuesSubConto (เช่นเดียวกับคุณลักษณะ มันจะมีค่า subconto หากไม่มีในไดเร็กทอรีอื่น)

2.3. การสื่อสารเกิดขึ้นโดยใช้ผังบัญชี

*************************************************************************************************
ทรัพยากรการลงทะเบียนการบัญชี:

จำนวน - งบดุล
ปริมาณ - นอกงบดุลและเกี่ยวข้องกับลักษณะทางบัญชีเชิงปริมาณ

*************************************************************************************************
ตารางลงทะเบียนการบัญชีเสมือน:

มูลค่าการซื้อขาย: มูลค่าการซื้อขายของบัญชีเดียว
TurnoverDtKt: มูลค่าการซื้อขายระหว่างสองบัญชี นั่นคือ ธุรกรรมเดียวกันทั้งหมดในช่วงเวลานั้น

*************************************************************************************************
การบัญชีสกุลเงินในการลงทะเบียนการบัญชี - วิธีการใช้:

เราสร้างคุณลักษณะทางบัญชี "สกุลเงิน" ในผังบัญชี
ในการลงทะเบียนการบัญชีเราสร้างเพิ่มเติม:
- มิติสกุลเงิน (ข้อห้ามของค่าว่าง งบดุล คุณลักษณะทางบัญชี - สกุลเงิน)
- ทรัพยากร CurrencyAmount (นอกงบดุล คุณลักษณะทางบัญชี - สกุลเงิน จะเก็บจำนวนเงินเป็นสกุลเงิน เช่น $100 เป็นต้น)
ทั้งหมด.

ดังนั้นโครงสร้างการลงทะเบียนจึงเป็น:

การวัด:
- สกุลเงิน
ทรัพยากร
- ปริมาณ
- จำนวนเงิน (จำนวนเป็นรูเบิล)
- CurrencyAmount (จำนวนเงินในสกุลเงิน)

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

*************************************************************************************************
เมื่อตั้งค่าพารามิเตอร์ของตารางเสมือนเพื่อให้ได้ส่วนหลัง เราจะกำหนดเงื่อนไขในมิติ ไม่ใช่ทรัพยากร

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

*************************************************************************************************
ความหมายของทรัพยากรและรายละเอียดในทะเบียนการคำนวณ

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

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

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

*************************************************************************************************
แจกแจงระยะเวลาวันหยุดตามเดือนเมื่อบันทึกชุดรายการลงทะเบียน
หากระบุวันหยุดในเอกสารในบรรทัดเดียวเป็นเวลาหลายเดือนในบรรทัดเดียว:

StartDateTecMonth = เดือนเริ่มต้น (TexLineMainAccruals.ActionPeriodStart); CurrentMonthEndDate = เดือนสิ้นสุด (TexLineMainAccruals.ActionPeriodStart); เดือนปัจจุบัน = วันที่; ในขณะที่DateStartCurrentMonth<= НачалоМесяца(ТекСтрокаОсновныеНачисления.ПериодДействияКонец) Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодДействияНачало = Макс(ДатаНачалаТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияНачало); Движение.ПериодДействияКонец = КонецДня(Мин(ДатаОкончанияТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияКонец)); Движение.ПериодРегистрации = Дата; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаОсновныеНачисления.Подразделение; Движение.Сумма = 0; Движение.КоличествоДней = 0; Движение.График = ТекСтрокаОсновныеНачисления.График; Движение.Параметр = ТекСтрокаОсновныеНачисления.Параметр; Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(Дата, -3)); Движение.БазовыйПериодКонец = КонецДня(КонецМесяца(ДобавитьМесяц(Дата, -1))); ДатаНачалаТекМесяца = НачалоМесяца(ДобавитьМесяц(ДатаНачалаТекМесяца, 1)); ДатаОкончанияТекМесяца = КонецМесяца(ДатаНачалаТекМесяца); КонецЦикла; КонецЕсли;

*************************************************************************************************
การสร้างแผนภูมิแกนต์:

เราวางองค์ประกอบของประเภท "แผนภูมิแกนต์" ลงในแบบฟอร์ม เรียกว่า DG จากนั้นสร้างคำสั่ง "สร้าง" และเขียนสิ่งต่อไปนี้ในโมดูลแบบฟอร์ม:

&ขั้นตอน OnClient สร้าง (คำสั่ง) GenerateOnServer(); สิ้นสุดขั้นตอน &บนขั้นตอนเซิร์ฟเวอร์ GenerateOn Server() DG.Clear(); DG.Update = เท็จ; คำขอ = คำขอใหม่ ("SELECT |BasicAccrualsActualActionPeriod.Employee, |BasicAccrualsActualActionPeriod.CalculationType, |BasicAccrualsActualActionPeriod.ActionPeriodStart AS ActionPeriodStart, |MainAccrualsActualActionPeriod.Peri odActionsEnd AS PeriodActionsEnd |FROM |Calculation Register.MainAccruals .ActualPeriodActions AS MainAccrualsActualPeriodActions | WHERE |MainAccrualsActualPeriodActions.PeriodActions BETWEEN &StartDate และ &วันที่สิ้นสุด "); Query.SetParameter("StartDate", Period.StartDate); Request.SetParameter("EndDate", Period.EndDate); เลือก = Query.Run().Select(); ในขณะที่ Selection.Next() Loop Point = DG.SetPoint(Selection.Employee); Series = DG.SetSeries(การเลือกประเภทการคำนวณ); ค่า = DG.GetValue (จุด, ซีรี่ส์); ช่วงเวลา = Value.Add(); Interval.Start = Sample.PeriodActionStart; Interval.End = ตัวอย่าง ActionPeriodEnd; สิ้นสุดรอบ; DG.อัปเดต = จริง; สิ้นสุดขั้นตอน

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

*************************************************************************************************
กำลังประมวลผลรายการ "การกลับรายการ" ในงานการคำนวณ:

ในขั้นตอนการประมวลผลธุรกรรม (object module) เราสร้างการเคลื่อนไหวทั้งหมด และหากมีบันทึกในช่วงอื่นเราจะได้แบบนี้
(ระบบสร้างขึ้นโดยอัตโนมัติ - ช่วยเรา):

บันทึกการบวก = Movements.MainAccruals.GetAddition(); // ไม่จำเป็นต้องบันทึกการเคลื่อนไหวเพื่อรับการบวก

สำหรับแต่ละสายเทคโนโลยีจากรอบการเพิ่มบันทึก
บันทึก = Movements.MainAccruals.Add();
FillPropertyValues ​​(บันทึก TechString);
Record.RegistrationPeriod = TechString.RegistrationPeriodReversal;
Record.ActionPeriodStart = TechString.ActionPeriodStartReverse;
Record.ActionPeriodEnd = TechString.ActionPeriodEndReversal;
จุดสิ้นสุดของวงจร

และเมื่อคำนวณบันทึกให้ใส่เช็ค:

ถ้า TechMotion.Reversal แล้ว
CurrentMovement.จำนวน = - CurrentMovement.จำนวน;
สิ้นสุดถ้า;

*************************************************************************************************
วิธีการกำหนดสิ่งที่รวมอยู่ในยอดคงค้างหลัก และสิ่งที่รวมอยู่ในยอดคงค้างเพิ่มเติมในงานการคำนวณ

แต่สิ่งนี้ไม่ชัดเจน 100% เสมอไป ยังมีกรณีที่ซับซ้อนกว่านั้นถึงแม้จะมีหลายกรณีก็ตาม
(เช่น โบนัสที่ขึ้นอยู่กับจำนวนวันทำงานในหนึ่งเดือน - นี่คือ HE)

ค่าธรรมเนียมพื้นฐาน:
หากประเภทการคำนวณขึ้นอยู่กับกำหนดการ (หมายถึงการลงทะเบียนข้อมูลพร้อมวันที่ในปฏิทิน) แสดงว่าหมายถึงค่าธรรมเนียมหลัก

ตัวอย่างโอ้:
- เงินเดือน
- สิ่งที่คำนวณจากจำนวนวันทำการ (และสำหรับสิ่งนี้คุณต้องใช้ตารางเวลา): ในช่วงเวลาที่ถูกต้อง (เช่นเงินเดือน) หรือในช่วงเวลาฐาน

ค่าใช้จ่ายเพิ่มเติม:
สิ่งที่พิจารณาจากจำนวนเงินสะสมหรือเวลาทำงาน (ไม่ใช่บรรทัดฐาน!) หรือไม่ขึ้นอยู่กับเลย - นี่เป็นเพิ่มเติม เงินคงค้าง

นั่นคือ: เงินคงค้างสำหรับการคำนวณที่ใช้มาตรฐานเวลา (อาจเป็นข้อเท็จจริงด้วย) คือ OH และสำหรับข้อมูลจริงหรือไม่จำเป็นต้องมีอะไรเลยคือ DN

หรืออีกนัยหนึ่ง:

หาก VR ใช้มาตรฐานเวลา จะต้องรวมระยะเวลาที่ใช้งานได้สำหรับ VR ด้วย

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

รันคำสั่งบนแบบฟอร์ม:

&บนไคลเอนต์
ขั้นตอนวิธีใช้ (คำสั่ง)
OpenHelp("v8help://1cv8/EnterprWorkingWithCatalogs");
สิ้นสุดขั้นตอน

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

*************************************************************************************************
การดำเนินการโต้ตอบระหว่างแบบฟอร์ม เช่น การเลือก:

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

2. ในแบบฟอร์มที่เปิดไว้ ในตัวจัดการ “When CreateOnServer()” เราสามารถจับพารามิเตอร์ที่ส่งผ่านในขั้นตอนที่ 1 ผ่าน “Parameters.[ParameterName]” แบบฟอร์มที่เริ่มต้นการเปิดแบบฟอร์มนี้จะสามารถเข้าถึงได้ผ่านตัวระบุ "เจ้าของ" (หากระบุไว้ในขั้นตอนที่ 1)

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

*************************************************************************************************
วงจรชีวิตของพารามิเตอร์แบบฟอร์ม

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

*************************************************************************************************
การใช้อินเทอร์เฟซแท็กซี่

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

*************************************************************************************************

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

PSS: เพื่อนๆ เพื่อนๆ ถ้าใครมีข้อมูลที่เป็นประโยชน์อื่นๆ ในการเตรียมตัวสอบ และสอบผ่าน เม้นบอกไว้ได้เลย เราจะเพิ่มบทความให้ครับ

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

1. การออกแบบ “อิซ”

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

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

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

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

2. การเรียงลำดับข้อมูลตามช่องอ้างอิง

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

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

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

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

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

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

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

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

SELECT Employee.Name, Employee.Phone AS Phone จาก Directory.Employees AS Employees WHERE Phone LIKE "_-___-___-__-__"

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

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


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

เลือกการจัดหาบริการ องค์กร AS องค์กร การจัดหาบริการ ระบบการตั้งชื่อ AS ระบบการตั้งชื่อ SUM (การให้บริการ จำนวนเอกสาร) AS ผลรวมของเอกสารจากเอกสาร การให้บริการ AS การจัดหาบริการ กลุ่มตามการจัดหาบริการ องค์กร การจัดหา ของบริการ ผลการตั้งชื่อตามทั่วไป องค์กร การตั้งชื่อ

ในกรณีนี้ แบบสอบถามจะส่งกลับเกือบจะเหมือนกับแบบสอบถามต่อไปนี้:

เลือกการจัดหาบริการ องค์กร AS องค์กร การให้บริการ AS ศัพท์เฉพาะ การให้บริการ จำนวนเอกสาร AS จำนวนเอกสารจากเอกสาร การให้บริการ AS การให้บริการ ผลลัพธ์ AMOUNT (จำนวนเอกสาร) จำแนกตามทั่วไป องค์กร ศัพท์

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

6. ฟิลด์การยกเลิกการอ้างอิง

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

ขอ:

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

เลือก Payment.Link, Payment.Organization, Payment.Organization, องค์กร หน่วยผู้ดูแลระบบจากเอกสารการชำระเงิน AS การชำระเงิน LEFT JOIN Directory.Organizations AS องค์กรซอฟต์แวร์ Payment.Organization = Organisations.Link

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

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

เลือก UnallocatedPayments.Register.Date, ..... จาก RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

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

เลือก EXPRESS (UnallocatedPayments.Register AS Document.Payment).Date, ..... จาก RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

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

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

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

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

เลือกการชำระเงิน เชื่อมโยง AS การชำระเงิน การชำระเงิน ผู้ถือหุ้น AS ลูกค้า สถานที่การชำระเงินจากเอกสาร การชำระเงิน AS การชำระเงิน WHERE Payment.Branch = &Branch; //////////////////////////////////////////////// // /////////////////////////// SELECT Clients.Link AS Client, ISNULL(tPayment.Payment, "") AS Payment FROM Directory .Clients AS ลูกค้าเชื่อมต่อด้านซ้ายเพื่อชำระเงินเป็นเพื่อการชำระเงินซอฟต์แวร์ Clients.Link = toPayments.Client

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

เลือก Clients.Link, Payment.Link จาก Directory.US_Subscribers AS US_Subscribers เอกสารการเชื่อมต่อด้านซ้าย การชำระเงิน AS ซอฟต์แวร์การชำระเงิน (Clients.Link = Payment.Client และ Payment.Client.Name LIKE "Sugar Packet") จัดกลุ่มตาม Clients.Link การชำระเงิน ลิงค์

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

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

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

เลือก UnallocatedPaymentsBalances.Customer, UnallocatedPaymentsBalances.AmountBalance จาก (เลือก Clients.Link AS Link จาก Directory.Clients AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQuery LEFT JOIN RegisterAccumulations.UnallocatedPayments.Balances AS UnallocatedPayments BY Nested nyRequest.Link = UnallocatedPaymentsBalances ลูกค้า

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

เลือก Clients.Link AS Link PLACE tClients จาก Directory.Clients AS Clients WHERE
ลูกค้า.Link B (&ลูกค้า) ; //////////////////////////////////////////////// // /////////////////////////// เลือก tClients.Link, UnallocatedPaymentsRemains.AmountRemaining จาก tClients AS tClients LEFT JOIN RegisterAccumulations.UnallocatedPayments.Balances (, ลูกค้า ใน (เลือก tClients.Link จาก tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

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

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

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

เลือก Clients.Link AS Link PLACE tClients จาก Directory.Clients AS Clients INDEX BY Link WHERE
ลูกค้า.Link B (&ลูกค้า) ; //////////////////////////////////////////////// // /////////////////////////// เลือก UnallocatedPayments.AmountBalance, UnallocatedPayments.Client AS Client PLACE ยอดคงเหลือจาก RegisterAccumulations.UnallocatedPayments.Balances(, Client B ( เลือก tClients ลิงก์จาก tClients)) เป็นยอดเงินคงเหลือที่ไม่ได้ปันส่วน //////////////////////////////////////////////// // /////////////////////////// เลือก tClients.Link, toRemainders.AmountRemaining AS AmountRemaining จาก tClients AS tClients LEFT JOIN toRemainders AS Remainders BY tClients.Link = tRemainings.Client

9.การตรวจสอบผลการร้องขอ

ผลลัพธ์ของแบบสอบถามอาจว่างเปล่า หากต้องการตรวจสอบค่าว่าง ให้ใช้โครงสร้างต่อไปนี้:

ResRequest = คำขอดำเนินการ (); ถ้า resQuery.Empty() ให้ Return; สิ้นสุดถ้า;

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

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

คำขอ = คำขอใหม่; Query.Text = "SELECT | Clients.Link, | Clients.Birthdate |FROM | Directory.Clients AS Clients |WHERE | Clients.Link = &Client"; สำหรับแต่ละแถวจาก TableClients Loop Query.SetParameter("Client", Client); QueryResult = Query.Execute().Select(); สิ้นสุดรอบ;

สิ่งนี้จะบันทึกระบบจากการตรวจสอบไวยากรณ์ของคำขอในลูป

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

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

เลือกการชำระเงิน ลูกค้า จำนวนเงิน (การชำระเงิน จำนวน) เป็นจำนวนเงินจากเอกสาร การชำระเงิน AS การชำระเงิน โดยที่ เดือน (วันที่ชำระเงิน) = 9 จัดกลุ่มตามการชำระเงิน ลูกค้าที่มีจำนวนเงิน (การชำระเงิน จำนวน) > 13000

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


12. ค่าโมฆะ

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

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

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

เลือก "ไม่มีการชำระเงิน" เป็นแอตทริบิวต์ NULL AS เอกสาร PLACE เพื่อการชำระเงิน //////////////////////////////////////////////// // //////////////////////// SELECT Clients.Link AS Client, Payment.Link HOW Payment PUT tClientPayment FROM Directory.Clients AS Clients LEFT CONNECTION Document. การชำระเงิน AS ซอฟต์แวร์การชำระเงิน Clients.Link = Payment.Shareholder; //////////////////////////////////////////////// // //////////////////////// เลือก tClientPayment.Client จาก tClientPayment AS tClientPayment ภายใน เข้าร่วม tPayment AS tTopay BY tClientPayment.Payment = tPayment Document

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

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

SELECT "ไม่มีการชำระเงิน" AS Attribute, VALUE(Document.Payment.EmptyLink) AS Document PLACE toPayments; //////////////////////////////////////////////// // /////////////////////////// SELECT Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink )) HOW การชำระเงิน ใส่ tClientPayment จาก Directory.Clients AS Clients LEFT CONNECTION Document.Payment AS Payment BY Clients.Link = Payment.Shareholder; //////////////////////////////////////////////// // //////////////////////// เลือก tClientPayment.Client จาก tClientPayment AS tClientPayment ภายใน เข้าร่วม tPayment AS tTopay BY tClientPayment.Payment = tPayment Document

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

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

13. คุณลักษณะที่ไม่มีเอกสารของการออกแบบ "CHOICE WHEN...THEN...END"

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

เลือกการเลือกเมื่อ Users.Name = "Vasya Pupkin" จากนั้น "พนักงานคนโปรดของเรา" มิฉะนั้น "เราไม่รู้สิ่งนี้" END AS Field1 FROM Directory.Users AS Users

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

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

ตอนนี้การออกแบบดูยุ่งยากน้อยลงและเข้าใจง่าย

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


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

เลือก Users.Link AS ชื่อเต็ม, Users.Date of Birth, Users.Role PUT vtUsers จาก Directory.Users AS Users; //////////////////////////////////////////////// // /////////////////////////// เลือก tueUsers.ชื่อเต็ม, tueUsers.วันเกิดจาก tueUsers AS tueUsers GROUP BY tueUsers.ชื่อเต็ม, tueUsers . วันเกิด; //////////////////////////////////////////////// // /////////////////////////// เลือก wUsers.Full Name, wUsers.Role จาก wUsers AS wUsers GROUP BY wUsers.Full Name, wUsers เกิด

tPackage = คำขอ ExecutePackage();

TP_BirthDate = tPackage.อัพโหลด();
TP_Roles = tPackage.ยกเลิกการโหลด();

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

15. เงื่อนไขในการขอแบทช์

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

เลือก Users.Individual.Name AS Name, Users.Individual.Date of Birth AS Date of Birth, Users.Individual.Code AS Code PLACE vtUsers FROM Directory.Users AS Users; //////////////////////////////////////////////// // //////////////////////// เลือกบุคคลจากไดเรกทอรี

คุณสามารถกำหนดเงื่อนไขดังนี้:

WHERE Individuals.Code IN (เลือก vtUsers.Code จาก vtUsers) และ Individuals.Name IN (เลือก vtUsers.Code จาก vtUsers) และ Individuals.BirthDate IN (เลือก vtUsers.DateBirth จาก tvUsers)

และคุณสามารถทำได้ดังนี้:

WHERE (Individuals.Code, Individuals.Name, Individuals.Date of Birth) IN (เลือก tueUsers.Code, tueUsers.Name, tueUsers.Date of Birth จาก tueUsers)

อีกทั้งจำเป็นต้องรักษาความสงบเรียบร้อย

16. การเรียกตัวสร้างแบบสอบถามสำหรับ “เงื่อนไข” ในคำขอแบบแบตช์

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

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

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

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

อัปเดต1. จุดที่ 11,12
อัปเดต2. แต้ม 13,14,15,16

หนังสือมือสอง:
ภาษาแบบสอบถาม "1C:Enterprise 8" - E.Yu. ครัสทาเลวา
การพัฒนาทางวิชาชีพในระบบ 1C:Enterprise 8"

เมื่อจัดระเบียบตัวอย่างในปัญหาจริง ในกรณีส่วนใหญ่ การเลือกข้อมูลจะถูกจัดระเบียบตามเกณฑ์ที่กำหนด

ในกรณีที่เลือกจากตารางจริงก็ไม่มีปัญหาเกิดขึ้น ข้อมูลได้รับการประมวลผลเพียงเล็กน้อยเท่านั้น:

ในกรณีที่แหล่งที่มาในแบบสอบถามเป็นตารางเสมือน สถานการณ์จะค่อนข้างซับซ้อนมากขึ้น


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

เรารู้อยู่แล้วว่าตารางเสมือนเรียกว่าเสมือนเพราะไม่ได้อยู่ในฐานข้อมูลจริงๆ สิ่งเหล่านี้จะเกิดขึ้นในช่วงเวลาที่มีการร้องขอเท่านั้น อย่างไรก็ตามเรื่องนี้ จะสะดวกสำหรับเรา (นั่นคือผู้ที่เขียนแบบสอบถาม) ในการพิจารณาตารางเสมือนว่าเป็นตารางจริง จะเกิดอะไรขึ้นในระบบ 1C Enterprise 8 เมื่อแบบสอบถามที่เรารวบรวมยังคงเข้าถึงตารางเสมือน

ในขั้นตอนแรกระบบจะสร้างตารางเสมือน ในขั้นตอนที่สอง บันทึกจะถูกเลือกจากตารางผลลัพธ์ที่ตรงตามเงื่อนไขที่ระบุในส่วนคำสั่ง WHERE:
จะเห็นได้อย่างชัดเจนว่าตัวอย่างสุดท้ายจะไม่รวมบันทึกทั้งหมดจากตารางเสมือน (และจากฐานข้อมูล) แต่จะรวมเฉพาะบันทึกที่ตรงตามเงื่อนไขที่กำหนดเท่านั้น และบันทึกที่เหลือก็จะถูกแยกออกจากผลลัพธ์

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

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

ด้วยการกำหนดพารามิเตอร์ตารางเสมือน เราจะจำกัดจำนวนข้อมูลที่จะถูกประมวลผลโดยแบบสอบถามทันที

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

ข้อมูลที่นำมาจากเว็บไซต์

ทะเบียนสะสมในระบบ 1C:Enterprise แบ่งออกเป็นสองประเภท: การลงทะเบียนการสะสม ของเหลือและทะเบียนสะสม รอบต่อนาที.

ประเภทการลงทะเบียนจะถูกเลือกเมื่อสร้างในตัวกำหนดค่า

ตามชื่อที่แนะนำ บางรายการมีจุดมุ่งหมายเพื่อให้ได้ยอดคงเหลือ ณ วันที่กำหนด และอย่างที่สองมีวัตถุประสงค์เพื่อให้ได้มูลค่าการซื้อขายในช่วงเวลาที่เลือก ขึ้นอยู่กับประเภทของการลงทะเบียนการสะสม แพลตฟอร์ม 1C:Enterprise จะสร้างชุดตารางเสมือนที่แตกต่างกัน ในบทความนี้เราจะดูการทำงานกับตารางเสมือนของการลงทะเบียนการสะสม ในการดำเนินการนี้ เราจะสร้างการลงทะเบียนสำหรับการสะสมยอดคงเหลือ - สินค้าคงเหลือและทะเบียนสะสมการปฏิวัติ - สินค้าหมุนเวียน.

ตอนนี้เรามาดูกันว่าแพลตฟอร์มมีตารางเสมือนใดบ้างสำหรับการลงทะเบียนแต่ละรายการเหล่านี้

ทะเบียนสะสมการปฏิวัติ

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

ด้วยโต๊ะมาตรฐานทุกอย่างชัดเจน มาดูเสมือนจริงกันดีกว่า

การหมุนเวียนของตารางเสมือนจริง

ตารางนี้ช่วยให้คุณได้รับการหมุนเวียนทรัพยากรในแง่ของมิติ ในกรณีของเราเรามีสองมิติ: คลังสินค้าและ ผลิตภัณฑ์- และแหล่งข้อมูลหนึ่ง - ปริมาณ

ให้การลงทะเบียนของเรามีรายการดังต่อไปนี้

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

ดังนั้นคำขอจะมีลักษณะดังนี้:

เลือกผลิตภัณฑ์ Turnover Turnover.Warehouse, Products Turnover Turnover.Product, Products Turnover Turnover.Quantity Turnover จาก RegisterAccumulation.ProductsTurnover.Turnover(,) AS ProductsTurnoverTurnover

ผลลัพธ์ของแบบสอบถามมีลักษณะดังนี้:

นั่นคือเราได้รับผลตอบแทนทั้งด้านสินค้าและคลังสินค้ามาโดยตลอด สมมติว่าเราไม่สนใจคลังสินค้าและเราต้องการได้ผลตอบแทนเฉพาะในรูปของสินค้าเท่านั้น

เมื่อต้องการทำเช่นนี้ เราจะแยกมิติออกจากคำขอ คลังสินค้า

เลือกผลิตภัณฑ์ Turnover Turnover.Product, Product Turnover Turnover.Quantity Turnover จาก RegisterAccumulation.ProductsTurnover.Turnover(,) AS ProductsTurnoverTurnover

และด้วยเหตุนี้เราจะเหลือเพียงสองบรรทัดเท่านั้น

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

หลังจากนี้ คำขอเดิมของเราจะใช้แบบฟอร์มต่อไปนี้

เลือกมูลค่าการหมุนเวียนของสินค้า คลังสินค้า การหมุนเวียนของสินค้า สินค้า การหมุนเวียนของสินค้า ปริมาณการหมุนเวียนจากการลงทะเบียนการสะสม การหมุนเวียนของสินค้า การหมุนเวียน (&จุดเริ่มต้นของงวด &จุดสิ้นสุดของงวด คลังสินค้า = &คลังสินค้า) AS การหมุนเวียนของสินค้า

ดังที่เราเห็นความแตกต่างก็คือในวงเล็บหลังชื่อของตารางเสมือนมีพารามิเตอร์ที่ต้องกรอกก่อนดำเนินการค้นหา

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

จากการลงทะเบียนการสะสมผลิตภัณฑ์การหมุนเวียนการหมุนเวียน(,) วิธีมูลค่าการหมุนเวียนผลิตภัณฑ์ WHERE ผลิตภัณฑ์การหมุนเวียนการหมุนเวียน.Warehouse = &คลังสินค้า

เมื่อกรอกพารามิเตอร์ที่เราพลาดไป ความเป็นงวด- มาเปิดรายการและเลือกจากตัวเลือกที่เป็นไปได้มากมาย เดือน- เราจะลบพารามิเตอร์อื่นๆ ทั้งหมดเพื่อไม่ให้เกิดความสับสน

หลังจากนี้ เราจะสังเกตว่ามีฟิลด์ปรากฏขึ้นในช่องตาราง ระยะเวลา.

เมื่อเพิ่มลงในฟิลด์ที่เลือก เราได้รับข้อความคำขอต่อไปนี้:

เลือกผลิตภัณฑ์ Turnover Turnover.Period, Products Turnover Turnover.Warehouse, Products Turnover Turnover.Product, Products Turnover Turnover.Quantity Turnover FROM RegisterAccumulation.ProductsTurnover.Turnover(, Month,) AS ProductsTurnover Turnover.

เราดำเนินการตามคำขอ:

ดังนั้น ภายในช่วงเวลาที่เลือก เราสามารถแบ่งการปฏิวัติออกเป็นช่วงเล็กๆ ตามความถี่ที่เลือกได้

ทะเบียนการสะสมยอดคงเหลือ

เช่นเดียวกับการลงทะเบียนแบบย้อนกลับ มาดูในตัวออกแบบแบบสอบถามว่ามีตารางเสมือนใดบ้างที่พร้อมใช้งานสำหรับการลงทะเบียนการสะสมยอดคงเหลือ

อย่างที่คุณเห็น มีตารางเสมือนสามตารางสำหรับการลงทะเบียนการสะสมยอดคงเหลือ: การปฏิวัติ, ของเหลือ, ส่วนที่เหลือและการหมุนเวียน- ลองพิจารณาแต่ละรายการแยกกัน

การหมุนเวียนของตารางเสมือนจริง

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

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

ยอดคงเหลือตารางเสมือน

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

ลองดูตัวอย่างเล็กๆ น้อยๆ เรามีรายการลงทะเบียนดังต่อไปนี้:

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

เลือกผลิตภัณฑ์RemainingsRemainings.Warehouse, ProductsRemainingsRemainings.Product, ProductsRemainingsRemainings.QuantityRemaining FROM RegisterAccumulations.ProductsRemainings.Remainings(&DateRemainings,) AS ProductsRemainingRemainings

และหลังจากดำเนินการแล้ว เราก็จะได้ผลลัพธ์นี้

ยอดคงเหลือและมูลค่าการซื้อขายของตารางเสมือนจริง

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

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



กำลังโหลด...
สูงสุด