Файл epf состоит из заголовка и набора блоков.
4 значения типа DWORD:
7fffffff – смещение следующего суперблока в файле
00000200 – минимальный размер блока каталога и блока содержимого файла
00000007 – unknown, может меняться
00000000 – unknown
Смещение следующего суперблока всегда установлено в значение 7fffffff. Случаи, когда там было другое значение, наблюдались только после падения 1С на «конвертации» неправильно сгенеренных epf-файлов.
Блоки бывают трех видов: блок оглавления, блок-описатель файла, блок содержимого файла.
Блок состоит из заголовка блока и содержимого блока.
Сначала перевод строки: 0D 0A
Три числа в текстовом виде (hex-представление). Каждое число занимает восемь символов и еще пробел. В конце блока опять перевод строки.
Первое число – длина данных
Второе число – размер блока
Третье число – смещение следующей части данных
Содержимое идет непосредственно после конечного перевода строки заголовка блока. Содержимое некоторых блоков дополняется до минимального размера блока, определенного в заголовке файла.
Если блок не дополняется до минимального размера, то в качестве длины данных и размера блока указывается одно и то же значение: реальный размер данных.
Если блок дополняется до минимального размера, то все зависит от объема данных:
Если длина содержимого больше минимального размера блока и для этих данных предусмотрено разбиение на несколько блоков (вместо хранения в виде одного сплошного куска), то данные записываются следующим образом:
Самым первым блоком файла идет первый (и, возможно, не последний) блок оглавления. Оглавление файла состоит из множества ссылок на блоки, хранящие описание файлов, и блоки с содержимым файлов. Оглавление записывается в виде набора блоков так, как описано выше.
Содержимое оглавления это несколько записей. Каждая запись это три значения DWORD:
Записи сохраняются отсортированные по имени файла.
Блоки данного вида не дополняются до минимального размера блока и не разбиваются на несколько. Содержимое блока следующее:
Блоки данного вида хранятся в виде одного блока, независимо от размера данных. Если размер данных меньше минимального размера блока, то блок дополняется нулями. Однако, не исключено, что данные могут быть сохранены в виде набора блоков. Правда, наблюдать такого еще не приходилось.
Содержимое сжимается по алгоритму deflate без заголовка.
Читать epf-файл следует с файла по имени root.
Файл содержит ссылку на основной файл – содержащий описание свойств внешней обработки. Формат:
MainObject:
Number : unknown : 1
Object : SelfRef : {d59644d4-ad02–43e6-afef-0de1ff7d9c87} – GUID – собственное имя
Number : unknown : 1
Object : UnknownObj1
...
GUID : unknown
Object : UnknownObj2
...
Number : unknown : 1
Object : UnknownObj3
Number : unknown : 4
Object : UnknownObj8
Object : UnknownObj9
Object : UnknownObj10
Number : unknown : 4
GUID : unknown
GUID : unknown
Object: UnknownObj4
GUID: Идентификатор основной формы
String: пустая
GUID: пустой
Number : unknown : 0
Object : UnknownObj5
...
Number : unknown : 0
Object : UnknownObj6
String : Идентификатор обработки
Object : UnknownObj7
String : пустая
...
Number : unknown : 0
Number : unknown : 0
GUID : GUID обработки (?), файл с модулем имеет имя – этот GUID плюс строка .0
...
Number : unknown : 1
String : язык : ru
String : синоним идентификатора обработки
...
GUID : unknown
Number : количество форм
GUID : несколько GUID форм обработки, количество GUID в предыдущем числе
Хранилище, аналогичное по структуре основному хранилищу epf-файла. Но со следующими отличиями:
В хранилище два файла:
Каждая форма сохраняется в двух файлах: описание свойств формы, файл с диалогом и модулем формы.
Имя файла совпадает с GUID'ом формы. Содержимое:
Number : unknown : 1
Object : UnknownObj1
Number : unknown : 0
Number : unknown : 1
Object : UnknownObj2
Number : unknown : 0
Object : UnknownObj3
Object : UnknownObj5 {0}
Number : unknown : 9
Object : UnknownObj4
Number : unknown : 0
Number : unknown : 0
Number : unknown : 0
Object : SelfRef : два нуля и собственный GUID
String : идентификатор формы
Object : Синоним
String : пустая
Number : unknown : 1
String : язык : ru
String : синоним
Данные формы записываются в файл с именем, состоящим из GUID'а формы и строки .0. Данные хранятся в хранилище той же структуры, что и основное хранилище epf. Содержимое файлов сохраняется без сжатия, к блокам оглавления и содержимому файлов применяется мсвойство «минимальный размер блока» из заголовка. В хранилище находятся два файла: form – диалог и module – текст модуля. Файлы зачастую оказываются разбиты на несколько блоков.