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

18.08.15

База данных - Инструменты администратора БД

При работе в 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. 

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

 

Итог:

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

Вступайте в нашу телеграмм-группу Инфостарт

Violation of PRIMARY KEY constraint Cannot insert duplicate key in object

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

24900 руб.

20.08.2024    69853    364    170    

316

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

17000 руб.

10.11.2023    25575    93    46    

102

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 1С 8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 17.04.2026, версия 1.4.1, работает в 1С:ФРЕШ!

24400 руб.

06.12.2023    23059    80    10    

113

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14640 руб.

29.04.2020    50359    137    162    

92

Разработка Инструменты администратора БД Администрирование веб-серверов Администрирование Программист 1C:ERP Платные (руб)

Это специализированное решение для глубокого анализа и мониторинга серверов и баз данных 1С. Продукт позволяет выявлять причины замедлений, блокировок и ошибок, объединяя данные технологического журнала, СУБД и оборудования в единой интерактивной системе.

90000 руб.

13.05.2026    533    1    0    

2

Информационная безопасность Инструменты администратора БД Инструментарий разработчика Учет документов Системный администратор Программист Бизнес-аналитик Бухгалтер Пользователь Руководитель проекта 1С 8.3 1С 8.5 Розничная и сетевая торговля (FMCG) Платные (руб)

Контроль ввода данных в 1С: проверка заполнения реквизитов, обязательные поля, контроль перед записью и проведением, запрет проведения документа. Позволяет настраивать любые проверки данных в 1С 8.3/8.5 от обязательных полей до сложных условий – без открытия конфигуратора и написания кода. Готовое расширение, которое подключается и работает сразу.

6000 руб.

15.04.2026    1998    6    0    

20

Файловый обмен (TXT, XML, DBF), FTP Поиск данных Инструменты администратора БД Корректировка данных Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Данная обработка позволит Вам легко и просто, а главное - быстро, выполнить сравнение данных между ЛЮБЫМИ базами (и РИБ, по правилам конвертаций) по контрольным суммам выбранных объектов баз 1С, работающих на платформах 8.3 и выше. Удобный и понятный интерфейс в виде "мастера". Высокая скорость сравнения достигается за счет специального алгоритма расчета контрольной суммы объекта/записи и сравнения по данным суммам объектов 2х баз через файл. Имеется возможность выбора реквизитов, по которым система будет сравнивать объекты. Сравнение количества записей в движениях документов, возможность сравнивать данные по правилам конвертации и не только! Выбор объектов конфигурации для КАЖДОГО узла в отдельности с индивидуальным отбором для каждого объекта конфигурации, работа с FTP, сохранение или загрузка настроек, сохранение или загрузка результата сравнения, регистрация на обмен объекта и его движений. (Обновление от 12.11.2024, версия 2.2-2.5)

24400 руб.

27.10.2017    46207    32    13    

50
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. CheBurator 3234 19.08.15 01:17 Сейчас в теме
Не описано действительно нужное - 1. причина почему такая ошибка появилась 2. как избежать появления такой ошибки.
alyaev.a.v; +1 Ответить
3. Xershi 1553 19.08.15 09:30 Сейчас в теме
(1) CheBurator, моя причина описана в предыстории. Ваша может быть совсем другой!
(2) alyaev.a.v, я привел 2 варианта! Можете предложить третий? Не забываем читать ИТОГ!
4. alyaev.a.v 19.08.15 09:34 Сейчас в теме
(3) Ок, знали док это хорошо, сейчас есть уверенность что таких кривых доков больше нет?
5. Xershi 1553 19.08.15 09:34 Сейчас в теме
(4) alyaev.a.v, конечно! Код отлажен, ТиИ сделано!
6. alyaev.a.v 19.08.15 09:38 Сейчас в теме
(5) Если ТИИ сделано, тогда вообще не пойму зачем вариант 2 ???
Вариант 2 никакого отношения к проблеме не имеет получается, описание как найти по структуре базы таблицу в скуле и удалить запись.
7. Xershi 1553 19.08.15 09:42 Сейчас в теме
(6) alyaev.a.v, потому что у меня 2 копии базы. На одной запустил ТиИ. На второй сделал удаление.
А на рабочей базе повторил второй вариант. Согласись запустить ТиИ на рабочей базе на 24 часа не вариант!
9. alyaev.a.v 19.08.15 09:57 Сейчас в теме
(7) Не соглашусь.
Как временный вариант, чтобы дотянуть до выходных и сделать ТИИ подходит.
Но оставить так базу...Я бы сделал ТИИ и не парился бы.

Ну как говорится это решает специалист, повторюсь если есть уверенность что больше нет косяков, то почему и нет.
10. CheBurator 3234 19.08.15 14:34 Сейчас в теме
(3) "Данная ошибка в моем случае связана с тем, что в SQL есть движение документа, но документ не проведен"
- это не ошибка. Это следствие ошибки. Штатными вариантами действий добиться такой ситуации - навскидку не представляю.
8. shmellevich 136 19.08.15 09:51 Сейчас в теме
(1)
1. причина - нагрузка на SQL базу при большом количестве пользователей, особенно когда они работают с одним видом документов, и главная причина платформа 1С 7.7 и архитектура хранения документов в базе данных.

2. как избежать появления такой ошибки. - по своему опыту скажу подобные ошибки возникают настолько редко, что их даже воспроизвести не получится, у меня из 13 баз идентичных такие ошибки встречались за 3 года всего 2 или 3 раза, при этом размеры баз 10-ки ГБ.

Автору спасибо за инструкцию, для тех у кого это может проявиться.
11. CheBurator 3234 19.08.15 14:36 Сейчас в теме
(8) спсб за поснения. Но причина - так и осталась невыясненной... ;-)
12. Xershi 1553 19.08.15 14:48 Сейчас в теме
(11) CheBurator, еще раз повторяю как получить такую ошибку: в моем случае в документе была ошибка и документ не проводился. Я решил пройти отладчиком, шел через ф8. До конца кода не дошел и нажал ф5. Документ провелся без ошибки! Но не должен был проводиться, а выйти в ошибку. Но он провелся, конечно не корректно. И после отмены проведения и повторного проведения возникает ошибка. Я думаю это баг платформы.
13. CheBurator 3234 19.08.15 16:04 Сейчас в теме
(12) фигня какая-то...
> Документ провелся без ошибки! Но не должен был проводиться, а выйти в ошибку. Но он провелся, конечно не корректно.
- тем не менее провелся. штатно. с записью движений в регистр. ПРОБЛЕМ НЕ ВИЖУ.

> И после отмены проведения и повторного проведения возникает ошибка.
- отмену проведения штатно делали? повторное проведение выполнилось нормально (провелось с записью движений)? или не провелось с выдачей штатного сообщения? Дополнительным кодом с использованием транзакций - игрались?
.
Такая ошибка воспроизводится устойчиво? если да - просьба записать коротенькое видео.
14. Xershi 1553 19.08.15 16:16 Сейчас в теме
(13) CheBurator, вы статью прочитайте!!!
И код уже исправлен, поэтому записывать даже нечего.
17. CheBurator 3234 19.08.15 16:51 Сейчас в теме
(14) а что такого ХИТРОГО было в коде, что приводило к появлению ошибки?
то что документ провелся (хотя по вашему замыслу не должен был проводиться) - это штатное поведение.
то что документ отменили проведение - это штатная возможность
то что потом документ повторно провели (успешно или неуспешно) - это штатная возможность.
здесь ничего косячить не должно.

а вот то, что поправили код и внезапно у непроведенного документа не стало движений как и должно быть (а раньше были) - вот это и напрягает...
может вы там хитро с транзакциями баловались.. или прямые запросы юзаете...
18. Xershi 1553 19.08.15 17:20 Сейчас в теме
(17) CheBurator, вот именно
то что потом документ повторно провели (успешно или неуспешно) - это штатная возможность.
Он выпал в ошибку. Решение указал выше.
Прочтите (16).
Без удаления записи в скуле документ при проведении вывалился с ошибкой на скуле.
С удалением записи в скуле документ при проведении вылетает на ошибке кода в 1с.
После удаления и правки кода документ провелся нормально.
20. CheBurator 3234 19.08.15 19:40 Сейчас в теме
(18) он выпал в ошибку (скуль отрапортовал и это вообщем неинтересно) потому что до этого была ошибочная ситуация: документ не проведен, но движения присутствуют - а вот это интересно как именно этого добились.... и какой именно код (исходный, приводящий устойчиво к скульной ошибке ) поменяли, что теперь цепочка операций "проведение-распроведение-повторное проведение" отрабатывает нормально как и должно?

ответа на вопросы чуть выше вообщем так и не было: - игрались с транзакциями при проведении/распроведении доков? прямые запросы использовали в проведении/распроведении? использовали отмену проведения путем модификации прямыми запросами признака проведения документа? до возникновения ошибочной ситуации - про которую написал скуль - модифицировали что либо в таблицах регистров прямыми запросами или непосредственно в самом скуле?
21. Xershi 1553 20.08.15 08:47 Сейчас в теме
(20) CheBurator, если бы вы прочли все внимательно, то вопрос бы не возник. По коду как я понял: делалась проводка, но в счете дебета использовался старый план счетов(до 2012,а сейчас используем новый), из-за этого он не подставлялся в проводку. В этом была ошибка кода, после правки счет берется из нового плана счетов. Когда удалил запись, то и проблемы не стало!
15. MadDAD 139 19.08.15 16:21 Сейчас в теме
(12) может в табло в отладчике было что-то хитрое?

Вообще вот нашел методику - http://www.klerk.ru/print/1996 по аналогии можно и с регистрами.
16. Xershi 1553 19.08.15 16:30 Сейчас в теме
(15) MadDAD, ничего хитрого не было, вы же уже читали первоисточник http://forum.infostart.ru/forum9/topic136472/. Ссылка ваша хорошая, только сложно это переварить, если не работать со скулем.
24. _Z1 38 21.08.15 11:30 Сейчас в теме
(8) Это не причина.
sql держит любую нагрузку.
Как бы принцип транзакции или все сделано или все откатили.

Поддержу Cheburator прав на все 100%
2. alyaev.a.v 19.08.15 09:26 Сейчас в теме
Даже если сбойный док 1, то вариант так себе. Потом бух найдет еще один, потом еще и понеслась...
ТИИ избавляет сразу от ВСЕХ таких кривых доков/записей.
Да и не безопасно все это.
19. vasyak319 156 19.08.15 17:49 Сейчас в теме
Вы удаляете движение из таблицы регистра. А что у вас при этом с итогами?
22. CheBurator 3234 20.08.15 18:05 Сейчас в теме
А при чем здесь ПРОВОДКИ и наличие движений ПО РЕГИСТРУ у непроведенного документа...?
23. Xershi 1553 21.08.15 08:53 Сейчас в теме
(22) CheBurator, для этого написана статья.
Для отправки сообщения требуется регистрация/авторизация