1С 7.7 - А где же спрятаны Перечисления? |
Опубликовано d.mokshin в пн, 02/02/2009 - 00:00.
|
||
Действительно, если структуру хранения Документов и Справочников найти легко, то поиск по имени Перечисления в файлах 1Cv7.DD и 1Cv7.DDS, к сожалению, не приводит ни к каким результатам. Но ведь где-то же это должно храниться?!!
Тут дело посложнее: Перечисления хранятся непосредственно в файле метаданных - 1Cv7.MD. Если выполнить в нем поиск по идентификатору Перечня, то можно найти примерно такую структуру:
{"25984","Перечисл_ИД","Перечисл_Коммент","Перечисл_Син",
{"EnumVal",
{"25979","Знач1","Знач1_Коммент","Знач1_Предст","Знач1_Предст"},
{"25980","Знач2","Знач2_Коммент","Знач2_Предст","Знач2_Предст"},
{"25981","Знач3","Знач3_Коммент","Знач3_Предст","Знач3_Предст"},
{"25982","Знач4","Знач4_Коммент","Знач4_Предст","Знач4_Предст"},
{"25983","Знач5","Знач5_Коммент","Знач5_Предст","Знач5_Предст"},}}
И вот здесь начинается самое интересное! 1С хранит в таблицах ссылки на различные элементы в виде внутренних идентификационных кодов. Коды эти последовательны и состоят из цифр и заглавных латинских букв. Последовательность строится таким образом:
0, 1, 2, ..., 8, 9, A, B, C, D, E, F, ..., W, X, Y, Z, 10, 11, 12, ..., 1W, 1X, 1Y, 1Z, 20, ...
Т.е. фактически это представление числа в системе счисления с основанием 36: 10 цифр и 26 букв латинского алфавита.
Следовательно, путем несложных ;-) вычислений, получим, что значения Перечисления из примера выше будут соответствовать внутренним значениям:
25979 - K1N
25980 - K1O
25981 - K1P
25982 - K1Q
25983 - K1R
Ниже привожу 2 простейших примера перевода чисел во внутренние коды (и наоборот) на VB. За качество кода ногами не бить - написано навскидку :-)
'===========================================
Function to1c(N As Long) As String
Const cnst = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim res As String, ost As Long
res = ""
While N > 0
ost = N Mod 36
N = N \ 36
res = Mid$(cnst, ost + 1, 1) & res
Wend
to1c = res
End Function
'===========================================
'===========================================
Function from1c(S As String) As Long
Const cnst = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim res As Long, ost As Long
res = 0
S = Trim(S)
While S <> ""
res = res * 36
res = res + (InStr(cnst, Left$(S, 1)) - 1)
S = Mid$(S, 2)
Wend
from1c = res
End Function
'===========================================
Последние комментарии
- Новостной портал онлайн игр
1 год 36 нед. назад - Биткоин сегодня. Новости в мире криптовалют
1 год 36 нед. назад - Онлайн игры - новости
1 год 36 нед. назад - Полезные статьи о детях и их мамах
1 год 36 нед. назад - Онлайн игры - обзоры, прохождения, видео
1 год 38 нед. назад - Криптовалюты: биткоин, эфириум, доджкоин - новости
1 год 38 нед. назад - Обзоры онлайн игр и новости
1 год 39 нед. назад - Мир криптовалют - новости
2 гг. 6 час. назад - Свежие новости в мире криптовалют
2 гг. 1 день назад - Новости со всего мира на портале "Политика 24"
2 гг. 27 нед. назад
Не жалею, что
Не жалею, что потратил пару минут на чтение. Пишите почаще, еще непременно заскочу почитать что-то новенькое.