Внутри объектов 1С:Предприятие 8.х

Любые данные, которыми оперирует любой из модулей 1с-приложения, являются объектами, и даже те, которые относят к простым типам, имеют непростую структуру. Увидеть эти данные внутри почти невозможно, поскольку в целях общей надежности их нельзя изменить непосредственно, а то, что нельзя изменить, незачем и видеть.

Тем не менее в языке оставлена лазейка, которая открывает потрясающие возможности. Это пара функций:
ЗначениеВСтрокуВнутр(<Значение>)
 ЗначениеИзСтрокиВнутр(<Значение>)

Синтакс-помощник также сообщает в примечании: Используется для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать для других целей не рекомендуется.

Теория

Функция ЗначениеВСтрокуВнутр() выполняет сериализацию внутренней структуры объекта программной среды 1с в специальный формат строкового представления. Таким образом появляется возможность получить некоторое представление о его содержании и понять секреты внутренних механизмов платформы.

Функция ЗначениеИзСтрокиВнутр() выполняет обратную операцию десериализации из строкового представления в программный объект. Если строковое представление сконструировать, понимая внутренние механизмы платформы, то после его десериализации можно получить объект, который невозможно получить никаким другим способом.

Обе функции определены только в модулях &НаСервере, поэтому исследовать можно только отображаемые на сервере объекты. Прикладные объекты представляются как ссылки. Наибольший интерес представляют внутренние строки коллекций значений. Дмитрий Кинаш на infostart.ru достаточно подробно описал cтроку внутреннего представления данных:

Тип внутреннее Строковое  представление Комментарий
Примитивные типы Примитивные типы содержат литеру типа в начале
Неопределено {"U"} (Undefined) Символизирует неинициализированные переменную или свойство объекта составного типа.
Null {"L"} Без значения. Символизирует пустые значения, полученные из запроса как результат соединения или обращения к вложенным полям пустых ссылок через точку.
Булево =Истина {"B",<значение>}
пример: {"B",0} или {"B",1}
(Boolean)
Число =123.456 {"N",<значение>}
пример: {"N",123.456}
(Numeric)
Строка ="abc" {"S",<значение>}
пример: {"S","abc"}
(String)
Дата =ТекущаяДата() {"D",<YYYYMMDDhhmmss>}
пример: {"D",20210304181403}
(Date) Дата представляется шестнадцатизначным числом вывернутой даты yyyymmddhhmmss
Типы
Тип {"T",<уникальный идентификатор>}
Число: {"T",b0be78f2-0ee6-4d31-a3bb-77dd32ba5bec}
Строка: {"T",9b6abf8b-0173-48e5-b0a0-83b21fcf63c5}
(Type)
ОписаниеТипов {"#",f5c65050-3bbb-11d5-b988-0050bae0a95d,
{"Pattern",
{"#",<уникальный идентификатор прикладного типа>},
{"S"},
{"N"},...}}
Простые коллекции Чтобы описать коллекцию значений, необходимо в качестве первого параметра указать символ типа "#", а вторым параметром записать идентификатор типа. Для коллекций (также как и для Ссылок, Объектов, Списков, Выборок и так далее), в качестве идентификатора используется 32-разрядное 16-ричное число. Регистр для символов A-F (цифры с 10 по 15) не имеет значение - хоть большие и маленькие вперемешку. Но важно наличие разделение дефисами на 5 групп символов по правилу 8-4-4-4-12 и отсутствие пробельных символов внутри идентификатора - нарушение этих правил приводит к ошибке потока.

Идентификаторы типов коллекций значений наследуются от платформы Предприятие 7.7

Массив
А=Новый Массив(3);
А[0]=1;
А[1]="abc";
{"#",51e7a0d2-530b-11d4-b98a-008048da3034,
{3,
{"N",1},
{"S","abc"},
{"U"}
}
}
Многомерный Массив
А=новый массив(3,2);
А[0][0]=1;
А[1][1]="abc";
{"#",51e7a0d2-530b-11d4-b98a-008048da3034,
{3,
{"#",51e7a0d2-530b-11d4-b98a-008048da3034,
{2,
{"N",1},
{"U"}
}
},
{"#",51e7a0d2-530b-11d4-b98a-008048da3034,
{2,
{"U"},
{"S","abc"}
}
},
{"#",51e7a0d2-530b-11d4-b98a-008048da3034,
{2,
{"U"},
{"U"}
}
}
}
}
Структура
Структура("Ч,С,Д",1,"abc");
{"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,
{3,
{
{"S","Ч"},
{"N",1}
},
{
{"S","С"},
{"S","abc"}
}
}
}
Тип Структура - это частный случай Соответствия и с точки зрения внутренней структуры они полностью идентичны
Тип =ТипЗнч(1)
Тип =ТипЗнч("abc")
{"T",b0be78f2-0ee6-4d31-a3bb-77dd32ba5bec}
{"T",9b6abf8b-0173-48e5-b0a0-83b21fcf63c5}
Тип =ТипЗнч(1)
Тип =ТипЗнч("abc")
{"T",b0be78f2-0ee6-4d31-a3bb-77dd32ba5bec}
{"T",9b6abf8b-0173-48e5-b0a0-83b21fcf63c5}

Важные замечания:

  • форматированный текст в кодировке UTF-8
    • форматирование не имеет значения:
      • игнорируются все пробельные символы (пробелы, табуляции, переносы строк) в произвольных местах между фигурными скобками и параметрами
      • игнорируются все переводы строк
    • текст чувствителен к регистру символов
  • Выражения в неправильном формате, но с правильной структурой (ошибочный тип или идентификатор) распознаются как Неопределено!
  • Нарушение структуры или неправильные типы параметров на предопределенных позициях приводят к выводу ошибки: "Ошибка преобразования: Ошибка формата потока"
  • Лишние параметры игнорируются и не считаются нарушением структуры. Для примера {"N", 5, "S", "Test"} - это все равно будет число 5

 

Тип Идентификатор
Массив 51e7a0d2-530b-11d4-b98a-008048da3034
Структура 4238019d-7e49-4fc9-91db-b6b951d5cf8e
Соответствие 3d48feae-a9c6-4c5a-a099-9eb6477630c6
СписокЗначений 4772b3b4-f4a3-49c0-a1a5-8cb5961511a3
ТаблицаЗначений acf6192e-81ca-46ef-93a6-5a6968b78663
ДеревоЗначений e603c0f2-92fb-4d47-8f38-a44a381cf235
ФиксированныйМассив 4500381b-db30-4a10-9db4-990038032acf
ФиксированнаяСтруктура 3ee983d7-ace7-40f9-bb7e-2e916fcddd56
ФиксированноеСоответствие 220455ea-6c85-4513-996f-bbe79ed07774

 

 

Практика

Сочетание клавиш

При назначении команде формы сочетания клавиш создается объект СочетаниеКлавиш, для которого используется системное перечисление Клавиша, но в нем набор доступных клавиш существенно меньше, . Например назначить команде сочетание Alt+Ins штатными средствами невозможно, т.к. Клавиша.Ins не существует, но ее можно создать, сконструировав ее объект самостоятельно. Общее строковое представление объекта Клавиша: {"#",69cf4252-8759-11d5-bf7e-0050bae2bc79,<код клавиши>}, объекта СочетаниеКлавиш: {""#"",69cf4251-8759-11d5-bf7e-0050bae2bc79,1,{0,<код клавиши>,<модификатор>}}. Клавише Ins соответствует код 45, а кнопке Alt префикс 16, поэтому назначение сочетания клавиш Alt+Ins реализуется так:

Все коды клавиш и модификаторы клавиатуры приведены в справочнике ниже. С их помощью можно перехватывать любые нажатия, кроме тех, которые уже перехватывает система и платформа, в частности нажатие Ins не удастся перехватить, даже если в форме не будет ни одного табличного элемента.

Картинка

Внутреннее представление значения типа Картинка, загруженного из файла gif (Картинка.Вид = Абсолютная (тип: ВидКартинки)):

Внутреннее представление значения типа Картинка из БиблиотекаКартинок (Картинка.Вид = Из библиотеки (тип: ВидКартинки)):

Эксперименты с подменой данных завершались сообщениями об Ошибке потока.

Справочник

Идентификаторы и структуры

Таблица описывает структуру строки внутреннего представления типов. В описании использованы условные обозначения:

  • <значение> - значение в буквальном смысле: числовое 3.14 для числа, 0 или 1 для булево, строковое "abc" для строкового
  • {<ЗНАЧЕНИЕ>} - строковое значение во внутреннем представлении, соответствующее типу значения: {"N", 3.14}, {"B", 0}, {"S", "abc"}
  • {<*ЗНАЧЕНИЕ>} - строковое значение в сокращенном внутреннем представлении без "#" и без идентификатора типа, которое используется внутри других объектов для значений заведомо известного типа
Тип внутреннее Строковое  представление Комментарий
Массив {"#",51e7a0d2-530b-11d4-b98a-008048da3034,
{<количество>,{<ЗНАЧЕНИЕ0>},...}}
Структура {"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,
{<количество>,{{"S",<ключ>},{<ЗНАЧЕНИЕ>}},...}}
Соответствие {"#",3d48feae-a9c6-4c5a-a099-9eb6477630c6,
{<количество>,{{<КЛЮЧ>},{<ЗНАЧЕНИЕ>}},...}}
Клавиша {"#",69cf4252-8759-11d5-bf7e-0050bae2bc79,<код клавиши>}
СочетаниеКлавиш {"#",69cf4251-8759-11d5-bf7e-0050bae2bc79,1,
{0,<код клавиши>,<флаг префиксов>}
Тип Число {"T",b0be78f2-0ee6-4d31-a3bb-77dd32ba5bec}
Тип Строка {"T",9b6abf8b-0173-48e5-b0a0-83b21fcf63c5}
Тип Дата {"T",aae38c48-a877-411c-a6d3-fbaa1f83c4bd}
Картинка {"#",e6f51714-91cb-4dce-94fe-90ae3e3e1ad1,
{4,1,
{0,<уникальный идентификатор>},"",-1,-1,0,0,""}
}
пустая картинка:
{4,0,
{0},"",-1,-1,0,0,""}
ЭлементСпискаЗначений, {"#",c27d99e0-2f53-11d5-a3be-0050bae0a776,
{<представление>,<пометка>,{<ЗНАЧЕНИЕ>},
{<КАРТИНКА*>},<индекс>,0,""}}
СписокЗначений {"#",4772b3b4-f4a3-49c0-a1a5-8cb5961511a3,
{6,1e512aab-1b41-4ef6-9375-f0137be9dd91,0,0,
{<количество>,
{1e512aab-1b41-4ef6-9375-f0137be9dd91,
{<представление>,<пометка>,{<ЗНАЧЕНИЕ>},
{4,0,
{0},"",-1,-1,0,0,""},<индекс>,0,""}
},
{1e512aab-1b41-4ef6-9375-f0137be9dd91,
{<представление>,<пометка>,{<ЗНАЧЕНИЕ>},
{4,0,
{0},"",-1,-1,0,0,""},<индекс>,0,""}
}
},
{"Pattern"},0,1}
}
СправочникМенеджер {"#",<универсальный идентификатор менеджера>,{0}} ?
СправочникСсылка {"#",<универсальный идентификатор ссылки>,<номер>:<идентификатор>} пустая ссылка:
{"#",<универсальный идентификатор ссылки>,<номер>:00000000000000000000000000000000}
СправочникОбъект {"#",<универсальный идентификатор объекта>}

Коды клавиш

Esc
27
F1
112
F2
113
F3
114
F4
115
F5
116
F6
117
F7
118
F8
119
F9
120
F10
121
F11
122
F12
123
Print
Scr
Scroll
145
Break
19
~
192
1
49
2
50
3
51
4
52
5
53
6
54
7
55
8
56
9
57
0
58
-
189
=
187
Back
8
Ins
45
Home
36
PgUp
33
Num
144
/
111
*
106
-
109
Tab
9
Q
81
W
87
E
69
R
82
T
84
Y
89
U
85
I
73
O
79
P
80
[
219
]
221
\
220
Del
46
End
35
PgDn
34
7
103
8
104
9
105
+
107
Caps
20
A
65
S
83
D
68
F
70
G
71
H
72
J
74
K
75
L
76
;
186
'
222
Enter
13
4
100
5
101
6
102
Shift
16
Z
90
X
80
C
67
V
86
B
66
N
78
M
77
,
188
.
190
/
191
Shift
16
Up
38
1
97
2
98
3
99
Enter
13
Ctrl
17
Win
91
Alt Space
32
Alt Win
92
App
93
Ctrl
17
Left
37
Down
40
Right
39
0
96
.
110

Значения модификаторов

Alt +16 Ctrl +8 Shift +4 Модификатор
Shift 4
Ctrl 8
Ctrl Shift 12
Alt 16
Alt Shift 20
Alt Ctrl 24
Alt Ctrl Shift 28

Источники

Leave a Reply