Unikal indeksə qeyri-adi dəyər daxil etməyə cəhd edildi. Xəta: Unikal indeksə qeyri-adi dəyər daxil etmək cəhdi: microsoft sql server. mühasibat uçotu peşəkarından korporativə keçərkən və yalnız 1c 8 faylında unikal olmayan indeksləri silməklə yanaşı

Siz sətirləri ehtiva edən bir mesaj aldınız:
SQL Server üçün Microsoft OLE DB Provayderi: CREATE UNIQUE INDEX funksiyası dayandırıldı, çünki indeks ID-si üçün dublikat açar tapıldı
və ya
Obyektə dublikat açar sırasını daxil edə bilmirəm
və ya
Unikal indeksə qeyri-adi dəyər daxil etməyə cəhd edildi.

Həll yolları:

1. SQL Server idarəetmə studiyasında biz nasaz indeksi fiziki olaraq məhv edirik (mənim vəziyyətimdə bu, mühasibat uçotu registrinin yekunları cədvəlindəki indeks idi). 1C-də səhv sənədləri paylayacağıq. Test və düzəliş rejimində cədvəlin yenidən indeksləşdirilməsi + cəmilərin yenidən hesablanması üçün qutuları yoxlayın. 1C indeksi səhvsiz yenidən yaradır. Əvvəllər uğursuz sənədləri həyata keçiririk.

2. 1) istifadə İdarəetmə studiyası 2005, səhv olan bir indeks yaratmaq üçün yarat skripti yaratdı və onu faylda saxladı.
2) _AccumRgTn19455 cədvəlindən jamb indeksini əl ilə öldürün
3) kimi bir sorğu başlatdı
SQL kodu S_elect count(*), index_fields
AccumRgTn19455-DƏN
index_field BY GROUP
Sayı (*)>1 VAR
İndeks öldürüldükdən sonra məndə 15 dublikat qeyd var idi, baxmayaraq ki, 2-ci addımdan əvvəl sorğu heç nə qaytarmadı.
4) Mən bütün girişləri nəzərdən keçirdim və dublikatları əl ilə təmizlədim. Əslində, mən də nə ilə məşğul olduğumu başa düşmək üçün “Hesabat Strukturu” emalından istifadə etdim. Məlum oldu ki, _AccumRgTn19455 cədvəlində “Məhsul çıxışı (vergi uçotu)” yığılma registrini saxlayır. Mən də sql sorğuları ilə məşğul oldum, 15 qeyri-unikal sənəd müəyyən etdim və bütün hərəkətləri yerinə yetirdikdən sonra 1C-də bu sənədlərin normal, səhvsiz işləndiyini yoxladım. Əlbəttə ki, masaları təsadüfi təmizləməməlisiniz: nə təmizləndiyini və bunun necə ola biləcəyini başa düşmək vacibdir.
5) Bir faylda saxlanılan bir indeks yaratmaq üçün sorğu başladıldı.
6) Verilənlər bazasını tək istifadəçi rejiminə keçirdi və dbcc checkdb-ni işə saldı - bu dəfə heç bir səhv yaranmadı.
7) Baza yenidən tək istifadəçi rejiminə keçdi.
Budur... problem aradan qaldırıldı. Bəli, 1C-də mən “Sınaq və Düzəliş”i işə saldım, orada da hər şey yaxşı getdi, qeyri-adi indeksdən şikayət etməyi dayandırdım.

3. Qeyri-unikallıq sıfır qiymətli tarixlərdə olarsa, onda problem ofset parametri 2000-ə bərabər olan verilənlər bazası yaratmaqla həll edilir.

1. Problem verilənlər bazasını yükləməkdədirsə, onda:
1.1. Əgər siz MS SQL Server verilənlər bazasına yükləyirsinizsə (dt-faylından istifadə etməklə), onda verilənlər bazası yaratarkən yükləmədən əvvəl tarix ofsetini - 2000-i göstərin.
Əgər verilənlər bazası artıq ofset 0 ilə yaradılmışdırsa, onda 2000 ilə yenisini yaradın.

1.2. Əgər fayl versiyasında verilənlər bazası ilə işləmək mümkündürsə, o zaman Test və Düzəliş, eləcə də Konfiqurasiya - Konfiqurasiyanın yoxlanılması - Konfiqurasiyanın məntiqi bütövlüyünün yoxlanılması + Yanlış keçidlərin axtarılmasını həyata keçirin.

1.3. Əgər fayl versiyası yoxdursa, DT-dən DB2 ilə müştəri-server versiyasına yükləməyə cəhd edin (bu, unikallığı daha az tələb edir) və sonra Test və Düzəliş, həmçinin Konfiqurasiya - Konfiqurasiyanı yoxlayın - Konfiqurasiyanın məntiqi bütövlüyünü yoxlayın + Etibarsız Referansları axtarın.

1.4. Problemi lokallaşdırmaq üçün yüklənməsi uğursuz olan obyektin məlumatlarını müəyyən edə bilərsiniz. Bunu etmək üçün, yükləmə zamanı Profiler yardım proqramında izləməni aktivləşdirməlisiniz və ya DBMSSQL və EXCP proses hadisələri jurnalında qeydi aktivləşdirməlisiniz.

2. Qeyri-unikallıq problemi istifadəçilər işləyərkən baş verərsə:

2.1. 1.4-cü bənddəki metoddan istifadə edərək problemli sorğunu tapın.

2.1.2. Bəzən sorğuları yerinə yetirərkən xəta baş verir, məsələn:

Bu səhv yığılma registrinin modulunda olması səbəbindən baş verir " İş vaxtı təşkilatların işçiləri" "Yenidən hesablamaların qeydiyyatı" prosedurunda sorğuda "FƏRQLİ" xidməti sözü yoxdur.
Kod 1C v 8.x I.e. olmalıdır:
Sorğu = Yeni sorğu(
"MÜXTƏLİFİ SEÇİN
| Əsas.Fərdi,
. . . . .
ZUP və UPP-nin son buraxılışlarında xəta baş vermir, çünki "FƏRQLİ" deyir.

2.2. Əvvəlki paraqrafdan problemli indeksi tapdıqdan sonra unikal olmayan bir qeyd tapmaq lazımdır.
2.2.1. SQL istifadə edərək unikal olmayan qeydləri müəyyən etmək üçün "Balıq" skripti:
SQL Kodu S_seç COUNT(*) Sayğac,<перечисление всех полей соответствующего индекса>-dan<имя таблицы>
GROUP BY<перечисление всех полей соответствующего индекса>
Sayğacın OLMASI > 1

2.2.2 Nümunə. Səhvdəki indeks "_Document140_VT1385_IntKeyIndNG" adlanır.
Cədvəl sahələrinin siyahısı:
_Sənəd140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld139, _Fld139, _Fld199, _Fld139, _Fld139, _Fld1387, _Fld1388, _Fld1387 3_RR Ref, _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RTRef, _62,2TY_Fld_Fld_62,Fld_Fld_Fld 22261_RT Ref, _Fld22261_RRRef
Aşağıdakı proseduru yerinə yetirməzdən əvvəl edin ehtiyat surəti Verilənlər bazası.
MS SQL Server Query Analyzer-də işə salın:
SQL Kodu S_elect count(*), _Document140_IDRRef, _KeyField
from_Document140_VT1385
_Document140_IDRRef, _KeyField ilə qruplaşdırın
sayı (*) > 1 olduqda
_Document140_IDRRef, _KeyField, dublikat qeydlərin (id, açar) sütunlarının dəyərlərini tapmaq üçün ondan istifadə edin.

Müraciətdən istifadə edərək:
SQL kodu S_elect *
from_Document140_VT1385
və ya _Document140_IDRRef = id2 və _KeyField = açar2 və ya ...
dublikat girişlərin digər sütunlarının dəyərlərinə baxın.
Hər iki girişin mənalı dəyərləri varsa və dəyərlər fərqlidirsə, _KeyField dəyərini unikal olaraq dəyişdirin. Bunu etmək üçün _KeyField (keymax) üçün maksimum işğal edilmiş dəyəri təyin edin:
SQL Kodu S_elect max(_KeyField)
from_Document140_VT1385
burada _Document140_IDRRef = id1
Dublikat qeydlərdən birində _KeyField dəyərini düzgün olanı ilə əvəz edin:
SQL kodu yeniləməsi _Document140_VT1385
_KeyField = keymax + 1 təyin edin
Burada _LineNo1386 = iki təkrarlanan qeyddən birini seçməyə imkan verən əlavə şərtdir.

Əgər dublikat qeydlərdən biri (və ya hər ikisi) açıq-aydın yanlış məna daşıyırsa, o zaman silinməlidir:
SQL kodu _Document140_VT1385-dən silin
burada _Document140_IDRRef = id1 və _LineNo1386 = lineno1
Dublikat girişlər bütün sütunlarda eyni dəyərlərə malikdirsə, onlardan birini tərk etməlisiniz:
SQL Kodu S_select fərqli *
#tmp1 daxil edin
from_Document140_VT1385
burada _Document140_IDRRef = id1 və _KeyField = açar1

_Document140_VT1385-dən silin
burada _Document140_IDRRef = id1 və _KeyField = açar1

_Document140_VT1385-ə daxil edirəm
#tmp1_seçin

D_rop cədvəli #tmp1

Təsvir edilən prosedur hər bir cüt qeyd üçün yerinə yetirilməlidir.

2.2.3. İkinci misal:
SQL Kodu S_seç COUNT(*) AS İfadə2, _IDRRef AS İfadə1, _Təsvir
_Reference8_-dən
QRUPLA _IDRRef, _Təsvir
VAR (COUNT(*) > 1)

2.3.4 1C: Enterprise sorğusundan istifadə edərək qeyri-unikal qeydlərin müəyyən edilməsinə misal:
Code 1C v 8.x Directory.Link SEÇİN
Directory.Directory AS Directory-DƏN
Directory.Link ilə Qruplaşdırın
KƏMİYYƏTİ (*) > 1

Bu məqalə 1C: Enterprise 8.1 ilə işləyərkən sətirləri ehtiva edən bir mesajla qarşılaşsanız nə edəcəyinizi izah edəcəkdir:

Obyektə dublikat açar sətri daxil edilə bilməz

Unikal indeksə qeyri-adi dəyər daxil etməyə cəhd edildi.

İndeks nədir?

İndekslər, bir və ya bir neçə sütunun dəyərlərinə əsaslanaraq cədvəldəki sətirlərə sürətli giriş imkanı verən bir quruluşdur.
İndeks cədvəlin və ya görünüşün bir və ya bir neçə sütunundan qurulmuş açarları və göstərilən məlumatların saxlandığı yerləri göstərən göstəriciləri ehtiva edir.
İndekslər nəticə dəstini qaytarmaq üçün oxunmalı olan məlumatların miqdarını azaldır.

İndeks cədvəlin xüsusi sütunu (və ya sütunları) ilə əlaqələndirilsə də, o, yenə də ayrıca verilənlər bazası obyektidir.

1C: Enterprise verilənlər bazasındakı cədvəllərin indeksləri konfiqurasiya obyektlərinin yaradılması zamanı, eləcə də konfiqurasiya obyektlərinin müəyyən parametrləri zamanı dolayı şəkildə yaradılır.

MS SQL Server 2005-də indekslərin fiziki mahiyyəti.

Məlumat fiziki olaraq saxlanılır 8Kb səhifələrdə. Yaradılandan dərhal sonra cədvəldə indekslər olmadığı halda, cədvəl məlumat yığınına bənzəyir. Qeydlərin xüsusi saxlama qaydası yoxdur.
Məlumata daxil olmaq istədiyiniz zaman, SQL Server istehsal edəcək masa skanı(cədvəl skanı). SQL Server axtardığı qeydləri tapmaq üçün bütün cədvəli skan edir.
Buradan indekslərin əsas funksiyaları aydın olur:
- verilənlərə çıxış sürətinin artırılması;
— verilənlərin unikallığına dəstək.

Üstünlüklərinə baxmayaraq, indekslərin bir sıra çatışmazlıqları da var. Birincisi indekslərdir əlavə disk yer tutur və içində təsadüfi giriş yaddaşı. Hər dəfə indeks yaratdığınız zaman düymələri çox səviyyəli struktura malik ola bilən azalan və ya artan qaydada saxlayırsınız. Və açar nə qədər böyük/uzun olarsa, indeks ölçüsü də bir o qədər böyük olar. İkinci çatışmazlıqdır əməliyyatlar ləngiyir qeydlərin daxil edilməsi, yenilənməsi və silinməsi.
MS SQL Server 2005 mühitində bir neçə növ indeks həyata keçirilir:

  • qruplaşdırılmamış indekslər;
  • klasterləşdirilmiş (və ya qruplaşdırılmış) indekslər;
  • unikal indekslər;
  • sütunları olan indekslər
  • indeksləşdirilmiş baxışlar
  • tam mətn

Unikal indeks

İndekslənmiş sütundakı dəyərlərin unikallığı unikal indekslərlə təmin edilir. Əgər onlar mövcuddursa, server sizə yeni dəyər daxil etməyə və ya mövcud dəyəri dəyişdirməyə icazə verməyəcək ki, bu əməliyyat nəticəsində sütunda iki eyni dəyər görünsün.
Unikal indeks bir növ əlavədir və həm çoxluqlu, həm də çoxluqsuz indekslər üçün həyata keçirilə bilər. Bir cədvəldə bir unikal çoxluq indeksi və çoxlu unikal klaster olmayan indekslər ola bilər.
Unikal indekslər yalnız həqiqətən zəruri olduqda müəyyən edilməlidir. Sütundakı məlumatların bütövlüyünü təmin etmək üçün unikal indekslərə müraciət etməkdənsə, UNİKAL və ya İLKİN AÇAR tamlıq məhdudiyyətini təyin edə bilərsiniz. Onları yalnız məlumatların bütövlüyünü təmin etmək üçün istifadə etmək verilənlər bazası boşluğunu itirməkdir. Bundan əlavə, CPU vaxtı da onların saxlanmasına sərf olunur.

1C: Enterprise 8.1, 8.1 versiyasından başlayaraq, qruplaşdırılmış unikal indekslərdən fəal şəkildə istifadə edir. Bu o deməkdir ki, 8.0-dan çevirərkən və ya 8.1.7-dən köçürərkən qeyri-unikal indeks xətası əldə edə bilərsiniz.

Əgər qeyri-bərabərlik sıfır qiymətli tarixlərdədirsə, o zaman problem ofset parametri 2000-ə bərabər olan verilənlər bazası yaratmaqla həll edilə bilər.

Nə etməli?

1. Problem verilənlər bazasını yükləməkdədirsə, onda:

1.1. Əgər siz MS SQL Server verilənlər bazasına yükləyirsinizsə (dt faylından istifadə etməklə), onda verilənlər bazası yaratarkən yükləmədən əvvəl tarix ofsetini - 2000-i göstərin.

Əgər verilənlər bazası artıq ofset 0 ilə yaradılmışdırsa, onda 2000 ilə yenisini yaradın.

1.2. Əgər fayl versiyasında verilənlər bazası ilə işləmək mümkündürsə, o zaman Test və Düzəliş, eləcə də Konfiqurasiya - Konfiqurasiyanın yoxlanılması - Konfiqurasiyanın məntiqi bütövlüyünün yoxlanılması + Yanlış keçidlərin axtarılmasını həyata keçirin.

1.3. Əgər fayl versiyası yoxdursa, DT-dən DB2 ilə müştəri-server versiyasına yükləməyə cəhd edin (bu, unikallığı daha az tələb edir) və sonra Test və Düzəliş, həmçinin Konfiqurasiya - Konfiqurasiyanı yoxlayın - Konfiqurasiyanın məntiqi bütövlüyünü yoxlayın + Etibarsız Referansları axtarın.

1.4. Problemi lokallaşdırmaq üçün yüklənməsi uğursuz olan obyektin məlumatlarını müəyyən edə bilərsiniz. Bunu etmək üçün yükləmə zamanı Profiler yardım proqramında izləməni aktivləşdirməlisiniz və ya DBMSSQL və EXCP texnoloji hadisələr jurnalında qeydi aktivləşdirməlisiniz.

1.5. Əgər node (mübadilə planları) mövcuddursa, o zaman mübadilə həyata keçirin. Siz həmçinin mübadilə etməzdən əvvəl 2.3.5-ci bəndi əlavə edə bilərsiniz

2. Qeyri-unikallıq problemi istifadəçilər işləyərkən baş verərsə:

2.1. 1.4-cü bənddəki metoddan istifadə edərək problemli sorğunu tapın.

2.1.2. Bəzən sorğuları yerinə yetirərkən xəta baş verir, məsələn:

Bu xəta ona görə baş verir ki, “Təşkilatların işçilərinin iş vaxtı” yığım registrinin modulunda “Yenidən hesablamalar reyestrinin aparılması” prosedurunda “FƏRQLİ” xidmət sözünün sorğuya daxil edilməməsi.

Bunlar. olmalıdır:

Sorğu = Yeni Sorğu(
"MÜXTƏLİFİ SEÇİN
| Əsas.Fərdi,

ZUP və UPP-nin son buraxılışlarında xəta baş vermir, çünki "FƏRQLİ" deyir.

2.2. Əvvəlki paraqrafdan problemli indeksi tapdıqdan sonra unikal olmayan bir qeyd tapmaq lazımdır.

2.2.1. SQL istifadə edərək unikal olmayan qeydləri müəyyən etmək üçün "Balıq" skripti:
COUNT(*) Sayğac SEÇ,<перечисление всех полей соответствующего индекса>-dan<имя таблицы>
GROUP BY<перечисление всех полей соответствующего индекса>
Sayğacın OLMASI > 1

2.2.2 Nümunə. Səhvdəki indeks "_Document140_VT1385_IntKeyIndNG" adlanır.

Cədvəl sahələrinin siyahısı:

_FLD1388, _FLD1389, _FLD1391RREF, _FLD1392RREF, _FLD1393_TYPE, _FLD139393_RTRF, _FLD139393_RRREF, _FLD13939RREF, _Fld1394,

Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22260_RRRef, _Fld26TR22ld _Fld1392, _Fld1392, _Fld1392 261 _RRRef

Aşağıdakı proseduru yerinə yetirməzdən əvvəl verilənlər bazanızın ehtiyat nüsxəsini çıxarın.
MS SQL Server Query Analyzer-də işə salın:

count(*), _Document140_IDRRef, _KeyField seçin
from_Document140_VT1385
_Document140_IDRRef, _KeyField ilə qruplaşdırın
sayı (*) > 1 olduqda

_Document140_IDRRef, _KeyField, dublikat qeydlərin (id, açar) sütunlarının dəyərlərini tapmaq üçün ondan istifadə edin.

Müraciətdən istifadə edərək:

seçin *
from_Document140_VT1385
və ya _Document140_IDRRef = id2 və _KeyField = açar2 və ya …

dublikat girişlərin digər sütunlarının dəyərlərinə baxın.

Hər iki girişin mənalı dəyərləri varsa və dəyərlər fərqlidirsə, _KeyField dəyərini unikal olaraq dəyişdirin. Bunu etmək üçün _KeyField (keymax) üçün maksimum işğal edilmiş dəyəri təyin edin:

maksimum seçin(_KeyField)
from_Document140_VT1385
burada _Document140_IDRRef = id1

Dublikat qeydlərdən birində _KeyField dəyərini düzgün olanı ilə əvəz edin:

update_Document140_VT1385
_KeyField = keymax + 1 təyin edin

Burada _LineNo1386 = iki təkrarlanan qeyddən birini seçməyə imkan verən əlavə şərtdir.

Əgər dublikat qeydlərdən biri (və ya hər ikisi) açıq-aydın yanlış məna daşıyırsa, o zaman silinməlidir:


burada _Document140_IDRRef = id1 və _LineNo1386 = lineno1

Dublikat girişlər bütün sütunlarda eyni dəyərlərə malikdirsə, onlardan birini tərk etməlisiniz:

fərqli seçin *
#tmp1 daxil edin
from_Document140_VT1385
burada _Document140_IDRRef = id1 və _KeyField = açar1

_Document140_VT1385-dən silin
burada _Document140_IDRRef = id1 və _KeyField = açar1

_Document140_VT1385-ə daxil edin
#tmp1 seçin

cədvəli buraxın #tmp1

Təsvir edilən prosedur hər bir cüt qeyd üçün yerinə yetirilməlidir.

2.2.3. İkinci misal:

SEÇ COUNT(*) İfadə2, _IDRRef İfadə1, _Təsvir
_Reference8_-dən
QRUPLA _IDRRef, _Təsvir
VAR (COUNT(*) > 1)

2.3.4 1C: Enterprise sorğusundan istifadə edərək qeyri-unikal qeydlərin müəyyən edilməsinə misal:

və ya mühasibat uçotu üçün

SEÇİN
Alt sorğu.Dövr,
Subquery.Registrator,
<измерения>,
SUM(Subquery.Number of Records) AS Qeydlərin Sayı
FROM
(SEÇİN
Özünü təmin edən Dövr AS Dövr,
Özünü dəstəkləyən. Qeydiyyatçı AS Qeydiyyatçı,
<измерения>,
1 AS Qeydlərin Sayı
FROM
Mühasibat Uçotu Registri.Özünü dəstəkləyən AS Özünü təmin edən) AS Alt Sorğu

GROUP BY
Alt sorğu.Dövr,
Subquery.Registrator,
<измерения>

OLMAQ
SUM(Alt sorğu.Qeydlərin sayı) > 1

2.3.5 Subd indeksini qeyri-unikal edin. Management Studio istifadə edərək indeksi skript edin.

2.3.6 RDB-də mübadilə zamanı xüsusi hal. Səhv ümumi və ya analitikanın hesablanması ilə əlaqəli "köməkçi" cədvəllərdə baş verir. Misal üçün:

Kontekst metodunu çağırarkən xəta (Yaz): Unikal indeksə qeyri-adi dəyər daxil etməyə cəhd:
SQL Server üçün Microsoft OLE DB Provayderi: '_Accnt10319_ByPeriod_TRNRN' unikal indeksli 'dbo._AccntRegED10319' obyektinə dublikat açar sətri daxil edilə bilməz.
HRESULT=80040E2F, SQLSrvr: Xəta vəziyyəti=1, Ciddilik=E, yerli=2601, sətir=1

Bu halda, yükləmədən əvvəl, cəmlərin istifadəsini söndürün, mesajı yükləyin, yekunların istifadəsini aktivləşdirin və yenidən hesablayın.

Siz sətirləri ehtiva edən bir mesaj aldınız:
SQL Server üçün Microsoft OLE DB Provayderi: CREATE UNIQUE INDEX funksiyası dayandırıldı, çünki indeks ID-si üçün dublikat açar tapıldı
və ya
Obyektə dublikat açar sırasını daxil edə bilmirəm
və ya
Unikal indeksə qeyri-adi dəyər daxil etməyə cəhd edildi.

Həll yolları:

1. SQL Server idarəetmə studiyasında biz nasaz indeksi fiziki olaraq məhv edirik (mənim vəziyyətimdə bu, mühasibat uçotu registrinin yekunları cədvəlindəki indeks idi). 1C-də səhv sənədləri paylayacağıq. Test və düzəliş rejimində cədvəlin yenidən indeksləşdirilməsi + cəmilərin yenidən hesablanması üçün qutuları yoxlayın. 1C indeksi səhvsiz yenidən yaradır. Əvvəllər uğursuz sənədləri həyata keçiririk.

2. 1) Management Studio 2005-dən istifadə edərək, səhv olan indeks yaratmaq üçün yaratma skripti yaratdım və onu faylda saxladım.
2) _AccumRgTn19455 cədvəlindən jamb indeksini əl ilə öldürün
3) kimi bir sorğu başlatdı
SQL kodu S_elect count(*), index_fields
FR OM AccumRgTn19455
index_field BY GROUP
Sayı (*)>1 VAR
İndeks öldürüldükdən sonra məndə 15 dublikat qeyd var idi, baxmayaraq ki, 2-ci addımdan əvvəl sorğu heç nə qaytarmadı.
4) Mən bütün girişləri nəzərdən keçirdim və dublikatları əl ilə təmizlədim. Əslində, mən də nə ilə məşğul olduğumu başa düşmək üçün “Hesabat Strukturu” emalından istifadə etdim. Məlum oldu ki, _AccumRgTn19455 cədvəlində “Məhsul çıxışı (vergi uçotu)” yığılma registrini saxlayır. Mən də sql sorğuları ilə məşğul oldum, 15 qeyri-unikal sənəd müəyyən etdim və bütün hərəkətləri yerinə yetirdikdən sonra 1C-də bu sənədlərin normal, səhvsiz işləndiyini yoxladım. Əlbəttə ki, masaları təsadüfi təmizləməməlisiniz: nə təmizləndiyini və bunun necə ola biləcəyini başa düşmək vacibdir.
5) Bir faylda saxlanılan bir indeks yaratmaq üçün sorğu başladıldı.
6) Verilənlər bazasını tək istifadəçi rejiminə keçirdi və dbcc checkdb-ni işə saldı - bu dəfə heç bir səhv yaranmadı.
7) Baza yenidən tək istifadəçi rejiminə keçdi.
Budur... problem aradan qaldırıldı. Bəli, 1C-də mən “Sınaq və Düzəliş”i işə saldım, orada da hər şey yaxşı getdi, qeyri-adi indeksdən şikayət etməyi dayandırdım.

3. Qeyri-unikallıq sıfır qiymətli tarixlərdə olarsa, onda problem ofset parametri 2000-ə bərabər olan verilənlər bazası yaratmaqla həll edilir.

1. Problem verilənlər bazasını yükləməkdədirsə, onda:
1.1. Əgər siz MS SQL Server verilənlər bazasına yükləyirsinizsə (dt-faylından istifadə etməklə), onda verilənlər bazası yaratarkən yükləmədən əvvəl tarix ofsetini - 2000-i göstərin.
Əgər verilənlər bazası artıq ofset 0 ilə yaradılmışdırsa, onda 2000 ilə yenisini yaradın.

1.2. Əgər fayl versiyasında verilənlər bazası ilə işləmək mümkündürsə, o zaman Test və Düzəliş, eləcə də Konfiqurasiya - Konfiqurasiyanın yoxlanılması - Konfiqurasiyanın məntiqi bütövlüyünün yoxlanılması + Yanlış keçidlərin axtarılmasını həyata keçirin.

1.3. Əgər fayl versiyası yoxdursa, DT-dən DB2 ilə müştəri-server versiyasına yükləməyə cəhd edin (bu, unikallığı daha az tələb edir) və sonra Test və Düzəliş, həmçinin Konfiqurasiya - Konfiqurasiyanı yoxlayın - Konfiqurasiyanın məntiqi bütövlüyünü yoxlayın + Etibarsız Referansları axtarın.

1.4. Problemi lokallaşdırmaq üçün yüklənməsi uğursuz olan obyektin məlumatlarını müəyyən edə bilərsiniz. Bunu etmək üçün, yükləmə zamanı Profiler yardım proqramında izləməni aktivləşdirməlisiniz və ya DBMSSQL və EXCP proses hadisələri jurnalında qeydi aktivləşdirməlisiniz.

2. Qeyri-unikallıq problemi istifadəçilər işləyərkən baş verərsə:

2.1. 1.4-cü bənddəki metoddan istifadə edərək problemli sorğunu tapın.

2.1.2. Bəzən sorğuları yerinə yetirərkən xəta baş verir, məsələn:

Bu xəta ona görə baş verir ki, “Təşkilatların işçilərinin iş vaxtı” yığım registrinin modulunda “Yenidən hesablamalar reyestrinin aparılması” prosedurunda “FƏRQLİ” xidmət sözünün sorğuya daxil edilməməsi.
Kod 1C v 8.x I.e. olmalıdır:
Sorğu = Yeni Sorğu(
"MÜXTƏLİFİ SEÇİN
| Əsas.Fərdi,
. . . . .
ZUP və UPP-nin son buraxılışlarında xəta baş vermir, çünki "FƏRQLİ" deyir.

2.2. Əvvəlki paraqrafdan problemli indeksi tapdıqdan sonra unikal olmayan bir qeyd tapmaq lazımdır.
2.2.1. SQL istifadə edərək unikal olmayan qeydləri müəyyən etmək üçün "Balıq" skripti:
SQL Kodu S_seç COUNT(*) Sayğac,<перечисление всех полей соответствующего индекса>dan om<имя таблицы>
GROUP BY<перечисление всех полей соответствующего индекса>
Sayğacın OLMASI > 1

2.2.2 Nümunə. Səhvdəki indeks "_Document140_VT1385_IntKeyIndNG" adlanır.
Cədvəl sahələrinin siyahısı:
_Sənəd140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld139, _Fld139, _Fld199, _Fld139, _Fld139, _Fld1387, _Fld1388, _Fld1387 3_RR Ref, _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RTRef, _62,2TY_Fld_Fld_62,Fld_Fld_Fld 22261_RT Ref, _Fld22261_RRRef
Aşağıdakı proseduru yerinə yetirməzdən əvvəl verilənlər bazanızın ehtiyat nüsxəsini çıxarın.
MS SQL Server Query Analyzer-də işə salın:
SQL Kodu S_elect count(*), _Document140_IDRRef, _KeyField
_Document140_VT1385-dən
_Document140_IDRRef, _KeyField ilə qruplaşdırın
sayı (*) > 1 olduqda
_Document140_IDRRef, _KeyField, dublikat qeydlərin (id, açar) sütunlarının dəyərlərini tapmaq üçün ondan istifadə edin.

Müraciətdən istifadə edərək:
SQL kodu S_elect *
_Document140_VT1385-dən
burada _Document140_IDRRef = id1 və _KeyField = açar1 və ya _Document140_IDRRef = id2 və _KeyField = açar2 və ya ...
dublikat girişlərin digər sütunlarının dəyərlərinə baxın.
Hər iki girişin mənalı dəyərləri varsa və dəyərlər fərqlidirsə, _KeyField dəyərini unikal olaraq dəyişdirin. Bunu etmək üçün _KeyField (keymax) üçün maksimum işğal edilmiş dəyəri təyin edin:
SQL Kodu S_elect max(_KeyField)
_Document140_VT1385-dən
burada _Document140_IDRRef = id1
Dublikat qeydlərdən birində _KeyField dəyərini düzgün olanı ilə əvəz edin:
SQL kodu yeniləndi _Document140_VT1385
_KeyField = keymax + 1 təyin edin

Burada _LineNo1386 = iki təkrarlanan qeyddən birini seçməyə imkan verən əlavə şərtdir.

Əgər dublikat qeydlərdən biri (və ya hər ikisi) açıq-aydın yanlış məna daşıyırsa, o zaman silinməlidir:
SQL kodu _Document140_VT1385-dən silin
_Document140_IDRRef = id1 və _LineNo1386 = lineno1 olduqda
Dublikat girişlər bütün sütunlarda eyni dəyərlərə malikdirsə, onlardan birini tərk etməlisiniz:
SQL Kodu S_select fərqli *
#tmp1 daxil edin
from_Document140_VT1385

_Document140_VT1385-dən silin
_Document140_IDRRef = id1 və _KeyField = açar1 olduqda

_Document140_VT1385-ə daxil edirəm
#tmp1_seçin

D_rop cədvəli #tmp1

Təsvir edilən prosedur hər bir cüt qeyd üçün yerinə yetirilməlidir.

2.2.3. İkinci misal:
SQL Kodu S_seç COUNT(*) AS İfadə2, _IDRRef AS İfadə1, _Təsvir
_İstinad8_-dən
QRUPLA _IDRRef, _Təsvir
VAR (COUNT(*) > 1)

2.3.4 1C: Enterprise sorğusundan istifadə edərək qeyri-adi qeydlərin müəyyən edilməsinə misal:
Code 1C v 8.x Directory.Link SEÇİN
FROM Directory.Directory AS Directory
Directory.Link ilə Qruplaşdırın
KƏMİYYƏTİ (*) > 1

Məlumat saytdan götürülüb

Siz sətirləri ehtiva edən bir mesaj aldınız:
SQL Server üçün Microsoft OLE DB Provayderi: CREATE UNIQUE INDEX funksiyası dayandırıldı, çünki indeks ID-si üçün dublikat açar tapıldı
və ya
Obyektə dublikat açar sırasını daxil edə bilmirəm
və ya
Unikal indeksə qeyri-adi dəyər daxil etməyə cəhd edildi.

Həll yolları:

1. SQL Server idarəetmə studiyasında biz nasaz indeksi fiziki olaraq məhv edirik (mənim vəziyyətimdə bu, mühasibat uçotu registrinin yekunları cədvəlindəki indeks idi). 1C-də səhv sənədləri paylayacağıq. Test və düzəliş rejimində cədvəlin yenidən indeksləşdirilməsi + cəmilərin yenidən hesablanması üçün qutuları yoxlayın. 1C indeksi səhvsiz yenidən yaradır. Əvvəllər uğursuz sənədləri həyata keçiririk.

2. 1) Management Studio 2005-dən istifadə edərək, səhv olan indeks yaratmaq üçün yaratma skripti yaratdım və onu faylda saxladım.
2) _AccumRgTn19455 cədvəlindən jamb indeksini əl ilə öldürün
3) kimi bir sorğu başlatdı
SQL kodu S_elect count(*), index_fields
AccumRgTn19455-DƏN
index_field BY GROUP
Sayı (*)>1 VAR
İndeks öldürüldükdən sonra məndə 15 dublikat qeyd var idi, baxmayaraq ki, 2-ci addımdan əvvəl sorğu heç nə qaytarmadı.
4) Mən bütün girişləri nəzərdən keçirdim və dublikatları əl ilə təmizlədim. Əslində, mən də nə ilə məşğul olduğumu başa düşmək üçün “Hesabat Strukturu” emalından istifadə etdim. Məlum oldu ki, _AccumRgTn19455 cədvəlində “Məhsul çıxışı (vergi uçotu)” yığılma registrini saxlayır. Mən də sql sorğuları ilə məşğul oldum, 15 qeyri-unikal sənəd müəyyən etdim və bütün hərəkətləri yerinə yetirdikdən sonra 1C-də bu sənədlərin normal, səhvsiz işləndiyini yoxladım. Əlbəttə ki, masaları təsadüfi təmizləməməlisiniz: nə təmizləndiyini və bunun necə ola biləcəyini başa düşmək vacibdir.
5) Bir faylda saxlanılan bir indeks yaratmaq üçün sorğu başladıldı.
6) Verilənlər bazasını tək istifadəçi rejiminə keçirdi və dbcc checkdb-ni işə saldı - bu dəfə heç bir səhv yaranmadı.
7) Baza yenidən tək istifadəçi rejiminə keçdi.
Budur... problem aradan qaldırıldı. Bəli, 1C-də mən “Sınaq və Düzəliş”i işə saldım, orada da hər şey yaxşı getdi, qeyri-adi indeksdən şikayət etməyi dayandırdım.

3. Qeyri-unikallıq sıfır qiymətli tarixlərdə olarsa, onda problem ofset parametri 2000-ə bərabər olan verilənlər bazası yaratmaqla həll edilir.

1. Problem verilənlər bazasını yükləməkdədirsə, onda:
1.1. Əgər siz MS SQL Server verilənlər bazasına yükləyirsinizsə (dt-faylından istifadə etməklə), onda verilənlər bazası yaratarkən yükləmədən əvvəl tarix ofsetini - 2000-i göstərin.
Əgər verilənlər bazası artıq ofset 0 ilə yaradılmışdırsa, onda 2000 ilə yenisini yaradın.

1.2. Əgər fayl versiyasında verilənlər bazası ilə işləmək mümkündürsə, o zaman Test və Düzəliş, eləcə də Konfiqurasiya - Konfiqurasiyanın yoxlanılması - Konfiqurasiyanın məntiqi bütövlüyünün yoxlanılması + Yanlış keçidlərin axtarılmasını həyata keçirin.

1.3. Əgər fayl versiyası yoxdursa, DT-dən DB2 ilə müştəri-server versiyasına yükləməyə cəhd edin (bu, unikallığı daha az tələb edir) və sonra Test və Düzəliş, həmçinin Konfiqurasiya - Konfiqurasiyanı yoxlayın - Konfiqurasiyanın məntiqi bütövlüyünü yoxlayın + Etibarsız Referansları axtarın.

1.4. Problemi lokallaşdırmaq üçün yüklənməsi uğursuz olan obyektin məlumatlarını müəyyən edə bilərsiniz. Bunu etmək üçün, yükləmə zamanı Profiler yardım proqramında izləməni aktivləşdirməlisiniz və ya DBMSSQL və EXCP proses hadisələri jurnalında qeydi aktivləşdirməlisiniz.

2. Qeyri-unikallıq problemi istifadəçilər işləyərkən baş verərsə:

2.1. 1.4-cü bənddəki metoddan istifadə edərək problemli sorğunu tapın.

2.1.2. Bəzən sorğuları yerinə yetirərkən xəta baş verir, məsələn:

Bu xəta ona görə baş verir ki, “Təşkilatların işçilərinin iş vaxtı” yığım registrinin modulunda “Yenidən hesablamalar reyestrinin aparılması” prosedurunda “FƏRQLİ” xidmət sözünün sorğuya daxil edilməməsi.
Kod 1C v 8.x I.e. olmalıdır:
Sorğu = Yeni Sorğu(
"MÜXTƏLİFİ SEÇİN
| Əsas.Fərdi,
. . . . .
ZUP və UPP-nin son buraxılışlarında xəta baş vermir, çünki "FƏRQLİ" deyir.

2.2. Əvvəlki paraqrafdan problemli indeksi tapdıqdan sonra unikal olmayan bir qeyd tapmaq lazımdır.
2.2.1. SQL istifadə edərək unikal olmayan qeydləri müəyyən etmək üçün "Balıq" skripti:
SQL Kodu S_seç COUNT(*) Sayğac,<перечисление всех полей соответствующего индекса>-dan<имя таблицы>
GROUP BY<перечисление всех полей соответствующего индекса>
Sayğacın OLMASI > 1

2.2.2 Nümunə. Səhvdəki indeks "_Document140_VT1385_IntKeyIndNG" adlanır.
Cədvəl sahələrinin siyahısı:
_Sənəd140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld139, _Fld139, _Fld199, _Fld139, _Fld139, _Fld1387, _Fld1388, _Fld1387 3_RR Ref, _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RTRef, _62,2TY_Fld_Fld_62,Fld_Fld_Fld 22261_RT Ref, _Fld22261_RRRef
Aşağıdakı proseduru yerinə yetirməzdən əvvəl verilənlər bazanızın ehtiyat nüsxəsini çıxarın.
MS SQL Server Query Analyzer-də işə salın:
SQL Kodu S_elect count(*), _Document140_IDRRef, _KeyField
from_Document140_VT1385
_Document140_IDRRef, _KeyField ilə qruplaşdırın
sayı (*) > 1 olduqda
_Document140_IDRRef, _KeyField, dublikat qeydlərin (id, açar) sütunlarının dəyərlərini tapmaq üçün ondan istifadə edin.

Müraciətdən istifadə edərək:
SQL kodu S_elect *
from_Document140_VT1385
və ya _Document140_IDRRef = id2 və _KeyField = açar2 və ya ...
dublikat girişlərin digər sütunlarının dəyərlərinə baxın.
Hər iki girişin mənalı dəyərləri varsa və dəyərlər fərqlidirsə, _KeyField dəyərini unikal olaraq dəyişdirin. Bunu etmək üçün _KeyField (keymax) üçün maksimum işğal edilmiş dəyəri təyin edin:
SQL Kodu S_elect max(_KeyField)
from_Document140_VT1385
burada _Document140_IDRRef = id1
Dublikat qeydlərdən birində _KeyField dəyərini düzgün olanı ilə əvəz edin:
SQL kodu yeniləməsi _Document140_VT1385
_KeyField = keymax + 1 təyin edin
Burada _LineNo1386 = iki təkrarlanan qeyddən birini seçməyə imkan verən əlavə şərtdir.

Əgər dublikat qeydlərdən biri (və ya hər ikisi) açıq-aydın yanlış məna daşıyırsa, o zaman silinməlidir:
SQL kodu _Document140_VT1385-dən silin
burada _Document140_IDRRef = id1 və _LineNo1386 = lineno1
Dublikat girişlər bütün sütunlarda eyni dəyərlərə malikdirsə, onlardan birini tərk etməlisiniz:
SQL Kodu S_select fərqli *
#tmp1 daxil edin
from_Document140_VT1385
burada _Document140_IDRRef = id1 və _KeyField = açar1

_Document140_VT1385-dən silin
burada _Document140_IDRRef = id1 və _KeyField = açar1

_Document140_VT1385-ə daxil edirəm
#tmp1_seçin

D_rop cədvəli #tmp1

Təsvir edilən prosedur hər bir cüt qeyd üçün yerinə yetirilməlidir.

2.2.3. İkinci misal:
SQL Kodu S_seç COUNT(*) AS İfadə2, _IDRRef AS İfadə1, _Təsvir
_Reference8_-dən
QRUPLA _IDRRef, _Təsvir
VAR (COUNT(*) > 1)

2.3.4 1C: Enterprise sorğusundan istifadə edərək qeyri-unikal qeydlərin müəyyən edilməsinə misal:
Code 1C v 8.x Directory.Link SEÇİN
Directory.Directory AS Directory-DƏN
Directory.Link ilə Qruplaşdırın
KƏMİYYƏTİ (*) > 1




Üst