Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • U kontaktu sa
  • 1s pokušava umetnuti nejedinstvenu vrijednost u jedinstveni indeks. Greška: pokušaj umetanja nejedinstvene vrijednosti u jedinstveni indeks: microsoft sql server

1s pokušava umetnuti nejedinstvenu vrijednost u jedinstveni indeks. Greška: pokušaj umetanja nejedinstvene vrijednosti u jedinstveni indeks: microsoft sql server

Naišli ste na poruku koja sadrži redove:
Microsoft OLE DB dobavljač za SQL Server: CREATE UNIQUE INDEX prekinut jer je pronađen duplikat ključa za ID indeksa
ili
Ne mogu I_umetnuti duplirani red ključa u objektu
ili
Napravljen je pokušaj umetanja nejedinstvene vrijednosti u jedinstveni indeks.

Opcije rješenja:

1. U studiju za upravljanje SQL Serverom fizički uništavamo neuspeli indeks (u mom slučaju je to bio indeks na tabeli ukupnih vrednosti računovodstvenog registra). U 1C ćemo distribuirati neispravne dokumente. U režimu testiranja i korekcije, označite potvrdne okvire za ponovno indeksiranje tabela + ponovno izračunavanje ukupnih iznosa. 1C ponovo kreira indeks bez greške. Vršimo prethodno propale dokumente.

2. 1) Uz pomoć Management Studio 2005, generisao sam skriptu za kreiranje indeksa, koja je bila greška, i sačuvala je u fajl.
2) Ručno ubio indeks iz tabele _AccumRgTn19455
3) Pokrenuo zahtjev poput
SQL kod S_elect count(*), index_fields
OD AccumRgTn19455
GROUP BY indeks_polje
IMAJUĆI broj(*)>1
Nakon što je indeks ubijen, prikazao sam 15 dupliranih zapisa, iako prije koraka 2 upit nije vratio ništa.
4) Pregledao sam sve zapise i ručno očistio duplikate. U stvari, koristio sam i obradu "Strukture izvještaja" da bih shvatio čime se uopšte bavim. Ispostavilo se da tabela _AccumRgTn19455 pohranjuje registar akumulacije "Izlaz proizvoda (poresko računovodstvo)". Probavio sam i sql upite, identifikovao 15 nejedinstvenih dokumenata i nakon završetka svih radnji provjerio sam u 1C da li se ti dokumenti obrađuju normalno, bez grešaka. Naravno, ne vrijedi nasumično čistiti stolove tek tako: važno je razumjeti šta se čisti i u šta se to može pretvoriti.
5) Pokrenuo je upit za kreiranje indeksa, koji je sačuvan u datoteci.
6) Prebacio bazu podataka u jednokorisnički mod i pokrenuo dbcc checkdb - ovaj put nije bilo grešaka.
7) Baza je vraćena u jednokorisnički način rada.
Sve... problem je poražen. Pa čak iu 1C sam pokrenuo "Testiranje i ispravljanje", i tu je sve prošlo u redu, prestao je da psuje na nejedinstveni indeks.

3. Ako nejedinstvenost leži u datumima sa nultim vrijednostima, tada se problem rješava kreiranjem baze s parametrom pomaka od 2000.

1. Ako je problem učitavanje baze podataka, tada:
1.1. Ako učitavate (koristeći dt-datoteku) u bazu podataka MS SQL Servera, tada prilikom kreiranja baze podataka prije učitavanja navedite pomak datuma - 2000.
Ako je baza već kreirana sa pomakom 0, onda kreirajte novu sa 2000.

1.2. Ako je moguće raditi sa bazom podataka u verziji datoteke, onda izvršite Testiranje i popravljanje, kao i Konfiguracija - Provjera konfiguracije - Provjera logičkog integriteta konfiguracije + Traženje neispravnih veza.

1.3. Ako ne postoji varijanta datoteke, pokušajte učitati iz DT u varijantu DB2 klijent/poslužitelj (koja je manje izbirljiva u pogledu jedinstvenosti), a zatim pokrenite Test i popravak i Konfiguracija - Provjera konfiguracije - Provjera logičkog integriteta konfiguracije + Tražitelj loših referenci.

1.4. Da biste lokalizirali problem, možete odrediti podatke objekta čije učitavanje nije uspjelo. Da biste to učinili, morate omogućiti praćenje u vrijeme pokretanja u uslužnom programu Profiler ili omogućiti evidentiranje u DBMSSQL i EXCP dnevnik događaja procesa.

2. Ukoliko se problem nejedinstvenosti manifestuje tokom rada korisnika:

2.1. Pronađite problematičan zahtjev metodom iz stava 1.4.

2.1.2. Ponekad dođe do greške tokom izvršavanja zahtjeva, na primjer:

Ova greška nastaje zbog činjenice da u modulu registra akumulacije "Radno vrijeme zaposlenih u organizacijama" u postupku "Registarski preračuni" u zahtjevu nema službene riječi "DRUGAČIJE".
Kod 1C v 8.x tj. treba biti:
Zahtjev = Novi zahtjev(
„IZABIR DRUGAČIJE
| Basic.Individual,
. . . . .
U najnovijim izdanjima ZUP-a i UPP-a greška se ne pojavljuje, jer. piše "RAZNO".

2.2. Nakon pronalaženja problematičnog indeksa iz prethodnog paragrafa, morate pronaći nejedinstveni unos.
2.2.1. "Fish" skripta za definiranje nejedinstvenih zapisa korištenjem SQL-a:
SQL kod S_odaberi COUNT(*) brojač,<перечисление всех полей соответствующего индекса>od<имя таблицы>
GROUP BY<перечисление всех полей соответствующего индекса>
IMAJUĆI Brojač > 1

2.2.2 Primjer. Indeks u grešci se zove "_Document140_VT1385_IntKeyIndNG".
Lista polja tabele:
_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
Napravite sigurnosnu kopiju vaše baze podataka prije nego što slijedite proceduru u nastavku.
Pokrenite u MS SQL Server Query Analyzeru:
SQL kod S_odaberi broj(*), _Document140_IDRRef, _KeyField
iz _Dokumenta140_VT1385
grupirati po _Document140_IDRRef, _KeyField
imaju broj (*) > 1
Koristite ga da saznate vrijednosti stupaca _Document140_IDRRef, _KeyField, duplih zapisa (id, ključ).

sa zahtjevom:
SQL kod S_elect *
iz _Dokumenta140_VT1385
ili _Document140_IDRRef = id2 i _KeyField = ključ2 ili ...
pogledajte vrijednosti drugih kolona duplih unosa.
Ako oba unosa imaju smislene vrijednosti i te vrijednosti su različite, tada popravite vrijednost _KeyField da bude jedinstvena. Da biste to učinili, definirajte maksimalnu zauzetu vrijednost _KeyField(keymax):
SQL kod S_elect max(_KeyField)
iz _Dokumenta140_VT1385
gdje je _Document140_IDRRef = id1
Zamijenite vrijednost _KeyField u jednom od duplikata unosa ispravnim:
Ažuriranje SQL koda _Document140_VT1385
postavite _KeyField = keymax + 1
Ovdje _LineNo1386 = je dodatni uvjet koji vam omogućava da odaberete jedan od dva duplikata unosa.

Ako jedan (ili oba) duplikat unosa ima očito pogrešnu vrijednost, onda ga treba ukloniti:
Brisanje SQL koda iz _Document140_VT1385
gdje je _Document140_IDRRef = id1 i _LineNo1386 = lineno1
Ako dupli unosi imaju iste vrijednosti u svim stupcima, onda se jedan od njih mora ostaviti:
SQL kod S_odaberi različit *
u #tmp1
iz _Dokumenta140_VT1385
gdje je _Document140_IDRRef = id1 i _KeyField = ključ1

Izbriši iz _Document140_VT1385
gdje je _Document140_IDRRef = id1 i _KeyField = ključ1

I_umetnuti u _Document140_VT1385
S_odaberite #tmp1

D_rop tablica #tmp1

Opisani postupak se mora izvesti za svaki par duplikata unosa.

2.2.3. Drugi primjer:
SQL kod S_odaberi COUNT(*) AS Izraz2, _IDRRef AS Izraz1, _Opis
IZ _Reference8_
GROUP BY _IDRRef, _Description
IMATI (BROJ(*) > 1)

2.3.4 Primjer definiranja nejedinstvenih zapisa korištenjem 1C:Enterprise upita:
Code 1C v 8.x ODABERITE priručnik Link
FROM imenik Direktorij AS imenik
GROUP BY
IMAJUĆI KOLIČINU(*) > 1

Naišli ste na poruku koja sadrži redove:
Microsoft OLE DB dobavljač za SQL Server: CREATE UNIQUE INDEX prekinut jer je pronađen duplikat ključa za ID indeksa
ili
Ne mogu I_umetnuti duplirani red ključa u objektu
ili
Napravljen je pokušaj umetanja nejedinstvene vrijednosti u jedinstveni indeks.

Opcije rješenja:

1. U studiju za upravljanje SQL Serverom fizički uništavamo neuspeli indeks (u mom slučaju je to bio indeks na tabeli ukupnih vrednosti računovodstvenog registra). U 1C ćemo distribuirati neispravne dokumente. U režimu testiranja i korekcije, označite potvrdne okvire za ponovno indeksiranje tabela + ponovno izračunavanje ukupnih iznosa. 1C ponovo kreira indeks bez greške. Vršimo prethodno propale dokumente.

2. 1) Uz pomoć Management Studio 2005, generisao sam skriptu za kreiranje indeksa, koja je bila greška, i sačuvala je u fajl.
2) Ručno ubio indeks iz tabele _AccumRgTn19455
3) Pokrenuo zahtjev poput
SQL kod S_elect count(*), index_fields
OD OM AccumRgTn19455
GROUP BY indeks_polje
IMAJUĆI broj(*)>1
Nakon što je indeks ubijen, prikazao sam 15 dupliranih zapisa, iako prije koraka 2 upit nije vratio ništa.
4) Pregledao sam sve zapise i ručno očistio duplikate. U stvari, koristio sam i obradu "Strukture izvještaja" da bih shvatio čime se uopšte bavim. Ispostavilo se da tabela _AccumRgTn19455 pohranjuje registar akumulacije "Izlaz proizvoda (poresko računovodstvo)". Probavio sam i sql upite, identifikovao 15 nejedinstvenih dokumenata i nakon završetka svih radnji provjerio sam u 1C da li se ti dokumenti obrađuju normalno, bez grešaka. Naravno, ne vrijedi nasumično čistiti stolove tek tako: važno je razumjeti šta se čisti i u šta se to može pretvoriti.
5) Pokrenuo je upit za kreiranje indeksa, koji je sačuvan u datoteci.
6) Prebacio bazu podataka u jednokorisnički mod i pokrenuo dbcc checkdb - ovaj put nije bilo grešaka.
7) Baza je vraćena u jednokorisnički način rada.
Sve... problem je poražen. Pa čak iu 1C sam pokrenuo "Testiranje i ispravljanje", i tu je sve prošlo u redu, prestao je da psuje na nejedinstveni indeks.

3. Ako nejedinstvenost leži u datumima sa nultim vrijednostima, tada se problem rješava kreiranjem baze s parametrom pomaka od 2000.

1. Ako je problem učitavanje baze podataka, tada:
1.1. Ako učitavate (koristeći dt-datoteku) u bazu podataka MS SQL Servera, tada prilikom kreiranja baze podataka prije učitavanja navedite pomak datuma - 2000.
Ako je baza već kreirana sa pomakom 0, onda kreirajte novu sa 2000.

1.2. Ako je moguće raditi sa bazom podataka u verziji datoteke, onda izvršite Testiranje i popravljanje, kao i Konfiguracija - Provjera konfiguracije - Provjera logičkog integriteta konfiguracije + Traženje neispravnih veza.

1.3. Ako ne postoji varijanta datoteke, pokušajte učitati iz DT u varijantu DB2 klijent/poslužitelj (koja je manje izbirljiva u pogledu jedinstvenosti), a zatim pokrenite Test i popravak i Konfiguracija - Provjera konfiguracije - Provjera logičkog integriteta konfiguracije + Tražitelj loših referenci.

1.4. Da biste lokalizirali problem, možete odrediti podatke objekta čije učitavanje nije uspjelo. Da biste to učinili, morate omogućiti praćenje u vrijeme pokretanja u uslužnom programu Profiler ili omogućiti evidentiranje u DBMSSQL i EXCP dnevnik događaja procesa.

2. Ukoliko se problem nejedinstvenosti manifestuje tokom rada korisnika:

2.1. Pronađite problematičan zahtjev metodom iz stava 1.4.

2.1.2. Ponekad dođe do greške tokom izvršavanja zahtjeva, na primjer:

Ova greška nastaje zbog činjenice da u modulu registra akumulacije "Radno vrijeme zaposlenih u organizacijama" u postupku "Registarski preračuni" u zahtjevu nema službene riječi "DRUGAČIJE".
Kod 1C v 8.x tj. treba biti:
Zahtjev = Novi zahtjev(
„IZABIR DRUGAČIJE
| Basic.Individual,
. . . . .
U najnovijim izdanjima ZUP-a i UPP-a greška se ne pojavljuje, jer. piše "RAZNO".

2.2. Nakon pronalaženja problematičnog indeksa iz prethodnog paragrafa, morate pronaći nejedinstveni unos.
2.2.1. "Fish" skripta za definiranje nejedinstvenih zapisa korištenjem SQL-a:
SQL kod S_odaberi COUNT(*) brojač,<перечисление всех полей соответствующего индекса>fr om<имя таблицы>
GROUP BY<перечисление всех полей соответствующего индекса>
IMAJUĆI Brojač > 1

2.2.2 Primjer. Indeks u grešci se zove "_Document140_VT1385_IntKeyIndNG".
Lista polja tabele:
_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
Napravite sigurnosnu kopiju vaše baze podataka prije nego što slijedite proceduru u nastavku.
Pokrenite u MS SQL Server Query Analyzeru:
SQL kod S_odaberi broj(*), _Document140_IDRRef, _KeyField
od _Document140_VT1385
grupirati po _Document140_IDRRef, _KeyField
imaju broj (*) > 1
Koristite ga da saznate vrijednosti stupaca _Document140_IDRRef, _KeyField, duplih zapisa (id, ključ).

sa zahtjevom:
SQL kod S_elect *
od _Document140_VT1385
gdje je _Document140_IDRRef = id1 i _KeyField = ključ1 ili _Document140_IDRRef = id2 i _KeyField = ključ2 ili ...
pogledajte vrijednosti drugih kolona duplih unosa.
Ako oba unosa imaju smislene vrijednosti i te vrijednosti su različite, tada popravite vrijednost _KeyField da bude jedinstvena. Da biste to učinili, definirajte maksimalnu zauzetu vrijednost _KeyField(keymax):
SQL kod S_elect max(_KeyField)
od _Document140_VT1385
gdje je ere_Document140_IDRRef=id1
Zamijenite vrijednost _KeyField u jednom od duplikata unosa ispravnim:
Ažuriranje SQL koda _Document140_VT1385
postavite _KeyField = keymax + 1

Ovdje _LineNo1386 = je dodatni uvjet koji vam omogućava da odaberete jedan od dva duplikata unosa.

Ako jedan (ili oba) duplikat unosa ima očito pogrešnu vrijednost, onda ga treba ukloniti:
Brisanje SQL koda iz _Document140_VT1385
gdje su _Document140_IDRRef = id1 i _LineNo1386 = lineno1
Ako dupli unosi imaju iste vrijednosti u svim stupcima, onda se jedan od njih mora ostaviti:
SQL kod S_odaberi različit *
u #tmp1
iz _Dokumenta140_VT1385

Izbriši iz _Document140_VT1385
gdje su _Document140_IDRRef = id1 i _KeyField = key1

I_umetnuti u _Document140_VT1385
S_odaberite #tmp1

D_rop tablica #tmp1

Opisani postupak se mora izvesti za svaki par duplikata unosa.

2.2.3. Drugi primjer:
SQL kod S_odaberi COUNT(*) AS Izraz2, _IDRRef AS Izraz1, _Opis
IZ _Reference8_
GROUP BY _IDRRef, _Description
IMATI (BROJ(*) > 1)

2.3.4 Primjer definiranja nejedinstvenih zapisa korištenjem 1C:Enterprise upita:
Code 1C v 8.x ODABERITE priručnik Link
FROM imenik Direktorij AS imenik
GROUP BY
IMAJUĆI KOLIČINU(*) > 1

Informacije preuzete sa stranice

Ovaj članak će opisati šta učiniti ako, kada radite sa 1C:Enterprise 8.1, naiđete na poruku koja sadrži redove:

Nije moguće umetnuti duplirani red ključeva u objekt

Napravljen je pokušaj umetanja nejedinstvene vrijednosti u jedinstveni indeks.

Šta je indeks?

Indeksi su struktura koja vam omogućava brz pristup redovima tabele na osnovu vrednosti jedne ili više njenih kolona.
Indeks sadrži ključeve izgrađene od jedne ili više kolona tablice ili pogleda i pokazivače koji mapiraju mjesto na kojem su pohranjeni navedeni podaci.
Indeksi smanjuju količinu podataka koji se moraju pročitati da bi se vratio skup rezultata.

Iako je indeks pridružen određenom stupcu (ili stupcima) tablice, on je još uvijek samostalni objekt baze podataka.

Indeksi tablica u bazi podataka 1C:Enterprise kreiraju se implicitno prilikom kreiranja konfiguracijskih objekata, kao i kod određenih postavki konfiguracijskih objekata.

Fizička suština indeksa u MS SQL Serveru 2005.

Fizički podaci se pohranjuju na stranicama od 8Kb. Odmah nakon kreiranja, dok tabela nema indekse, tabela izgleda kao gomila podataka. Zapisi nemaju određeni redosled skladištenja.
Kada želite pristupiti podacima, SQL Server će proizvesti skeniranje tablice(skeniranje tabele). SQL Server skenira cijelu tabelu da pronađe zapise koje traži.
Odavde postaju jasne osnovne funkcije indeksa:
- povećanje brzine pristupa podacima,
- podrška za jedinstvenost podataka.

Uprkos prednostima, indeksi imaju i niz nedostataka. Prvi su indeksi. zauzimaju dodatni prostor na disku i u RAM-u. Svaki put kada kreirate indeks, ključeve pohranjujete u rastućem ili opadajućem redoslijedu, koji se može slojeviti. I što je veći/duži ključ, to je veća veličina indeksa. Drugi nedostatak je operacije se usporavaju umetanje, ažuriranje i brisanje zapisa.
U okruženju MS SQL Server 2005 implementirano je nekoliko tipova indeksa:

  • negrupisani indeksi;
  • grupirani (ili grupirani) indeksi;
  • jedinstveni indeksi;
  • indeksi sa uključenim kolonama
  • indeksirani prikazi
  • puni tekst

Jedinstveni indeks

Jedinstvenost vrijednosti u indeksiranoj koloni zagarantovana je jedinstvenim indeksima. Ako su prisutni, server neće dozvoliti da se ubaci nova vrijednost ili da se promijeni postojeća vrijednost na način da se kao rezultat ove operacije u koloni pojave dvije identične vrijednosti.
Jedinstveni indeks je vrsta dodatka i može se implementirati i za klasterirane i za ne-klasterirane indekse. Jedna tablica može imati jedan jedinstveni grupirani i mnogo jedinstvenih indeksa koji nisu klasterirani.
Jedinstvene indekse treba definirati samo kada je to apsolutno neophodno. Da biste osigurali integritet podataka na stupcu, možete definirati ograničenje integriteta UNIQUE ili PRIMARY KEY umjesto pribjegavanja jedinstvenim indeksima. Njihovo korištenje samo za osiguranje integriteta podataka je gubitak prostora u bazi podataka. Osim toga, CPU vrijeme se troši i na njihovo održavanje.

1C:Enterprise 8.1, počevši od verzije 8.1, aktivno koristi grupisane jedinstvene indekse. To znači da kada konvertujete sa 8.0 ili migrirate sa 8.1.7, možete dobiti nejedinstvenu grešku indeksa.

Ako nejedinstvenost leži u datumima sa nula vrijednosti, tada se problem rješava kreiranjem baze s parametrom pomaka jednakim 2000.

sta da radim?

1. Ako je problem učitavanje baze podataka, tada:

1.1. Ako učitavate (koristeći dt-datoteku) u bazu podataka MS SQL Servera, tada prilikom kreiranja baze podataka prije učitavanja navedite pomak datuma - 2000.

Ako je baza već kreirana sa pomakom 0, onda kreirajte novu sa 2000.

1.2. Ako je moguće raditi sa bazom podataka u verziji datoteke, onda izvršite Testiranje i popravljanje, kao i Konfiguracija - Provjera konfiguracije - Provjera logičkog integriteta konfiguracije + Traženje neispravnih veza.

1.3. Ako ne postoji varijanta datoteke, pokušajte učitati iz DT u varijantu DB2 klijent/server (koja je manje izbirljiva u pogledu jedinstvenosti), a zatim pokrenite Test i popravak i Konfiguracija - Provjerite konfiguraciju - Provjerite logički integritet konfiguracije + Potražite loše reference.

1.4. Da biste lokalizirali problem, možete odrediti podatke objekta čije učitavanje nije uspjelo. Da biste to učinili, morate omogućiti praćenje u vrijeme pokretanja u uslužnom programu Profiler ili omogućiti evidentiranje u DBMSSQL i EXCP dnevnik događaja procesa.

1.5. Ako je čvor dostupan (planovi razmjene), izvršite razmjenu. Također možete dodatno izvršiti paragraf 2.3.5 prije zamjene

2. Ukoliko se problem nejedinstvenosti manifestuje tokom rada korisnika:

2.1. Pronađite problematičan zahtjev metodom iz stava 1.4.

2.1.2. Ponekad dođe do greške tokom izvršavanja zahtjeva, na primjer:

Ova greška nastaje zbog činjenice da u modulu registra akumulacije "Radno vrijeme zaposlenih u organizacijama" u proceduri "Registarski preračuni" u zahtjevu nije uključena službena riječ "RAZLIČITO".

One. treba biti:

Zahtjev = Novi zahtjev(
"IZABIR DRUGAČIJE
| Basic.Individual,

U najnovijim izdanjima ZUP-a i UPP-a greška se ne pojavljuje, jer. kaže DRUGAČIJE.

2.2. Nakon pronalaženja problematičnog indeksa iz prethodnog paragrafa, morate pronaći nejedinstveni unos.

2.2.1. "Fish" skripta za definiranje nejedinstvenih zapisa korištenjem SQL-a:
SELECT COUNT(*) Brojač,<перечисление всех полей соответствующего индекса>od<имя таблицы>
GROUP BY<перечисление всех полей соответствующего индекса>
IMAJUĆI Brojač > 1

2.2.2 Primjer. Indeks u grešci se zove "_Document140_VT1385_IntKeyIndNG".

Lista polja tabele:

Dokument140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld1393_RTF13_RTF, _Fld1388, _Fld1388, Fld1389

Fld1395 _Fld1396RRef _Fld1397 _Fld1398 _Fld1399RRef _Fld22260_TYPE _Fld22260_RTRef

Napravite sigurnosnu kopiju vaše baze podataka prije nego što slijedite proceduru u nastavku.
Pokrenite u MS SQL Server Query Analyzeru:

odaberite count(*), _Document140_IDRRef, _KeyField
iz _Dokumenta140_VT1385
grupirati po _Document140_IDRRef, _KeyField
imaju broj (*) > 1

Koristite ga da saznate vrijednosti stupaca _Document140_IDRRef, _KeyField, duplih zapisa (id, ključ).

sa zahtjevom:

odaberite *
iz _Dokumenta140_VT1385
ili _Document140_IDRRef = id2 i _KeyField = ključ2 ili …

pogledajte vrijednosti drugih kolona duplih unosa.

Ako oba unosa imaju smislene vrijednosti i te vrijednosti su različite, tada popravite vrijednost _KeyField da bude jedinstvena. Da biste to učinili, definirajte maksimalnu zauzetu vrijednost _KeyField(keymax):

odaberite max(_KeyField)
iz _Dokumenta140_VT1385
gdje je _Document140_IDRRef = id1

Zamijenite vrijednost _KeyField u jednom od duplikata unosa ispravnim:

ažuriranje_Dokument140_VT1385
postavite _KeyField = keymax + 1

Ovdje _LineNo1386 = je dodatni uvjet koji vam omogućava da odaberete jedan od dva duplikata unosa.

Ako jedan (ili oba) duplikat unosa ima očito pogrešnu vrijednost, onda ga treba ukloniti:


gdje je _Document140_IDRRef = id1 i _LineNo1386 = lineno1

Ako dupli unosi imaju iste vrijednosti u svim stupcima, onda se jedan od njih mora ostaviti:

odaberite različito *
u #tmp1
iz _Dokumenta140_VT1385
gdje je _Document140_IDRRef = id1 i _KeyField = ključ1

izbrisati iz _Document140_VT1385
gdje je _Document140_IDRRef = id1 i _KeyField = ključ1

umetnite u _Document140_VT1385
odaberite #tmp1

ispusti tabelu #tmp1

Opisani postupak se mora izvesti za svaki par duplikata unosa.

2.2.3. Drugi primjer:

SELECT COUNT(*) AS Izraz2, _IDRRef AS Izraz1, _Opis
IZ _Reference8_
GROUP BY _IDRRef, _Description
IMATI (BROJ(*) > 1)

2.3.4 Primjer definiranja nejedinstvenih zapisa korištenjem 1C:Enterprise upita:

ili za računovodstvo

ODABIRATI
Potupit.Period,
Podupit.Registar,
<измерения>,
SUM(Podupit.Broj zapisa) AS Broj zapisa
OD
(IZABIR
Samonosivi.Period AS Period,
Registrar AS Registrar,
<измерения>,
1 AS Broj zapisa
OD
Registar računovodstva Samonosivi AS Samonosivi) AS Potupit

GROUP BY
Potupit.Period,
Podupit.Registar,
<измерения>

HAVING
SUM(Podupit.Broj zapisa) > 1

2.3.5 Učiniti da subd indeks nije jedinstven. Skriptirajte indeks koristeći Management Studio.

2.3.6 Poseban slučaj u razmjeni u RDB. Greška pada na "pomoćne" tabele povezane sa izračunom ukupnih iznosa ili analitikom. Na primjer:

Greška pri pozivanju metode konteksta (Write): pokušaj umetanja nejedinstvene vrijednosti u jedinstveni indeks:
Microsoft OLE DB dobavljač za SQL Server: Ne može umetnuti duplikat ključa u objekt 'dbo._AccntRegED10319' s jedinstvenim indeksom '_Accnt10319_ByPeriod_TRNRN'.
HRESULT=80040E2F, SQLSrvr: stanje greške=1, ozbiljnost=E, izvorno=2601, red=1

U tom slučaju, prije učitavanja, isključite korištenje zbrojeva, preuzmite poruku, uključite korištenje zbroja i ponovno izračunajte.

Naišli ste na poruku koja sadrži redove:
Microsoft OLE DB dobavljač za SQL Server: CREATE UNIQUE INDEX prekinut jer je pronađen duplikat ključa za ID indeksa
ili
Ne mogu I_umetnuti duplirani red ključa u objektu
ili
Napravljen je pokušaj umetanja nejedinstvene vrijednosti u jedinstveni indeks.

Opcije rješenja:

1. U studiju za upravljanje SQL Serverom fizički uništavamo neuspeli indeks (u mom slučaju je to bio indeks na tabeli ukupnih vrednosti računovodstvenog registra). U 1C ćemo distribuirati neispravne dokumente. U režimu testiranja i korekcije, označite potvrdne okvire za ponovno indeksiranje tabela + ponovno izračunavanje ukupnih iznosa. 1C ponovo kreira indeks bez greške. Vršimo prethodno propale dokumente.

2. 1) Uz pomoć Management Studio 2005, generisao sam skriptu za kreiranje indeksa, koja je bila greška, i sačuvala je u fajl.
2) Ručno ubio indeks iz tabele _AccumRgTn19455
3) Pokrenuo zahtjev poput
SQL kod S_elect count(*), index_fields
OD AccumRgTn19455
GROUP BY indeks_polje
IMAJUĆI broj(*)>1
Nakon što je indeks ubijen, prikazao sam 15 dupliranih zapisa, iako prije koraka 2 upit nije vratio ništa.
4) Pregledao sam sve zapise i ručno očistio duplikate. U stvari, koristio sam i obradu "Strukture izvještaja" da bih shvatio čime se uopšte bavim. Ispostavilo se da tabela _AccumRgTn19455 pohranjuje registar akumulacije "Izlaz proizvoda (poresko računovodstvo)". Probavio sam i sql upite, identifikovao 15 nejedinstvenih dokumenata i nakon završetka svih radnji provjerio sam u 1C da li se ti dokumenti obrađuju normalno, bez grešaka. Naravno, ne vrijedi nasumično čistiti stolove tek tako: važno je razumjeti šta se čisti i u šta se to može pretvoriti.
5) Pokrenuo je upit za kreiranje indeksa, koji je sačuvan u datoteci.
6) Prebacio bazu podataka u jednokorisnički mod i pokrenuo dbcc checkdb - ovaj put nije bilo grešaka.
7) Baza je vraćena u jednokorisnički način rada.
Sve... problem je poražen. Pa čak iu 1C sam pokrenuo "Testiranje i ispravljanje", i tu je sve prošlo u redu, prestao je da psuje na nejedinstveni indeks.

3. Ako nejedinstvenost leži u datumima sa nultim vrijednostima, tada se problem rješava kreiranjem baze s parametrom pomaka od 2000.

1. Ako je problem učitavanje baze podataka, tada:
1.1. Ako učitavate (koristeći dt-datoteku) u bazu podataka MS SQL Servera, tada prilikom kreiranja baze podataka prije učitavanja navedite pomak datuma - 2000.
Ako je baza već kreirana sa pomakom 0, onda kreirajte novu sa 2000.

1.2. Ako je moguće raditi sa bazom podataka u verziji datoteke, onda izvršite Testiranje i popravljanje, kao i Konfiguracija - Provjera konfiguracije - Provjera logičkog integriteta konfiguracije + Traženje neispravnih veza.

1.3. Ako ne postoji varijanta datoteke, pokušajte učitati iz DT u varijantu DB2 klijent/poslužitelj (koja je manje izbirljiva u pogledu jedinstvenosti), a zatim pokrenite Test i popravak i Konfiguracija - Provjera konfiguracije - Provjera logičkog integriteta konfiguracije + Tražitelj loših referenci.

1.4. Da biste lokalizirali problem, možete odrediti podatke objekta čije učitavanje nije uspjelo. Da biste to učinili, morate omogućiti praćenje u vrijeme pokretanja u uslužnom programu Profiler ili omogućiti evidentiranje u DBMSSQL i EXCP dnevnik događaja procesa.

2. Ukoliko se problem nejedinstvenosti manifestuje tokom rada korisnika:

2.1. Pronađite problematičan zahtjev metodom iz stava 1.4.

2.1.2. Ponekad dođe do greške tokom izvršavanja zahtjeva, na primjer:

Ova greška nastaje zbog činjenice da u modulu registra akumulacije "Radno vrijeme zaposlenih u organizacijama" u postupku "Registarski preračuni" u zahtjevu nema službene riječi "DRUGAČIJE".
Kod 1C v 8.x tj. treba biti:
Zahtjev = Novi zahtjev(
„IZABIR DRUGAČIJE
| Basic.Individual,
. . . . .
U najnovijim izdanjima ZUP-a i UPP-a greška se ne pojavljuje, jer. piše "RAZNO".

2.2. Nakon pronalaženja problematičnog indeksa iz prethodnog paragrafa, morate pronaći nejedinstveni unos.
2.2.1. "Fish" skripta za definiranje nejedinstvenih zapisa korištenjem SQL-a:
SQL kod S_odaberi COUNT(*) brojač,<перечисление всех полей соответствующего индекса>od<имя таблицы>
GROUP BY<перечисление всех полей соответствующего индекса>
IMAJUĆI Brojač > 1

2.2.2 Primjer. Indeks u grešci se zove "_Document140_VT1385_IntKeyIndNG".
Lista polja tabele:
_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
Napravite sigurnosnu kopiju vaše baze podataka prije nego što slijedite proceduru u nastavku.
Pokrenite u MS SQL Server Query Analyzeru:
SQL kod S_odaberi broj(*), _Document140_IDRRef, _KeyField
iz _Dokumenta140_VT1385
grupirati po _Document140_IDRRef, _KeyField
imaju broj (*) > 1
Koristite ga da saznate vrijednosti stupaca _Document140_IDRRef, _KeyField, duplih zapisa (id, ključ).

sa zahtjevom:
SQL kod S_elect *
iz _Dokumenta140_VT1385
ili _Document140_IDRRef = id2 i _KeyField = ključ2 ili ...
pogledajte vrijednosti drugih kolona duplih unosa.
Ako oba unosa imaju smislene vrijednosti i te vrijednosti su različite, tada popravite vrijednost _KeyField da bude jedinstvena. Da biste to učinili, definirajte maksimalnu zauzetu vrijednost _KeyField(keymax):
SQL kod S_elect max(_KeyField)
iz _Dokumenta140_VT1385
gdje je _Document140_IDRRef = id1
Zamijenite vrijednost _KeyField u jednom od duplikata unosa ispravnim:
Ažuriranje SQL koda _Document140_VT1385
postavite _KeyField = keymax + 1
Ovdje _LineNo1386 = je dodatni uvjet koji vam omogućava da odaberete jedan od dva duplikata unosa.

Ako jedan (ili oba) duplikat unosa ima očito pogrešnu vrijednost, onda ga treba ukloniti:
Brisanje SQL koda iz _Document140_VT1385
gdje je _Document140_IDRRef = id1 i _LineNo1386 = lineno1
Ako dupli unosi imaju iste vrijednosti u svim stupcima, onda se jedan od njih mora ostaviti:
SQL kod S_odaberi različit *
u #tmp1
iz _Dokumenta140_VT1385
gdje je _Document140_IDRRef = id1 i _KeyField = ključ1

Izbriši iz _Document140_VT1385
gdje je _Document140_IDRRef = id1 i _KeyField = ključ1

I_umetnuti u _Document140_VT1385
S_odaberite #tmp1

D_rop tablica #tmp1

Opisani postupak se mora izvesti za svaki par duplikata unosa.

2.2.3. Drugi primjer:
SQL kod S_odaberi COUNT(*) AS Izraz2, _IDRRef AS Izraz1, _Opis
IZ _Reference8_
GROUP BY _IDRRef, _Description
IMATI (BROJ(*) > 1)

2.3.4 Primjer definiranja nejedinstvenih zapisa korištenjem 1C:Enterprise upita:
Code 1C v 8.x ODABERITE priručnik Link
FROM imenik Direktorij AS imenik
GROUP BY
IMAJUĆI KOLIČINU(*) > 1

Top Related Articles