Измышлизмы на тему некоторых форматов внутренних файлов

advertisement
Измышлизмы на тему некоторых
форматов внутренних файлов 1Cv8.
Версия 1 от 18.03.2008 (awa)
Предварительное замечание
При описании форматов я буду использовать квадратные, круглые и угловые скобки. Круглые
скобки означают, что элемент, описанный в круглых скобках может встречаться 0 или 1 раз. Т.е.
это не обязательный элемент. Квадратные скобки означают, что элемент, описанный в квадратных
скобках может встречаться любое количество раз, включая 0. Т.е. Квадратные скобки описывают
возможное повторение элементов. В угловых скобках я буду заключать название элемента (и
возможно, тип), структура которого будет описана отдельно, если она не очевидна.
Список с вложенными списками
Многие файлы 1С, как внутренние (например некоторые файлы, содержащиеся в cf-файлах и
извлекаемые из него утилитой V8Unpack), так и внешние (например, файлы *.pfl), имеют структуру
«списка с вложенными списками» (надо придумать какой-нибудь простой термин для
обозначения таких файлов). Эти файлы представляют собой текстовые файлы определенной
структуры.
Для начала, определим несколько типов, которые могут содержаться в таких файлах.
1. Число. Представляет из себя последовательность цифр, с необязательной десятичной
точкой:
<Цифра>[<Цифра>] (.<Цифра>[<Цифра>])
<Цифра> - это символ 0…9
2. Строка. Представляет из себя произвольную последовательность символов, ограниченную
спереди и сзади двойными кавычками ("). Для обозначения символа двойной кавычки
внутри строки используется последовательность двух двойных кавычек ("").
3. GUID (Уникальный идентификатор). Представляет из себя последовательность символов
следующего формата:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
где x – шестнадцатиричная цифра (0…9, a…f, A…F)
4. Binary (Двоичные данные). Представляет из себя строку, начинающуюся с символов
#base64:, за которыми следует набор символов, представляющий из себя зашифрованный
алгоритмом base64 двоичные данные.
5. Список. Список предсталяет собой последовательность значений, разделенных запятыми и
ограниченный спереди и сзади фигурными скобками:
{< Значение>[,< Значение>]}
где < Значение> - это значение любого из типов Число, Строка, GUID, Binary ,
Список.
В случае, если < Значение> является значением типа Список, то оно отделяется спереди и
сзади символами перевода строки (0x0D, 0x0A).
Собственно весь файл является одним значением типа Список, только он не выделен символами
перевода строки, как вложенные списки.
Формат файла image.data (файл компилированного модуля)
Файл Image.data представляет собой файл в формате вышеизложенного «списка с вложенными
списками». Причем значений типа GUID и Binary в таких файлах не встречается (по крайней мере я
не встречал ни разу и есть все основания утверждать, что так оно и есть).
Сначала определим один производный тип, который часто встречается не только в файлах
image.data, но и в других файлах формата «списка…». Назовет этот тип ЗначениеСТипом. На самом
деле этот тип является значением типа Список с одним или двумя элементами списка:
{<ТипЗначения:Строка>(,<ЗначениеЗаданногоТипа>)}
Первый элемент имеет тип Строка, что я и указал через двоеточие. Я и далее буду пользоваться
таким способом указания типа при описании формата файла. Наличие и тип второго элемента
списка определяется значением первого элемента <ТипЗначения>. Перечислю все известные мне
значения элемента <ТипЗначения>:
1. "S" - ЗначениеСТипом определяет значение строкового типа. <ЗначениеЗаданногоТипа>
является значением типа Строка.
2. "N" - ЗначениеСТипом определяет значение числового типа. <ЗначениеЗаданногоТипа>
является значением типа Число.
3. "B" - ЗначениеСТипом определяет значение булевого типа. <ЗначениеЗаданногоТипа>
является значением типа Число с возможными значениями 0 и 1. 0 – это Ложь, 1 – Истина.
4. "D" - ЗначениеСТипом определяет значение типа Дата. <ЗначениеЗаданногоТипа> является
значением типа Число длиной 12 в формате ггггММддччммсс.
5. "L" - ЗначениеСТипом определяет значение Null. <ЗначениеЗаданногоТипа> отсутствует.
6. "U" - ЗначениеСТипом определяет значение Неопределено. <ЗначениеЗаданногоТипа>
отсутствует.
7. "" – ЗначениеСТипом определяет пустое значение. <ЗначениеЗаданногоТипа> отсутствует.
Пояснение: пустое значение появляется, например, когда мы вызываем функцию, но не
передаем ей никакого значения, чтобы функция использовала значение по умолчанию –
НекаяФункция(а, , б) – вот здесь второй параметр и является пустым значением.
8. "#" – ЗначениеСТипом определяет значение типа GUID. <ЗначениеЗаданногоТипа>
является значением типа GUID. (повторю, что в image.data значения с типом GUID не
встречается, поэтому и такие ЗначениеСТипом тоже не встречаются, однако в других
файлах формата «списка с вложенными списками» это встречается.
Во избежание путаницы, хочу обратить внимание на разницу типов, которые я определил для
файла формата «списка…» и типов встроенного языка 1С. ЗначениеСТипом – это производный тип
файла формата «списка…», а вот конкретное значение типа ЗначениеСТипом определяет какоелибо значение того или другого типа встроенного языка 1С. Например:
{"N",5}
{"S","Контрагенты"}
{"D",20070730000000}
{"U"}
это все разные примеры значений типа ЗначениеСТипом, но определяют они разные значения с
разными типами языка 1С – Число 5, Строка "Контрагенты", Дата 30.07.2007 и Неопределено.
Перейдем теперь собственно к формату image.data. Файл image.data представляет собой список
(т.е. значение типа Список) со следующими элементами:
{1,<Команды:Список>,<Константы:Список>,<Переменные:Список>,<Метки:Список>,<Процедуры:
Список>}
Причем, кроме первых двух элементов (1 и <Команды>), остальные элементы могут отсутствовать.
Вложенный список <Команды> описывает собственно исполняемый код виртуальной машины 1С.
Формат списка <Команды> следующий:
{"Cmd",<КоличествоКоманд:Число>,<ИндексПервойКоманды:Число>[,<КодКоманды:Список>]}
Первый элемент "Cmd" – признак блока <Команды>. <КодКоманды> - это элементарная команда
виртуальной машины 1С. Количество элементов <КодКоманды> определяется элементом
<КоличествоКоманд >. <ИндексПервойКоманды> определяет первую команду основного кода
модуля (т.е. кода, расположенного сразу после всех процедур и функций, и который исполняется
сразу после создания модуля). В случае отсутствия основного кода <ИндексПервойКоманды>
равен 4294967295. Список <КодКоманды> представляет собой список из двух чисел:
{<Код:Число>,<ОпКод:Число>}
Возможные значения <Код> и <ОпКод> и их смысл будут описаны ниже.
Рассмотрим теперь формат списка <Константы>:
{"Const",<КоличествоКонстант:Число>[,<КонстантноеЗначение:ЗначениеСТипом>]}
Первый элемент "Const" – признак блока <Константы>, второй элемент <КоличествоКонстант>
определяет количество последующих элементов <КонстантноеЗначение>. Каждое
<КонстантноеЗначение> представляет собой значение типа ЗначениеСТипом, описанного выше. В
этом блоке описываются все константные значения, используемые в модуле. Например, если в
коде модуля есть такие строки:
Счетчик = Счетчик + 1;
Состояние("Обработано " + Счетчик + " элементов");
то тут есть три константных значения: 1, "Обработано " и " элементов".
Следующий блок – список <Переменные>. Здесь описываются глобальные переменные, видимые
на уровне модуля. Формат списка <Переменные> такой:
{"Var", <КоличествоПеременных:Число>[,<Переменная:Список>]}
Первый элемент "Var" – признак блока <Переменные>. Второй параметр указывает количество
переменных описанных в этом блоке, т.е. количество элементов <Переменная>. Сами
переменные описываются в элементах <Переменная>:
{<ИмяПеременной:Строка>,<ВидПеременной:Число>,-1}
Строка <ИмяПеременной> хранит имя переменной именно так, как оно задано в исходном коде
модуля. Число <ВидПеременной> является побитовым набором флагов, определяющих вид
переменной:
Номер бита
0
1
3
4
5
Вес (значение)
1
2
4
8
16
Описание
0 – глобальная переменная, 1 – локальная
Внешняя переменная (объявленная не в этом модуле)
Переменная является параметром процедуры/функции
Переменная определена с ключевым словом Знач
Переменная определена с ключевым словом Экспорт
Не все биты имеют смысл для глобальных переменных, но далее будет показано, что существуют
аналогичные блоки описания переменных внутри процедур, и там имеют смысл другие биты.
Download