1С 7.7 - А где же спрятаны Перечисления?


Действительно, если структуру хранения Документов и Справочников найти легко, то поиск по имени Перечисления в файлах 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
'===========================================


Не жалею, что

Не жалею, что потратил пару минут на чтение. Пишите почаще, еще непременно заскочу почитать что-то новенькое.

Нравится