Имя: Пароль:
1C
1С v8
Восстановление по УИД
0 УПП
 
27.03.13
10:54
Коллеги, добрый день. Я тут разбираюсь с проблемой задвоиности индексов, нашел таблицу проблемную, по сути в ней задовоиности нет, просто платформы пытается вставить не уникальное значение в индекс. Ну не в этом  дело, смотрю значения этой таблицы:

Я так полагаю, что (поле kref) 0xA075001EC9EBA4BC11DFFD4159868477 это УИД?, как его можно восстановить что бы понять, что этой за значение?

Хотя длина УИД 32 символа, здесь 34.
1 cw014
 
27.03.13
10:55
(0) Сам то понял, что спросил?
2 thezos
 
27.03.13
10:56
(0) нет
3 hhhh
 
27.03.13
11:00
(0) 0x - это не символы.
4 H A D G E H O G s
 
27.03.13
11:01
И A075001EC9EBA4BC11DFFD4159868477 - тоже не символы.
5 МихаилМ
 
27.03.13
11:01
проверил - 32 естественно без 0x.
6 H A D G E H O G s
 
27.03.13
11:02
(0) а что значит восстановить?
7 УПП
 
27.03.13
11:04
Да, точно:
УИД A075001EC9EBA4BC11DFFD4159868477

Без 0x
8 УПП
 
27.03.13
11:04
(7)
Соответственно Уид:
A075001E-C9EB-A4BC-11DF-FD4159868477
9 УПП
 
27.03.13
11:05
(4) А что же это по вашему ?
10 H A D G E H O G s
 
27.03.13
11:08
(9) Набор чисел.
11 cw014
 
27.03.13
11:09
(10) И букав
12 hhhh
 
27.03.13
11:09
(8) ну в базе сделать Справочники.ВашСправочник.ПолучитьСсылку(Новый УникальныйИдентификатор("A075001EC9EBA4BC11DFFD4159868477"));

или

Документы.ВашДОкумент.ПолучитьСсылку(Новый УникальныйИдентификатор("A075001EC9EBA4BC11DFFD4159868477"));

ваша задача теперь выяснить конкретно: какой справочник это или документ.
13 cw014
 
27.03.13
11:09
(8) Ошибаешься
14 H A D G E H O G s
 
27.03.13
11:12
(12) Там надо переставить значения предварительно.
15 УПП
 
27.03.13
11:12
(13) если я напишу так:

Соответственно Уид:
Новый УникальныйИдентификатор("A075001EC9EBA4BC11DFFD4159868477")

Вам легче спать будет?
16 cw014
 
27.03.13
11:14
(15) Ты ошибся при преобразовании записи в таблице в уникальный идентификатор... Если в таблице поле = 0xA075001EC9EBA4BC11DFFD4159868477, тогда УИД объекта будет
59868477-FD41-11DF-A075-001EC9EBA4BC
17 УПП
 
27.03.13
11:16
(16) почему такое преобразование идет? Какой алгоритм преобразования? Это точно ?
18 cw014
 
27.03.13
11:16
(17) Точнее не бывает
19 cw014
 
27.03.13
11:17
(17) Пока ты не поймешь, от какой таблицы твой УИД - ты не найдешь запись по нему
20 Maxus43
 
27.03.13
11:17
(17) в скл нет типа УИД 1совского
21 H A D G E H O G s
 
27.03.13
11:19
(20) Есть
22 H A D G E H O G s
 
27.03.13
11:20
uniqueidentifier так то.
Правда хранится это в binary(16), наверное для того, чтобы sql сам новые значения не хреначил.
23 cw014
 
27.03.13
11:21
(17) А какие поля у твоей таблицы вообще есть?
24 Maxus43
 
27.03.13
11:22
(22) я всмысле ты уверен что тип значения uniqueidentifier идентичен 1совскому типу УникальныйИдетификатор?
25 УПП
 
27.03.13
11:25
(23) Вот запрос:

SELECT [_Period]
     ,[_RecorderTRef]
     ,[_RecorderRRef]
     ,[_LineNo]
     ,[_Correspond]
     ,[_KindRRef]
     ,[_Value_TYPE]
     ,[_Value_RTRef]
     ,[_Value_RRRef]
 FROM [_AccRgED21756]
26 Defender aka LINN
 
27.03.13
11:25
(24) Я уверен, ибо проверял и юзал.
27 H A D G E H O G s
 
27.03.13
11:26
(25) Отключи Итоги по Регистру Бухгалтерии, обновись, включи итоги по регистру Бухгалтерии.
28 cw014
 
27.03.13
11:26
Я так понимаю, что вот эти поля, которые ты хочешь узнать:

[_RecorderTRef]
[_RecorderRRef]
29 УПП
 
27.03.13
11:27
У полей REF тип binary
30 УПП
 
27.03.13
11:27
(28) Ну да
31 H A D G E H O G s
 
27.03.13
11:28
(27) Нет, нет, нет.

Я ошибся, перепутал _AccRgED с AccRgAT. Итогами это не вылечишь.
32 УПП
 
27.03.13
11:28
(30) По ним завдоение индекса идет
33 cw014
 
27.03.13
11:28
RecorderTRef - номер документа. Преобразуй его в int (например, если у тебя там 0000018B, тогда значение будет = 395)...

Потом ищи таблицу _Document[твой получившийся номер] и в ней делай запрос

SELECT * FROM _Document[твой получившийся номер] WHERE _RRef = 0xA075001EC9EBA4BC11DFFD4159868477
34 H A D G E H O G s
 
27.03.13
11:29
(32) Текст ошибки скажи.
35 УПП
 
27.03.13
11:29
При добавлении субконто на счет:
exec sp_executesql N'INSERT INTO _AccRgED21756 (_Period, _RecorderTRef, _RecorderRRef, _LineNo, _Correspond, _KindRRef, _Value_TYPE, _Value_RTRef, _Value_RRRef) SELECT
T1._Period,
T1._RecorderTRef,
T1._RecorderRRef,
T1._LineNo,
P1,
@P2,
@P3,
@P4,
@P5
FROM _AccRg21728 T1
WHERE T1._AccountDtRRef = @P6',N'P1 numeric(1),@P2 varbinary(16),@P3 varbinary(1),@P4 varbinary(4),@P5 varbinary(16),@P6 varbinary(16)',0,0xB44B334DE4C5D19D4D7785E8F75E7ABE,0x08,0x000000C5,0x00000000000000000000000000000000,0x805D33BC049644DC4E1DE44B2F91458C



Вылетает:
Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo._AccRgED21756' with unique index '_AccRg21756_ByPeriod_TRNRN'. The duplicate key value is (Oct  2 4009 11:25AM, 0x000001d6, 0x8f5d001ec9eba4bc11deaf18dc2e7afa, 1, 0xb44b334de4c5d19d4d7785e8f75e7abe, 0).
The statement has been terminated.
36 УПП
 
27.03.13
11:30
Делал запрос:

SELECT _Period, _RecorderTRef, _RecorderRRef, _LineNo, _Correspond, _KindRRef, _Value_TYPE, _Value_RTRef, _Value_RRRef, Count(*) FROM _AccRgED21756 GROUP BY _Period, _RecorderTRef, _RecorderRRef, _LineNo, _Correspond, _KindRRef, _Value_TYPE, _Value_RTRef, _Value_RRRef HAVING Count(*) > 1

Завдоенности в самой таблице нет, просто идет попытка вставки значения, которое задваивает индекс
37 УПП
 
27.03.13
11:31
А что это за поля?
,[_Value_TYPE]
,[_Value_RTRef]
,[_Value_RRRef]
38 H A D G E H O G s
 
27.03.13
11:32
(37) Значение субконто.
39 H A D G E H O G s
 
27.03.13
11:34
Посмотри, че за док Oct  2 4009 11:25AM сделал запись в РБ
40 H A D G E H O G s
 
27.03.13
11:34
Странно, что нет секунд
41 УПП
 
27.03.13
11:34
У меня такое ощущение, что в таблице остались записи от старого субконто "Статьи ДДС", сейчас его добавляю опять и потому идет задвоение. Не знаю уже что думать...
42 H A D G E H O G s
 
27.03.13
11:34
02.10.2009 в 11:25
43 УПП
 
27.03.13
11:34
(39) Таких полно, почти на каждый регистартор ругается
44 H A D G E H O G s
 
27.03.13
11:41
(41) А что тут думать - резервную копию - и
delete from _AccRgED21756  where AccRgED21756 _KindRRef=0xB44B334DE4C5D19D4D7785E8F75E7ABE
45 H A D G E H O G s
 
27.03.13
11:43
delete from _AccRgED21756  where AccRgED21756. _KindRRef=0xB44B334DE4C5D19D4D7785E8F75E7ABE
46 УПП
 
27.03.13
11:46
(45) Это что вы удаляете ?
47 H A D G E H O G s
 
27.03.13
11:52
(46) Значения субконто для документов для ВидаСубконто "СтатьяДДС".

Только убедитесь, что 0xB44B334DE4C5D19D4D7785E8F75E7ABE  - это точно СтатьяДДС.

Отловите запрос
ВЫБРАТЬ
   1 КАК Поле1
ИЗ
   ПланВидовХарактеристик.ВидыСубконтоХозрасчетные КАК ВидыСубконтоХозрасчетные
ГДЕ
   ВидыСубконтоХозрасчетные.Ссылка = Значение(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиДвиженияДенежныхСредств)

в профайлере и убедитесь, что там _idref ваш.
48 УПП
 
27.03.13
12:02
(47) Да, все верно:

exec sp_executesql N'SELECT
P1
FROM _Chrc994 T1 WITH(NOLOCK)
WHERE (T1._IDRRef = @P2)',N'P1 numeric(1),@P2 varbinary(16)',1,0xB44B334DE4C5D19D4D7785E8F75E7ABE


Значения остались.


Да вот только удаляться то все, у меня проблема с 57.1, нужно какой то условие добавлять на счет к этой таблице?
49 H A D G E H O G s
 
27.03.13
12:08
(48) А причем тут счета?
50 H A D G E H O G s
 
27.03.13
12:09
Это тупо табличка значений субконт в разрезе документа.
51 УПП
 
27.03.13
12:10
(50) Понял, сейчас на тесте попробую.
52 Serginio1
 
27.03.13
12:14
53 УПП
 
27.03.13
12:30
(50) Вся аналитика слетела по Статье ДДС. Видимо все же нужен дополнительный отбор?
54 H A D G E H O G s
 
27.03.13
12:33
(53) мммм, так.
55 УПП
 
27.03.13
12:36
(54)
Может по всем этим полям делать отбор, ну кроме периода конечно:

(Oct  2 4009 11:25AM, 0x000001d6, 0x8f5d001ec9eba4bc11deaf18dc2e7afa, 1, 0xb44b334de4c5d19d4d7785e8f75e7abe, 0)

?
56 H A D G E H O G s
 
27.03.13
12:39
(53) Вертаем пока табличку взад.
57 H A D G E H O G s
 
27.03.13
12:41
И отловим в профайлере такой запрос:

ВЫБРАТЬ
   1 КАК Поле1
ИЗ
   РегистрБухгалтерии.Хозрасчетный.Субконто КАК ХозрасчетныйСубконто
ГДЕ
   ХозрасчетныйСубконто.Регистратор В
           (ВЫБРАТЬ РАЗЛИЧНЫЕ
               Хозрасчетный.Регистратор
           ИЗ
               РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
           ГДЕ
               (Хозрасчетный.СчетДт = &Счет57_1
                   ИЛИ Хозрасчетный.СчетКт = &Счет57_1))
   И ХозрасчетныйСубконто.Вид = &ВидСубконтоДДС
58 H A D G E H O G s
 
27.03.13
12:42
Получим нечто подобное:

exec sp_executesql N'SELECT
P1
FROM _AccRgED20737 T1 WITH(NOLOCK)
WHERE T1._RecorderTRef + T1._RecorderRRef IN
(SELECT
T2._RecorderTRef + T2._RecorderRRef AS Q_001_F_000CRef
FROM _AccRg20709 T2 WITH(NOLOCK)
WHERE ((T2._AccountDtRRef = @P2) OR (T2._AccountCtRRef = @P2))) AND (T1._KindRRef = @P3)', N'P1 numeric(1,0),@P2 varbinary(16),@P3 varbinary(16)', 1, 0xA36F5219F3882D59474C2B8DF0E06657, 0xA2D9EF0AD9924E764E73FB1C43E874EE
59 H A D G E H O G s
 
27.03.13
12:42
И заменим Select на Delete
60 УПП
 
27.03.13
12:50
exec sp_executesql N'DELETE
P1
FROM _AccRgED21756 T1 WITH(NOLOCK)
WHERE T1._RecorderTRef + T1._RecorderRRef IN
(SELECT
T2._RecorderTRef + T2._RecorderRRef AS Q_001_F_000CRef
FROM _AccRg21728 T2 WITH(NOLOCK)
WHERE ((T2._AccountDtRRef = @P2) OR (T2._AccountCtRRef = @P2))) AND (T1._KindRRef = @P3)', N'P1 numeric(1,0),@P2 varbinary(16),@P3 varbinary(16)', 1, 0x805D33BC049644DC4E1DE44B2F91458C, 0xB44B334DE4C5D19D4D7785E8F75E7ABE

Так?
61 УПП
 
27.03.13
12:54
(60) Такую вот ошибку выдает:

Msg 1087, Level 16, State 1, Line 2
Must declare the table variable "@P1".
62 H A D G E H O G s
 
27.03.13
12:58
(60) Ну что же ты.

exec sp_executesql N'
delete
FROM _AccRgED20737
WHERE _AccRgED20737._RecorderTRef + _AccRgED20737._RecorderRRef IN
(SELECT
T2._RecorderTRef + T2._RecorderRRef AS Q_001_F_000CRef
FROM _AccRg20709 T2 WITH(NOLOCK)
WHERE ((T2._AccountDtRRef = @P2) OR (T2._AccountCtRRef = @P2))) AND (_AccRgED20737._KindRRef = @P3)', N'@P2 varbinary(16),@P3 varbinary(16)', 0xA36F5219F3882D59474C2B8DF0E06655, 0xA2D9EF0AD9924E764E73FB1C43E874EE
63 МихаилМ
 
27.03.13
13:05
._RecorderTRef + _RecorderRRef

некорректно.

могут быть удалены  не те данные
64 H A D G E H O G s
 
27.03.13
13:06
(63) Например?
65 H A D G E H O G s
 
27.03.13
13:06
(63) Ты это 1С-ке скажи.
66 H A D G E H O G s
 
27.03.13
13:11
(63) Михаил, что там с не теми данными?
67 МихаилМ
 
27.03.13
13:12
(64)
пример

430 + 4567890900434345
429 + 4567890900434346
68 H A D G E H O G s
 
27.03.13
13:16
(67) Передай это в 1С. Я серьезно.
69 МихаилМ
 
27.03.13
13:17
(68)
не припомню ,что бы мы на "ты" переходили
70 H A D G E H O G s
 
27.03.13
13:25
(69) Здесь, на форуме - можно.
71 hhhh
 
27.03.13
13:39
(68) лицензионным соглашением запрещено влезать не средствами платформы. Если передаст в 1с, его в черный список занесут.
72 H A D G E H O G s
 
27.03.13
13:41
(71) Даже профайлер запрещен?
73 Maxus43
 
27.03.13
13:42
Планы запроса разрешено смотреть, даже в тех журнале можно, норм всё
74 УПП
 
27.03.13
13:49
(71) Ничего подобного, я обращался в 1С по поводу задоиности индексов, вот их ответ:

Протестируйте вашу базу до попытки вставки субконто. Попробуйте выгрузить базу в dt (если возможно) и загрузить ее в файловую версию, протестировать ее там и добавить субконто.
Другой способ - внести изменения в таблицу MS SQL Server
Определить имя проблемной таблицы можно с помощью SQL Trace или технологического журнала, если включить в него запись событий EXCP со всеми свойствами. Включите дополнительно запись событий DBMSSQL.
Для этого нужно добавить:
<event>
<eq property="name" value="DBMSSQL"/>
</event>
Конфигурационный файл нужно положить на компьютер, где установлен сервер 1С:Предприятия 8. Смотреть результаты в подкаталоге rphost_ХХХ.
Например,
<config xmlns=" v8.1c.ru/v8/tech-log »»">
<log location="c:\logs" history="1">
<event>
<eq property="Name" value="EXCP"/>
</event>
<event>
<eq property="Name" value="DBMSSQL"/>
</event>
<property name="All"> </property>
</log>
<dump location="c:\dumps" create="1" type="1023"/>
</config>
В журнале должна присутствовать запись события DBMSSQL с текстом CREATE UNIQUE INDEX ....
По ней можно определить таблицу, в которой есть дублированный ключ.
Нужно найти продублированные записи и удалить лишние.
Например, Ошибка произошла пм создании этого индекса :
create unique clustered index [_InfoR18755_ByPeriod_TRS] on [_InfoReg18755] (_Period, _Fld18756RRef, _Fld18757)

Запрос SELECT _Period, _Fld18756RRef, _Fld18757, Count(*) FROM _InfoReg18755 GROUP BY _Period, _Fld18756RRef, _Fld18757 HAVING Count(*) > 1 выдаст список записей, которых в базе больше одной по этому ключу.



-----------------

Это говорит о том, что они официально разрешают влазить в БД
75 УПП
 
27.03.13
13:50
(62) Сейчас попробую этот запрос, отпишусь
76 УПП
 
27.03.13
14:16
Да, удаление помогло, единственное что, у корр счета тоже аналитика слетает в части статей ДДС:

Д57 К50 (инкассация)

Ну да ладно, заполнить не проблема.

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

Написал запрос в 1С, что они скажут, посмотрю.

Но что самое странное, вообще запрещено действительно влазить в БД не средствами платформы, хотя они же сами и рекомендуют это сделать.
77 Maxus43
 
27.03.13
14:21
(76) для испарвление ошибок - рекомендуют, а работа повседневная - это нарушение
78 Serginio1
 
27.03.13
14:54
(20) Есть
Convert(binary(16),NEWID())
v8: _SimpleKey и его установка
2 + 2 = 3.9999999999999999999999999999999...