Имя: Пароль:
1C
1C 7.7
v7: Ошибка CREATE UNIQUE INDEX terminated because a duplicate key was found for inde
0 Tester
 
16.09.14
13:06
При обновлении конфигурации 1С 7.7 поломалась база.
Ошибка: CREATE UNIQUE INDEX terminated because a duplicate key was found for index ID %X%. Most significant primary key is ' %YYYY% '.
При входе в Конфигуратор или в режим Предприятие выдавало ошибку и прога закрывалась.
Проштудировал пару веток, в т.ч. 1C 7.7 SQL испорчена базы при установке обновления.
В итоге свел решение проблемы в один скриптик-мануал.
Может кому будет полезно.

/* 1. Выборка документов из журнала по ид. документа */
SELECT *
FROM _1sjourn
WHERE IDDoc IN (
/* Выборка записей из таблицы "Ссылки документов",
где значения 3-х полей повторяются (неуникальные записи) */
    SELECT CHILDID
    FROM _1scrdoc
    GROUP BY CHILDID, MDID, PARENTVAL
    HAVING count(*) > 1
)

/* 2. Далее по IDDOCDEF в файле 1Cv7.DDS ищем название документа. */
/* 3. В файле 1Cv7.DDS отключаем уникальность индекса таблицы _1scrdoc */
/* 4. По DOCNO ищем документы в базе и перепроводим их */
/* 5. В файле 1Cv7.DDS обратно включаем уникальность индекса таблицы _1scrdoc и запускаем 1С.
Вуаля. После пересчета все работает */

У меня оказалось 9 косячных документов "Выписка". С причиной возникновения ошибки пока не разобрался.
2 Ёпрст
 
гуру
16.09.14
13:11
всего то надо truncate table _1scrdoc и пересчет служебных данных, если всё дело было только в этой табличке
3 МихаилМ
 
16.09.14
13:15
не проще удалить дубли
4 VladZ
 
16.09.14
13:16
(0) Решение этой проблемы уже было описано. Ищи в Инете.
5 КонецЦикла
 
16.09.14
13:38
Запрос может не выявить косячных данных, бывает необходимость в удалении индексов сначала
6 Tester
 
16.09.14
14:10
Проблему решил. Но все равно непонятно, что было с теми 9 выписками.
(2) (3) В _1scrdoc удалял вручную дубли. Но когда дублей уже не было 1С-ка заново пересчитывала графы отбора и перекрестные ссылки и заново писала в _1scrdoc дублирующие записи, пыталась создать уникальный индекс и опять выдавала ту же ошибку. Здесь только поиск документов, приводящих к неверному автозаполнению _1scrdoc. Ими оказались 9 выписок.
7 Tester
 
16.09.14
14:56
Сейчас парюсь с переводом времени из 36-ричной системы счисления в десятичную и переводом во время :)
8 Ёпрст
 
гуру
16.09.14
14:56
(7) зачем ?
9 Ёпрст
 
гуру
16.09.14
15:01
+8 на вот, готовые примеры..
http://www.1cpp.ru/forum/YaBB.pl?num=1153475454
10 Tester
 
16.09.14
15:55
(9) спс, перевел с помощью конвертера http://vanchester.ru/converter.html , а потом разложил в экселе на часы, минуты и секунды.
В общем все глючные документы имеют время EAEAY8 (в 36-ричной) или 863990000 (в десятичной) или время 23:59:59. Никаких отличий больше не нашел. Непонятно, почему 1С в _1scrdoc лепит дубли.
11 Ёпрст
 
гуру
16.09.14
15:56
(10) это же баян
12 Ёпрст
 
гуру
16.09.14
15:57
разные позиции доков будут в 1sjourn и в остальныз табличках, при времени 235959..где-то "время" продолжается, а где-то нет.. будет косяк в операциях и в проводках еще
13 Tester
 
16.09.14
16:20
(12) Позиции понятно разные при одинаковом времени. Но почему дубли в _1scrdoc?
14 Ёпрст
 
гуру
16.09.14
16:23
да хз, видать найти не может по позиции и лепит еще одну запись
15 Tester
 
08.10.14
17:29
Ребята, продолжение истории.
После перепроведения выписок проблема решилась.
Но через некоторое время опять кажется поменял графу отбора и получил попытку создания уникального индекса по таблице ссылки документов. А там дублирующиеся записи и та же ошибка. Нашел выписки, перепровел их, база работает.
Но все равно не пойму по какой причине у меня много документов с временем 23:59:59.
И прикол 1С-ки в том, что если есть 2 дока
1. Выписка 1 23:59:59
2. Выписка 2 23:59:59
а я хочу переместить Выписку 1 под Выписка 2, чтобы учитывать движения Выписка 2, то изменение времени не перемещает документы в пределах одной секунды.

Вопрос - как установить позицию документу вручную? ПолучитьПозицию(), а установить позицию нету!
16 Дык ё
 
08.10.14
17:41
(15) в пределах секунды не получится - они будут в порядке iddoc

установить позицию: распровести, УстановитьВремя, провести
17 пипец
 
08.10.14
17:44
в скульной видел и 24:05 время ;)) от такое тоже бывает
18 Tester
 
08.10.14
17:45
Сейчас ищу документы с временем > 23:59:59.
Пока таковых нет :)
19 КонецЦикла
 
08.10.14
17:53
(15) В пределах одной секунды можно тучу доков разместить, не тем голова у тебя забита
20 КонецЦикла
 
08.10.14
17:54
Если документ в реальности создан позднее (имеет больший iddoc) - значит только время менять. Если некуда - уменьшать время предыдущих документов.
21 Tester
 
08.10.14
17:57
(20) Тут несколько проблем в одной.
1-я: переместить документ, который в середине 23:59:59 в самый низ.
2-я: разобраться почему стало куча документов в 23:59:59.
3-я: почему строится неверная таблица ссылок документов.
Похоже все 3 проблемы связаны.
22 КонецЦикла
 
08.10.14
18:20
Наличие нескольких документов в одной секунде не приводит к ошибкам
Либо программист виноват либо одно из двух...
23 Tester
 
09.10.14
11:06
ыввы
24 Tester
 
09.10.14
11:07
Млин, что за глюк. Не могу пост оставить.
25 Tester
 
09.10.14
11:09
Короче похоже понял, почему стало много документов в 23:59:59.
Может кому будет интересно, попробую описать.
Есть документ ТоварыВПути с 2-мя табличными частями: 1-я ТЧ обычная, а вторая реализована в виде отдельного документа, данные из ТЧ которого загружаются в ТЗ основного документа. Так вот в 1 прекрасный момент кто-то поставил время любого документа в базе в 23:59:59.
26 Tester
 
09.10.14
11:11
После этого другой чел создал документ ТоварыВПути на рабочую дату и документ записался с текущим временем (интерактивная запись документа по умолчанию с текущим временем), а связанный отдельный документ записался со временем 23:59:59 (программная запись методом Записать() пишет не с текущем временем, а с временем посл. документа + 10 секунд). Потом наштамповали еще несколько документов ТоварыВПути с нормальным временем, но связанные документы получились в 23:59:59. Потом на след. день, меняют дату документа ТоварыВПути (может и криво, но такая логика работы) и записывают документ. Документ записывается текущим временем, а связанный документ тоже меняет дату на дату основного документа, но записывается со старым временем 23:59:59. Усугубляют положение создание документов задним число. Они пишутся все в 23:59:59, т.к. уже есть документы в это же время. Так ситуация повторяется и получается практически каждый день кот-то создает документы задним числом и все они пишутся в 23:59:59.

Выход - при программной записи связанных (имеющих цель хранить 2-ю табличную часть к основному документу) документов ВСЕГДА применять метод УстановитьВремя() и писать документы в начало дня! Я применил УстановитьВремя(0,0,1);

Буду дальше наблюдать уйдет ли проблема с "CREATE UNIQUE INDEX terminated because a duplicate key was found..." при пересчете таблицы Ссылки документов.