Xəta: Unikal indeksə qeyri-adi dəyər daxil etmək cəhdi: microsoft sql server. buh prof-dan bldg-ə keçəndə və nəinki. Unikal indeksə qeyri-adi dəyər daxil etmək cəhdi edilib.

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ətirini 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ı. Yaxşı, 1C-də mən “Sınaq və Düzəliş”i işə saldım, orada da hər şey qaydasında 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. Fayl versiyası yoxdursa, DT-dən DB2 ilə müştəri-server versiyasına yükləməyə cəhd edin (bu, unikallığa daha az tələbkardır) 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, _Fld19, _Fld19, _Fld19, _Fld19 93_ RRRef, _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTREf_26,ld_F2, Fld22261 _RTRef, _Fld22261_RRRef
Aşağıdakı proseduru yerinə yetirməzdən əvvəl edin ehtiyat surəti verilənlər bazaları.
MS SQL Server Sorğu Analizatorunda 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

Verilənlər bazasındakı bəzi obyektlərin, detalların, alt kontoların NULL dəyəri varsa, lakin onlar belə bir dəyərə malik ola bilmirlərsə, xəta baş verir. Və bu səhv yalnız SQL verilənlər bazasında görünür. Bunlar. Əgər belə bir verilənlər bazasını bir fayla yükləsəniz, bu xəta artıq olmayacaq. Çünki Fayl verilənlər bazasının öz cədvəli (cəmi 4), SQL isə öz cədvəlinə malikdir. Və SQL verilənlər bazası öz cədvəllərindəki bu cür dəyərlərə tənqidi reaksiya verir.

Bu problem verilənlər bazasının hər hansı versiyasında (SQL və ya fayl) heç bir sınaq (nə xarici, nə də daxili) və hətta SQL-də cədvəllərin yenidən qurulması üçün nəzərdə tutulan SQL menecerindəki _1sp_DBReindex Proseduru ilə həll edilə bilməz.

Mühasibat uçotu 3.0 PROF-dan CORP-a keçid nümunəsindən istifadə edərək problemin həllinə baxaq. Keçiddən sonra 68.01 hesabında yeni subhesab, Vergi orqanında qeydiyyat var. Və sonra, SQL verilənlər bazalarında bu hesabı istifadə edən PRO versiyasında yaradılmış bütün sənədlər köçürülməyəcək. Yuxarıda göstərilən xəta görünəcək. Çünki Köhnə sənədlər üçün bu yeni sub-hesab, elanlarda, NULL dəyəri ilə yazılacaq (baxmayaraq ki, Boş dəyər və ya vergi orqanı olmalıdır).

Bu xətanı düzəltmək üçün NULL dəyərləri olmamalıdır. Bu halda, Vergi orqanında subconto Qeydiyyatdan istifadə edilən sənədlərdə. Bu, NULL-u Boş dəyərlə əvəz edəcək bir emal yazmaqla edilə bilər (hazır emal bu məqalədən endirilə bilər). Bunu emal edərək edin, çünki Sənəd yerləşdirmələrində bu subhesabın dəyərini əl ilə dəyişdirmək cəhdi eyni xəta ilə nəticələnir.

Vergi Orqanında Qeydiyyatın bütün alt kontaktlarında NULL-lərin dəyişdirilməsi üçün emal aşağıdakı bu məqalədən yüklənə bilər.

AMMA SQL verilənlər bazasında NULL-u əvəz etmək işləməyəcək, emal zamanı eyni xəta yaranacaq; Buna görə də bunu etməlisiniz:

1. CORP-a tərcümə edilmiş SQL verilənlər bazasının artıq işləyən versiyasını dt faylına yükləyin (konfiquratorda Administrasiya – Verilənlər bazasını yüklə – verilənlər bazasını *.dt faylı şəklində hara yükləmək lazım olduğunu seçin)

2. dt faylını fayl bazasına yükləyin (lazımsız və ya əvvəlcədən hazırlanmış, təmiz fayl bazasında, konfiquratorda İdarəetmə - Verilənlər bazasını yüklə - əvvəllər yüklənmiş dt faylını seçin)

3. Fayl verilənlər bazasında emal həyata keçirin (orada heç bir səhv olmayacaq və bütün NULL-lər düzgün şəkildə əvəz olunacaq) (emalın necə həyata keçiriləcəyi aşağıda təsvir edilmişdir)

5. İndi isə əksinə, dt faylını fayl bazasından boşaltın və SQL verilənlər bazasına yükləyin. İndi işlənmiş sənədləri yerləşdirərkən səhvlər baş verməyəcək.

Bu məqalənin işlənməsi NULL dəyərinə malik olan Vergi Orqanında subpodrat Qeydiyyatının (CORP versiyasında görünür) yerləşdirilməsinin daxil olduğu müəyyən edilmiş dövr üçün bütün sənədləri tapır. Və bu dəyəri Boş dəyərlə əvəz edir.

Emal zamanı sənədləri emal etməyiniz lazım olan müddəti göstərməlisiniz (bazada qeydlərin saxlandığı bütün dövr üçün edə bilərsiniz) və "Doldur" düyməsini basın. cədvəl hissəsi" Sonra hansı sənədləri emal edəcəyinizi qeyd etmək üçün qutuları yoxlaya bilərsiniz (hamısını seçə bilərsiniz) və "Proses" düyməsini klikləyin.

Müvafiq olaraq, əgər kimsə eyni xətaya malikdirsə, lakin CORP-ə keçdikdən sonra DEYİL, lakin məsələn, mübadilədən, bəzi məlumatları yüklədikdən, bəzi emal həyata keçirdikdən və s. Sonra siz NULL dəyərinin konkret sənəddə/kataloqda harada təyin olunduğunu müəyyən etməli və bu NULL-u oxşar şəkildə, lakin öz emalınızla, lakin yuxarıda təsvir olunan ardıcıllıqla silməlisiniz. Unutmayın ki, NULL ola bilər, sənəd yerləşdirmələrində olduğu kimi, daxil olmaqla. təkcə mühasibat uçotu deyil, həm də sənəd/məlumat kitabçası şəklində bir yerdə, bəzi detallarda, lakin bu halda, yəqin ki, açılmayacaq.

Həmçinin, Bukh KORP fayl verilənlər bazasını SQL-ə köçürdükdən sonra (və verilənlər bazası əvvəllər PROF idi), sənədi yerləşdirərkən bu xəta sizə rast gəldisə, bu o deməkdir ki, PROF versiyasında yaradılmış sənədlər indi də Vergi orqanında sub-hesab Qeydiyyatı NULL dəyəri və SQL verilənlər bazası bunu qəbul etmir. Və verilənlər bazasını SQL-ə yükləyərkən aşağıdakı xəta görünəcək. Burada, əslində, fayl verilənlər bazasında NULL dəyərlər olmayacaq, lakin SQL öz cədvəllərinə məhz belə dəyərləri yükləyəcək. Ona görə də məcbur etmək lazımdır SQL verilənlər bazası bu NULL-ləri yaradın və sonra onları fayl bazasında düzəldin, lakin bunu necə edəcəyinizi sizə deyə bilmərəm.

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ətirini 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. Fayl versiyası yoxdursa, DT-dən DB2 ilə müştəri-server versiyasına yükləməyə cəhd edin (bu, unikallığa daha az tələbkardır) 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, _Fld19, _Fld19, _Fld19, _Fld19 93_ RRRef, _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTREf_26,ld_F2, Fld22261 _RTRef, _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 girişlə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
_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

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ətirini 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ı. Yaxşı, 1C-də mən “Sınaq və Düzəliş”i işə saldım, orada da hər şey qaydasında 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. Fayl versiyası yoxdursa, DT-dən DB2 ilə müştəri-server versiyasına yükləməyə cəhd edin (bu, unikallığa daha az tələbkardır) 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, _Fld19, _Fld19, _Fld19, _Fld19 93_ RRRef, _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTREf_26,ld_F2, Fld22261 _RTRef, _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 Sorğu Analizatorunda 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

Rəylər