Indeks unik 1c sql. Kesalahan: Mencoba memasukkan nilai non-unik ke dalam indeks unik: microsoft sql server

Indeks unik 1c sql. Kesalahan: Mencoba memasukkan nilai non-unik ke dalam indeks unik: microsoft sql server

Anda telah menerima pesan yang berisi baris:
Penyedia Microsoft OLE DB untuk SQL Server: CREATE UNIQUE INDEX dihentikan karena kunci duplikat ditemukan untuk ID indeks
atau
Tidak dapat I_menyisipkan baris kunci duplikat dalam objek
atau
Upaya telah dilakukan untuk memasukkan nilai non-unik ke dalam indeks unik.

Solusi:

1. Di studio manajemen SQL Server, kami secara fisik menghancurkan indeks yang salah (dalam kasus saya itu adalah indeks pada tabel total register akuntansi). Di 1C kami akan mendistribusikan dokumen yang salah. Dalam mode pengujian dan koreksi, centang kotak untuk pengindeksan ulang tabel + penghitungan ulang total. 1C membuat ulang indeks tanpa kesalahan. Kami melaksanakan dokumen yang sebelumnya gagal.

2. 1)C menggunakan Manajemen Studio 2005 membuat skrip pembuatan untuk membuat indeks, yang bermasalah, dan menyimpannya ke file.
2) Secara manual mematikan indeks kusen dari tabel _AccumRgTn19455
3) Meluncurkan permintaan suka
Kode SQL S_elect count(*), index_fields
DARI AccumRgTn19455
KELOMPOK BERDASARkan bidang_indeks
MEMILIKI hitungan(*)>1
Setelah indeks dimatikan, saya menampilkan 15 catatan duplikat, meskipun sebelum langkah 2 kueri tidak mengembalikan apa pun.
4) Saya memeriksa semua entri dan membersihkan duplikat secara manual. Faktanya, saya juga menggunakan pemrosesan “Struktur Laporan” untuk memahami apa yang saya hadapi. Ternyata tabel _AccumRgTn19455 menyimpan register akumulasi “Output produk (akuntansi pajak)”. Saya juga mengutak-atik query sql, mengidentifikasi 15 dokumen yang tidak unik, dan setelah semua tindakan selesai, saya memeriksa di 1C bahwa dokumen-dokumen ini diproses secara normal, tanpa kesalahan. Tentu saja, Anda tidak boleh membersihkan meja secara sembarangan: penting untuk memahami apa yang dibersihkan dan bagaimana hasilnya.
5) Meluncurkan permintaan untuk membuat indeks, yang disimpan dalam file.
6) Mengalihkan database ke mode pengguna tunggal dan meluncurkan dbcc checkdb - kali ini tidak ada kesalahan yang terjadi.
7) Mengalihkan basis kembali ke mode pengguna tunggal.
Itu saja... masalahnya teratasi. Nah, di 1C saya meluncurkan "Pengujian dan Koreksi", semuanya berjalan baik di sana, saya berhenti mengeluh tentang indeks yang tidak unik.

3. Jika ketidakunikkannya terletak pada tanggal yang nilainya nol, maka masalahnya diselesaikan dengan membuat database dengan parameter offset sama dengan 2000.

1. Jika masalahnya adalah memuat database, maka:
1.1. Jika Anda memuat (menggunakan file dt) ke database MS SQL Server, maka saat membuat database, sebelum memuat, tentukan tanggal offset - 2000.
Jika database sudah dibuat dengan offset 0, maka buatlah database baru dengan offset 2000.

1.2. Jika memungkinkan untuk bekerja dengan database dalam versi file, maka lakukan Pengujian dan Koreksi, serta Konfigurasi - Memeriksa konfigurasi - Memeriksa integritas logis konfigurasi + Mencari tautan yang salah.

1.3. Jika tidak ada versi file, coba muat dari DT ke versi client-server dengan DB2 (yang tidak terlalu menuntut keunikan), lalu lakukan Pengujian dan Koreksi, serta Konfigurasi - Verifikasi Konfigurasi - Periksa Integritas Logis Konfigurasi + Cari Referensi Tidak Valid.

1.4. Untuk melokalisasi masalahnya, Anda dapat menentukan data objek yang pemuatannya gagal. Untuk melakukan ini, Anda perlu mengaktifkan penelusuran di utilitas Profiler saat boot atau mengaktifkan perekaman di log peristiwa proses DBMSSQL dan EXCP.

2. Jika masalah non-keunikan terjadi saat pengguna sedang bekerja:

2.1. Temukan permintaan yang bermasalah menggunakan metode di paragraf 1.4.

2.1.2. Terkadang terjadi kesalahan saat menjalankan kueri, misalnya:

Kesalahan ini terjadi karena dalam modul register akumulasi "Waktu kerja karyawan organisasi" dalam prosedur "Daftar Perhitungan Ulang", kata layanan "BERBEDA" tidak disertakan dalam permintaan.
Kode 1C v 8.x Yaitu. seharusnya:
Permintaan = Permintaan Baru(
"PILIH BERBAGAI
| Dasar.Individu,
. . . . .
Pada rilis terbaru ZUP dan UPP error tidak terjadi karena tertulis "BERBEDA".

2.2. Setelah menemukan indeks bermasalah dari paragraf sebelumnya, Anda perlu menemukan catatan yang tidak unik.
2.2.1. Skrip "Ikan" untuk mengidentifikasi catatan non-unik dengan menggunakan SQL:
Kode SQL S_elect COUNT(*) Penghitung,<перечисление всех полей соответствующего индекса>dari<имя таблицы>
KELOMPOK OLEH<перечисление всех полей соответствующего индекса>
MEMILIKI Penghitung > 1

2.2.2 Contoh. Indeks dalam kesalahan disebut "_Document140_VT1385_IntKeyIndNG".
Daftar bidang tabel:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393_ R RRef, _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261 _RTRef, _Fld22261_RRRef
Sebelum melakukan prosedur di bawah ini, lakukan salinan cadangan database.
Jalankan di MS SQL Server Query Analyzer:
Kode SQL S_pilih hitungan(*), _Document140_IDRRef, _KeyField
dari_Dokumen140_VT1385
kelompokkan berdasarkan _Document140_IDRRef, _KeyField
memiliki hitungan(*) > 1
Gunakan untuk mengetahui nilai kolom _Document140_IDRRef, _KeyField, catatan duplikat (id, kunci).

Menggunakan permintaan:
Kode SQL S_pilih *
dari_Dokumen140_VT1385
atau _Document140_IDRRef = id2 dan _KeyField = key2 atau ...
lihat nilai kolom lain dari entri duplikat.
Jika kedua entri memiliki nilai yang berarti dan nilainya berbeda, maka ubah nilai _KeyField menjadi unik. Untuk melakukan ini, tentukan nilai maksimum yang ditempati _KeyField (keymax):
Kode SQL S_pilih maks(_KeyField)
dari_Dokumen140_VT1385
dimana _Document140_IDRRef = id1
Ganti nilai _KeyField di salah satu entri duplikat dengan yang benar:
Pembaruan kode SQL _Document140_VT1385
atur _KeyField = keymax + 1
Di sini _LineNo1386 = adalah kondisi tambahan yang memungkinkan Anda memilih salah satu dari dua rekaman berulang.

Jika salah satu (atau keduanya) dari entri duplikat jelas-jelas memiliki arti yang salah, maka entri tersebut harus dihapus:
Hapus kode SQL dari _Document140_VT1385
dimana _Document140_IDRRef = id1 dan _LineNo1386 = lineno1
Jika entri duplikat memiliki nilai yang sama di semua kolom, maka Anda harus meninggalkan salah satunya:
Kode SQL S_pilih berbeda *
ke #tmp1
dari_Dokumen140_VT1385
dimana _Document140_IDRRef = id1 dan _KeyField = kunci1

Hapus dari _Document140_VT1385
dimana _Document140_IDRRef = id1 dan _KeyField = kunci1

Saya_masukkan ke _Document140_VT1385
S_pilih #tmp1

Tabel D_rop #tmp1

Prosedur yang dijelaskan harus dilakukan untuk setiap pasangan rekaman duplikat.

2.2.3. Contoh kedua:
Kode SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
DARI _Referensi8_
KELOMPOK BERDASARKAN _IDRRef, _Deskripsi
MEMILIKI (JUMLAH(*) > 1)

2.3.4 Contoh penentuan record non-unik menggunakan query 1C:Enterprise:
Kode 1C v 8.x PILIH Direktori.Link
DARI Direktori.Direktori SEBAGAI Direktori
KELOMPOK BERDASARKAN Direktori.Link
MEMILIKI KUANTITAS(*) > 1

Anda telah menerima pesan yang berisi baris:
Penyedia Microsoft OLE DB untuk SQL Server: CREATE UNIQUE INDEX dihentikan karena kunci duplikat ditemukan untuk ID indeks
atau
Tidak dapat I_menyisipkan baris kunci duplikat dalam objek
atau
Upaya telah dilakukan untuk memasukkan nilai non-unik ke dalam indeks unik.

Solusi:

1. Di studio manajemen SQL Server, kami secara fisik menghancurkan indeks yang salah (dalam kasus saya itu adalah indeks pada tabel total register akuntansi). Di 1C kami akan mendistribusikan dokumen yang salah. Dalam mode pengujian dan koreksi, centang kotak untuk pengindeksan ulang tabel + penghitungan ulang total. 1C membuat ulang indeks tanpa kesalahan. Kami melaksanakan dokumen yang sebelumnya gagal.

2. 1) Menggunakan Management Studio 2005, saya membuat skrip buat untuk membuat indeks, yang bermasalah, dan menyimpannya ke file.
2) Secara manual mematikan indeks kusen dari tabel _AccumRgTn19455
3) Meluncurkan permintaan suka
Kode SQL S_elect count(*), index_fields
DARI AccumRgTn19455
KELOMPOK BERDASARkan bidang_indeks
MEMILIKI hitungan(*)>1
Setelah indeks dimatikan, saya menampilkan 15 catatan duplikat, meskipun sebelum langkah 2 kueri tidak mengembalikan apa pun.
4) Saya memeriksa semua entri dan membersihkan duplikat secara manual. Faktanya, saya juga menggunakan pemrosesan “Struktur Laporan” untuk memahami apa yang saya hadapi. Ternyata tabel _AccumRgTn19455 menyimpan register akumulasi “Output produk (akuntansi pajak)”. Saya juga mengutak-atik query sql, mengidentifikasi 15 dokumen yang tidak unik, dan setelah semua tindakan selesai, saya memeriksa di 1C bahwa dokumen-dokumen ini diproses secara normal, tanpa kesalahan. Tentu saja, Anda tidak boleh membersihkan meja secara sembarangan: penting untuk memahami apa yang dibersihkan dan bagaimana hasilnya.
5) Meluncurkan permintaan untuk membuat indeks, yang disimpan dalam file.
6) Mengalihkan database ke mode pengguna tunggal dan meluncurkan dbcc checkdb - kali ini tidak ada kesalahan yang terjadi.
7) Mengalihkan basis kembali ke mode pengguna tunggal.
Itu saja... masalahnya teratasi. Nah, di 1C saya meluncurkan "Pengujian dan Koreksi", semuanya berjalan baik di sana, saya berhenti mengeluh tentang indeks yang tidak unik.

3. Jika ketidakunikkannya terletak pada tanggal yang nilainya nol, maka masalahnya diselesaikan dengan membuat database dengan parameter offset sama dengan 2000.

1. Jika masalahnya adalah memuat database, maka:
1.1. Jika Anda memuat (menggunakan file dt) ke database MS SQL Server, maka saat membuat database, sebelum memuat, tentukan tanggal offset - 2000.
Jika database sudah dibuat dengan offset 0, maka buatlah database baru dengan offset 2000.

1.2. Jika memungkinkan untuk bekerja dengan database dalam versi file, maka lakukan Pengujian dan Koreksi, serta Konfigurasi - Memeriksa konfigurasi - Memeriksa integritas logis konfigurasi + Mencari tautan yang salah.

1.3. Jika tidak ada versi file, coba muat dari DT ke versi client-server dengan DB2 (yang tidak terlalu menuntut keunikan), lalu lakukan Pengujian dan Koreksi, serta Konfigurasi - Verifikasi Konfigurasi - Periksa Integritas Logis Konfigurasi + Cari Referensi Tidak Valid.

1.4. Untuk melokalisasi masalahnya, Anda dapat menentukan data objek yang pemuatannya gagal. Untuk melakukan ini, Anda perlu mengaktifkan penelusuran di utilitas Profiler saat boot atau mengaktifkan perekaman di log peristiwa proses DBMSSQL dan EXCP.

2. Jika masalah non-keunikan terjadi saat pengguna sedang bekerja:

2.1. Temukan permintaan yang bermasalah menggunakan metode di paragraf 1.4.

2.1.2. Terkadang terjadi kesalahan saat menjalankan kueri, misalnya:

Kesalahan ini terjadi karena dalam modul register akumulasi "Waktu kerja karyawan organisasi" dalam prosedur "Daftar Perhitungan Ulang", kata layanan "BERBEDA" tidak disertakan dalam permintaan.
Kode 1C v 8.x Yaitu. seharusnya:
Permintaan = Permintaan Baru(
"PILIH BERBAGAI
| Dasar.Individu,
. . . . .
Pada rilis terbaru ZUP dan UPP error tidak terjadi karena tertulis "BERBEDA".

2.2. Setelah menemukan indeks bermasalah dari paragraf sebelumnya, Anda perlu menemukan catatan yang tidak unik.
2.2.1. Skrip "Fish" untuk mengidentifikasi catatan non-unik menggunakan SQL:
Kode SQL S_elect COUNT(*) Penghitung,<перечисление всех полей соответствующего индекса>dari<имя таблицы>
KELOMPOK OLEH<перечисление всех полей соответствующего индекса>
MEMILIKI Penghitung > 1

2.2.2 Contoh. Indeks dalam kesalahan disebut "_Document140_VT1385_IntKeyIndNG".
Daftar bidang tabel:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393_ R RRef, _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261 _RTRef, _Fld22261_RRRef
Sebelum melakukan prosedur di bawah ini, harap buat cadangan database Anda.
Jalankan di MS SQL Server Query Analyzer:
Kode SQL S_pilih hitungan(*), _Document140_IDRRef, _KeyField
dari_Dokumen140_VT1385
kelompokkan berdasarkan _Document140_IDRRef, _KeyField
memiliki hitungan(*) > 1
Gunakan untuk mengetahui nilai kolom _Document140_IDRRef, _KeyField, catatan duplikat (id, kunci).

Menggunakan permintaan:
Kode SQL S_pilih *
dari_Dokumen140_VT1385
atau _Document140_IDRRef = id2 dan _KeyField = key2 atau ...
lihat nilai kolom lain dari entri duplikat.
Jika kedua entri memiliki nilai yang berarti dan nilainya berbeda, maka ubah nilai _KeyField menjadi unik. Untuk melakukan ini, tentukan nilai maksimum yang ditempati _KeyField (keymax):
Kode SQL S_pilih maks(_KeyField)
dari_Dokumen140_VT1385
dimana _Document140_IDRRef = id1
Ganti nilai _KeyField di salah satu entri duplikat dengan yang benar:
Pembaruan kode SQL _Document140_VT1385
atur _KeyField = keymax + 1
Di sini _LineNo1386 = adalah kondisi tambahan yang memungkinkan Anda memilih salah satu dari dua rekaman berulang.

Jika salah satu (atau keduanya) dari entri duplikat jelas-jelas memiliki arti yang salah, maka entri tersebut harus dihapus:
Hapus kode SQL dari _Document140_VT1385
dimana _Document140_IDRRef = id1 dan _LineNo1386 = lineno1
Jika entri duplikat memiliki nilai yang sama di semua kolom, maka Anda harus meninggalkan salah satunya:
Kode SQL S_pilih berbeda *
ke #tmp1
dari_Dokumen140_VT1385
dimana _Document140_IDRRef = id1 dan _KeyField = kunci1

Hapus dari _Document140_VT1385
dimana _Document140_IDRRef = id1 dan _KeyField = kunci1

Saya_masukkan ke _Document140_VT1385
S_pilih #tmp1

Tabel D_rop #tmp1

Prosedur yang dijelaskan harus dilakukan untuk setiap pasangan rekaman duplikat.

2.2.3. Contoh kedua:
Kode SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
DARI _Referensi8_
KELOMPOK BERDASARKAN _IDRRef, _Deskripsi
MEMILIKI (JUMLAH(*) > 1)

2.3.4 Contoh penentuan record non-unik menggunakan query 1C:Enterprise:
Kode 1C v 8.x PILIH Direktori.Link
DARI Direktori.Direktori SEBAGAI Direktori
KELOMPOK BERDASARKAN Direktori.Link
MEMILIKI KUANTITAS(*) > 1

Kesalahan terjadi jika beberapa objek, detail, subkonto dalam database memiliki nilai NULL, namun tidak dapat memiliki nilai tersebut. Dan kesalahan ini hanya muncul di database SQL. Itu. Jika Anda mengunggah database seperti itu ke file, maka kesalahan ini tidak akan ada lagi. Karena Basis data file memiliki tabelnya sendiri (total 4), dan SQL memiliki tabelnya sendiri. Dan database SQL bereaksi secara kritis terhadap nilai-nilai tersebut dalam tabelnya.

Masalah ini tidak dapat diselesaikan dengan pengujian apa pun (baik eksternal maupun internal) dalam versi database apa pun (SQL atau file) dan bahkan dengan Prosedur _1sp_DBReindex di manajer SQL, yang tampaknya seharusnya merestrukturisasi tabel dalam SQL.

Mari kita lihat solusi masalah menggunakan contoh peralihan dari Accounting 3.0 PROF ke CORP. Setelah transisi, akun 68.01 memiliki sub-akun baru, Pendaftaran dengan Otoritas Pajak. Dan kemudian, dalam database SQL, semua dokumen yang dibuat dalam versi PRO yang menggunakan akun ini tidak akan ditransfer. Kesalahan yang ditunjukkan di atas akan muncul. Karena subaccount baru ini untuk dokumen lama, dalam postingannya akan ditulis dengan nilai NULL (walaupun seharusnya begitu Nilai kosong, atau entah bagaimana otoritas pajak).

Untuk memperbaiki kesalahan ini, Anda perlu menghapus nilai NULL di tempat yang tidak seharusnya. Dalam hal ini, dalam dokumen yang menggunakan subkonto Pendaftaran dengan Otoritas Pajak. Hal ini dapat dilakukan dengan menulis pemrosesan yang akan menggantikan NULL dengan nilai Kosong (pemrosesan siap pakai dapat diunduh dari artikel ini). Lakukan dengan mengolah, karena Upaya untuk mengubah nilai sub-akun ini secara manual dalam postingan dokumen menghasilkan kesalahan yang sama.

Proses penggantian NULL di seluruh subkontak Pendaftaran pada Otoritas Pajak dapat diunduh pada artikel di bawah ini.

TAPI tidak akan berfungsi untuk mengganti NULL di database SQL; selama pemrosesan, kesalahan yang sama akan terjadi. Oleh karena itu Anda perlu melakukan ini:

1. Unggah versi database SQL yang sudah berfungsi, diterjemahkan ke CORP, ke dalam file dt (di konfigurator Administrasi – Unggah basis data – pilih tempat untuk mengunggah basis data dalam bentuk file *.dt)

2. Unggah dt'shnik ke database file (di tempat yang tidak perlu atau sudah disiapkan sebelumnya, bersih, basis data berkas, di konfigurator Administrasi – Muat database – pilih file dt yang diunduh sebelumnya)

3. Lakukan pemrosesan pada file database (tidak akan ada error disana dan semua NULL akan terganti dengan benar) (cara melakukan pemrosesan dijelaskan di bawah)

5. Sekarang, sebaliknya, keluarkan file dt dari database file dan muat ke dalam database SQL. Kini, saat memposting dokumen yang sudah diproses, kesalahan tidak akan terjadi.

Pemrosesan dari artikel ini menemukan semua dokumen untuk periode tertentu yang postingannya mencakup Pendaftaran subkontrak dengan Otoritas Pajak (yang muncul dalam versi CORP), yang bernilai NULL. Dan ganti nilai ini dengan nilai Kosong.

Dalam pemrosesan, Anda harus menunjukkan periode di mana Anda perlu memproses dokumen (Anda bisa untuk seluruh periode penyimpanan catatan dalam database) dan klik “Isi bagian tabel" Kemudian Anda dapat mencentang kotak untuk menandai dokumen mana yang akan diproses (Anda dapat memilih semua) dan klik tombol “Proses”.

Oleh karena itu, jika seseorang mengalami kesalahan yang sama, tetapi BUKAN setelah beralih ke CORP, tetapi misalnya setelah bertukar, memuat beberapa data, melakukan beberapa pemrosesan, dll. Kemudian Anda perlu mengidentifikasi di mana nilai NULL ditetapkan dalam dokumen/direktori tertentu dan menghapus NULL ini dengan cara yang sama, tetapi dengan pemrosesan Anda sendiri, tetapi dalam urutan yang dijelaskan di atas. Ingatlah bahwa NULL dapat berupa, seperti dalam postingan dokumen, termasuk. tidak hanya akuntansi, tetapi juga dalam bentuk dokumen/buku referensi, dalam beberapa detail, tetapi dalam hal ini mungkin bahkan tidak akan terbuka.

Juga, jika kesalahan ini muncul pada Anda saat memposting dokumen, setelah Anda mentransfer database file Bukh KORP ke SQL (dan database awalnya PROF), itu berarti dokumen-dokumen yang dibuat dalam versi PROF sekarang juga ada di versi PROF. Pendaftaran sub-akun di Otoritas Pajak nilai NULL dan database SQL tidak menerima ini. Dan saat memuat database ke SQL, akan muncul error berikut. Di sini, sebenarnya, tidak akan ada nilai NULL dalam database file, tetapi SQL akan memuat nilai tersebut ke dalam tabelnya. Oleh karena itu, di sini kita perlu memaksa database SQL untuk membuat NULL ini dan kemudian memperbaikinya di database file.

Anda telah menerima pesan yang berisi baris:
Penyedia Microsoft OLE DB untuk SQL Server: CREATE UNIQUE INDEX dihentikan karena kunci duplikat ditemukan untuk ID indeks
atau
Tidak dapat I_menyisipkan baris kunci duplikat dalam objek
atau
Upaya telah dilakukan untuk memasukkan nilai non-unik ke dalam indeks unik.

Solusi:

1. Di studio manajemen SQL Server, kami secara fisik menghancurkan indeks yang salah (dalam kasus saya itu adalah indeks pada tabel total register akuntansi). Di 1C kami akan mendistribusikan dokumen yang salah. Dalam mode pengujian dan koreksi, centang kotak untuk pengindeksan ulang tabel + penghitungan ulang total. 1C membuat ulang indeks tanpa kesalahan. Kami melaksanakan dokumen yang sebelumnya gagal.

2. 1) Menggunakan Management Studio 2005, saya membuat skrip buat untuk membuat indeks, yang bermasalah, dan menyimpannya ke file.
2) Secara manual mematikan indeks kusen dari tabel _AccumRgTn19455
3) Meluncurkan permintaan suka
Kode SQL S_elect count(*), index_fields
FR OM AccumRgTn19455
KELOMPOK BERDASARkan bidang_indeks
MEMILIKI hitungan(*)>1
Setelah indeks dimatikan, saya menampilkan 15 catatan duplikat, meskipun sebelum langkah 2 kueri tidak mengembalikan apa pun.
4) Saya memeriksa semua entri dan membersihkan duplikat secara manual. Faktanya, saya juga menggunakan pemrosesan “Struktur Laporan” untuk memahami apa yang saya hadapi. Ternyata tabel _AccumRgTn19455 menyimpan register akumulasi “Output produk (akuntansi pajak)”. Saya juga mengutak-atik query sql, mengidentifikasi 15 dokumen yang tidak unik, dan setelah semua tindakan selesai, saya memeriksa di 1C bahwa dokumen-dokumen ini diproses secara normal, tanpa kesalahan. Tentu saja, Anda tidak boleh membersihkan meja secara sembarangan: penting untuk memahami apa yang dibersihkan dan bagaimana hasilnya.
5) Meluncurkan permintaan untuk membuat indeks, yang disimpan dalam file.
6) Mengalihkan database ke mode pengguna tunggal dan meluncurkan dbcc checkdb - kali ini tidak ada kesalahan yang terjadi.
7) Mengalihkan basis kembali ke mode pengguna tunggal.
Itu saja... masalahnya teratasi. Nah, di 1C saya meluncurkan "Pengujian dan Koreksi", semuanya berjalan baik di sana, saya berhenti mengeluh tentang indeks yang tidak unik.

3. Jika ketidakunikkannya terletak pada tanggal yang nilainya nol, maka masalahnya diselesaikan dengan membuat database dengan parameter offset sama dengan 2000.

1. Jika masalahnya adalah memuat database, maka:
1.1. Jika Anda memuat (menggunakan file dt) ke database MS SQL Server, maka saat membuat database, sebelum memuat, tentukan tanggal offset - 2000.
Jika database sudah dibuat dengan offset 0, maka buatlah database baru dengan offset 2000.

1.2. Jika memungkinkan untuk bekerja dengan database dalam versi file, maka lakukan Pengujian dan Koreksi, serta Konfigurasi - Memeriksa konfigurasi - Memeriksa integritas logis konfigurasi + Mencari tautan yang salah.

1.3. Jika tidak ada versi file, coba muat dari DT ke versi client-server dengan DB2 (yang tidak terlalu menuntut keunikan), lalu lakukan Pengujian dan Koreksi, serta Konfigurasi - Verifikasi Konfigurasi - Periksa Integritas Logis Konfigurasi + Cari Referensi Tidak Valid.

1.4. Untuk melokalisasi masalahnya, Anda dapat menentukan data objek yang pemuatannya gagal. Untuk melakukan ini, Anda perlu mengaktifkan penelusuran di utilitas Profiler saat boot atau mengaktifkan perekaman di log peristiwa proses DBMSSQL dan EXCP.

2. Jika masalah non-keunikan terjadi saat pengguna sedang bekerja:

2.1. Temukan permintaan yang bermasalah menggunakan metode di paragraf 1.4.

2.1.2. Terkadang terjadi kesalahan saat menjalankan kueri, misalnya:

Kesalahan ini terjadi karena dalam modul register akumulasi "Waktu kerja karyawan organisasi" dalam prosedur "Daftar Perhitungan Ulang", kata layanan "BERBEDA" tidak disertakan dalam permintaan.
Kode 1C v 8.x Yaitu. seharusnya:
Permintaan = Permintaan Baru(
"PILIH BERBAGAI
| Dasar.Individu,
. . . . .
Pada rilis terbaru ZUP dan UPP error tidak terjadi karena tertulis "BERBEDA".

2.2. Setelah menemukan indeks bermasalah dari paragraf sebelumnya, Anda perlu menemukan catatan yang tidak unik.
2.2.1. Skrip "Fish" untuk mengidentifikasi catatan non-unik menggunakan SQL:
Kode SQL S_elect COUNT(*) Penghitung,<перечисление всех полей соответствующего индекса>dari<имя таблицы>
KELOMPOK OLEH<перечисление всех полей соответствующего индекса>
MEMILIKI Penghitung > 1

2.2.2 Contoh. Indeks dalam kesalahan disebut "_Document140_VT1385_IntKeyIndNG".
Daftar bidang tabel:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393_ R RRef, _Fld1394,_Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261 _RTRef, _Fld22261_RRRef
Sebelum melakukan prosedur di bawah ini, harap buat cadangan database Anda.
Jalankan di MS SQL Server Query Analyzer:
Kode SQL S_pilih hitungan(*), _Document140_IDRRef, _KeyField
dari om _Dokumen140_VT1385
kelompokkan berdasarkan _Document140_IDRRef, _KeyField
memiliki hitungan(*) > 1
Gunakan untuk mengetahui nilai kolom _Document140_IDRRef, _KeyField, catatan duplikat (id, kunci).

Menggunakan permintaan:
Kode SQL S_pilih *
dari om _Dokumen140_VT1385
dimana _Document140_IDRRef = id1 dan _KeyField = key1 atau _Document140_IDRRef = id2 dan _KeyField = key2 atau ...
lihat nilai kolom lain dari entri duplikat.
Jika kedua entri memiliki nilai yang berarti dan nilainya berbeda, maka ubah nilai _KeyField menjadi unik. Untuk melakukan ini, tentukan nilai maksimum yang ditempati _KeyField (keymax):
Kode SQL S_pilih maks(_KeyField)
dari om _Dokumen140_VT1385
dimana _Document140_IDRRef = id1
Ganti nilai _KeyField di salah satu entri duplikat dengan yang benar:
Pembaruan kode SQL memakan _Document140_VT1385
atur _KeyField = keymax + 1

Di sini _LineNo1386 = adalah kondisi tambahan yang memungkinkan Anda memilih salah satu dari dua rekaman berulang.

Jika salah satu (atau keduanya) dari entri duplikat jelas-jelas memiliki arti yang salah, maka entri tersebut harus dihapus:
Hapus kode SQL dari _Document140_VT1385
dimana _Document140_IDRRef = id1 dan _LineNo1386 = lineno1
Jika entri duplikat memiliki nilai yang sama di semua kolom, maka Anda harus meninggalkan salah satunya:
Kode SQL S_pilih berbeda *
ke #tmp1
dari_Dokumen140_VT1385

Hapus dari _Document140_VT1385
dimana _Document140_IDRRef = id1 dan _KeyField = key1

Saya_masukkan ke _Document140_VT1385
S_pilih #tmp1

Tabel D_rop #tmp1

Prosedur yang dijelaskan harus dilakukan untuk setiap pasangan rekaman duplikat.

2.2.3. Contoh kedua:
Kode SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
DARI _Referensi8_
KELOMPOK BERDASARKAN _IDRRef, _Deskripsi
MEMILIKI (JUMLAH(*) > 1)

2.3.4 Contoh penentuan record non-unik menggunakan query 1C:Enterprise:
Kode 1C v 8.x PILIH Direktori.Link
DARI Direktori.Direktori SEBAGAI Direktori
KELOMPOK BERDASARKAN Direktori.Link
MEMILIKI KUANTITAS(*) > 1

Informasi diambil dari situs