Бірегей емес мәнді бірегей индекске кірістіру әрекеті жасалды. Қате: бірегей емес мәнді бірегей индекске кірістіру әрекеті: microsoft sql сервері. 1s 8 файлындағы бірегей емес индекстерді жою ғана емес, бухгалтерлік проф-тен corp-ға ауысқанда

Сіз жолдарды қамтитын хабарламаны кездестірдіңіз:
SQL серверіне арналған Microsoft OLE DB провайдері: CREATE UNIQUE INDEX тоқтатылды, себебі индекс идентификаторы үшін қайталанатын кілт табылды
немесе
Нысанда қайталанатын кілт жолын енгізу мүмкін емес
немесе
Бірегей емес мәнді бірегей индекске кірістіру әрекеті жасалды.

Шешім нұсқалары:

1. SQL Server басқару студиясында біз сәтсіз индексті физикалық түрде жоямыз (менің жағдайда бұл есеп регистрінің қорытындылар кестесіндегі индекс болды). 1С-де қате құжаттарды таратамыз. Тестілеу және түзету режимінде кестелерді қайта индекстеу + қорытындыларды қайта есептеу үшін құсбелгілерді қойыңыз. 1С индексті қатесіз қайта жасайды. Біз бұрын істен шыққан құжаттарды орындаймыз.

2. 1) Management Studio 2005 бағдарламасының көмегімен индексті құруға арналған құру сценарийін жасадым, ол қате болды және оны файлға сақтадым.
2) _AccumRgTn19455 кестесіндегі индексті қолмен өлтірді
3) сияқты сұрауды іске қосты
SQL коды S_elect count(*), index_fields
AccumRgTn19455
GROUP BY индекс_өрісі
САН (*)>1
Индекс жойылғаннан кейін мен 15 қайталанатын жазбаны көрсеттім, бірақ 2-қадамға дейін сұрау ештеңе қайтармады.
4) Мен барлық жазбаларды қарап шықтым және көшірмелерді қолмен тазаладым. Негізінде, мен жалпы немен айналысып жатқанымды түсіну үшін «Есептер құрылымын» өңдеуді де қолдандым. _AccumRgTn19455 кестесінде «Өнім шығару (салық есебі)» жинақтау регистрі сақталатыны анықталды. Мен сондай-ақ sql сұрауларымен айналыстым, бірегей емес 15 құжатты анықтадым және барлық әрекеттерді орындағаннан кейін 1С-де бұл құжаттардың қалыпты, қатесіз өңделуін тексердім. Әрине, кестелерді кездейсоқ тазалаудың қажеті жоқ: не тазартылып жатқанын және оның неге айналуы мүмкін екенін түсіну маңызды.
5) Файлда сақталған индексті құру сұранысын іске қосты.
6) Дерекқорды бір пайдаланушы режиміне ауыстырды және dbcc checkdb іске қосты - бұл жолы қателер болмады.
7) Негізді бір пайдаланушы режиміне қайта көшірді.
Міне, мәселе шешілді. Тіпті 1С-те мен «Тестілеу және түзетуді» іске қостым, онда да бәрі жақсы болды, ол бірегей емес индекске ант беруді тоқтатты.

3. Егер бірегейлік нөлдік мәндері бар күндерде болса, онда ығысу параметрі 2000 болатын база құру арқылы мәселе шешіледі.

1. Мәселе дерекқорды жүктеуде болса, онда:
1.1. Егер сіз MS SQL Server дерекқорына жүктеп жатсаңыз (dt-файлын пайдалану), онда дерекқорды құру кезінде жүктеу алдында күннің ауытқуын көрсетіңіз - 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 I.e. болу керек:
Сұраныс = Жаңа сұраныс(
«басқасын ТАҢДАҢЫЗ
| Негізгі. Жеке,
. . . . .
ZUP және UPP соңғы шығарылымдарында қате пайда болмайды, себебі. онда «ӘРтүрлі» деп жазылған.

2.2. Алдыңғы абзацтан проблемалық көрсеткішті тапқаннан кейін бірегей емес жазбаны табу керек.
2.2.1. SQL көмегімен бірегей емес жазбаларды анықтауға арналған «Балық» сценарийі:
SQL коды S_elect COUNT(*) санауыш,<перечисление всех полей соответствующего индекса>бастап<имя таблицы>
ТОПТАУ<перечисление всех полей соответствующего индекса>
Есептегіштің болуы > 1

2.2.2 Мысал. Қатедегі индекс "_Document140_VT1385_IntKeyIndNG" деп аталады.
Кесте өрістерінің тізімі:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld139, _Fld19, _Fld19, _Fld139, _Fld1387, _Fld1387, 393_RR Ref _Fld1394,_Fld1395 _RTRef, _Fld22261_RRRef
Төмендегі процедураны орындамас бұрын дерекқордың сақтық көшірмесін жасаңыз.
MS SQL Server Query Analyzer бағдарламасында іске қосыңыз:
SQL коды S_elect count(*), _Document140_IDRRef, _KeyField
_Document140_VT1385 ішінен
_Document140_IDRRef, _KeyField бойынша топтау
саны бар (*) > 1
Оны _Document140_IDRRef, _KeyField, қайталанатын жазбалар (id, кілт) бағандарының мәндерін білу үшін пайдаланыңыз.

Өтінішпен:
SQL коды S_elect *
_Document140_VT1385 ішінен
немесе _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_IDRRef = id1 және _KeyField = кілт1

_Document140_VT1385 ішінен жою
мұндағы _Document140_IDRRef = id1 және _KeyField = кілт1

_Document140_VT1385 ішіне енгіземін
#tmp1_таңдаңыз

D_rop кестесі #tmp1

Сипатталған процедура қайталанатын жазбалардың әрбір жұбы үшін орындалуы керек.

2.2.3. Екінші мысал:
SQL коды S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Сипаттамасы
_Анықтама 8_
_IDRRef, _Сипаттамасы бойынша ТОПТАУ
БАР (COUNT(*) > 1)

2.3.4 1C: Enterprise сұранысы арқылы бірегей емес жазбаларды анықтау мысалы:
Код 1C v 8.x Анықтаманы ТАҢДАУ Сілтеме
Каталогтан.Каталог AS Каталог
ТОПТАУ
САНЫ БАР (*) > 1

Бұл мақалада 1C: Enterprise 8.1-мен жұмыс істеу кезінде жолдар бар хабарламаны кездестірсеңіз, не істеу керектігі сипатталады:

Нысанға қайталанатын кілт жолын кірістіру мүмкін емес

Бірегей емес мәнді бірегей индекске кірістіру әрекеті жасалды.

Индекс дегеніміз не?

Индекстер – оның бір немесе бірнеше бағандарының мәндері негізінде кесте жолдарына жылдам қол жеткізуге мүмкіндік беретін құрылым.
Индекс кестенің немесе көріністің бір немесе бірнеше бағандарынан құрастырылған кілттерді және көрсетілген деректер сақталатын орынмен салыстырылатын көрсеткіштерді қамтиды.
Индекстер нәтижелер жиынын қайтару үшін оқылатын деректер көлемін азайтады.

Индекс кестенің белгілі бір бағанымен (немесе бағандарымен) байланысты болса да, ол бәрібір дербес дерекқор нысаны болып табылады.

1С: Enterprise дерекқорындағы кесте индекстері конфигурация объектілерін құру кезінде, сондай-ақ конфигурация объектілерінің белгілі бір параметрлерімен жасырын түрде жасалады.

MS SQL Server 2005-тегі индекстердің физикалық мәні.

Физикалық деректер сақталады 8Кб беттерде. Жасалғаннан кейін кестеде индекстер болмаса да, кесте деректер үйіндісіне ұқсайды. Жазбаларда арнайы сақтау тәртібі жоқ.
Деректерге қол жеткізгіңіз келгенде, SQL сервері шығарады кестені сканерлеу(кестені сканерлеу). SQL сервері іздеген жазбаларды табу үшін бүкіл кестені сканерлейді.
Осыдан индекстердің негізгі функциялары анық болады:
- деректерге қол жеткізу жылдамдығын арттыру,
- деректер бірегейлігін қолдау.

Артықшылықтарға қарамастан, индекстердің бірқатар кемшіліктері де бар. Біріншісі - индекстер. дискідегі қосымша орынды аладыжәне жедел жадта. Индекс жасаған сайын пернелерді қабаттастыруға болатын өсу немесе кему ретімен сақтайсыз. Ал кілт неғұрлым үлкен/ұзын болса, индекс өлшемі соғұрлым үлкен болады. Екінші кемшілігі операциялары баяулайдыжазбаларды енгізу, жаңарту және жою.
MS SQL Server 2005 ортасында индекстердің бірнеше түрлері енгізілген:

  • кластерлік емес индекстер;
  • кластерленген (немесе кластерленген) индекстер;
  • бірегей индекстер;
  • бағандары бар индекстер
  • индекстелген көріністер
  • толық мәтін

Бірегей көрсеткіш

Индекстелген бағандағы мәндердің бірегейлігі бірегей индекстермен қамтамасыз етіледі. Егер олар бар болса, сервер жаңа мәнді енгізуге немесе бар мәнді осы әрекеттің нәтижесінде бағанда екі бірдей мән пайда болатындай өзгертуге рұқсат бермейді.
Бірегей индекс қосымшаның бір түрі болып табылады және оны кластерленген және кластерленбеген индекстер үшін орындауға болады. Бір кестеде бір бірегей кластерленген және көптеген бірегей кластерленбеген индекстер болуы мүмкін.
Бірегей индекстер өте қажет болғанда ғана анықталуы керек. Бағандағы деректер тұтастығын қамтамасыз ету үшін бірегей индекстерге жүгінудің орнына ЕРЕКШЕ немесе БІРІНШІ КІЛТІК тұтастық шектеуін анықтауға болады. Оларды тек деректердің тұтастығын қамтамасыз ету үшін пайдалану дерекқордағы бос орынды ысырап етеді. Сонымен қатар, процессордың уақыты да оларға қызмет көрсетуге жұмсалады.

1C: Enterprise 8.1 8.1 нұсқасынан бастап кластерленген бірегей индекстерді белсенді пайдаланады. Бұл 8.0-ден түрлендіру немесе 8.1.7-ден көшіру кезінде бірегей емес индекс қатесін алуға болатынын білдіреді.

Егер бірегейлік нөлдік мәндері бар күндерде болса, онда есеп 2000-ға тең ығысу параметрі бар база құру арқылы шешіледі.

Не істеу?

1. Мәселе дерекқорды жүктеуде болса, онда:

1.1. Егер сіз MS SQL Server дерекқорына жүктеп жатсаңыз (dt-файлын пайдалана отырып), онда дерекқорды құру кезінде жүктеу алдында күннің ығысуын көрсетіңіз - 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. SQL көмегімен бірегей емес жазбаларды анықтауға арналған «Балық» сценарийі:
ТАҢДАУ COUNT(*) санауыш,<перечисление всех полей соответствующего индекса>бастап<имя таблицы>
ТОПТАУ<перечисление всех полей соответствующего индекса>
Есептегіштің болуы > 1

2.2.2 Мысал. Қатедегі индекс "_Document140_VT1385_IntKeyIndNG" деп аталады.

Кесте өрістерінің тізімі:

Құжат140_IDRRef _KeyField _LineNo1386 _Fld1387 _Fld1388 _Fld1389 _Fld1390 _Fld1391RRef _Fld1392RRef _Fld1394,

Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTREf, _Fld22260_RRRef, _Fld22260_RRRef, _Fld2TR62ld _Fld1392, _Fld1398, _Fld1399RRef 222 61_RRСілтеме

Төмендегі процедураны орындамас бұрын дерекқордың сақтық көшірмесін жасаңыз.
MS SQL Server Query Analyzer бағдарламасында іске қосыңыз:

count(*), _Document140_IDRRef, _KeyField таңдаңыз
_Document140_VT1385 ішінен
_Document140_IDRRef, _KeyField бойынша топтау
саны бар (*) > 1

Оны _Document140_IDRRef, _KeyField, қайталанатын жазбалар (id, кілт) бағандарының мәндерін білу үшін пайдаланыңыз.

Өтінішпен:

таңдау *
_Document140_VT1385 ішінен
немесе _Document140_IDRRef = id2 және _KeyField = key2 немесе …

қайталанатын жазбалардың басқа бағандарының мәндерін қараңыз.

Егер екі жазбаның да мәнді мәндері болса және бұл мәндер әртүрлі болса, _KeyField мәнін бірегей етіп бекітіңіз. Бұл әрекетті орындау үшін _KeyField(keymax) максималды мәнін анықтаңыз:

макс таңдау(_KeyField)
_Document140_VT1385 ішінен
мұндағы _Document140_IDRRef = id1

Қайталанатын жазбалардың біріндегі _KeyField мәнін дұрысымен ауыстырыңыз:

update_Document140_VT1385
_KeyField = keymax + 1 орнатыңыз

Мұнда _LineNo1386 = екі қайталанатын жазбаның біреуін таңдауға мүмкіндік беретін қосымша шарт.

Егер қайталанатын жазбалардың біреуі (немесе екеуі де) анық қате мәнге ие болса, оны алып тастау керек:


мұндағы _Document140_IDRRef = id1 және _LineNo1386 = lineno1

Қайталанатын жазбалар барлық бағандарда бірдей мәндерге ие болса, олардың біреуін қалдыру керек:

ерекше таңдаңыз *
#tmp1 ішіне
_Document140_VT1385 ішінен
мұндағы _Document140_IDRRef = id1 және _KeyField = кілт1

_Document140_VT1385 ішінен жою
мұндағы _Document140_IDRRef = id1 және _KeyField = кілт1

_Document140_VT1385 ішіне енгізіңіз
#tmp1 таңдаңыз

#tmp1 кестесін тастаңыз

Сипатталған процедура қайталанатын жазбалардың әрбір жұбы үшін орындалуы керек.

2.2.3. Екінші мысал:

COUNT(*) ТАҢДАУ ЕСЕП 2, _IDRRef AS Expr1, _ Сипаттама
_Анықтама 8_
_IDRRef, _Сипаттамасы бойынша ТОПТАУ
БАР (COUNT(*) > 1)

2.3.4 1C: Enterprise сұранысы арқылы бірегей емес жазбаларды анықтау мысалы:

немесе бухгалтерлік есеп үшін

ТАҢДАУ
Ішкі сұрау.Кезең,
Ішкі сұрау. Тіркеуші,
<измерения>,
SUM(Subquery.Number of Records) AS Жазбалар саны
FROM
(ТАҢДАУ
Өзін-өзі қамтамасыз ету. Период AS Кезең,
Өзін-өзі қамтамасыз ету. Тіркеуші AS Тіркеуші,
<измерения>,
1 AS жазбалар саны
FROM
Бухгалтерлік есеп тізілімі Өзін-өзі қамтамасыз ететін AS Өзін-өзі қамтамасыз ететін) AS Ішкі сұрау

ТОПТАУ
Ішкі сұрау.Кезең,
Ішкі сұрау. Тіркеуші,
<измерения>

БАР
SUM(Ішкі сұрау.Жазбалар саны) > 1

2.3.5 Subd индексін бірегей емес етіп жасаңыз. Management Studio арқылы индексті сценарий жасаңыз.

2.3.6 РДБ-дағы биржадағы ерекше жағдай. Қате жиынтықты немесе аналитиканы есептеумен байланысты «көмекші» кестелерге түседі. Мысалы:

Мәтінмәндік әдісті шақыру қатесі (Жазу): Бірегей емес мәнді бірегей индекске кірістіру әрекеті:
SQL серверіне арналған Microsoft OLE DB провайдері: "_Accnt10319_ByPeriod_TRNRN" бірегей индексі бар "dbo._AccntRegED10319" нысанына қайталанатын кілт жолын кірістіру мүмкін емес.
HRESULT=80040E2F, SQLSrvr: Қате күйі=1, Қауіптілігі=E, жергілікті=2601, жол=1

Бұл жағдайда жүктеу алдында қорытындыларды пайдалануды өшіріп, хабарламаны жүктеп алып, қорытындыларды пайдалануды қосыңыз және қайта есептеңіз.

Сіз жолдарды қамтитын хабарламаны кездестірдіңіз:
SQL серверіне арналған Microsoft OLE DB провайдері: CREATE UNIQUE INDEX тоқтатылды, себебі индекс идентификаторы үшін қайталанатын кілт табылды
немесе
Нысанда қайталанатын кілт жолын енгізу мүмкін емес
немесе
Бірегей емес мәнді бірегей индекске кірістіру әрекеті жасалды.

Шешім нұсқалары:

1. SQL Server басқару студиясында біз сәтсіз индексті физикалық түрде жоямыз (менің жағдайда бұл бухгалтерлік есеп регистрінің қорытындылар кестесіндегі индекс болды). 1С-де қате құжаттарды таратамыз. Тестілеу және түзету режимінде кестелерді қайта индекстеу + қорытындыларды қайта есептеу үшін құсбелгілерді қойыңыз. 1С индексті қатесіз қайта жасайды. Біз бұрын істен шыққан құжаттарды орындаймыз.

2. 1) Management Studio 2005 бағдарламасының көмегімен индексті құруға арналған құру сценарийін жасадым, ол қате болды және оны файлға сақтадым.
2) _AccumRgTn19455 кестесіндегі индексті қолмен өлтірді
3) сияқты сұрауды іске қосты
SQL коды S_elect count(*), index_fields
FR OM AccumRgTn19455
GROUP BY индекс_өрісі
САН (*)>1
Индекс жойылғаннан кейін мен 15 қайталанатын жазбаны көрсеттім, бірақ 2-қадамға дейін сұрау ештеңе қайтармады.
4) Мен барлық жазбаларды қарап шықтым және көшірмелерді қолмен тазаладым. Негізінде, мен жалпы немен айналысып жатқанымды түсіну үшін «Есептер құрылымын» өңдеуді де қолдандым. _AccumRgTn19455 кестесінде «Өнім шығару (салық есебі)» жинақтау регистрі сақталатыны анықталды. Мен сондай-ақ sql сұрауларымен айналыстым, 15 бірегей емес құжатты анықтадым және барлық әрекеттерді орындағаннан кейін 1С-де бұл құжаттардың қалыпты, қатесіз өңделуін тексердім. Әрине, кестелерді кездейсоқ тазалаудың қажеті жоқ: не тазартылып жатқанын және оның неге айналуы мүмкін екенін түсіну маңызды.
5) Файлда сақталған индексті құру сұранысын іске қосты.
6) Дерекқорды бір пайдаланушы режиміне ауыстырды және dbcc checkdb іске қосты - бұл жолы қателер болмады.
7) Негізді бір пайдаланушы режиміне қайта көшірді.
Міне, мәселе шешілді. Тіпті 1С-те мен «Тестілеу және түзетуді» іске қостым, онда да бәрі жақсы болды, ол бірегей емес индекске ант беруді тоқтатты.

3. Егер бірегейлік нөлдік мәндері бар күндерде болса, онда ығысу параметрі 2000 болатын база құру арқылы мәселе шешіледі.

1. Мәселе дерекқорды жүктеуде болса, онда:
1.1. Егер сіз MS SQL Server дерекқорына жүктеп жатсаңыз (dt-файлын пайдалану), онда дерекқорды құру кезінде жүктеу алдында күннің ауытқуын көрсетіңіз - 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 I.e. болу керек:
Сұраныс = Жаңа сұраныс(
«басқасын ТАҢДАҢЫЗ
| Негізгі. Жеке,
. . . . .
ZUP және UPP соңғы шығарылымдарында қате пайда болмайды, себебі. онда «ӘРтүрлі» деп жазылған.

2.2. Алдыңғы абзацтан проблемалық көрсеткішті тапқаннан кейін бірегей емес жазбаны табу керек.
2.2.1. SQL көмегімен бірегей емес жазбаларды анықтауға арналған «Балық» сценарийі:
SQL коды S_elect COUNT(*) санауыш,<перечисление всех полей соответствующего индекса>бастап<имя таблицы>
ТОПТАУ<перечисление всех полей соответствующего индекса>
Есептегіштің болуы > 1

2.2.2 Мысал. Қатедегі индекс "_Document140_VT1385_IntKeyIndNG" деп аталады.
Кесте өрістерінің тізімі:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld139, _Fld19, _Fld19, _Fld139, _Fld1387, _Fld1387, 393_RR Ref _Fld1394,_Fld1395 _RTRef, _Fld22261_RRRef
Төмендегі процедураны орындамас бұрын дерекқордың сақтық көшірмесін жасаңыз.
MS SQL Server Query Analyzer бағдарламасында іске қосыңыз:
SQL коды S_elect count(*), _Document140_IDRRef, _KeyField
_Document140_VT1385 ішінен
_Document140_IDRRef, _KeyField бойынша топтау
саны бар (*) > 1
Оны _Document140_IDRRef, _KeyField, қайталанатын жазбалар (id, кілт) бағандарының мәндерін білу үшін пайдаланыңыз.

Өтінішпен:
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 ішінен
ere_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 = кілт1

_Document140_VT1385 ішіне енгіземін
#tmp1_таңдаңыз

D_rop кестесі #tmp1

Сипатталған процедура қайталанатын жазбалардың әрбір жұбы үшін орындалуы керек.

2.2.3. Екінші мысал:
SQL коды S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Сипаттамасы
_Анықтама 8_
_IDRRef, _Сипаттамасы бойынша ТОПТАУ
БАР (COUNT(*) > 1)

2.3.4 1C: Enterprise сұранысы арқылы бірегей емес жазбаларды анықтау мысалы:
Код 1C v 8.x Анықтаманы ТАҢДАУ Сілтеме
Каталогтан.Каталог AS Каталог
ТОПТАУ
САНЫ БАР (*) > 1

Ақпарат сайттан алынды

Сіз жолдарды қамтитын хабарламаны кездестірдіңіз:
SQL серверіне арналған Microsoft OLE DB провайдері: CREATE UNIQUE INDEX тоқтатылды, себебі индекс идентификаторы үшін қайталанатын кілт табылды
немесе
Нысанда қайталанатын кілт жолын енгізу мүмкін емес
немесе
Бірегей емес мәнді бірегей индекске кірістіру әрекеті жасалды.

Шешім нұсқалары:

1. SQL Server басқару студиясында біз сәтсіз индексті физикалық түрде жоямыз (менің жағдайда бұл есеп регистрінің қорытындылар кестесіндегі индекс болды). 1С-де қате құжаттарды таратамыз. Тестілеу және түзету режимінде кестелерді қайта индекстеу + қорытындыларды қайта есептеу үшін құсбелгілерді қойыңыз. 1С индексті қатесіз қайта жасайды. Біз бұрын істен шыққан құжаттарды орындаймыз.

2. 1) Management Studio 2005 бағдарламасының көмегімен индексті құруға арналған құру сценарийін жасадым, ол қате болды және оны файлға сақтадым.
2) _AccumRgTn19455 кестесіндегі индексті қолмен өлтірді
3) сияқты сұрауды іске қосты
SQL коды S_elect count(*), index_fields
AccumRgTn19455
GROUP BY индекс_өрісі
САН (*)>1
Индекс жойылғаннан кейін мен 15 қайталанатын жазбаны көрсеттім, бірақ 2-қадамға дейін сұрау ештеңе қайтармады.
4) Мен барлық жазбаларды қарап шықтым және көшірмелерді қолмен тазаладым. Негізінде, мен жалпы немен айналысып жатқанымды түсіну үшін «Есептер құрылымын» өңдеуді де қолдандым. _AccumRgTn19455 кестесінде «Өнім шығару (салық есебі)» жинақтау регистрі сақталатыны анықталды. Мен сондай-ақ sql сұрауларымен айналыстым, бірегей емес 15 құжатты анықтадым және барлық әрекеттерді орындағаннан кейін 1С-де бұл құжаттардың қалыпты, қатесіз өңделуін тексердім. Әрине, кестелерді кездейсоқ тазалаудың қажеті жоқ: не тазартылып жатқанын және оның неге айналуы мүмкін екенін түсіну маңызды.
5) Файлда сақталған индексті құру сұранысын іске қосты.
6) Дерекқорды бір пайдаланушы режиміне ауыстырды және dbcc checkdb іске қосты - бұл жолы қателер болмады.
7) Негізді бір пайдаланушы режиміне қайта көшірді.
Міне, мәселе шешілді. Тіпті 1С-те мен «Тестілеу және түзетуді» іске қостым, онда да бәрі жақсы болды, ол бірегей емес индекске ант беруді тоқтатты.

3. Егер бірегейлік нөлдік мәндері бар күндерде болса, онда ығысу параметрі 2000 болатын база құру арқылы мәселе шешіледі.

1. Мәселе дерекқорды жүктеуде болса, онда:
1.1. Егер сіз MS SQL Server дерекқорына жүктеп жатсаңыз (dt-файлын пайдалану), онда дерекқорды құру кезінде жүктеу алдында күннің ауытқуын көрсетіңіз - 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 I.e. болу керек:
Сұраныс = Жаңа сұраныс(
«басқасын ТАҢДАҢЫЗ
| Негізгі. Жеке,
. . . . .
ZUP және UPP соңғы шығарылымдарында қате пайда болмайды, себебі. онда «ӘРтүрлі» деп жазылған.

2.2. Алдыңғы абзацтан проблемалық көрсеткішті тапқаннан кейін бірегей емес жазбаны табу керек.
2.2.1. SQL көмегімен бірегей емес жазбаларды анықтауға арналған «Балық» сценарийі:
SQL коды S_elect COUNT(*) санауыш,<перечисление всех полей соответствующего индекса>бастап<имя таблицы>
ТОПТАУ<перечисление всех полей соответствующего индекса>
Есептегіштің болуы > 1

2.2.2 Мысал. Қатедегі индекс "_Document140_VT1385_IntKeyIndNG" деп аталады.
Кесте өрістерінің тізімі:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1392RRef, _Fld1392RRef, _Fld139, _Fld19, _Fld19, _Fld139, _Fld1387, _Fld1387, 393_RR Ref _Fld1394,_Fld1395 _RTRef, _Fld22261_RRRef
Төмендегі процедураны орындамас бұрын дерекқордың сақтық көшірмесін жасаңыз.
MS SQL Server Query Analyzer бағдарламасында іске қосыңыз:
SQL коды S_elect count(*), _Document140_IDRRef, _KeyField
_Document140_VT1385 ішінен
_Document140_IDRRef, _KeyField бойынша топтау
саны бар (*) > 1
Оны _Document140_IDRRef, _KeyField, қайталанатын жазбалар (id, кілт) бағандарының мәндерін білу үшін пайдаланыңыз.

Өтінішпен:
SQL коды S_elect *
_Document140_VT1385 ішінен
немесе _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_IDRRef = id1 және _KeyField = кілт1

_Document140_VT1385 ішінен жою
мұндағы _Document140_IDRRef = id1 және _KeyField = кілт1

_Document140_VT1385 ішіне енгіземін
#tmp1_таңдаңыз

D_rop кестесі #tmp1

Сипатталған процедура қайталанатын жазбалардың әрбір жұбы үшін орындалуы керек.

2.2.3. Екінші мысал:
SQL коды S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Сипаттамасы
_Анықтама 8_
_IDRRef, _Сипаттамасы бойынша ТОПТАУ
БАР (COUNT(*) > 1)

2.3.4 1C: Enterprise сұранысы арқылы бірегей емес жазбаларды анықтау мысалы:
Код 1C v 8.x Анықтаманы ТАҢДАУ Сілтеме
Каталогтан.Каталог AS Каталог
ТОПТАУ
САНЫ БАР (*) > 1




Жоғарғы