Изменения формата файлов конфигурации (CF) в 8.3.16

16.12.21

Разработка - Математика и алгоритмы

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

Внутренняя структура файла конфигурации (*.cf) описана в публикации Андрея Овсянкина, за что ему огромное спасибо! Но с приходом в платформе релиза 8.3.16 произошли изменения в структуре хранения конфигурации. 

В данной публикации изложен опыт по распаковке конфигурации в проекте https://github.com/e8tools/v8unpack после изменения формата хранения в 8.3.16

Так пустая конфигурация в формате 8.3.16 стала занимать на диске порядка 74-75 Кб, хотя ранее "пустышка" была размером в 5 Кб. 

 

      

 

При этом если конфигурация создается в более свежей платформе чем 8.3.16, но с режимом совместимости до 8.3.15 включительно, структура конфигурации остается прежняя.

Рассмотрим за счет чего произошли такие изменения в размере файла.

Если открыть файл в любом HEX редакторе можно не сразу заметить изменения в структуре хранения данных в файле. Все вроде бы как на своих местах...Но это только впечатление.

 

 

На самом же деле реальные данные обнаруживаются совсем в другом месте, а именно начиная со смещения 0х1359 (4953)

Внутри контейнера тут и там встречаем волшебная константу, обозначающая некую «пустоту» – это число 0xFFFFFFFFFFFFFFFF - максимальное значение 8-байтового, ранее такой константой была 0х7FFFFFFF - максимальное значение 4-байтового целого числа со знаком.

 

 

Надо больше буковок FFFFFFFFFFFFFFFFFFFFFFFF...

В структуре блока изменилось значение размера с 0х200 (512) на 0х10000 (65536)

 

 

Заголовок блока увеличил длину с 31 байта до 54 из-за увеличения разрядности в 2 раза и принял следующий вид:

[CRLF][Размер всего документа][Пробел][Размер текущего блока][Пробел][Адрес следующего блока][Пробел][CRLF], где

  • Размер всего документа - общая длина документа в байтах. Записана в виде строкового представления hex-числа. Длина – 16 байт.
  • Размер текущего блока – длина тела блока в байтах. Записана также в виде строкового представления числа INT64 (было INT32) в hex-формате. Если документ состоит из единственного блока, то размер всего документа либо меньше, либо совпадает с размером текущего блока (что логично)
  • Адрес следующего блока – адрес по которому расположен очередной блок документа. Если адрес следующего блока равен INT64_MAX (0xFFFFFFFFFFFFFFFF), то это значит, что следующего блока нет. Адрес следующего блока также записан в виде строкового представления числа.

Формат заголовка контейнера претерпел изменения в сторону увеличения адреса первого свободного блока в 2 раза (INT32 -> INT64):

Поле Тип Пояснение
Адрес первого свободного блока INT64 (8 байт) Смещение, по которому начинается цепочка свободных блоков
Размер блока по умолчанию INT32 (4 байта) Блок может иметь произвольную длину, но значение по умолчанию можно использовать для добавления новых блоков, например.
Поле неизвестного назначения (см. комментарии к статье) Часто совпадает с количеством файлов в контейнере INT32 (4 байта) Число, отражающее некоторую величину, как правило, совпадающую с количеством файлов в контейнере, однако, коллеги в комментариях считают, что это не совсем так. На алгоритм интерпретации контейнера данное число никак не влияет, его можно игнорировать
Зарезервированное поле INT32 (4 байта) Всегда равно 0 (всегда ли?)

 

Формат записи документа оглавления

Оглавление содержит перечень указателей на файлы, размещенные в контейнере   

Поле Тип Пояснение
Адрес документа атрибутов INT64 (8 байт) Адрес документа атрибутов файла
Адрес документа содержимого INT64 (8 байт) Адрес документа содержимого файлов
Зарезервированное поле INT64 (8 байт) Всегда равно 0xFFFFFFFFFFFFFFFF

 

 

Казалось бы, переходи по данным адресам и получай данные, но...

Пытаемся получить атрибуты файла...пусто.

 

 

Аналогичная ситуация и с содержимым:

 

 

Данных, по указанным адресам не оказывается. Чтобы найти реальные данные необходимо вспомнить про волшебную константу 0х1359 и данные сразу обнаружатся.

Данные атрибутов = 0x0001004B + 0x1359 = 0x113A4

Данные содержимого = 0x000100E2 + 0x1359 = 0x1143B

 

 

Файлы внутри корневого контейнера как известно сжаты по алгоритму Deflate, файлы внутри вложенных контейнеров записаны без сжатия. После распаковки алгоритм поиска данных в контейнере необходимо использовать тот, что описан в статье Андрея, т.е. в сжатом контейнере волшебная константа 0х1359 при сохранении данных не участвовала.

В заключение

Возможно, приведенная статья кому-то сократит путь к пониманию чтения файлов конфигурации 8.3.16. Жду конструктивную критику и желаю всем удачи!

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    2027    stopa85    12    

34

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    5024    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    8158    5    SpaceOfMyHead    17    

59

Мини-обзор разных решений задач

Математика и алгоритмы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    3249    RustIG    7    

25

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    8089    7    kalyaka    11    

44

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    9124    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    8236    dusha0020    8    

72
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. VKislitsin 972 17.12.21 13:32 Сейчас в теме
Сергей, спасибо за уточнение по новому формату!
У меня есть несколько вопросов:

1. Правильно ли я понимаю, что конфигурация-заглушка в старом формате, расположенная в начале файла, всегда одна и та же? В тех файлах, что мне попадались, было именно так.
2. Определение формата старый/новый выполняется путем проверки соответствия новому формату заголовка блока по адресу 0x136D?
3. Как определяется в каком формате необходимо выполнять запаковку? Чтением файла version?

Спрашиваю, т.к. у меня есть уже готовый аналог v8unpack, реализованный на чистом 1С (в ближайшие пару недель, думаю, будет опубликован). Делал для работы с расширениями и файлы в новом формате не попадались. Буквально вчера коллега спросил, а может ли мое решение распаковать такой файл и я разбирался с этим новым форматом.

Насчет адресации с волшебным смещением 0х1359, я предположу, что сначала пишется контейнер в новом формате (без всяких смещений), а уже затем стыкуется с заглушкой старого формата.
Для чтения, полагаю, также можно просто отбросить заглушку и работать с контейнером без поправок на смещение.
2. fishca 1255 17.12.21 14:40 Сейчас в теме
(1)
1. заглушка мне попадалась тоже только одна
2. да, думаю другого способа пока нет, либо я его не знаю.
3. в скобко-файле version - будет лежать информация о версии файла, все что выше 80315 - новый формат конфигурации
Прикрепленные файлы:
3. VKislitsin 972 17.12.21 14:44 Сейчас в теме
(2)
в скобко-файле version - будет лежать информация о версии файла

К такому же варианту склоняюсь. Только 80315 мне ни разу не попадалось. Видел либо пусто, либо 80314, либо 80316.
12. VKislitsin 972 28.08.22 20:09 Сейчас в теме
(2)
в скобко-файле version - будет лежать информация о версии файла, все что выше 80315 - новый формат конфигурации

Сергей и коллеги, прошу помочь разобраться как по содержимому распакованных файлов определить формат для запаковки конфигурации.
в (2) и (3) мы вроде бы сошлись на том, что "80316" в файле version говорит о том, что это новый формат.

Но во время тестирования разборки cf-ников с последующей пересборкой своим инструментом, обнаружил что "старый" формат тоже не одинаково пишется. Мне попались две вариации:
- оглавление записано блоками по 512 байт (скриншот 1) - размер блока = 200 (512 байт), и заполнено значение адреса следующего блока.
- оглавление записано единым блоком (скриншот 2) - размер блока равен размеру документа, адрес следующего блока не указан.

При этом в файле "version" для обоих вариаций содержимое одинаково:
{
{216,0,
{80314,0}
}
}

Экспериментальным путем выяснил, что 80314 или 80316 или другие значения в этом файле - это режим совместимости конфигурации.

На что еще можно обратить внимание в каталоге с распаковкой, чтобы выяснить как будет правильно запаковать?
Прикрепленные файлы:
4. dmpas 418 19.12.21 10:22 Сейчас в теме
Спасибо, что оформил знания в статью!
5. VKislitsin 972 19.12.21 15:50 Сейчас в теме
Сергей, я еще обратил внимание, что выполнение v8unpack -U для нового формата распаковывает только заглушку (версия 3.0.42). Подскажите, пожалуйста, это сделано целенаправленно?
6. fishca 1255 19.12.21 21:48 Сейчас в теме
(5) скорее всего ошибка, надо будет посмотреть повнимательнее.
7. VKislitsin 972 19.12.21 22:03 Сейчас в теме
(6) Я на github еще одну issue написал. Возможно, это уже устранено в 3.0.43, но я не нашел релиза этой версии.
ZhokhovM; +1 Ответить
8. VitaliyCeban 461 20.12.21 14:22 Сейчас в теме
Более года назад сделал свой распаковщик на .NET 5. Нет там никакой волшебной константы 0x1359.
Просто два разных, полностью независимых контейнера, следующих друг за другом. Один в старом формате (заглушка). Другой - в новом, который, собственно, и содержит полезные данные.
Распаковываю первый контейнер, в процессе узнаю значение его размера, которое по совместительству является и адресом начала второго контейнера. Распаковываю и его. Никаких волшебных констант.
Естественно, адреса внутри каждого из контейнеров являются относительными к началу контейнера, а не к началу файла.
9. dmpas 418 21.12.21 10:31 Сейчас в теме
(8) Напрашивается эксперимент: упаковать заглушку бОльшего размера и проверить, съест ли это конфигуратор.
13. Businka76 72 01.05.23 18:13 Сейчас в теме
(8) Как Вы размер контейнера считали?
10. fishca 1255 21.12.21 10:36 Сейчас в теме
(8) что-то мне не очень верится в это. Как в первом контейнере может поместиться большая конфигурация, даже если она в старом формате?
11. ZhokhovM 735 09.08.22 13:12 Сейчас в теме
Распаковка формата CF версии 80316.
https://infostart.ru/public/1691321/
За статью спасибо!
Оставьте свое сообщение