Ошибка "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.
Все, теперь ошибка при проведении возникать перестанет!
Итог:
Важно! Я четко знал, какой документ был сбойный. У меня была копия базы для экспериментов! Повторять только на копии!

