Cannot insert duplicate key. Кто виноват и что делать

0. YPermitin 9109 25.02.19 02:40 Сейчас в теме
Ошибка "CANNOT INSERT DUPLICATE KEY" в базах 1С и связанная с ней "магия".

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. lunjio 63 25.02.19 06:28 Сейчас в теме
Не мешало бы ещё вариант, пересоздание индексов добавить, все таки имеет место быть и такое.
YPermitin; +1 Ответить
3. YPermitin 9109 25.02.19 12:07 Сейчас в теме
(1) а можете привести конкретный кейс, когда пересоздание индекса помогло? На моей практике вообще никогда не давпло результат.
5. lunjio 63 25.02.19 13:20 Сейчас в теме
(3) Конечно )) К примеру свертываешь большую базу, удаление приходится делать напрямую, если индексы не пересоздать, ошибки при вставке, описанные вами.
6. YPermitin 9109 25.02.19 13:49 Сейчас в теме
(5) не исключаю, конечно, что это могло бы помочь, но как?

Перестроение индекса не меняет данные и не удаляет дубли строк. Вы упомянули свертку. На самом деле пример с регистром бухгалтерии как-раз родился из-за свертки, а в статье я показал что дело было в аналитике. Перестроение индекса бы не помогло.

Возможно Вы имеете ввиду не перестроение, что-то другое? Файловая или клиент-серверная база?

Может под перестроением понимается запуск утилиты тестировпния и исправления?
7. lunjio 63 25.02.19 14:17 Сейчас в теме
(6) Нет, понимаю пересоздание индексов через скульное обслуживание, либо да, через тестирование исправление, хотя там по-моему реорганизует, т.е фрагментирует а не создает ,верно ?
В общем ситуация следующая, удалил из таблицы все документы, с движениями и т.п, изредка возникает ошибка описанная вами, при попытке перенести в эту базу документ удаленный раннее, т.е индекс не удалился при удалении строки, из разряда фантастики конечно, но имело место.
YPermitin; +1 Ответить
8. YPermitin 9109 25.02.19 15:25 Сейчас в теме
(7) действительно, фантастика.

Хотелось бы взглянуть на базу с ошибкой и воспроизвести. Трудно вериться, хочется эксперементировать.

Если сможете как-то на демоданных сделать, то цены этой базе не будет.
2. vano-ekt 840 25.02.19 11:55 Сейчас в теме
сегодня есть, что плюсануть на ИС)
kuzyara; YPermitin; +2 Ответить
4. YPermitin 9109 25.02.19 12:08 Сейчас в теме
9. acanta 26.02.19 14:22 Сейчас в теме
Документ из прошлого периода, 2014 года, поэтому при изменении платформа не удаляет записи из таблицы итого, а сторнирует их!

По какому принципу платформа отличает прошлый период от текущего?
Например при рассчитанных итогах на 2020 год закрывать периоды с перепроведением документов начиная с 2014 в бухгалтерии - записи будут сторнироваться или удаляться и пересоздаваться заново?
Исходя из этого, насколько часто имеет смысл пересчитывать итоги?
10. YPermitin 9109 26.02.19 15:05 Сейчас в теме
(9) главное следить, чтобы NULL не появлялось в аналитике проводок там, где не следует.

Если есть битая аналитика, то пересчет итогов может быть лишь обезбаливающим и проблемы будут пояляться.

В примере платформа сторнирует записи из-за ошибки в запросе,т.к. не нашла уже существующую запись итогов. Сторно быть не должно.

По поводу старого периода - если есть записи итогов в следующих датах, то период прошлый.
11. nytlenc 10.06.19 05:06 Сейчас в теме
Платформа 1С автоматически создает множество индексов в зависимости от типа метаданного. Подробнее об индексах можно прочитать на ИТС, там есть подробная информация.


Метаданного???? о_О Вы серьёзно?
Кстати вы в курсе, что ваша статья - это прямое нарушение лицензионного соглашения 1С? (п. 64)
Прикрепленные файлы:
12. YPermitin 9109 10.06.19 06:40 Сейчас в теме
(11) что Вы хотите всем этим сказать и какого ответа ожидаете? :)
13. nytlenc 10.06.19 06:54 Сейчас в теме
(12) Юрий, ничего злонамеренного :) Просто. Знаете ли Вы, что это нарушение лицензии (скорее всего знаете) и думаю стоит об этом упомянуть в статье (хотя может и есть, каюсь мог проглядеть).
И второе конечно, что режет глаз, слово "Метаданного", к сожалению такого слова нет, Метаданные всегда пишутся и произносятся во множественном числе, даже если идет речь о какой-то одной сущности конфигурации. То есть правильно будет писать:

Платформа 1С автоматически создает множество индексов в зависимости от типа метаданного метаданных. Подробнее об индексах можно прочитать на ИТС, там есть подробная информация.


Ваша статья довольно обширная и интересная. Но когда встречаешь подобные моменты за которые "цепляется глаз", доверие к источнику слегка падает.
Спасибо :)

Или как вариант так :

Платформа 1С автоматически создает множество индексов в зависимости от типа метаданных объекта конфигурации. Подробнее об индексах можно прочитать на ИТС, там есть подробная информация.
14. YPermitin 9109 10.06.19 07:07 Сейчас в теме
(13) Пусть статья остаенется как есть для истории.

Ваш коммментарий больше похож на троллинг, поэтому просто рекомендую почитать другие подобные статьи.

Удачного вам дня и хорошего настроения! Держитесь там! :)
15. nytlenc 10.06.19 08:48 Сейчас в теме
(14) )))))) Статья отличная бесспорно. Спасибо. И Вам хорошего дня.
16. YPermitin 9109 10.06.19 12:16 Сейчас в теме
17. nytlenc 10.06.19 12:39 Сейчас в теме
(16) Пусть останется как есть для истории. (шучу... кнопки спутал спросонья, прошу прощения) :)
18. YPermitin 9109 10.06.19 15:46 Сейчас в теме
(17) никого не хотел обидеть...

I am sorry!
19. nvv1970 25.02.20 09:18 Сейчас в теме
Отвечая на вопрос "что делать" - я бы для начала собрал статистику.
Моя статистика по неуникальности на "объектах" говорит, что ошибка возникает только на совместимостях до 8.3. При чем это не только справочники, документы, но и служебные таблицы типа Files.
Впервые массово столкнувшись на автоблокировках с такой ошибкой я проанализировал трассу в скуле. Платформа выполняет select по id, а потом или insert или update. Вроде нет проблем. Однако изменение данных в транзакции, а проверка - вне. На лицо логическая ошибка установки блокировок. При отсутствии id две сессии попытаются выполнить insert. Т.е. я думал, что все дело в параллельности. На партнерке поднимал тему.
Однако, наблюдались на старых УПП такие ошибки в совместимости 8.2.13 на упрблокировках, да еще и в однопользовательском режиме. При чем картина была примерно такая: пишем объект в режиме загрузки из xml, получаем ошибку уникальности, а повтор записи проходит без проблем. Ошибка частая. Платформа может быть в т.ч. свежей. Например, на 8.3.15 ошибка все еще присутствует.
А вот при повышении совместимости до 8.3 ошибки не встречал. Трудно сказать что повлияло. Раньше бы я подумал, что rcsi. Однако при однопользовательских ошибках больше похоже на ошибки платформы в старых совместимостях.

А какая у вас статистика появления подобных ошибок, камрады?
20. Cyberhawk 120 03.03.20 17:32 Сейчас в теме
1.Полностью отключаем итоги по регистру (вот некоторая информация на ИТС).
2. Перепроводим / создаем / удаляем нужный документ.
Документ в 99% типовых не проведется, ибо при отключенных итогах запросы, использующие обращение к виртуальным таблицам регистра, выпадут в ошибку исполнения.
YPermitin; +1 Ответить
21. Cyberhawk 120 03.03.20 17:37 Сейчас в теме
Сразу скажу, что в нашем примере дублей строк не было, то есть этот способ нам не подходит. Опыт показывает, что обычно дубли строк в таблице отсутствуют
Так а откуда взяться дублям? Ошибка-то возникает при попытке вставки дублирующейся записи в таблицу СУБД и не завершается. Как тут поможет чистка каких-то дублей и при тут они вообще?
YPermitin; +1 Ответить
22. YPermitin 9109 03.03.20 17:50 Сейчас в теме
(21) Так в статье же есть информация по обоим вопросам.
23. Cyberhawk 120 03.03.20 18:00 Сейчас в теме
(22) В статье ты позиционируешь вариант №2 как, мол, "Удали дубли из БД".
Этим дублям в БД неоткуда взяться, если не отключать неуникальность индекса в СУБД. Т.е. на момент ошибки (на момент попытки вставки дубля) никаких дублей в СУБД быть не может. Поэтому этот "вариант №2" никак не помогает решить проблему.
Этот "вариант №2" может быть применим только если до этого воспользовались вариантом №3 (сами отключили уникальность и тем самым допустили вставку дубля), поэтому позиционировать "вариант №2" как независимый способ лечения некорректно.
24. YPermitin 9109 03.03.20 18:13 Сейчас в теме
(23) мне кажется, что есть какое-то недопонимание.
25. YPermitin 9109 03.03.20 18:18 Сейчас в теме
(23) я бы описал все что в статье другими словами, но сейчас просто сил нет :)

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

Почти всегда причиной были кривые данные. Даже есть общая версия отчета для проверки регистра, чтобы такие ситуации избегать. Недавно публиковал.

Ну и да, с индексом уникальным конечно не может быть записей дублей.

Извините, если отвечаю не о том) вторник как понедельник:)))
26. Cyberhawk 120 03.03.20 18:32 Сейчас в теме
(25)
Про удаление дублей имеется ввиду исключить записи, которые появляются при вставке данных платформой
Вроде в описании варианта №2 довольно четко предлагается (скриптом-запросом к СУБД) найти и достать записи-дубли из БД. И далее по тексту моего предыдущего комментария.
27. YPermitin 9109 03.03.20 18:39 Сейчас в теме
(26) из своей практики SQL-скриптом я не удалял дубли как таковые, а скорее находил потенциальные проблемы. В варианте 2 явно сделан запрос для поиска дублей, но смысла в нем на практике мало. Нужно отталкиваться от ошибки. Например, известно, что ошибка на такой-то записи, т.к. в тексте ошибки обычно пишется из-за каких значений произошел дубль.

Далее с помощью подобных запросов, лишь добавив фильтр или опустив некоторые измерения (например, значения субконто) найти повторяющиеся записи. Тут очень индивидуально. А дальше уже разбираться, что с ними делать.

Был случай, когда таким способом нашел в таблице итогов 3 записи за разные периоды (месяцы), которые мешали записать проводку в текущем периоде. Я посчитал сколько таких записей за все время (сгруппировал без учета периода). Т.к. изменять документ в прошлом периоде было нельзя (бизнес не согласовал изменение данных и пересчет итогов, т.к. это могло повлиять на отчетность), пришлось "скальпелем" при помощи SQL-запросов исправить некоторые данные в таблице итогов.

Но это экстрим конечно. Нужно четко понимать, что и для чего.
В статье я поэтому написал: "Готовых скриптов тут не будет, т.к. каждый случай требует своего подхода.".

Как-то так. Никого не хотел запутать. А у вас тоже какая-то ошибка возникла с дублями?
28. Cyberhawk 120 03.03.20 18:42 Сейчас в теме
(27) Не особо понял, как описание варианта №4 и практики его применения относится к моему исходному комментарию, относящемуся - напомню - к варианту №2.
29. YPermitin 9109 03.03.20 18:43 Сейчас в теме
(28) 2 вариант для поиска причин проблем. 4 для исправления.
31. Cyberhawk 120 03.03.20 18:46 Сейчас в теме
(29)
2 вариант для поиска причин проблем
Как поиск дублей записей может помогать выйти на причину, если в БД никаких дублей быть не может? Идем на второй круг.
32. YPermitin 9109 03.03.20 18:47 Сейчас в теме
(31) :D это уже смешно.

Вернитесь к материалу позже.
30. YPermitin 9109 03.03.20 18:44 Сейчас в теме
(28) Откланяюсь :) Пора и другими делами заниматься :)
Оставьте свое сообщение
Вопросы с вознаграждением