Любые данные, которыми оперирует любой из модулей 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 реализуется так:
1 2 3 4 |
СочетаниеКлавишAltIns = ЗначениеИзСтрокиВнутр("{""#"",69cf4251-8759-11d5-bf7e-0050bae2bc79,1,{0,45,16}}"); ЭтаФорма.Команды.КомандаAltIns.СочетаниеКлавиш = СочетаниеКлавишAltIns; // клавиша тоже может быть создана, но СочетаниеКлавиш на ее основе вызывает ошибку в конструкторе: КлавишаIns = ЗначениеИзСтрокиВнутр("{""#"",69cf4252-8759-11d5-bf7e-0050bae2bc79,45}"); |
Все коды клавиш и модификаторы клавиатуры приведены в справочнике ниже. С их помощью можно перехватывать любые нажатия, кроме тех, которые уже перехватывает система и платформа, в частности нажатие Ins не удастся перехватить, даже если в форме не будет ни одного табличного элемента.
Картинка
Внутреннее представление значения типа Картинка, загруженного из файла gif (Картинка.Вид = Абсолютная (тип: ВидКартинки)):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{"#",e6f51714-91cb-4dce-94fe-90ae3e3e1ad1,{4,3, {0}, "",-1,-1, 1,{{#base64:iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEX////+/v7+ /PP+/PL/+unm5d798sX+7rL+7rH95pP95Yn95Iidnp6VlJSUlJOVk46Uk43822L8 22H71Ub71UX7zyv7zyr7ziX7zSD6zB+TeySSeyR8fHtkZGQAAAAKe9ldAAAAH3RS TlP///////////////////////////////////////8AzRl2EAAAAAlwSFlzAAAu IwAALiMBeKU/dgAAAKpJREFUeJxlT8sSgjAMXKTQ8lDBA8z04P//mMzARRxh2kJr bQse1Bx2kk2yyZIrvoN46GgWwwjFd2KoCQ72kOihCURfR2rKrShp1beO6C7RKPGy 651V544TpLGUm56ULHUTGebPhZlljiDQLj9FFlCh/PtDp2QFbr5IoCmBSItx7xYQ BcFiGNvOMGYWt8L7ulKTQVxS++BetB2OlPoJ/Ww3L82vOfAgkQd8AzJfOOVEvFMK AAAAAElFTkSuQmCC}} ,0,""}} |
Внутреннее представление значения типа Картинка из БиблиотекаКартинок (Картинка.Вид = Из библиотеки (тип: ВидКартинки)):
1 2 3 4 5 |
{"#",e6f51714-91cb-4dce-94fe-90ae3e3e1ad1,{4,1, {0,093dd4ed-e03c-4fc6-a95a-01f51379cccf}, "",-1,-1, 0 ,0,""}} |
Эксперименты с подменой данных завершались сообщениями об Ошибке потока.
Справочник
Идентификаторы и структуры
Таблица описывает структуру строки внутреннего представления типов. В описании использованы условные обозначения:
- <значение> - значение в буквальном смысле: числовое 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 |
Источники
- Описание формата внутреннего представления данных 1С в контексте обмена данными Дмитрий Кинаш@infostart.ru (06.09.2019)
- Полноценные шорткаты Павел Егоров@infostart.ru (08.09.2009)