Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 2231 - ошибка duplicate key constraint "parent__1scrdoc"   Make a simular bug
Summary: ошибка duplicate key constraint "parent__1scrdoc"
Status: CLOSED FIXED
Alias: None
Product: SELTA@Etersoft
Classification: Продукты (Products)
Component: Общее (show other bugs)
Version: 1.0.3
Hardware: PC Windows
: P4 critical
Target Milestone: ---
Assignee: Станислав Коробейников
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 2054
  Show dependency treegraph
 
In work:
Reported: 2008-08-08 10:09 MSD by Шубин Виталий
Modified: 2014-09-11 18:44 MSK (History)
3 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments
скрин ошибки (203.46 KB, image/jpeg)
2010-11-18 03:58 MSK, Михаил Карпухин
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Шубин Виталий 2008-08-08 10:09:13 MSD
Платформа: Windows XP, 1C 7.7 (27 релиз) компонента опер. учет, SELTA@ETERSOFT 1.03
Конфигурация на базе типовой: Торговля+склад

Проблема 1 (Критическая):
1. Открываем любой журнал (например складские документы)
2. Выбираем непроведенный документ (причем тот, который заведомо не проведется)
3. Пытаемся провести
4. 1С выдает сообщение о том, что документ не проводится (при этом список документов в форме журнала очищается)
5. Журнал оставляем как есть (пустой список)
6. создаем любой документ (например, чек ККМ), записываем его
7. Заходим в журнал документов (в нашем случае журнал чеков) и пытаемся:
  а. Изменить время документа (ошибка duplicate key constraint "parent__1scrdoc")
  б. Провести (ошибка duplicate key constraint "parent__1scrdoc")
8. С ошибкой помогает справится пересчет служебных данных

Проблема 2 (Неприятная):
1. Выбираем непроведенный документ (причем тот, который заведомо не проведется)
2. 1С выводит сообщение об ошибке (игнорируем его) + опять получаем пустой журнал
3. Пытаемся снова провести этот же документ
4. Вылазит ошибка (current transaction is aborted, commands ignored until end of transaction block...)
Comment 1 Калюхович Юрий 2008-08-08 14:15:53 MSD
удалось воспроизвести следующее:

журнал документов Складские документы ->
перемещение ТМЦ(в розницу) (не проведен)
провести ->
--error:
SQL State 25P02
Native 7
Message ERROR current trans.is aborted...
Error while executing the query
--
--error:
Невосстановимая ошибка бд!
--
->вылет 1С

либо если сделать документ непроведенным, а затем попытаться провести - результат тот же, с вылетом 1С

в трассировке - 

1cv7s           8-9	EXIT  SQLExecDirect  with return code -1 (SQL_ERROR)
		HSTMT               022D15A8
		UCHAR *             0x01EC9D40 [      -3] "Select * from _1SJOURN(NOLOCK) where ROW_ID=?\ 0"
		SDWORD                    -3

		DIAG [25P02] ERROR: current transaction is aborted, commands ignored until end of transaction block;
Error while executing the query (7) 

в логах сельты:
in_sql:
Select * from _1SJOURN(NOLOCK) where ROW_ID=?
out_sql:
SELECT * FROM _1SJOURN WHERE ROW_ID=?
Comment 2 Шубин Виталий 2008-08-08 16:38:36 MSD
А если:
документ открыть из журнала (журнал содержит перечень документов, количество строк больше 0);
добится ошибки при проведении документа (журнал не закрывается).

После этого журнал документов будет содержать 0 строк...
Если у вас эта ситуация не повторяется, то у нас она наблюдается на нескольких базах (из 35 переведенных - остальные просто еще не проверяли, но я думаю, проблема та же).

Возможно проблема в этом...
Я в понедельник Вам пришлю лог самой селты, только у нас разница -7 часов (соответственно рабочий день уже почти закончится)
Comment 3 Калюхович Юрий 2008-08-11 11:15:47 MSD
(In reply to comment #2)
> А если:
> документ открыть из журнала (журнал
> содержит перечень документов, количество
> строк больше 0);
> добится ошибки при проведении документа
> (журнал не закрывается).
> 
> После этого журнал документов будет
> содержать 0 строк...

воспроизвести не удалось (selta v1.0.3) - не удалось добиться ошибки проведения с очищением списка документов в журнале. с selta v1.0.4 ошибка(описана в комментарии #1) возникает при перепроведении (с вылетом 1С); если же 1С открыть повторно - новый документ существует и отмечен проведенным
Comment 4 Калюхович Юрий 2008-08-12 17:41:40 MSD
частично удалось воспроизвести, selta v1.0.4, 1с+ТИС (стандартная),
журнал "складские документы"->открыть непроведенный док.(который и не проведется)->попыт.провести->ошибка->
a) если, не закрывая, этот же документ записать->журнал очищается;
б) если, не закрывая, попытаться повторно провести документ - 1с вылетает

ошибку при изменении времени воспроизвести не удалось;

если создать чек, потом создать чек на возврат, провести чек, затем попытаться провести чек на возврат - не проводится, 1с выдает ошибку с уникальностью ( "parent__1scrdoc" ) и вылетает
Comment 5 Калюхович Юрий 2008-08-18 16:35:27 MSD
ошибки вылета 1С, очищения журнала и изменения времени воспроизвел, получил логи трассировки,
выложил на ftp://tmp/goga/dup_logs/
Comment 6 Калюхович Юрий 2008-08-20 16:59:40 MSD
(In reply to comment #5)
> ошибки вылета 1С, очищения журнала и
> изменения времени воспроизвел, получил
> логи трассировки,
> выложил на ftp://tmp/goga/dup_logs/
> 

скорее всего, проблема с динамическими курсорами. в comm логе часто есть типа "cursor is open" либо "курсор не существует"
Comment 7 Станислав Коробейников 2008-10-16 17:22:29 MSD
То, что написано в комментарии #4:
a) если, не закрывая, этот же документ
записать->журнал очищается;
б) если, не закрывая, попытаться повторно
провести документ - 1с вылетает

все это происходит из за отката транзакций. (SQL_ROLLBACK) и а) и б) Курсоры закрываются, но ни ODBC драйвер  (ни похоже( не уверен) 1с)  об этом не знают. 

по б) Могу сделать так, что бы не закрывалась, путём создания курсора при отмене транзакции. Но все равно происходит то, что написано в (а). Если все-таки вывести ещё раз - вылетает
Comment 8 Станислав Коробейников 2008-10-20 17:40:32 MSD
С последнего раза произошли изменения. 
Теперь, я могу другими способами сделать некоторые улучшения:
схема работы 1с выяснилос такая. 
1. Создали Handle подключения 
2. Создали Handle операции
3. В этой операции выподняет "SELECT ..."
4. делает ROLLBACK подключения при этом все остается нормально. 
5. делает ROLLBACK подключения.
6. Закрывает при этом операцию. Закрывается курсор.    

Я сделал так. после ROLLBACK, но отменил закрытие курсора (SQLFreeStmt). При этом в отличии от прошлого раза все продолжает работать. Ошибок не возникает. Но курсор без нового создания все равно не работает. Из за этого обидно пропадают с экрана записи. Но при дальнейшей работе с ними, курсор нормально обновится. 
Надо бы самому его обновить. Но пока не понял когда и в каком месте.  
Comment 9 Станислав Коробейников 2008-10-20 17:47:46 MSD
С последнего раза произошли изменения. 
Теперь, я могу другими способами сделать некоторые улучшения:
схема работы 1с выяснилос такая. 
1. Создали Handle подключения 
2. Создали Handle операции
3. В этой операции выподняет "SELECT ..."
4. делает ROLLBACK подключения при этом все остается нормально. 
5. делает ROLLBACK подключения.
6. Закрывает при этом операцию. Закрывается курсор.    

Я сделал так. после ROLLBACK, но отменил закрытие курсора (SQLFreeStmt). При этом в отличии от прошлого раза все продолжает работать. Ошибок не возникает. Но курсор без нового создания все равно не работает. Из за этого обидно пропадают с экрана записи. Но при дальнейшей работе с ними, курсор нормально обновится. 
Надо бы самому его обновить. Но пока не понял когда и в каком месте.  
Comment 10 Станислав Коробейников 2008-10-21 12:54:30 MSD
Сделал что бы все работало. В принципе лекарство универсальное. Но может для других баг понадобятся корректировки. 
Что сделал:
1. Отловил все курсоры окрытые во время ROLLBACK'а его подключения. Изменил тип этих курсоров с SQL_CURSOR_DYNAMIC на 8(их всего 2).
2. В SQLFetchScroll отловил курсор с типом 8. Создал его, заменил тип обратно на SQL_CURSOR_DYNAMIC.

Все заработало.
Comment 11 Шильников Андрей 2008-10-27 17:38:19 MSK
>7. Заходим в журнал документов (в нашем
>случае журнал чеков) и пытаемся:
>  а. Изменить время документа (ошибка duplicate
>key constraint "parent__1scrdoc")

Снова появилась ошибка, но после нескольких изменений, а не сразу.
Comment 12 Станислав Коробейников 2008-10-28 17:44:27 MSK
Проблема в том, что курсоры даже при окончании транзакции, уничтожаются не всегда.
В мануале к посгресу:

WITH HOLD specifies that the cursor can continue to be used after the transaction that created it successfully commits. 

При COMMIT они не должны уничтожаться, и не уничтожаются. А при ROLLBACK. Я из этого не понял. 

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

Но пока могу порадовать, я при ROLLBACK'е уничтожаю все курсоры. И пока все работает. Надо завтра повнимательней потестировать. 
Comment 13 Станислав Коробейников 2008-10-29 17:37:00 MSK
Всего имеется две ошибки. Обе проявляются при изменении времени непроведенного документа

1. 
duplicate key violates unique constraint "parent__1scrdoc"

parent__1scrdoc индекс таблицы _1scrdoc. Составной. Интересующие нас поле: CHILD_DATE_TIME_IDDOC

изменим время документа 9Z. 
В таблице видим поле:
"200810247JT8IO    9Z   "
Которое сотоит из '20081024' -- дата загадочного 7JT8IO - я так понимаю -- это время. и '    9Z   ' -- это id документа.   

Что делается:
mssql
Update _1SCRDOC set CHILD_DATE_TIME_IDDOC=SUBSTRING(CHILD_DATE_TIME_IDDOC,1,8)+'885V5S'+SUBSTRING(CHILD_DATE_TIME_IDDOC,15,9) where CHILDID=?
pgsql
UPDATE _1SCRDOC SET CHILD_DATE_TIME_IDDOC = SUBSTR (CHILD_DATE_TIME_IDDOC, 1, 8)+'8FUKKW'||SUBSTR (CHILD_DATE_TIME_IDDOC, 15, 9) WHERE CHILDID = E'    9Z   '

И ожидаем получить 
'200810248FUKKW    9Z   ' 20 символов.  
Но получаем:
"20081024               8FUKKW    9Z                 "(53 символа)
А тип поля mchar(19)
и остается там:
20081024
так, что остается. А там уже такое есть. 

Дело в том, что SUBSTR, когда входной параметр поле добавляет пробелы. 

2. Вторая проблема с курсорами, что они не всегда закрываются, при ROLLBACK.

1. Делаю вместо SUBSTR  --  CAST(SUBSTR  
2. Принудительно стал закрывать курсоры

Но решив только вторую проблему, я перестал сталкиваться с первой, но только в новых базах. А в старых сталкиваюсь. Но не знаю почему. 
Надо протестировать на только что созданных базах. 
Только первое обновление. А потом первое и второе. Может хватит и одного!?

1. /var/ftp/tmp/stas/Test1
1+2 1. /var/ftp/tmp/stas/Test2
Comment 14 Шильников Андрей 2008-10-30 15:58:15 MSK
С обновлением 1 конфигурации ТиС и Бух работают нормально.
С обновлением 1+2 работает только ТиС.
Comment 15 Шильников Андрей 2008-11-01 14:02:17 MSK
Оставляем первый вариант, он идет в сборку.
Comment 16 Станислав Коробейников 2008-11-19 17:50:31 MSK
Добавил второе исправление (с изменениями substr), только другой вариант. Теперь должно все работать нормально. 
Лежит в current
Comment 17 Михаил Карпухин 2009-01-12 16:17:29 MSK
Created attachment 1016 [details]
скрин ошибки

postgre 8.3.5 selta 1.0.5 только скачал, вылетает с той же ошибкой... Скрин прилагаю...
Comment 18 Vitaly Lipatov 2014-09-11 18:44:31 MSK
Для тех, кто не пользуется багзиллой или не умеет пользоваться групповым редактированием при поиске, закрываем задачи, которые они должны были принять.