Каталог решений - Ошибка "Violation of PRIMARY KEY constraint … Cannot insert duplicate key in object"

Ошибка "Violation of PRIMARY KEY constraint … Cannot insert duplicate key in object"

Ошибка "Violation of PRIMARY KEY constraint … Cannot insert duplicate key in object"

В наличии

При работе в 1С на SQL может появиться ошибка "Violation of PRIMARY KEY constraint … Cannot insert duplicate key in object".
Сегодня попытаемся понять, почему она возникла и как ее устранить!

Категория:

Описание

Предыстория:

Никого не удивлю, типичный случай. Приходит бухгалтер и сообщает, что хотела провести документ в 1С 7.7, но он выпадает в ошибку.

Начал разбираться, прошелся отладчиком в копии по коду. Причину сразу не нашел, до конца кода отладку не провел и решил нажать F5, чтобы продолжить работу в базе. Документ провелся. Но я решил отменить проведение и повторно провести его. И вот тут вылетела ошибка «Violation of PRIMARY KEY constraint ‘PK_RA17286’. Cannot insert duplicate key in object ‘RA17286’.» Естественно, это только частный случай, как эта ошибка может возникнуть, но ее решение подойдет для каждого!

 

Решение:

Данная ошибка в моем случае связана с тем, что в SQL есть движение документа, но документ не проведен. В момент его проведения должна создаться запись в регистре, но она уже есть!

Я нашел два решения:

1. Простой, но долгий.

2. Сложный, но быстрый. 

Решение 1.

Зайти в конфигуратор и нажать ТиИ (Тестирование и исправление ИБ). В моем случае база весит ~ 16 гигабайт. ТиИ работало на тестовом сервере ~ 24 часа. Думаю, время решение такой ошибки не устроит вас! Но если у вас есть время или нет в штате опытного программиста, то можете выбрать этот вариант решения вопроса!

Решение 2.

У нас 1С 7.7 стоит на MS SQL Server 2000. Копия базы также развернута на SQL. 

Итак, что нам понадобится:

1. Файл «1Cv7.DDS», который лежит в каталоге базы 1с 7.7.

2. Имя документа из конфигуратора.

3. Доступ в SQL.

Откроем файл «1Cv7.DDS» (я использую просмотр по F3 в тоталкомандере). Найдем строку с именем документа. Вы увидите таблицу и в колонке «Name» или «SQLTableNam» будет написано название таблицы в SQL (в моем случае это было «DH17245»). Заходим в «Enterprise Manager» нашего SQL. Находим нашу базу и ищем в ней таблицу с нужным названием (я искал «DH17245»). Когда нашли таблицу с таким именем, то кликаем по таблице ПКМ «Открыть таблицу» (Open table) -> «Вернуть все строки» (Return all rows). Там ищем запись по вашему документу. Мне удалось его легко найти, документ был один в нужном периоде. Нашли запись и запомнили его IDDOC (у меня было «KLMN»). Теперь ищем таблицу, которая вывалилась в ошибке (у меня «RA17286»). Аналогично открываем таблицу с ошибкой (моя таблица «RA17286») и находим запись на нужный документ (мой документ «KLMN»). Удалим запись ПКМ по строке нажать Delete -> Yes. 

Все, теперь ошибка при проведении возникать перестанет!

 

Итог:

Важно! Я четко знал, какой документ был сбойный. У меня была копия базы для экспериментов! Повторять только на копии!

has been added to your cart:
Оформление заказа