أجهزة الكمبيوتر شبابيك إنترنت

مؤشر فريد 1C SQL. خطأ: محاولة إدراج قيمة غير فريدة في فهرس فريد: خادم Microsoft SQL. عند التبديل من buh prof إلى bldg وليس فقط. ما هو الفهرس

يحدث خطأ إذا كانت بعض الكائنات والتفاصيل والعناصر الفرعية في قاعدة البيانات لها قيمة NULL، لكن لا يمكن أن تحتوي على مثل هذه القيمة. ويظهر هذا الخطأ فقط في قواعد بيانات SQL. أولئك. إذا قمت بتحميل قاعدة البيانات هذه إلى ملف واحد، فلن يكون هذا الخطأ موجودًا بعد الآن. لأن تحتوي قاعدة بيانات الملفات على جداول خاصة بها (4 في المجموع)، كما أن SQL لها جداول خاصة بها. وتتفاعل قاعدة بيانات SQL بشكل حاسم مع هذه القيم في جداولها.

لا يمكن حل هذه المشكلة عن طريق أي اختبار (لا خارجي ولا داخلي) في أي إصدار من قاعدة البيانات (SQL أو ملف) وحتى عن طريق إجراء _1sp_DBReindex في مدير SQL، والذي يبدو أنه من المفترض أن يعيد هيكلة الجداول في SQL.

دعونا نلقي نظرة على حل المشكلة باستخدام مثال التبديل من Accounting 3.0 PROF إلى CORP. بعد التحول، أصبح للحساب 68.01 حساب فرعي جديد، وهو التسجيل لدى مصلحة الضرائب. وبعد ذلك، في قواعد بيانات SQL، لن يتم نقل كافة المستندات التي تم إنشاؤها في الإصدار PRO والتي تستخدم هذا الحساب. سيظهر الخطأ الموضح أعلاه. لأن ستتم كتابة هذا الحساب الفرعي الجديد للمستندات القديمة، في الترحيلات، بالقيمة NULL (على الرغم من أنه يجب أن تكون هناك قيمة فارغة، أو بطريقة ما مصلحة الضرائب).

لإصلاح هذا الخطأ، تحتاج إلى إزالة القيم الخالية حيث لا ينبغي أن تكون. في هذه الحالة، في المستندات التي يتم فيها استخدام التسجيل الفرعي لدى مصلحة الضرائب. يمكن القيام بذلك عن طريق كتابة معالجة تستبدل NULL بقيمة فارغة (يمكن تنزيل المعالجة الجاهزة من هذه المقالة). افعل ذلك عن طريق المعالجة، لأن تؤدي محاولة تغيير قيمة هذا الحساب الفرعي يدويًا في عمليات ترحيل المستندات إلى نفس الخطأ.

يمكن تنزيل معالجة استبدال القيم الخالية في جميع جهات الاتصال الفرعية للتسجيل لدى مصلحة الضرائب من هذه المقالة أدناه.

ولكن لن ينجح استبدال NULL في قاعدة بيانات SQL؛ سيتم إنشاء نفس الخطأ أثناء المعالجة. لذلك عليك القيام بذلك:

1. قم بتحميل قاعدة بيانات SQL العاملة بالفعل، والمترجمة إلى إصدار CORP، في ملف dt (في إدارة التكوين - تحميل قاعدة البيانات - حدد مكان تحميل قاعدة البيانات كملف *.dt)

2. قم بتحميل ملف dt في قاعدة بيانات الملفات (في قاعدة بيانات ملفات نظيفة غير ضرورية أو معدة مسبقًا، في إدارة التكوين - تحميل قاعدة البيانات - حدد ملف dt الذي تم تحميله مسبقًا)

3. إجراء المعالجة في قاعدة بيانات الملفات (لن تكون هناك أخطاء وسيتم استبدال جميع القيم الخالية بشكل صحيح) (كيفية إجراء المعالجة موضحة أدناه)

5. الآن، على العكس من ذلك، قم بإلغاء تحميل ملف dt من قاعدة بيانات الملفات وتحميله في قاعدة بيانات SQL. الآن، عند نشر المستندات المعالجة، لن تحدث أخطاء.

تؤدي المعالجة من هذه المقالة إلى العثور على كافة المستندات الخاصة بالفترة المحددة التي تتضمن الترحيلات فيها تسجيل العقد من الباطن لدى مصلحة الضرائب (الذي يظهر في إصدار CORP)، والذي له القيمة NULL. ويستبدل هذه القيمة بقيمة فارغة.

أثناء المعالجة، يجب عليك الإشارة إلى الفترة التي تريد معالجة المستندات خلالها (يمكنك تحديد الفترة الكاملة التي يتم فيها الاحتفاظ بالسجلات في قاعدة البيانات) والنقر فوق "ملء القسم الجدولي". بعد ذلك يمكنك تحديد المربعات لتحديد المستندات المطلوب معالجتها (يمكنك تحديد الكل) والنقر فوق الزر "معالجة".

وفقًا لذلك، إذا كان لدى شخص ما نفس الخطأ، ولكن ليس بعد التبديل إلى CORP، ولكن على سبيل المثال بعد تبادل، وتحميل بعض البيانات، وإجراء بعض المعالجة، وما إلى ذلك. ثم تحتاج إلى تحديد المكان الذي تم فيه تعيين القيمة NULL في مستند/دليل محدد وإزالة هذه القيمة NULL بطريقة مماثلة، ولكن من خلال المعالجة الخاصة بك، ولكن بالترتيب الموضح أعلاه. تذكر أن NULL يمكن أن يكون، كما هو الحال في منشورات المستندات، متضمنًا. ليس فقط تلك المتعلقة بالمحاسبة، ولكن أيضًا في مكان ما على شكل مستند/كتاب مرجعي، في بعض التفاصيل، ولكن في هذه الحالة ربما لن يتم فتحه.

أيضًا، إذا ظهر لك هذا الخطأ عند نشر مستند، بعد أن قمت بنقل قاعدة بيانات ملف Bukh KORP إلى SQL (وكانت قاعدة البيانات في الأصل PROF)، فهذا يعني أن تلك المستندات التي تم إنشاؤها في إصدار PROF موجودة الآن أيضًا في تسجيل الحساب الفرعي في هيئة الضرائب بقيمة NULL وقاعدة بيانات SQL لا تقبل ذلك. وعند تحميل قاعدة البيانات إلى SQL، سيظهر الخطأ التالي. هنا، في الواقع، لن تكون هناك قيم فارغة في قاعدة بيانات الملفات، ولكن SQL ستقوم بتحميل هذه القيم بالضبط في جداولها. لذلك، نحتاج هنا إلى إجبار قاعدة بيانات SQL على إنشاء هذه القيم الفارغة ثم تصحيحها في قاعدة بيانات الملفات، لكن لا يمكنني إخبارك بكيفية القيام بذلك.

ستوضح هذه المقالة ما يجب فعله إذا واجهت رسالة تحتوي على السطور أثناء العمل مع 1C:Enterprise 8.1:

لا يمكن إدراج صف مفاتيح مكرر في الكائن

جرت محاولة لإدراج قيمة غير فريدة في فهرس فريد.

ما هو الفهرس؟

الفهارس هي بنية تسمح بالوصول السريع إلى الصفوف في الجدول بناءً على قيم واحد أو أكثر من أعمدته.
يحتوي الفهرس على مفاتيح تم إنشاؤها من عمود واحد أو أكثر من جدول أو طريقة عرض، ومؤشرات تحدد مكان تخزين البيانات المحددة.
تعمل الفهارس على تقليل كمية البيانات التي يجب قراءتها لإرجاع مجموعة النتائج.

على الرغم من أن الفهرس يرتبط بعمود (أو أعمدة) محدد في الجدول، إلا أنه يظل كائن قاعدة بيانات منفصلاً.

يتم إنشاء فهارس الجداول في قاعدة بيانات 1C:Enterprise ضمنيًا عند إنشاء كائنات التكوين، وكذلك أثناء إعدادات معينة لكائنات التكوين.

الجوهر المادي للفهارس في MS SQL Server 2005.

جسديا يتم تخزين البيانات على صفحات 8 كيلو بايت. مباشرة بعد الإنشاء، في حين أن الجدول لا يحتوي على فهارس، يبدو الجدول وكأنه كومة من البيانات. السجلات ليس لها ترتيب تخزين محدد.
عندما تريد الوصول إلى البيانات، سينتج SQL Server مسح الجدول(مسح الجدول). يقوم SQL Server بفحص الجدول بأكمله للعثور على السجلات التي يبحث عنها.
ومن هنا تتضح الوظائف الأساسية للمؤشرات:
- زيادة سرعة الوصول إلى البيانات،
- دعم تفرد البيانات.

على الرغم من مزاياها، فإن للمؤشرات أيضًا عدد من العيوب. الأول هو الفهارس تشغل مساحة إضافية على القرصوفي ذاكرة الوصول العشوائي. في كل مرة تقوم فيها بإنشاء فهرس، تقوم بتخزين المفاتيح بترتيب تنازلي أو تصاعدي، والذي يمكن أن يكون له بنية متعددة المستويات. وكلما كان المفتاح أكبر/أطول، كان حجم الفهرس أكبر. العيب الثاني هو العمليات تتباطأإدراج وتحديث وحذف السجلات.
في بيئة MS SQL Server 2005، يتم تنفيذ عدة أنواع من الفهارس:

  • فهارس غير مجمعة؛
  • الفهارس المجمعة (أو المجمعة)؛
  • فهارس فريدة من نوعها؛
  • الفهارس مع الأعمدة المضمنة
  • وجهات النظر المفهرسة
  • نص كامل

مؤشر فريد

يتم ضمان تفرد القيم في العمود المفهرس بواسطة فهارس فريدة. إذا كانت موجودة، فلن يسمح لك الخادم بإدراج قيمة جديدة أو تغيير قيمة موجودة بحيث تظهر قيمتان متطابقتان في العمود نتيجة لهذه العملية.
الفهرس الفريد هو نوع من الوظائف الإضافية ويمكن تنفيذه لكل من الفهارس المجمعة وغير المجمعة. يمكن أن يحتوي جدول واحد على فهرس مجمع فريد والعديد من الفهارس الفريدة غير المجمعة.
يجب تعريف الفهارس الفريدة فقط عند الضرورة حقًا. لضمان تكامل البيانات في عمود، يمكنك تحديد قيد تكامل UNIQUE أو PRIMARY KEY بدلاً من اللجوء إلى فهارس فريدة. إن استخدامها فقط لضمان سلامة البيانات يعد مضيعة لمساحة قاعدة البيانات. بالإضافة إلى ذلك، يتم أيضًا قضاء وقت وحدة المعالجة المركزية في صيانتها.

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. في بعض الأحيان يحدث خطأ أثناء تنفيذ الاستعلامات، على سبيل المثال:

يحدث هذا الخطأ بسبب حقيقة أنه في وحدة تسجيل التراكم "وقت العمل لموظفي المؤسسات" في إجراء "تسجيل إعادة الحساب"، لم يتم تضمين كلمة الخدمة "مختلفة" في الطلب.

أولئك. يجب ان يكون:

الطلب = طلب جديد(
"اختر مختلفًا
| الأساسية.فردية،

في أحدث الإصدارات من 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، _Fld1394،

Fld1395، _Fld1396RRef، _Fld1397، _Fld1398، _Fld1399RRef، _Fld22260_TYPE، _Fld22260_RTRef، _Fld22260_RRRef، _Fld22261_TYPE، _Fld22261_RTRef، _Fld2226 1_RRRef

قبل تنفيذ الإجراء أدناه، يرجى عمل نسخة احتياطية من قاعدة البيانات الخاصة بك.
تشغيل في محلل استعلام MS SQL Server:

حدد العد (*)، _Document140_IDRRef، _KeyField
from_Document140_VT1385
المجموعة حسب _Document140_IDRRef، _KeyField
وجود عدد (*)> 1

استخدمه لمعرفة قيم أعمدة _Document140_IDRRef، _KeyField، السجلات المكررة (المعرف، المفتاح).

باستخدام الطلب:

يختار *
from_Document140_VT1385
أو _Document140_IDRRef = id2 و_KeyField = key2 أو ...

انظر إلى قيم الأعمدة الأخرى للإدخالات المكررة.

إذا كان كلا الإدخالين لهما قيم ذات معنى وكانت القيم مختلفة، فقم بتغيير قيمة _KeyField لتكون فريدة. للقيام بذلك، حدد الحد الأقصى لقيمة _KeyField (keymax):

حدد الحد الأقصى (_KeyField)
from_Document140_VT1385
حيث _Document140_IDRRef = id1

استبدل قيمة _KeyField في أحد الإدخالات المكررة بالقيمة الصحيحة:

update_Document140_VT1385
مجموعة _KeyField = keymax + 1

هنا _LineNo1386 = هو شرط إضافي يسمح لك بتحديد أحد السجلين المتكررين.

إذا كان لأحد الإدخالات المكررة (أو كليهما) معنى غير صحيح بشكل واضح، فيجب إزالته:


حيث _Document140_IDRRef = id1 و_LineNo1386 = lineno1

إذا كانت الإدخالات المكررة لها نفس القيم في جميع الأعمدة، فأنت بحاجة إلى ترك واحد منهم:

اختر مسافة *
في #tmp1
from_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، _Description
وجود (العدد(*) > 1)

2.3.4 مثال لتحديد السجلات غير الفريدة باستخدام استعلام 1C:Enterprise:

أو للمحاسبة

يختار
استعلام فرعي.الفترة،
استعلام فرعي.مسجل،
<измерения>,
SUM(استعلام فرعي.عدد السجلات) 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: تم إنهاء إنشاء فهرس فريد بسبب العثور على مفتاح مكرر لمعرف الفهرس
أو
لا يمكن إدخال صف مفتاح مكرر في الكائن
أو
جرت محاولة لإدراج قيمة غير فريدة في فهرس فريد.

حلول:

1. في استوديو إدارة SQL Server، نقوم بتدمير الفهرس المعيب فعليًا (في حالتي كان فهرسًا في جدول إجماليات السجل المحاسبي). في 1C سنقوم بتوزيع المستندات المعيبة. في وضع الاختبار والتصحيح، حدد المربعات الخاصة بإعادة فهرسة الجدول + إعادة حساب الإجماليات. 1C يعيد إنشاء الفهرس دون خطأ. نقوم بتنفيذ المستندات الفاشلة مسبقًا.

2. 1) باستخدام Management Studio 2005، قمت بإنشاء برنامج نصي لإنشاء فهرس، والذي كان به أخطاء، وحفظته في ملف.
2) قم بقتل مؤشر الدعامة يدويًا من الجدول _AccumRgTn19455
3) أطلقت طلب مثل
كود SQL S_elect count(*),index_fields
من AccumRgTn19455
المجموعة حسب Index_field
وجود العد (*)> 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. في بعض الأحيان يحدث خطأ أثناء تنفيذ الاستعلامات، على سبيل المثال:

يحدث هذا الخطأ بسبب حقيقة أنه في وحدة تسجيل التراكم "وقت العمل لموظفي المؤسسات" في إجراء "تسجيل إعادة الحساب"، لم يتم تضمين كلمة الخدمة "مختلفة" في الطلب.
الكود 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_ RRRef، _Fld1394،_ Fld1395، _Fld1396RRef، _Fld1397، _Fld1398، _Fld1399RRef، _Fld22260_TYPE، _Fld22260_RTRef، _Fld22260_RRRef، _Fld22261_TYPE، _Fld22261 _RTRef، _Fld22261_RRRef
قبل تنفيذ الإجراء أدناه، يرجى عمل نسخة احتياطية من قاعدة البيانات الخاصة بك.
تشغيل في محلل استعلام MS SQL Server:
رمز SQL S_elect count(*)، _Document140_IDRRef، _KeyField
from_Document140_VT1385
المجموعة حسب _Document140_IDRRef، _KeyField
وجود عدد (*)> 1
استخدمه لمعرفة قيم أعمدة _Document140_IDRRef، _KeyField، السجلات المكررة (المعرف، المفتاح).

باستخدام الطلب:
كود SQL S_elect *
from_Document140_VT1385
أو _Document140_IDRRef = id2 و_KeyField = key2 أو ...
انظر إلى قيم الأعمدة الأخرى للإدخالات المكررة.
إذا كان كلا الإدخالين لهما قيم ذات معنى وكانت القيم مختلفة، فقم بتغيير قيمة _KeyField لتكون فريدة. للقيام بذلك، حدد الحد الأقصى لقيمة _KeyField (keymax):
كود SQL S_elect max(_KeyField)
from_Document140_VT1385
حيث _Document140_IDRRef = id1
استبدل قيمة _KeyField في أحد الإدخالات المكررة بالقيمة الصحيحة:
تحديث كود SQL _Document140_VT1385
مجموعة _KeyField = keymax + 1
هنا _LineNo1386 = هو شرط إضافي يسمح لك بتحديد أحد السجلين المتكررين.

إذا كان لأحد الإدخالات المكررة (أو كليهما) معنى غير صحيح بشكل واضح، فيجب إزالته:
حذف كود SQL من _Document140_VT1385
حيث _Document140_IDRRef = id1 و_LineNo1386 = lineno1
إذا كانت الإدخالات المكررة لها نفس القيم في جميع الأعمدة، فأنت بحاجة إلى ترك أحدها:
كود SQL S_elect مميز *
في #tmp1
from_Document140_VT1385
حيث _Document140_IDRRef = id1 و_KeyField = key1

حذف من _Document140_VT1385
حيث _Document140_IDRRef = id1 و_KeyField = key1

أدخل في _Document140_VT1385
اختر #tmp1

جدول D_rop #tmp1

يجب تنفيذ الإجراء الموصوف لكل زوج من السجلات المكررة.

2.2.3. المثال الثاني:
رمز SQL S_elect COUNT(*) AS Expr2، _IDRRef AS Expr1، _Description
من _المرجع8_
المجموعة حسب _IDRRef، _Description
وجود (العدد(*) > 1)

2.3.4 مثال لتحديد السجلات غير الفريدة باستخدام استعلام 1C:Enterprise:
الكود 1C v 8.x SELECT Directory.Link
من Directory.Directory AS الدليل
المجموعة حسب الدليل. الرابط
وجود الكمية (*)> 1

وصلتك رسالة تحتوي على السطور التالية:
موفر Microsoft OLE DB لـ SQL Server: تم إنهاء إنشاء فهرس فريد بسبب العثور على مفتاح مكرر لمعرف الفهرس
أو
لا يمكن إدخال صف مفتاح مكرر في الكائن
أو
جرت محاولة لإدراج قيمة غير فريدة في فهرس فريد.

حلول:

1. في استوديو إدارة SQL Server، نقوم فعليًا بتدمير الفهرس المعيب (في حالتي كان فهرسًا في جدول إجماليات السجل المحاسبي). في 1C سنقوم بتوزيع المستندات المعيبة. في وضع الاختبار والتصحيح، حدد المربعات الخاصة بإعادة فهرسة الجدول + إعادة حساب الإجماليات. 1C يعيد إنشاء الفهرس دون خطأ. نقوم بتنفيذ المستندات الفاشلة مسبقًا.

2. 1) باستخدام Management Studio 2005، قمت بإنشاء برنامج نصي لإنشاء فهرس، والذي كان به أخطاء، وحفظته في ملف.
2) قم بقتل مؤشر الدعامة يدويًا من الجدول _AccumRgTn19455
3) أطلقت طلب مثل
كود SQL S_elect count(*),index_fields
فر أوم AccumRgTn19455
المجموعة حسب Index_field
وجود العد (*)> 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. في بعض الأحيان يحدث خطأ أثناء تنفيذ الاستعلامات، على سبيل المثال:

يحدث هذا الخطأ بسبب حقيقة أنه في وحدة تسجيل التراكم "وقت العمل لموظفي المؤسسات" في إجراء "تسجيل إعادة الحساب"، لم يتم تضمين كلمة الخدمة "مختلفة" في الطلب.
الكود 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_ RRRef، _Fld1394،_ Fld1395، _Fld1396RRef، _Fld1397، _Fld1398، _Fld1399RRef، _Fld22260_TYPE، _Fld22260_RTRef، _Fld22260_RRRef، _Fld22261_TYPE، _Fld22261 _RTRef، _Fld22261_RRRef
قبل تنفيذ الإجراء أدناه، يرجى عمل نسخة احتياطية من قاعدة البيانات الخاصة بك.
تشغيل في محلل استعلام MS SQL Server:
رمز SQL S_elect count(*)، _Document140_IDRRef، _KeyField
من _Document140_VT1385
المجموعة حسب _Document140_IDRRef، _KeyField
وجود عدد (*)> 1
استخدمه لمعرفة قيم أعمدة _Document140_IDRRef، _KeyField، السجلات المكررة (المعرف، المفتاح).

باستخدام الطلب:
كود SQL S_elect *
من _Document140_VT1385
حيث _Document140_IDRRef = id1 و_KeyField = key1 أو _Document140_IDRRef = id2 و_KeyField = key2 أو ...
انظر إلى قيم الأعمدة الأخرى للإدخالات المكررة.
إذا كان كلا الإدخالين لهما قيم ذات معنى وكانت القيم مختلفة، فقم بتغيير قيمة _KeyField لتكون فريدة. للقيام بذلك، حدد الحد الأقصى لقيمة _KeyField (keymax):
كود SQL S_elect max(_KeyField)
من _Document140_VT1385
أين يوجد _Document140_IDRRef = id1
استبدل قيمة _KeyField في أحد الإدخالات المكررة بالقيمة الصحيحة:
تم تحديث كود SQL _Document140_VT1385
مجموعة _KeyField = keymax + 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
اختر #tmp1

جدول D_rop #tmp1

يجب تنفيذ الإجراء الموصوف لكل زوج من السجلات المكررة.

2.2.3. المثال الثاني:
رمز SQL S_elect COUNT(*) AS Expr2، _IDRRef AS Expr1، _Description
من _المرجع8_
المجموعة حسب _IDRRef، _Description
وجود (العدد(*) > 1)

2.3.4 مثال لتحديد السجلات غير الفريدة باستخدام استعلام 1C:Enterprise:
الكود 1C v 8.x SELECT Directory.Link
من Directory.Directory AS الدليل
المجموعة حسب الدليل. الرابط
وجود الكمية (*)> 1

المعلومات مأخوذة من الموقع