ข้อผิดพลาด 3.0 60.59 ในการแทรกค่าที่ไม่ซ้ำกัน มีการพยายามที่จะแทรกค่าที่ไม่ซ้ำกันลงในดัชนีที่ไม่ซ้ำกัน ดัชนีคืออะไร

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

โซลูชั่น:

1. ในสตูดิโอการจัดการ SQL Server เราจะทำลายดัชนีที่ผิดพลาดทางกายภาพ (ในกรณีของฉันคือดัชนีในตารางผลรวมการลงทะเบียนการบัญชี) ใน 1C เราจะแจกจ่ายเอกสารที่ผิดพลาด ในโหมดการทดสอบและแก้ไข ให้เลือกช่องสำหรับจัดทำดัชนีตารางใหม่ + คำนวณผลรวมใหม่ 1C สร้างดัชนีใหม่โดยไม่มีข้อผิดพลาด เราดำเนินการเอกสารที่ล้มเหลวก่อนหน้านี้

2. 1) โดยใช้ Management Studio 2005 ฉันสร้างสคริปต์สร้างเพื่อสร้างดัชนีซึ่งมีข้อบกพร่องและบันทึกลงในไฟล์
2) ฆ่าดัชนี jamb ด้วยตนเองจากตาราง _AccumRgTn19455
3) เปิดตัวคำขอเช่น
รหัส SQL S_elect นับ (*), index_fields
FR OM AccumRgTn19455
จัดกลุ่มตามดัชนี_ฟิลด์
มีนับ(*)>1
หลังจากที่ดัชนีถูกฆ่า ฉันมีบันทึกที่ซ้ำกัน 15 รายการแสดง แม้ว่าก่อนขั้นตอนที่ 2 ข้อความค้นหาจะไม่ส่งคืนอะไรเลย
4) ฉันอ่านรายการทั้งหมดแล้วและล้างรายการที่ซ้ำกันด้วยตนเอง อันที่จริง ฉันยังใช้การประมวลผล "โครงสร้างรายงาน" เพื่อทำความเข้าใจสิ่งที่ฉันกำลังเผชิญอยู่ ปรากฎว่าตาราง _AccumRgTn19455 เก็บทะเบียนการสะสม "ผลผลิตผลิตภัณฑ์ (การบัญชีภาษี)" ฉันยังแก้ไขด้วยการสืบค้น sql ระบุเอกสารที่ไม่ซ้ำกัน 15 เอกสาร และหลังจากเสร็จสิ้นขั้นตอนทั้งหมดแล้ว ฉันตรวจสอบใน 1C ว่าเอกสารเหล่านี้ได้รับการประมวลผลตามปกติโดยไม่มีข้อผิดพลาด แน่นอนว่า คุณไม่ควรเพียงแค่ทำความสะอาดโต๊ะแบบสุ่มเท่านั้น สิ่งสำคัญคือต้องเข้าใจว่าอะไรกำลังทำความสะอาดและจะเป็นอย่างไร
5) เปิดตัวคำขอเพื่อสร้างดัชนีซึ่งถูกบันทึกไว้ในไฟล์
6) เปลี่ยนฐานข้อมูลเป็นโหมดผู้ใช้คนเดียวและเปิดใช้งาน dbcc checkdb - คราวนี้ไม่มีการสร้างข้อผิดพลาด
7) เปลี่ยนฐานกลับเป็นโหมดผู้ใช้คนเดียว
เพียงเท่านี้...ปัญหาก็จะหมดไป ย้อนกลับไปใน 1C ฉันเปิดตัว "การทดสอบและการแก้ไข" ทุกอย่างเป็นไปด้วยดีเช่นกัน ฉันหยุดบ่นเกี่ยวกับดัชนีที่ไม่ซ้ำใคร

3. ถ้าความไม่ซ้ำกันอยู่ในวันที่ที่มีค่าเป็นศูนย์จากนั้นปัญหาจะได้รับการแก้ไขโดยการสร้างฐานข้อมูลที่มีพารามิเตอร์ออฟเซ็ตเท่ากับ 2000

1. หากปัญหากำลังโหลดฐานข้อมูล ให้ทำดังนี้:
1.1. หากคุณกำลังโหลด (โดยใช้ไฟล์ dt) ลงในฐานข้อมูล MS SQL Server จากนั้นเมื่อสร้างฐานข้อมูลก่อนที่จะโหลดให้ระบุออฟเซ็ตวันที่ - 2000
หากฐานข้อมูลถูกสร้างขึ้นด้วยออฟเซ็ต 0 ให้สร้างฐานข้อมูลใหม่ด้วย 2000

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

1.3. หากไม่มีเวอร์ชันไฟล์ ให้ลองโหลดจาก DT ลงในเวอร์ชันไคลเอ็นต์-เซิร์ฟเวอร์ด้วย DB2 (ซึ่งมีความต้องการความเป็นเอกลักษณ์น้อยกว่า) จากนั้นทำการทดสอบและแก้ไข รวมถึงการกำหนดค่า - ตรวจสอบการกำหนดค่า - ตรวจสอบความสมบูรณ์ทางลอจิคัลของการกำหนดค่า + ค้นหาข้อมูลอ้างอิงที่ไม่ถูกต้อง

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

2. หากปัญหาความไม่ซ้ำกันเกิดขึ้นในขณะที่ผู้ใช้กำลังทำงาน:

2.1. ค้นหาคำขอที่มีปัญหาโดยใช้วิธีการในวรรค 1.4

2.1.2. บางครั้งมีข้อผิดพลาดเกิดขึ้นขณะดำเนินการค้นหา เช่น:

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากความจริงที่ว่าในโมดูลการลงทะเบียนการสะสม "เวลาทำงานของพนักงานขององค์กร" ในขั้นตอน "การคำนวณการลงทะเบียนใหม่" คำบริการ "DIFFERENT" จะไม่รวมอยู่ในคำขอ
รหัส 1C v 8.x เช่น ควรจะเป็น:
คำขอ = คำขอใหม่ (
"เลือกต่างๆ
- พื้นฐานส่วนบุคคล
. . . . .
ใน ZUP และ UPP รุ่นล่าสุด ข้อผิดพลาดจะไม่เกิดขึ้นเนื่องจาก มันบอกว่า "แตกต่าง"

2.2. หลังจากค้นหาดัชนีที่เป็นปัญหาจากย่อหน้าก่อนหน้าแล้ว คุณต้องค้นหาบันทึกที่ไม่ซ้ำกัน
2.2.1. สคริปต์ "Fish" สำหรับระบุบันทึกที่ไม่ซ้ำโดยใช้ SQL:
รหัส SQL S_elect COUNT(*) ตัวนับ<перечисление всех полей соответствующего индекса>จาก<имя таблицы>
จัดกลุ่มตาม<перечисление всех полей соответствующего индекса>
มีเคาน์เตอร์ > 1

2.2.2 ตัวอย่าง ดัชนีในข้อผิดพลาดเรียกว่า "_Document140_VT1385_IntKeyIndNG"
รายการเขตข้อมูลตาราง:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393_ _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261, _Fld22261_RRอ้างอิง
ก่อนดำเนินการตามขั้นตอนด้านล่าง โปรดสำรองฐานข้อมูลของคุณ
ทำงานในตัววิเคราะห์แบบสอบถามเซิร์ฟเวอร์ MS SQL:
รหัส SQL S_elect นับ (*), _Document140_IDRRef, _KeyField
จาก om _Document140_VT1385
จัดกลุ่มตาม _Document140_IDRRef, _KeyField
มีจำนวน(*) > 1
ใช้เพื่อค้นหาค่าของคอลัมน์ _Document140_IDRRef, _KeyField, ระเบียนที่ซ้ำกัน (id, key)

การใช้คำขอ:
รหัส SQL S_elect *
จาก om _Document140_VT1385
โดยที่ _Document140_IDRRef = id1 และ _KeyField = key1 หรือ _Document140_IDRRef = id2 และ _KeyField = key2 หรือ ...
ดูค่าของคอลัมน์อื่นๆ ของรายการที่ซ้ำกัน
หากทั้งสองรายการมีค่าที่มีความหมายและค่าต่างกัน ให้เปลี่ยนค่า _KeyField ให้ไม่ซ้ำกัน เมื่อต้องการทำเช่นนี้ ให้กำหนดค่าการครอบครองสูงสุดของ _KeyField (keymax):
รหัส SQL S_elect สูงสุด (_KeyField)
จาก om _Document140_VT1385
มี _Document140_IDRRef อยู่ที่ไหน = id1
แทนที่ค่า _KeyField ในรายการที่ซ้ำกันรายการใดรายการหนึ่งด้วยค่าที่ถูกต้อง:
อัปเดตโค้ด SQL กิน _Document140_VT1385
ตั้งค่า _KeyField = คีย์แม็กซ์ + 1

ที่นี่ _LineNo1386 = เป็นเงื่อนไขเพิ่มเติมที่ช่วยให้คุณสามารถเลือกหนึ่งในสองเรกคอร์ดที่ทำซ้ำได้

หากรายการที่ซ้ำกันรายการใดรายการหนึ่ง (หรือทั้งสอง) มีความหมายไม่ถูกต้องอย่างชัดเจน ควรลบรายการนั้นออก:
ลบโค้ด SQL ออกจาก _Document140_VT1385
มี _Document140_IDRRef = id1 และ _LineNo1386 = lineno1 อยู่ตรงไหน
หากรายการที่ซ้ำกันมีค่าเท่ากันในทุกคอลัมน์คุณจะต้องปล่อยรายการใดรายการหนึ่งไว้:
รหัส SQL S_elect แตกต่าง *
ลงใน #tmp1
จาก_Document140_VT1385

ลบออกจาก _Document140_VT1385
มี _Document140_IDRRef = id1 และ _KeyField = key1 อยู่ตรงไหน

ฉัน_แทรกลงใน _Document140_VT1385
S_เลือก #tmp1

ตาราง D_rop #tmp1

ต้องปฏิบัติตามขั้นตอนที่อธิบายไว้สำหรับบันทึกที่ซ้ำกันแต่ละคู่

2.2.3. ตัวอย่างที่สอง:
รหัส SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
จาก _ข้อมูลอ้างอิง8_
จัดกลุ่มตาม _IDRRef, _คำอธิบาย
มี (นับ(*) > 1)

2.3.4 ตัวอย่างการพิจารณาบันทึกที่ไม่ซ้ำโดยใช้แบบสอบถาม 1C:Enterprise:
รหัส 1C v 8.x SELECT Directory.Link
จากไดเร็กทอรีไดเร็กทอรี AS ไดเร็กทอรี
จัดกลุ่มตามไดเรกทอรีลิงค์
มีปริมาณ(*) > 1

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

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

โซลูชั่น:

1. ในสตูดิโอการจัดการ SQL Server เราจะทำลายดัชนีที่ผิดพลาดทางกายภาพ (ในกรณีของฉันคือดัชนีในตารางผลรวมการลงทะเบียนการบัญชี) ใน 1C เราจะแจกจ่ายเอกสารที่ผิดพลาด ในโหมดการทดสอบและแก้ไข ให้เลือกช่องสำหรับจัดทำดัชนีตารางใหม่ + คำนวณผลรวมใหม่ 1C สร้างดัชนีใหม่โดยไม่มีข้อผิดพลาด เราดำเนินการเอกสารที่ล้มเหลวก่อนหน้านี้

2. 1) โดยใช้ Management Studio 2005 ฉันสร้างสคริปต์สร้างเพื่อสร้างดัชนีซึ่งมีข้อบกพร่องและบันทึกลงในไฟล์
2) ฆ่าดัชนี jamb ด้วยตนเองจากตาราง _AccumRgTn19455
3) เปิดตัวคำขอเช่น
รหัส SQL S_elect นับ (*), index_fields
จาก AccumRgTn19455
จัดกลุ่มตามดัชนี_ฟิลด์
มีนับ(*)>1
หลังจากที่ดัชนีถูกฆ่า ฉันมีบันทึกที่ซ้ำกัน 15 รายการแสดง แม้ว่าก่อนขั้นตอนที่ 2 ข้อความค้นหาจะไม่ส่งคืนอะไรเลย
4) ฉันอ่านรายการทั้งหมดแล้วและล้างรายการที่ซ้ำกันด้วยตนเอง อันที่จริง ฉันยังใช้การประมวลผล "โครงสร้างรายงาน" เพื่อทำความเข้าใจสิ่งที่ฉันกำลังเผชิญอยู่ ปรากฎว่าตาราง _AccumRgTn19455 เก็บทะเบียนการสะสม "ผลผลิตผลิตภัณฑ์ (การบัญชีภาษี)" ฉันยังแก้ไขด้วยการสืบค้น sql ระบุเอกสารที่ไม่ซ้ำกัน 15 ฉบับ และหลังจากดำเนินการทั้งหมดเสร็จสิ้น ฉันตรวจสอบใน 1C ว่าเอกสารเหล่านี้ได้รับการประมวลผลตามปกติโดยไม่มีข้อผิดพลาด แน่นอนว่า คุณไม่ควรเพียงแค่ทำความสะอาดโต๊ะแบบสุ่มเท่านั้น สิ่งสำคัญคือต้องเข้าใจว่าอะไรกำลังทำความสะอาดและจะเป็นอย่างไร
5) เปิดตัวคำขอเพื่อสร้างดัชนีซึ่งถูกบันทึกไว้ในไฟล์
6) เปลี่ยนฐานข้อมูลเป็นโหมดผู้ใช้คนเดียวและเปิดใช้งาน dbcc checkdb - คราวนี้ไม่มีการสร้างข้อผิดพลาด
7) เปลี่ยนฐานกลับเป็นโหมดผู้ใช้คนเดียว
เพียงเท่านี้...ปัญหาก็จะหมดไป ย้อนกลับไปใน 1C ฉันเปิดตัว "การทดสอบและการแก้ไข" ทุกอย่างเป็นไปด้วยดีเช่นกัน ฉันหยุดบ่นเกี่ยวกับดัชนีที่ไม่ซ้ำใคร

3. ถ้าความไม่ซ้ำกันอยู่ในวันที่ที่มีค่าเป็นศูนย์จากนั้นปัญหาจะได้รับการแก้ไขโดยการสร้างฐานข้อมูลที่มีพารามิเตอร์ออฟเซ็ตเท่ากับ 2000

1. หากปัญหากำลังโหลดฐานข้อมูล ให้ทำดังนี้:
1.1. หากคุณกำลังโหลด (โดยใช้ไฟล์ dt) ลงในฐานข้อมูล MS SQL Server จากนั้นเมื่อสร้างฐานข้อมูลก่อนที่จะโหลดให้ระบุออฟเซ็ตวันที่ - 2000
หากฐานข้อมูลถูกสร้างขึ้นด้วยออฟเซ็ต 0 ให้สร้างฐานข้อมูลใหม่ด้วย 2000

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

1.3. หากไม่มีเวอร์ชันไฟล์ ให้ลองโหลดจาก DT ลงในเวอร์ชันไคลเอ็นต์-เซิร์ฟเวอร์ด้วย DB2 (ซึ่งมีความต้องการความเป็นเอกลักษณ์น้อยกว่า) จากนั้นทำการทดสอบและแก้ไข รวมถึงการกำหนดค่า - ตรวจสอบการกำหนดค่า - ตรวจสอบความสมบูรณ์ทางลอจิคัลของการกำหนดค่า + ค้นหาข้อมูลอ้างอิงที่ไม่ถูกต้อง

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

2. หากปัญหาความไม่ซ้ำกันเกิดขึ้นในขณะที่ผู้ใช้กำลังทำงาน:

2.1. ค้นหาคำขอที่มีปัญหาโดยใช้วิธีการในวรรค 1.4

2.1.2. บางครั้งมีข้อผิดพลาดเกิดขึ้นขณะดำเนินการค้นหา เช่น:

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากความจริงที่ว่าในโมดูลการลงทะเบียนการสะสม "เวลาทำงานของพนักงานขององค์กร" ในขั้นตอน "การคำนวณการลงทะเบียนใหม่" คำบริการ "DIFFERENT" จะไม่รวมอยู่ในคำขอ
รหัส 1C v 8.x เช่น ควรจะเป็น:
คำขอ = คำขอใหม่ (
"เลือกต่างๆ
- พื้นฐานส่วนบุคคล
. . . . .
ใน ZUP และ UPP รุ่นล่าสุด ข้อผิดพลาดจะไม่เกิดขึ้นเนื่องจาก มันบอกว่า "แตกต่าง"

2.2. หลังจากค้นหาดัชนีที่เป็นปัญหาจากย่อหน้าก่อนหน้าแล้ว คุณต้องค้นหาบันทึกที่ไม่ซ้ำกัน
2.2.1. สคริปต์ "Fish" สำหรับระบุบันทึกที่ไม่ซ้ำโดยใช้ SQL:
รหัส SQL S_elect นับ (*) ตัวนับ<перечисление всех полей соответствующего индекса>จาก<имя таблицы>
จัดกลุ่มตาม<перечисление всех полей соответствующего индекса>
มีเคาน์เตอร์ > 1

2.2.2 ตัวอย่าง ดัชนีในข้อผิดพลาดเรียกว่า "_Document140_VT1385_IntKeyIndNG"
รายการเขตข้อมูลตาราง:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393_ _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261, _Fld22261_RRอ้างอิง
ก่อนดำเนินการตามขั้นตอนด้านล่าง โปรดสำรองฐานข้อมูลของคุณ
ทำงานในตัววิเคราะห์แบบสอบถามเซิร์ฟเวอร์ MS SQL:
รหัส SQL S_elect นับ (*), _Document140_IDRRef, _KeyField
จาก_Document140_VT1385
จัดกลุ่มตาม _Document140_IDRRef, _KeyField
มีจำนวน(*) > 1
ใช้เพื่อค้นหาค่าของคอลัมน์ _Document140_IDRRef, _KeyField, ระเบียนที่ซ้ำกัน (id, key)

การใช้คำขอ:
รหัส SQL S_elect *
จาก_Document140_VT1385
หรือ _Document140_IDRRef = id2 และ _KeyField = key2 หรือ ...
ดูค่าของคอลัมน์อื่นๆ ของรายการที่ซ้ำกัน
หากทั้งสองรายการมีค่าที่มีความหมายและค่าต่างกัน ให้เปลี่ยนค่า _KeyField ให้ไม่ซ้ำกัน เมื่อต้องการทำเช่นนี้ ให้กำหนดค่าการครอบครองสูงสุดของ _KeyField (keymax):
รหัส SQL S_elect สูงสุด (_KeyField)
จาก_Document140_VT1385
โดยที่ _Document140_IDRRef = id1
แทนที่ค่า _KeyField ในรายการที่ซ้ำกันรายการใดรายการหนึ่งด้วยค่าที่ถูกต้อง:
อัปเดตโค้ด SQL _Document140_VT1385
ตั้งค่า _KeyField = คีย์แม็กซ์ + 1
ที่นี่ _LineNo1386 = เป็นเงื่อนไขเพิ่มเติมที่ช่วยให้คุณสามารถเลือกหนึ่งในสองเรกคอร์ดที่ทำซ้ำได้

หากรายการที่ซ้ำกันรายการใดรายการหนึ่ง (หรือทั้งสอง) มีความหมายไม่ถูกต้องอย่างชัดเจน ควรลบรายการนั้นออก:
ลบโค้ด SQL ออกจาก _Document140_VT1385
โดยที่ _Document140_IDRRef = id1 และ _LineNo1386 = lineno1
หากรายการที่ซ้ำกันมีค่าเท่ากันในทุกคอลัมน์คุณจะต้องปล่อยรายการใดรายการหนึ่งไว้:
รหัส SQL S_elect แตกต่าง *
ลงใน #tmp1
จาก_Document140_VT1385
โดยที่ _Document140_IDRRef = id1 และ _KeyField = key1

ลบออกจาก _Document140_VT1385
โดยที่ _Document140_IDRRef = id1 และ _KeyField = key1

ฉัน_แทรกลงใน _Document140_VT1385
S_เลือก #tmp1

ตาราง D_rop #tmp1

ต้องปฏิบัติตามขั้นตอนที่อธิบายไว้สำหรับบันทึกที่ซ้ำกันแต่ละคู่

2.2.3. ตัวอย่างที่สอง:
รหัส SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
จาก _ข้อมูลอ้างอิง8_
จัดกลุ่มตาม _IDRRef, _คำอธิบาย
มี (นับ(*) > 1)

2.3.4 ตัวอย่างการพิจารณาบันทึกที่ไม่ซ้ำโดยใช้แบบสอบถาม 1C:Enterprise:
รหัส 1C v 8.x SELECT Directory.Link
จากไดเร็กทอรีไดเร็กทอรี AS ไดเร็กทอรี
จัดกลุ่มตามไดเรกทอรีลิงค์
มีปริมาณ(*) > 1

บทความนี้จะอธิบายว่าต้องทำอย่างไรเมื่อทำงานกับ 1C:Enterprise 8.1 คุณพบข้อความที่มีบรรทัด:

ไม่สามารถแทรกแถวคีย์ที่ซ้ำกันในวัตถุได้

มีการพยายามที่จะแทรกค่าที่ไม่ซ้ำกันลงในดัชนีที่ไม่ซ้ำกัน

ดัชนีคืออะไร?

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

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

ดัชนีของตารางในฐานข้อมูล 1C:Enterprise จะถูกสร้างขึ้นโดยปริยายเมื่อสร้างออบเจ็กต์การกำหนดค่า รวมถึงระหว่างการตั้งค่าบางอย่างของออบเจ็กต์การกำหนดค่า

สาระสำคัญทางกายภาพของดัชนีใน MS SQL Server 2005

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

แม้จะมีข้อดี แต่ดัชนีก็มีข้อเสียหลายประการเช่นกัน อันแรกคือดัชนี ใช้พื้นที่ดิสก์เพิ่มเติมและในแรม ทุกครั้งที่คุณสร้างดัชนี คุณจะจัดเก็บคีย์ตามลำดับจากมากไปน้อยหรือจากน้อยไปหามาก ซึ่งอาจมีหลายระดับได้ และยิ่งคีย์ใหญ่/ยาวเท่าใด ขนาดดัชนีก็จะยิ่งใหญ่ขึ้นเท่านั้น ข้อเสียประการที่สองคือ การดำเนินงานกำลังชะลอตัวลงการแทรก การอัปเดต และการลบบันทึก
ในสภาพแวดล้อม MS SQL Server 2005 มีการใช้ดัชนีหลายประเภท:

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

ดัชนีที่ไม่ซ้ำ

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

1C:Enterprise 8.1 เริ่มต้นจากเวอร์ชัน 8.1 ใช้ดัชนีเฉพาะแบบคลัสเตอร์อย่างจริงจัง ซึ่งหมายความว่าเมื่อแปลงจาก 8.0 หรือย้ายจาก 8.1.7 คุณอาจได้รับข้อผิดพลาดของดัชนีที่ไม่ซ้ำกัน

หากความไม่ซ้ำกันอยู่ในวันที่ที่มีค่าเป็นศูนย์ ปัญหาจะได้รับการแก้ไขโดยการสร้างฐานข้อมูลที่มีพารามิเตอร์ออฟเซ็ตเท่ากับ 2000

จะทำอย่างไร?

1. หากปัญหากำลังโหลดฐานข้อมูล ให้ทำดังนี้:

1.1. หากคุณกำลังโหลด (โดยใช้ไฟล์ dt) ลงในฐานข้อมูล MS SQL Server ดังนั้นเมื่อสร้างฐานข้อมูลก่อนที่จะโหลดให้ระบุออฟเซ็ตวันที่ - 2000

หากฐานข้อมูลถูกสร้างขึ้นด้วยออฟเซ็ต 0 ให้สร้างฐานข้อมูลใหม่ด้วย 2000

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

1.3. หากไม่มีเวอร์ชันไฟล์ ให้ลองโหลดจาก DT ลงในเวอร์ชันไคลเอ็นต์-เซิร์ฟเวอร์ด้วย DB2 (ซึ่งมีความต้องการความเป็นเอกลักษณ์น้อยกว่า) จากนั้นทำการทดสอบและแก้ไข รวมถึงการกำหนดค่า - ตรวจสอบการกำหนดค่า - ตรวจสอบความสมบูรณ์ทางลอจิคัลของการกำหนดค่า + ค้นหาข้อมูลอ้างอิงที่ไม่ถูกต้อง

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

1.5. หากโหนด (แผนการแลกเปลี่ยน) พร้อมใช้งาน ให้ทำการแลกเปลี่ยน คุณสามารถกรอกย่อหน้า 2.3.5 เพิ่มเติมได้ก่อนที่จะทำการแลกเปลี่ยน

2. หากปัญหาความไม่ซ้ำกันเกิดขึ้นในขณะที่ผู้ใช้กำลังทำงาน:

2.1. ค้นหาคำขอที่มีปัญหาโดยใช้วิธีการในวรรค 1.4

2.1.2. บางครั้งมีข้อผิดพลาดเกิดขึ้นขณะดำเนินการค้นหา เช่น:

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

เหล่านั้น. ควรจะเป็น:

คำขอ = คำขอใหม่ (
"เลือกต่างๆ
- พื้นฐานส่วนบุคคล

ใน ZUP และ UPP รุ่นล่าสุด ข้อผิดพลาดจะไม่เกิดขึ้นเนื่องจาก มันบอกว่า "แตกต่าง"

2.2. หลังจากค้นหาดัชนีที่เป็นปัญหาจากย่อหน้าก่อนหน้าแล้ว คุณต้องค้นหาบันทึกที่ไม่ซ้ำกัน

2.2.1. สคริปต์ "Fish" สำหรับระบุบันทึกที่ไม่ซ้ำโดยใช้ SQL:
เลือกนับ(*) ตัวนับ<перечисление всех полей соответствующего индекса>จาก<имя таблицы>
จัดกลุ่มตาม<перечисление всех полей соответствующего индекса>
มีเคาน์เตอร์ > 1

2.2.2 ตัวอย่าง ดัชนีในข้อผิดพลาดเรียกว่า "_Document140_VT1385_IntKeyIndNG"

รายการเขตข้อมูลตาราง:

Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393_RRRef, 1394,

FLd1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261_RTRef, _Fld2226 _RRอ้างอิง

ก่อนดำเนินการตามขั้นตอนด้านล่าง โปรดสำรองฐานข้อมูลของคุณ
ทำงานในตัววิเคราะห์แบบสอบถามเซิร์ฟเวอร์ MS SQL:

เลือกจำนวน(*), _Document140_IDRRef, _KeyField
จาก_Document140_VT1385
จัดกลุ่มตาม _Document140_IDRRef, _KeyField
มีจำนวน(*) > 1

ใช้เพื่อค้นหาค่าของคอลัมน์ _Document140_IDRRef, _KeyField, ระเบียนที่ซ้ำกัน (id, key)

การใช้คำขอ:

เลือก *
จาก_Document140_VT1385
หรือ _Document140_IDRRef = id2 และ _KeyField = key2 หรือ …

ดูค่าของคอลัมน์อื่นๆ ของรายการที่ซ้ำกัน

หากทั้งสองรายการมีค่าที่มีความหมายและค่าต่างกัน ให้เปลี่ยนค่า _KeyField ให้ไม่ซ้ำกัน เมื่อต้องการทำเช่นนี้ ให้กำหนดค่าการครอบครองสูงสุดของ _KeyField (keymax):

เลือกสูงสุด (_KeyField)
จาก_Document140_VT1385
โดยที่ _Document140_IDRRef = id1

แทนที่ค่า _KeyField ในรายการที่ซ้ำกันรายการใดรายการหนึ่งด้วยค่าที่ถูกต้อง:

update_Document140_VT1385
ตั้งค่า _KeyField = คีย์แม็กซ์ + 1

ที่นี่ _LineNo1386 = เป็นเงื่อนไขเพิ่มเติมที่ช่วยให้คุณสามารถเลือกหนึ่งในสองเรกคอร์ดที่ทำซ้ำได้

หากรายการที่ซ้ำกันรายการใดรายการหนึ่ง (หรือทั้งสอง) มีความหมายไม่ถูกต้องอย่างชัดเจน ควรลบรายการนั้นออก:


โดยที่ _Document140_IDRRef = id1 และ _LineNo1386 = lineno1

หากรายการที่ซ้ำกันมีค่าเท่ากันในทุกคอลัมน์คุณจะต้องปล่อยรายการใดรายการหนึ่งไว้:

เลือกความแตกต่าง *
ลงใน #tmp1
จาก_Document140_VT1385
โดยที่ _Document140_IDRRef = id1 และ _KeyField = key1

ลบออกจาก _Document140_VT1385
โดยที่ _Document140_IDRRef = id1 และ _KeyField = key1

แทรกลงใน _Document140_VT1385
เลือก #tmp1

วางตาราง #tmp1

ต้องปฏิบัติตามขั้นตอนที่อธิบายไว้สำหรับบันทึกที่ซ้ำกันแต่ละคู่

2.2.3. ตัวอย่างที่สอง:

เลือก COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
จาก _ข้อมูลอ้างอิง8_
จัดกลุ่มตาม _IDRRef, _คำอธิบาย
มี (นับ(*) > 1)

2.3.4 ตัวอย่างการพิจารณาบันทึกที่ไม่ซ้ำโดยใช้แบบสอบถาม 1C:Enterprise:

หรือเพื่อการบัญชี

เลือก
แบบสอบถามย่อยระยะเวลา
แบบสอบถามย่อยบันทึก
<измерения>,
SUM(Subquery.Number of Records) AS จำนวนเรคคอร์ด
จาก
(เลือก
การพึ่งพาตนเอง ระยะเวลา AS
พึ่งตนเองนายทะเบียน AS นายทะเบียน
<измерения>,
1 AS จำนวนบันทึก
จาก
การลงทะเบียนการบัญชี AS ที่สนับสนุนตนเอง) AS แบบสอบถามย่อย

จัดกลุ่มตาม
แบบสอบถามย่อยระยะเวลา
แบบสอบถามย่อยบันทึก
<измерения>

มี
SUM(แบบสอบถามย่อยจำนวนระเบียน) > 1

2.3.5 ทำให้ดัชนีย่อยไม่ซ้ำกัน สคริปต์ดัชนีโดยใช้ Management Studio

2.3.6 เป็นกรณีพิเศษเมื่อทำการแลกเปลี่ยนใน RDB ข้อผิดพลาดเกิดขึ้นในตาราง "เสริม" ที่เกี่ยวข้องกับการคำนวณผลรวมหรือการวิเคราะห์ ตัวอย่างเช่น:

ข้อผิดพลาดเมื่อเรียกวิธีบริบท (เขียน): กำลังพยายามแทรกค่าที่ไม่ซ้ำกันลงในดัชนีเฉพาะ:
ผู้ให้บริการ Microsoft OLE DB สำหรับ SQL Server: ไม่สามารถแทรกแถวคีย์ที่ซ้ำกันในวัตถุ 'dbo._AccntRegED10319' ด้วยดัชนีที่ไม่ซ้ำกัน '_Accnt10319_ByPeriod_TRNRN'
HRESULT=80040E2F, SQLSrvr: สถานะข้อผิดพลาด=1, ความรุนแรง=E, ดั้งเดิม=2601, บรรทัด=1

ในกรณีนี้ ก่อนที่จะโหลด ให้ปิดการใช้ผลรวม โหลดข้อความ เปิดใช้งานการใช้ผลรวม และคำนวณใหม่

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

โซลูชั่น:

1. ในสตูดิโอการจัดการ SQL Server เราจะทำลายดัชนีที่ผิดพลาดทางกายภาพ (ในกรณีของฉันคือดัชนีในตารางผลรวมการลงทะเบียนการบัญชี) ใน 1C เราจะแจกจ่ายเอกสารที่ผิดพลาด ในโหมดการทดสอบและแก้ไข ให้เลือกช่องสำหรับจัดทำดัชนีตารางใหม่ + คำนวณผลรวมใหม่ 1C สร้างดัชนีใหม่โดยไม่มีข้อผิดพลาด เราดำเนินการเอกสารที่ล้มเหลวก่อนหน้านี้

2. 1) โดยใช้ Management Studio 2005 ฉันสร้างสคริปต์สร้างเพื่อสร้างดัชนีซึ่งมีข้อบกพร่องและบันทึกลงในไฟล์
2) ฆ่าดัชนี jamb ด้วยตนเองจากตาราง _AccumRgTn19455
3) เปิดตัวคำขอเช่น
รหัส SQL S_elect นับ (*), index_fields
จาก AccumRgTn19455
จัดกลุ่มตามดัชนี_ฟิลด์
มีนับ(*)>1
หลังจากที่ดัชนีถูกฆ่า ฉันมีบันทึกที่ซ้ำกัน 15 รายการแสดง แม้ว่าก่อนขั้นตอนที่ 2 ข้อความค้นหาจะไม่ส่งคืนอะไรเลย
4) ฉันอ่านรายการทั้งหมดแล้วและล้างรายการที่ซ้ำกันด้วยตนเอง อันที่จริง ฉันยังใช้การประมวลผล "โครงสร้างรายงาน" เพื่อทำความเข้าใจสิ่งที่ฉันกำลังเผชิญอยู่ ปรากฎว่าตาราง _AccumRgTn19455 เก็บทะเบียนการสะสม "ผลผลิตผลิตภัณฑ์ (การบัญชีภาษี)" ฉันยังแก้ไขด้วยการสืบค้น sql ระบุเอกสารที่ไม่ซ้ำกัน 15 ฉบับ และหลังจากดำเนินการทั้งหมดเสร็จสิ้น ฉันตรวจสอบใน 1C ว่าเอกสารเหล่านี้ได้รับการประมวลผลตามปกติโดยไม่มีข้อผิดพลาด แน่นอนว่า คุณไม่ควรเพียงแค่ทำความสะอาดโต๊ะแบบสุ่มเท่านั้น สิ่งสำคัญคือต้องเข้าใจว่าอะไรกำลังทำความสะอาดและจะเป็นอย่างไร
5) เปิดตัวคำขอเพื่อสร้างดัชนีซึ่งถูกบันทึกไว้ในไฟล์
6) เปลี่ยนฐานข้อมูลเป็นโหมดผู้ใช้คนเดียวและเปิดใช้งาน dbcc checkdb - คราวนี้ไม่มีการสร้างข้อผิดพลาด
7) เปลี่ยนฐานกลับเป็นโหมดผู้ใช้คนเดียว
เพียงเท่านี้...ปัญหาก็จะหมดไป ย้อนกลับไปใน 1C ฉันเปิดตัว "การทดสอบและการแก้ไข" ทุกอย่างเป็นไปด้วยดีเช่นกัน ฉันหยุดบ่นเกี่ยวกับดัชนีที่ไม่ซ้ำใคร

3. ถ้าความไม่ซ้ำกันอยู่ในวันที่ที่มีค่าเป็นศูนย์จากนั้นปัญหาจะได้รับการแก้ไขโดยการสร้างฐานข้อมูลที่มีพารามิเตอร์ออฟเซ็ตเท่ากับ 2000

1. หากปัญหากำลังโหลดฐานข้อมูล ให้ทำดังนี้:
1.1. หากคุณกำลังโหลด (โดยใช้ไฟล์ dt) ลงในฐานข้อมูล MS SQL Server จากนั้นเมื่อสร้างฐานข้อมูลก่อนที่จะโหลดให้ระบุออฟเซ็ตวันที่ - 2000
หากฐานข้อมูลถูกสร้างขึ้นด้วยออฟเซ็ต 0 ให้สร้างฐานข้อมูลใหม่ด้วย 2000

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

1.3. หากไม่มีเวอร์ชันไฟล์ ให้ลองโหลดจาก DT ลงในเวอร์ชันไคลเอ็นต์-เซิร์ฟเวอร์ด้วย DB2 (ซึ่งมีความต้องการความเป็นเอกลักษณ์น้อยกว่า) จากนั้นทำการทดสอบและแก้ไข รวมถึงการกำหนดค่า - ตรวจสอบการกำหนดค่า - ตรวจสอบความสมบูรณ์ทางลอจิคัลของการกำหนดค่า + ค้นหาข้อมูลอ้างอิงที่ไม่ถูกต้อง

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

2. หากปัญหาความไม่ซ้ำกันเกิดขึ้นในขณะที่ผู้ใช้กำลังทำงาน:

2.1. ค้นหาคำขอที่มีปัญหาโดยใช้วิธีการในวรรค 1.4

2.1.2. บางครั้งมีข้อผิดพลาดเกิดขึ้นขณะดำเนินการค้นหา เช่น:

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากความจริงที่ว่าในโมดูลการลงทะเบียนการสะสม "เวลาทำงานของพนักงานขององค์กร" ในขั้นตอน "การคำนวณการลงทะเบียนใหม่" คำบริการ "DIFFERENT" จะไม่รวมอยู่ในคำขอ
รหัส 1C v 8.x เช่น ควรจะเป็น:
คำขอ = คำขอใหม่ (
"เลือกต่างๆ
- พื้นฐานส่วนบุคคล
. . . . .
ใน ZUP และ UPP รุ่นล่าสุด ข้อผิดพลาดจะไม่เกิดขึ้นเนื่องจาก มันบอกว่า "แตกต่าง"

2.2. หลังจากค้นหาดัชนีที่เป็นปัญหาจากย่อหน้าก่อนหน้าแล้ว คุณต้องค้นหาบันทึกที่ไม่ซ้ำกัน
2.2.1. สคริปต์ "Fish" สำหรับระบุบันทึกที่ไม่ซ้ำโดยใช้ SQL:
รหัส SQL S_elect นับ (*) ตัวนับ<перечисление всех полей соответствующего индекса>จาก<имя таблицы>
จัดกลุ่มตาม<перечисление всех полей соответствующего индекса>
มีเคาน์เตอร์ > 1

2.2.2 ตัวอย่าง ดัชนีในข้อผิดพลาดเรียกว่า "_Document140_VT1385_IntKeyIndNG"
รายการเขตข้อมูลตาราง:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393_ _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261, _Fld22261_RRอ้างอิง
ก่อนดำเนินการตามขั้นตอนด้านล่าง โปรดสำรองฐานข้อมูลของคุณ
ทำงานในตัววิเคราะห์แบบสอบถามเซิร์ฟเวอร์ MS SQL:
รหัส SQL S_elect นับ (*), _Document140_IDRRef, _KeyField
จาก_Document140_VT1385
จัดกลุ่มตาม _Document140_IDRRef, _KeyField
มีจำนวน(*) > 1
ใช้เพื่อค้นหาค่าของคอลัมน์ _Document140_IDRRef, _KeyField, ระเบียนที่ซ้ำกัน (id, key)

การใช้คำขอ:
รหัส SQL S_elect *
จาก_Document140_VT1385
หรือ _Document140_IDRRef = id2 และ _KeyField = key2 หรือ ...
ดูค่าของคอลัมน์อื่นๆ ของรายการที่ซ้ำกัน
หากทั้งสองรายการมีค่าที่มีความหมายและค่าต่างกัน ให้เปลี่ยนค่า _KeyField ให้ไม่ซ้ำกัน เมื่อต้องการทำเช่นนี้ ให้กำหนดค่าการครอบครองสูงสุดของ _KeyField (keymax):
รหัส SQL S_elect สูงสุด (_KeyField)
จาก_Document140_VT1385
โดยที่ _Document140_IDRRef = id1
แทนที่ค่า _KeyField ในรายการที่ซ้ำกันรายการใดรายการหนึ่งด้วยค่าที่ถูกต้อง:
อัปเดตโค้ด SQL _Document140_VT1385
ตั้งค่า _KeyField = คีย์แม็กซ์ + 1
ที่นี่ _LineNo1386 = เป็นเงื่อนไขเพิ่มเติมที่ช่วยให้คุณสามารถเลือกหนึ่งในสองเรกคอร์ดที่ทำซ้ำได้

หากรายการที่ซ้ำกันรายการใดรายการหนึ่ง (หรือทั้งสอง) มีความหมายไม่ถูกต้องอย่างชัดเจน ควรลบรายการนั้นออก:
ลบโค้ด SQL ออกจาก _Document140_VT1385
โดยที่ _Document140_IDRRef = id1 และ _LineNo1386 = lineno1
หากรายการที่ซ้ำกันมีค่าเท่ากันในทุกคอลัมน์คุณจะต้องปล่อยรายการใดรายการหนึ่งไว้:
รหัส SQL S_elect แตกต่าง *
ลงใน #tmp1
จาก_Document140_VT1385
โดยที่ _Document140_IDRRef = id1 และ _KeyField = key1

ลบออกจาก _Document140_VT1385
โดยที่ _Document140_IDRRef = id1 และ _KeyField = key1

ฉัน_แทรกลงใน _Document140_VT1385
S_เลือก #tmp1

ตาราง D_rop #tmp1

ต้องปฏิบัติตามขั้นตอนที่อธิบายไว้สำหรับบันทึกที่ซ้ำกันแต่ละคู่

2.2.3. ตัวอย่างที่สอง:
รหัส SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
จาก _ข้อมูลอ้างอิง8_
จัดกลุ่มตาม _IDRRef, _คำอธิบาย
มี (นับ(*) > 1)

2.3.4 ตัวอย่างการพิจารณาบันทึกที่ไม่ซ้ำโดยใช้แบบสอบถาม 1C:Enterprise:
รหัส 1C v 8.x SELECT Directory.Link
จากไดเร็กทอรีไดเร็กทอรี AS ไดเร็กทอรี
จัดกลุ่มตามไดเรกทอรีลิงค์
มีปริมาณ(*) > 1

เกิดข้อผิดพลาดหากวัตถุ รายละเอียด เนื้อหาย่อยในฐานข้อมูลมีค่า NULL แต่ไม่สามารถมีค่าดังกล่าวได้ และข้อผิดพลาดนี้จะปรากฏเฉพาะในฐานข้อมูล SQL เท่านั้น เหล่านั้น. หากคุณอัปโหลดฐานข้อมูลดังกล่าวเป็นไฟล์หนึ่ง ข้อผิดพลาดนี้จะไม่อยู่ที่นั่นอีกต่อไป เพราะ ฐานข้อมูลไฟล์มีตารางของตัวเอง (ทั้งหมด 4 ตาราง) และ SQL ก็มีตารางของตัวเอง และฐานข้อมูล SQL ตอบสนองอย่างมีวิจารณญาณต่อค่าดังกล่าวในตาราง

ปัญหานี้ไม่สามารถแก้ไขได้ด้วยการทดสอบใดๆ (ทั้งภายนอกหรือภายใน) ในเวอร์ชันใดๆ ของฐานข้อมูล (SQL หรือไฟล์) และแม้กระทั่งโดย _1sp_DBReindex Procedure ในตัวจัดการ SQL ซึ่งดูเหมือนว่าจะควรจะปรับโครงสร้างตารางใน SQL ใหม่

ลองดูวิธีแก้ไขปัญหาโดยใช้ตัวอย่างการเปลี่ยนจากการบัญชี 3.0 PROF เป็น CORP หลังจากการเปลี่ยนแปลง บัญชี 68.01 มีบัญชีย่อยใหม่ การลงทะเบียนกับหน่วยงานด้านภาษี จากนั้นในฐานข้อมูล SQL เอกสารทั้งหมดที่สร้างในเวอร์ชัน PRO ที่ใช้บัญชีนี้จะไม่ถูกถ่ายโอน ข้อผิดพลาดที่แสดงข้างต้นจะปรากฏขึ้น เพราะ บัญชีย่อยใหม่สำหรับเอกสารเก่าในการผ่านรายการจะถูกเขียนด้วยค่า NULL (แม้ว่าจะควรมีค่าว่างหรือหน่วยงานด้านภาษีก็ตาม)

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

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

แต่การแทนที่ NULL ในฐานข้อมูล SQL จะไม่ทำงาน ในระหว่างการประมวลผล ข้อผิดพลาดเดียวกันจะถูกสร้างขึ้น ดังนั้นคุณต้องทำสิ่งนี้:

1. อัปโหลดเวอร์ชันที่ทำงานอยู่แล้วของฐานข้อมูล SQL ซึ่งแปลเป็น CORP ลงในไฟล์ dt (ในผู้ดูแลระบบตัวกำหนดค่า – อัปโหลดฐานข้อมูล – เลือกตำแหน่งที่จะอัปโหลดฐานข้อมูลเป็นไฟล์ *.dt)

2. โหลดไฟล์ dt ลงในฐานข้อมูลไฟล์ (ในฐานข้อมูลไฟล์ที่สะอาดที่ไม่จำเป็นหรือเตรียมไว้ล่วงหน้าในผู้ดูแลระบบตัวกำหนดค่า - โหลดฐานข้อมูล - เลือกไฟล์ dt ที่อัพโหลดก่อนหน้านี้)

3. ทำการประมวลผลในฐานข้อมูลไฟล์ (จะไม่มีข้อผิดพลาดที่นั่นและ NULL ทั้งหมดจะถูกแทนที่อย่างถูกต้อง) (วิธีการประมวลผลอธิบายไว้ด้านล่าง)

5. ในทางกลับกัน ให้ยกเลิกการโหลดไฟล์ dt จากฐานข้อมูลไฟล์และโหลดลงในฐานข้อมูล SQL ตอนนี้เมื่อผ่านรายการเอกสารที่ประมวลผลแล้ว ข้อผิดพลาดจะไม่เกิดขึ้น

การประมวลผลจากบทความนี้จะค้นหาเอกสารทั้งหมดในช่วงเวลาที่ระบุซึ่งการผ่านรายการรวมการลงทะเบียนผู้รับเหมาช่วงกับหน่วยงานจัดเก็บภาษี (ซึ่งปรากฏในเวอร์ชัน CORP) ซึ่งมีค่าเป็น NULL และแทนที่ค่านี้ด้วยค่าว่าง

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

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

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