Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Создание своих индексов по таблице документов, глюки с IDDOC при записи. (число прочтений - 6779 )
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Создание своих индексов по таблице документов, глюки с IDDOC при записи.
30. Августа 2010 :: 19:39
Печать  
Попытался сделать свои доп. индексы по полям шапки таблицы. Все сделал, протестировал в монопольном режиме - все хорошо работает. Но вот в разделенном режиме при попытке отредактировать уже созданный документ и его записи выдает ошибку con not insert duplicate key и делает ссылку на родной индекс по IDDOC. Если убрать новый доп. индекс и переиндексировать таблицу - то проблема пропадает. Может кто сталкивался с такими глюками 1С-ки при добавлении своих индексов?
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #1 - 31. Августа 2010 :: 05:13
Печать  
Да нет - не сталкивались. Какая версия SQL, покажи как индексы создаешь (код)
  
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #2 - 31. Августа 2010 :: 05:59
Печать  
SQL 2008
(Microsoft SQL Server 2008 (SP1) - 10.0.2723.0 (Intel X86)   Jul 10 2009 01:41:08   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2) )

Индексы создает 1С-ка (посредством файла ddx), скрипт готового индекса:
Код
Выбрать все
CREATE NONCLUSTERED INDEX [IX_1SSH_CONTR] ON [dbo].[DH2337]
(
	[SP2312] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] 



в ddx строка выглядит так:
Код
Выбрать все
X=DH2337 %I=IX_1SSH_CONTR                  |IX_1SSH_CONTR |0     |SP2312                                                      |0           



Проблема вся в том, что когда не в монопольном режиме работать, тогда почему то 1С-ка начинает глючить с ID кодом документа.
  
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #3 - 31. Августа 2010 :: 06:17
Печать  
И глюк скорее всего происходит в момент записи двух документов и возникновении взаимной блокировки таблицы журналов или DH*. При этом гибкие блокировки не используются, используется только метод ROMIX-а по обходу цикла в момент ожидания блокировки (odbc33.dll: http://x-romix.narod.ru/vk_TerminalSleep.rar).
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #4 - 31. Августа 2010 :: 07:32
Печать  
(0) Приведи точный текст сообщения.

PS также профайлером можешь найти оператор insern или
update на чем все валиться.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #5 - 31. Августа 2010 :: 07:33
Печать  
pvase писал(а) 31. Августа 2010 :: 06:17:
И глюк скорее всего происходит в момент записи двух документов и возникновении взаимной блокировки таблицы журналов или DH*. При этом гибкие блокировки не используются, используется только метод ROMIX-а по обходу цикла в момент ожидания блокировки (odbc33.dll: http://x-romix.narod.ru/vk_TerminalSleep.rar).

Если на время отключить vk_TerminalSleep subj возникает или нет.

  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #6 - 31. Августа 2010 :: 08:18
Печать  
Дело в том, что ошибку можно отловить только в рабочей базе. А экспериментировать на рабочей базе во время работы как то не хочется. В тестовой никак не могу создать условий, при которых появиться такой глюк.

А ошибка простая пример во вложении.
  

errorSQL.jpg ( 34 KB | Загрузки )
errorSQL.jpg
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #7 - 31. Августа 2010 :: 08:39
Печать  
Тогда получается что при записи документа DH2337
у тебя идет какая то другая запись в документ dh16707
может как раз у тебя в некоторых случаях
документ dh16707 новый именно тогда для него 1с выделяет
iddoc выделяет неправильно вот и получаешь subj
Не в модуле проведения все это ?

также что в определении индекса означает
IGNORE_DUP_KEY = OFF ( я не работал с sql2008)
может все дело в этом.
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #8 - 31. Августа 2010 :: 14:12
Печать  
Да это я такой пример привел. Вообще индексы были как для таблицы  DH2337 так и для той что в примере.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #9 - 31. Августа 2010 :: 15:47
Печать  
Цитата:
GNORE_DUP_KEY = { ON | OFF }
Определяет реакцию на ошибку, возникшую из-за дублирования значений ключа при вставке нескольких строк в уникальный кластеризованный или уникальный некластеризованный индекс. Значение по умолчанию — OFF.

ON
Выдае��ся предупреждение, а строки с неуникальными ключами не вставляются.

OFF
Выдается сообщение об ошибке и происходит откат всей транзакции INSERT.

Аргумент IGNORE_DUP_KEY применяется только к операциям вставки, выполняемым после создания или перестройки индекса. Во время операций с индексами этот параметр не используется.

взято из http://msdn.microsoft.com/ru-ru/library/ms188783(SQL.90).aspx
т.е. просто получается у тебя
primary key не уникалный на этой таблице.
, а совпадение что все работает в монопольном режиме случайность ( не попадал на те данные). на тех же данных свалишься и в монопольном режиме.

PS (0) похоже у тебя серьезные проблемы с базой.
ищи на этом сайте мою обработку "проверьте ваши регистры"
проверяет не только регистры но и документы и проверяй базу как можно скорее.

  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #10 - 31. Августа 2010 :: 18:43
Печать  
С Базой все нормально, убрал индексы + переиндексация и все заработало. Просто похоже что 1С-ка как то странно ведет себя с индексами, толи она смотрит первый попавшийся, то ли еще какие глюки - отловить сложно из за глюков в рабочей базе, а ждать и отлаживать пока все ждут меня - такого не поймут ни директор ни сотрудники.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #11 - 01. Сентября 2010 :: 10:32
Печать  
pvase писал(а) 31. Августа 2010 :: 18:43:
С Базой все нормально, убрал индексы + переиндексация и все заработало. Просто похоже что 1С-ка как то странно ведет себя с индексами, толи она смотрит первый попавшийся, то ли еще какие глюки - отловить сложно из за глюков в рабочей базе, а ждать и отлаживать пока все ждут меня - такого не поймут ни директор ни сотрудники.


Цитата:
С Базой все нормально

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

Цитата:
убрал индексы + переидексация

- при этом у тебя идет полное перестроение индекса. насколько я знаю при построении(перестроении) индекса не производиться проверка на уникальность.


Цитата:
отловить сложно из за глюков в рабочей базе, а ждать и отлаживать пока все ждут меня - такого не поймут ни директор ни сотрудники.

Делай логирование либо через запись в файл на диск с:\
(если терминал то можно файл назвать используя @@spid) или
пиши логи в ms sql в другую базу чтобы  запись осталась даже при вылете. после того как найдешь где вылетает то можно обсуждать дальше.

насколько я вижу падение возможно в двух случаях
1.Либо  При записи из итерактивной формы существующего документа (у такого документа уже есть iddoc)

2.либо при выполнении команды Док.Записать() ( в этом случае важно документ новый или уже есть в базе).
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #12 - 02. Сентября 2010 :: 14:05
Печать  
приводить неполные скрипты схемы, давать скрины ошибкок от других таблиц, делать скорополительные выводы...
уж будь добр, приведи скрипты схемы таблицы.
  
Наверх
ICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #13 - 09. Сентября 2010 :: 10:38
Печать  
Наконец то выловил баг, но вот как исправить - не знаю.
Вот что делает 1С-ка при записи документа:
Код
Выбрать все
exec sp_executesql N'
	Update DH2337
	set  
		IDDOC=@P1,
		SP17145=@P2,
		SP2311=@P3,
		SP2313=@P4,
		SP2314=@P5,
		SP2315=@P6,
		SP6004=@P7,
		SP2317=@P8,
		SP2318=@P9,
		SP2319=@P10,
		SP2320=@P11,
		SP2321=@P12,
		SP15782=@P13,
		SP15783=@P14,
		SP15784=@P15,
		SP15796=@P16,
		SP15859=@P17,
		SP16323=@P18,
		SP17146=@P19,
		SP18397=@P20,
		SP18910=@P21,
		SP20122=@P22,
		SP20602=@P23,
		SP20807=@P24,
		SP20952=@P25,
		SP21433=@P26,
		SP2330=@P27,
		SP2331=@P28,
		SP2332=@P29,
		SP2333=@P30,
		SP2334=@P31,
		SP17181=@P32,
		SP1853=@P33,
		SP1855=@P34
	where  SP2312=@P35
	',
	N'@P1 varchar(9),
	@P2 varchar(9),
	@P3 varchar(9),
	@P4 varchar(13),
	@P5 varchar(9),
	@P6 numeric(9,5),
	@P7 datetime,
	@P8 varchar(9),
	@P9 varchar(9),
	@P10 varchar(9),
	@P11 varchar(9),
	@P12 varchar(9),
	@P13 varchar(9),
	@P14 numeric(9,5),
	@P15 datetime,
	@P16 varchar(9),
	@P17 varchar(15),
	@P18 varchar(9),
	@P19 numeric(1,0),
	@P20 varchar(9),
	@P21 numeric(1,0),
	@P22 varchar(9),
	@P23 numeric(1,0),
	@P24 numeric(1,0),
	@P25 numeric(6,0),
	@P26 varchar(9),
	@P27 numeric(13,2),
	@P28 numeric(11,3),
	@P29 numeric(14,3),
	@P30 numeric(14,3),
	@P31 numeric(14,3),
	@P32 numeric(3,0),
	@P33 varchar(9),
	@P34 text,
	@P35 varchar(9)',
	'  IZ2C   ',
	'    2Q   ',
	'     7CB ',
	' 1MZ  CXNN   ',
	'     1   ',
	1.00000,
	'2010-07-29 00:00:00',
	'     1ZG ',
	'    VK   ',
	'    2U   ',
	'    V3   ',
	'    XD   ',
	'     8   ',
	1000.00000,
	'2010-09-06 00:00:00',
	'     1CB ',
	'               ',
	'     0   ',
	0,
	'     1   ',
	0,
	'     7   ',
	0,
	0,
	29,
	'     F   ',
	12931.38,
	0,
	12931.380,
	2586.276,
	15517.656,
	0,
	'     1   ',
	'аванс 7800',
	'   1PQ   ' 



Обратите внимание на строку: "where  SP2312=@P35"
т.е. вместо того чтобы использовать IDDOC 1С-ка использует поле дополнительно вручную созданного индекса. И конечно же получается ошибка:
Violation of PRIMARY KEY constraint 'PK_DH2337'. Cannot insert duplicate key in object 'dbo.DH2337'.
  
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание своих индексов по таблице документов, глюки с IDDOC при записи.
Ответ #14 - 09. Сентября 2010 :: 10:47
Печать  
Почему берет не IDDOC а другое поле - скорее всего можно понять только используя дизасемблер, просто анализ Bkend.dll не дал возможности обнаружить где происходит подмена.
Ясно одно, 1С-ка не может работать с таблицами DH где больше одного индекса.
Или же использовать составной индекс и вторым полем пихать IDDOC, тогда поле будет уникальным и тогда 1С-ка будет использовать аткое условие:
Код
Выбрать все
where  IDDOC=@P34 and SP2312=@P35 


Бред конечно, но как временное решение проходит, но все же проблема есть.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать