Имя: Пароль:
1C
 
Ссылки в таблицах SQL 1с 8.1
0 kopilogus
 
21.09.10
09:20
Всем доброго дня, вопрос заключается в следующем.
Есть необходимость вытащить из sql таблиц 1С8.1 информацию по одному регистру сведений.

select top 2 * from _inforeg18126
дает следующее:

_Fld18127_TYPE    _Fld18127_RTRef    _Fld18127_RRRef    _Fld18128

0x08    0x000000A3    0xA50200142A9F9EC911DCCD55B9A168D1    c14f48d5-fa7d-4f5b-9c0c-77dae6ba5bc4
0x08    0x000000C7    0x8098001E0BBF911E11DDF1DEB181F8DE    cd82b3e5-49a8-446a-b373-d7c0bce24366

Знаю что данный регистр сведений содержит в себе ссылки на различные элементы справочников, докумнто и прочее.

Как понять на какой тип объекта метаданных ссылаются элементы?
Например, в приведенном выше запросе что означает ссылка 0x000000A3?
Есть ли таблица в которой хранится соответсвие шестнадцатиричного значения и наименования таблицы?
1 Defender aka LINN
 
21.09.10
09:24
(0) Найди эту запись в 1С и посмотри.
А вообще, это противоречит лицензионному соглашению.
2 kopilogus
 
21.09.10
09:27
Знаю, но нужно восстановить некоторые данные из битой базы.
Увы, других вариантов нет. :(
3 kopilogus
 
21.09.10
09:32
Записей в регистре около 30 000 не вариант каждую запись искать в 1С.
Нужно понять принцип ссылок в этом регистре, остально дело за t-sql.
Вот только не получается понять.

Есть у кого-либо еще идеи??
4 Defender aka LINN
 
21.09.10
09:32
(2) Восстановить куда? И как базу убили, если sql жив?
5 smitru
 
21.09.10
09:34
(0) вначале разбираешься со структурой БД (какая таблица к каким методанным 1С относится. Тогда поймёшь какой именно тип данных находится в том или ином столбце и соответственно уже поймёшь с какой таблицей сиквела он связан (опять же по структуре хранения БД в сиквеле)
6 kopilogus
 
21.09.10
09:38
Во время перепроведения документов был сбой по питанию, в итоге база вывалилась в Suspect, удалось ее поднять, но в результате получили частичную потерю информации.

Есть еще одна sql база, в которой вертится мобильная торговля (Оптимум, мож кто слышал).

Так вот, связь объектов между этими двумя базами - это мой регистр сведений.
После падения базы 1С, выгрузил ее из центральной заново, но пришлось пересоздать базу Оптимум так как регистр сведений неходит в плане обмена и оказался пустым.

Вот теперь нужно восстановить потерянные ссылки на объекты из этого регистра.
7 kopilogus
 
21.09.10
09:42
Со структурй проблем нет, знаю что где лежит, но не могу сделать

select * from _inforeg18126
JOIN [другие таблицы]

так как не знаю что означает 0x000000A3, 0x000000C7
и так далее
8 Начинающий Восьмерочн
 
21.09.10
09:43
так есть обработка в инете которая показывает какое поле есть кто
9 el-gamberro
 
21.09.10
09:45
(7) это двоичные данные ежли че... в них храняться ид-шники. Сами ид-ники это строка но они преобразованы в бинари.

В 8ке для хранения составных типов используется структура хранения данных в 3х полях. Видимо твой случай. Где-то была статья но точно сейчас не скажу где.
10 el-gamberro
 
21.09.10
09:47
select top 2 *, CAST(_Fld18127_TYPE as nvarchar(max)) from _inforeg18126

интересно что покажет?
11 kopilogus
 
21.09.10
09:48
Если вы имеете ввиду обработку, которая показывает структуру базы данных, то это не то что нужно.
Эта обработка может показать только соответствие объектов метаданных 1с таблицам в sql, с указанием полей sql таблиц, но вот описание ссылок элементов на другие элементы таблиц sql я к сожалению не нашел.
12 kopilogus
 
21.09.10
09:49
Запрос
select top 2 *, CAST(_Fld18127_TYPE as nvarchar(max)) from _inforeg18126

Дал следующее:


_Fld18127_TYPE    _Fld18127_RTRef    _Fld18127_RRRef    _Fld18128    (No column name)
0x08    0x000000A3    0xA50200142A9F9EC911DCCD55B9A168D1    c14f48d5-fa7d-4f5b-9c0c-77dae6ba5bc4    
0x08    0x000000C7    0x8098001E0BBF911E11DDF1DEB181F8DE    cd82b3e5-49a8-446a-b373-d7c0bce24366    
13 el-gamberro
 
21.09.10
09:50
(11) Если упрощенно то схема такая:

Тип        Вид          Сссылка
Документ   Реализация   0008

Это судя по всему у тебя и защито в твоей таблице.
14 el-gamberro
 
21.09.10
09:51
(12) Прям квадратики и выводит?
15 kopilogus
 
21.09.10
09:53
Да, прямо квадратики и выводит :)
16 kopilogus
 
21.09.10
09:55
Запрос

select top 2 * from _InfoReg18126

Дает

_Fld18127_RTRef
0x000000A3
0x000044D1
0x000044DD
0x00004530
0x00000195
0x000000F1
0x000044C2
0x000001AF
0x000000C7
0x00000000
0x00000075
0x00000076
0x000048D8
0x0000007D
0x000000F7
0x00000162
0x00000066

Откуда делаю вывод, что у меня 17 различных типов объектов метаданных в таблице находятся
17 kopilogus
 
21.09.10
09:57
Собственно, как понять каким таблицам соответствует каждое значение в этом запросе?
18 Defender aka LINN
 
21.09.10
10:02
А тупо перегрузить регистр "как есть" в новую базу - пробовал?
19 kopilogus
 
21.09.10
10:07
Не пробовал, потому что в новой базе уже есть новые регистры, сформированные при первой синхронизации с базой Оптимум.
Поэтому нельзя их тупо загонять.

Неужели нет информации о том, как формируются ссылки на объекты данных в sql.
Я так понимаю: поскольку есть значение ссылки, значит sql точно знает, что объекту с сылкой 0x000000A3 соответствует, напрмер, таблица _Reference108 и так далее.

Такое соответсвие должно быть описано где-то. Вопрос, где найти его??
20 pmb
 
21.09.10
10:13
(19) в поле _Fld18127_RTRef  зашита ссылка на таблицу. Попробуй поискать ее по значению этого поля. по идее значению 0x000000A3 должна соответствовать таблица
_Reference163.
Правда не знаю как определить где справочники а где документы.
21 kopilogus
 
21.09.10
10:15
Все равно, что это, главное чтобы по значению поля можно было определить конечную таблицу.

pmb, как Вы определили, что это именно _Reference163?
22 pmb
 
21.09.10
10:17
(21) шестнадцатеричная система счисления :)
АЗ = 16*10 + 3
23 sash-ml
 
21.09.10
10:17
(0) если ты знаешь какой это регистр, то можно посмотреть какие у него поля составного типа
24 1C-Nick
 
21.09.10
10:18
(22) а почему не 36-ричная, и тогда будет 363?
25 kopilogus
 
21.09.10
10:18
Только заметил, что допустил опечатку ранее 6-ю постами. Прошу прощения.

Запрос
select distinct _Fld18127_RTRef from _InfoReg18126

Дает

_Fld18127_RTRef
0x000000A3
0x000044D1
0x000044DD
0x00004530
0x00000195
0x000000F1
0x000044C2
0x000001AF
0x000000C7
0x00000000
0x00000075
0x00000076
0x000048D8
0x0000007D
0x000000F7
0x00000162
0x00000066
26 1C-Nick
 
21.09.10
10:19
(24) хотя судя по записи 0х - действительно 16-ти
27 1C-Nick
 
21.09.10
10:20
(25) а что дает
select distinct _Fld18127_TYPE from _InfoReg18126
28 kopilogus
 
21.09.10
10:20
Сейчас проверим, что там находится.
29 pmb
 
21.09.10
10:20
вот как определить что это будет справочник а документ - х.з. Но по идее номера таблиц не пересекаются, т.е. не должно быть таблицы _Reference163 и _Document163

(24) 0x000000A3   - всегда означало 16-ную систему счисления.
30 kopilogus
 
21.09.10
10:21
Оказалось _Reference107 (места хранения)
31 kopilogus
 
21.09.10
10:25
запрос
select distinct _Fld18127_TYPE from _InfoReg18126
Дает

_Fld18127_TYPE
0x01
0x08
32 kopilogus
 
21.09.10
10:26
0х01 - это пустая ссылка в регистре (единственная запись), остальные все с 0х08
33 1C-Nick
 
21.09.10
10:28
0х08 по идее означает что там только справочники.
и все ссылки из (25) это 16-ричные номера таблиц _Reference
но странно что 0x000000A3 это _Reference107
34 1C-Nick
 
21.09.10
10:32
можно пойти еще опытным путем
залить пустую конфигурацию, и добавить туда записи с разными типами - тогда точно можно определить какой тип какое значение дает.
но все должно по идее соответствовать (33)
35 kopilogus
 
21.09.10
10:35
Перепроверил еще раз, прошу прощения, действительно таблица _Reference163, это справочник складов.
36 kopilogus
 
21.09.10
10:41
Может, во вьюхах что-то полезное будет?

Запрос
select top 5 * from INFORMATION_SCHEMA.TABLES
Дает
TABLE_CATALOG    TABLE_SCHEMA    TABLE_NAME    TABLE_TYPE
UPP_Almaty    dbo    _InfoRegChangeRec14546    BASE TABLE
UPP_Almaty    dbo    _ReferenceChangeRec18621    BASE TABLE
UPP_Almaty    dbo    _ReferenceChangeRec1818    BASE TABLE
UPP_Almaty    dbo    _AccumReg17234    BASE TABLE
UPP_Almaty    dbo    _Document398    BASE TABLE

Вот только 16ти ричных описаний не хватает :(
37 1C-Nick
 
21.09.10
10:43
а что в итоге надо сделать из этих данных?
дать зпрос, определяющий имена таблиц?
38 1C-Nick
 
21.09.10
10:47
select distinct 'dbo._Reference' + CAST(CAST(_Fld18127_RTRef AS INT) AS VARCHAR) from _InfoReg18126
39 1C-Nick
 
21.09.10
10:49
а дальше если сильно постараться, то можно создать табличку соответствия имен таблиц именам метаданных, заполнить ее из 1С, а потом в соединять в запросе для определения имени метаданных
40 sash-ml
 
21.09.10
10:59
(39) да, я когда-то такое делал. Более сложным путем. а тут оказывается можно ПолучитьСтруктуруХраненияБазыДанных взять числовую составляющую, хексануть и будет табличка с описание типов ссылочных объектов :)
41 1C-Nick
 
21.09.10
11:02
(40) ну тогда еще проще
ПолучитьСтруктуруХраненияБазыДанных, хексануть  и засунуть имя метаданного, и хекс имя таблицы...
42 1C-Nick
 
21.09.10
11:03
хотя я так и не понял конечную цель - получить конкретные имена таблиц или еще что-либо...
43 kopilogus
 
21.09.10
11:57
Конечная цель - выяснить как и где хранится соответствие таблиц их 16-тиричным ссылкам.
44 Новенький_2009
 
21.09.10
12:01
закладка
45 kopilogus
 
21.09.10
12:42
В итоге вопрос остался открытым
46 el-gamberro
 
21.09.10
12:46
(43) ты че прикалываешься? по моему уже все разжевали.
47 kopilogus
 
21.09.10
12:57
А по-моему, просто никто не знает где решение.
По крайней мере, в этом топике оно не было озвучено.
48 sash-ml
 
21.09.10
13:00
(45) храниться эта беда в таблицах Config, и Params, DBSchema, аднако в зашифрованном виде, так что забудь про прямое получение имен средствами SQL
49 1C-Nick
 
21.09.10
13:19
(43) - а чем не устраивает ПолучитьСтруктуруХраненияБазыДанных?
Ошибка? Это не ошибка, это системная функция.