Некоторое время назад понадобилось массово определять, в какой версии КОМПАС был создан файл без установки самой программы. Задача возникла при обработке большой базы чертежей и моделей (.cdw, .spw, .frw, .m3d, .a3d), так как для каталога неплохо было бы понимать минимальную версию программы, в которой файл ещё открывается.
В процессе выяснилось, что у КОМПАС-файлов два принципиально разных контейнера, один из них бинарный и для него нет никакого официального описания формата.
С версии 16 файл - обычный ZIP. Внутри лежит текстовый FileInfo (UTF-16, ini-подобный): там есть поля вроде AppVersion / AppFullVersion (KOMPAS-3D V17, 16.1.0.0 и т. п.). Версию можно прочитать напрямую, хотя сам формат надписи может различаться.
До 16-й (и иногда позже, если файл остался в старом контейнере) формат бинарный. Сигнатура - KF, сразу за ней - 4 байта big-endian: код формата, например 0x4E00000C. Официальной таблицы «код -> версия» ASCON не публикует, по крайней мере я не нашел. Выглядит это как-то так:
4B 46 | 4E 00 00 0C → KF + 0x4E00000C → v12 SP1.
Часть соответствий уже была в базе утилиты file (libmagic): сигнатура KF + значение по смещению 2. Этого хватало примерно до линейки 5.x–12.x, но не на весь набор кодов, который встречается в реальных файлах (альтернативные коды одной мажорной версии, 13–15, редкие 5.x и т. д.).
Проверка на реальных данных
Дальше провели эмпирическое исследование на большой выборке файлов - прогнали каталог через пайплайн извлечения метаданных: для каждого файла определили вариант (ZIP-контейнер / бинарный KF) и вытащили либо поля из FileInfo, либо hex-код из заголовка KF. Собрали неизвестные коды и постепенно достраивали карту. Сопоставили коды с косвенными признаками:
датами появления файлов в базе и хронологией релизов КОМПАС
с картой из libmagic
с читаемым FileInfo у соседних файлов той же эпохи
Для подавляющего большинства кодов нашлась правдоподобная соответствующая версия.
Когда я говорю “мы”, конечно же я имею в виду себя и нейросеть.
Работоспособность подхода была протестирована на:
341 667 КОМПАС файлов из базы https://c-stud.ru
124 799 КОМПАС файлов из базы https://alldrawings.ru
Успешных определений формата около 95%. Таким образом появилась возможность достаточно надежно определять версию КОМПАСа прямо во время загрузки материала.
Утилита

Также решил накидать отдельную простенькую утилиту для определения версии - возможно кому-то пригодится. Есть консольная версия для Linux и GUI версия для Windows (поддерживается Windows 10 и новее). Скачать можно здесь, там же будут выходить и новые версии. Возможно в будущем будет добавлена поддержка других CAD файлов, если это будет кому-то нужно. С помощью утилиты можно определить версию отдельного файла или всех файлов в указанной папке. В текущую версию утилиты включён 51 уникальный код бинарного KF-контейнера.
Вот такой опыт реверс-инжиниринга. Естественно, правильность определения версии никак не гарантируется.
Комментарии (10)

Radon17
10.08.2026 08:54А описание где-то будет опубликовано? Создать бы конвертор из всего во всё...

konst90
10.08.2026 08:54Вообще конечно очень удручает, что Компас (да и многие другие разработчики подобных пакетов) так и не научились делать обратно-совместимые файлы, не сумели написать отдельный конвертер в более старую версию, и даже требуемую версию пакета при попытке открыть не определяют.
@kompas_3d почему у вас всё так?
Понятно, что в новых версиях появляется новый функционал, который старой версией не поддерживается, но не открываются даже примитивные файлы с построениями, которые уже лет десять как существуют.

kompas_3d
10.08.2026 08:54Обратная совместимость у нас как раз есть - все старые файлы читаются в новых версиях.
Файлы бинарные - смена версии программы и ядра, добавление новой функциональности меняет очень многое в структуре файла и предсказать эти изменения невозможно. Там даже версия компилятора повлиять может.

osmanpasha
10.08.2026 08:54меняет очень многое в структуре файла и предсказать эти изменения невозможно. Там даже версия компилятора повлиять может
Ну вот это и означает "так и не научились делать обратно-совместимые файлы". Видимо, вы просто пишете внутренние структуры из памяти в файл, а надо было сделать сериализатор/десериализатор, который пишет в файл независимо от компилятора и упаковки структур в оперативной памяти.

kompas_3d
10.08.2026 08:54Обратная совместимость - возможность чтения старых файлов в новых версиях. У нас она есть.

LostFire
10.08.2026 08:54Я думаю, человек пишет о том, что новые версии программы не могут десериализовывать старые бинарные форматы также как и новые zip-форматы. Если может, то тогда вопросов к вам нет.

kompas_3d
10.08.2026 08:54Старые файлы прекрасно открываются в новых версиях, с этим никогда не было никаких проблем. Более того открытие старых файлов регулярно тестируют.
Чтобы файл из новой версии открылся в старых версиях, нужно нажать сохранить как и выбрать формат прошлой версии - т.е. это тоже возможно, просто надо сделать дополнительные действия.


riky
10.08.2026 08:54Помню надо было превью извлечь для внутренней црм. Там в зип файле оно есть как tiff к которому добавлен доп кастомный заголовок не помню, типа 18 или 36 байт. Их заголовок можно отбросить и получить нормальный tiff.

fafnir999 Автор
10.08.2026 08:54Вы правы, превью тоже можно достать из файла - на сайтах этот этап делается, в статье это не упомянул. Результат можно посмотреть например здесь - https://alldrawings.ru/spisok-kategorij/item/kryshka-i-shtamp-dlia-eio-izgotovleniia
eps
Не думали отправить изменения в upstream
file/libmagic?