Разработчики в среде «1С:Предприятие» рано или поздно сталкиваются с вопросами внутренней кухни платформы. Одним из наиболее интригующих вопросов является устройство исполняемого кода: как устроен компилятор 1С, где физически хранится скомпилированный код и как получить байт-код конкретного модуля или всей конфигурации? В этой статье мы подробно разберем, как устроена виртуальная машина 1С, в каких случаях генерируется байт-код, и как извлечь его штатными средствами платформы, а также с помощью специализированных инструментов.
Для начала давайте разберем, что представляет собой исполняемый код в системе «1С:Предприятие». Виртуальная машина 1С работает по принципу, схожему с JVM (Java Virtual Machine) или CLR (.NET). Это классическая стековая машина. Когда программный код на встроенном языке 1С запускается на выполнение, он не транслируется напрямую в машинные инструкции процессора (x86/x64). Вместо этого он компилируется в промежуточный низкоуровневый код — байт-код.
Этот байт-код имеет строгую структуру и состоит из нескольких ключевых элементов:
Рассмотрим на простом примере, как привычная нам строка кода на языке 1С транслируется в низкоуровневые инструкции стековой машины:
// Исходный код 1С
Результат = Число1 + 10;
В байт-коде эта операция преобразуется в следующую последовательность команд:
PushVar Число1 ; Поместить значение переменной 'Число1' на вершину стека
PushConst 10 ; Поместить константу '10' на вершину стека
Add ; Сложить два верхних значения в стеке, результат поместить на вершину
PopVar Результат ; Извлечь значение из стека и записать его в переменную 'Результат'
Важно понимать: если модуль в конфигурации открыт для редактирования и не имеет защиты, платформа компилирует его в байт-код непосредственно в оперативной памяти во время запуска сеанса Предприятия. В самих файлах конфигурации (файле базы данных или файле поставки .cf) открытый модуль хранится в виде обычного исходного текста. Но если модуль закрыт паролем или полностью исключен из поставки (в режиме создания поставки конфигурации), исходный текст удаляется, а в файле базы данных сохраняется исключительно скомпилированный байт-код.
Многие разработчики не догадываются, что для извлечения скомпилированного байт-кода (файлов с расширением .bin) не требуется использовать сторонние хакерские утилиты. Платформа предоставляет для этого стандартный инструмент — выгрузку файлов конфигурации. Рассмотрим этот процесс по шагам.
Выгрузка модулей конфигурации (файла CF):
Проанализируем структуру полученного каталога. В созданной папке вы обнаружите иерархию папок и файлов, соответствующих объектам метаданных. Обратите внимание на расширения файлов:
.bsl. Открыв его любым текстовым редактором, вы увидите исходный код..bin (например, Module.bin для общих модулей или ObjectModule.bin для модулей объектов). Это и есть чистый скомпилированный байт-код 1С.Выгрузка внешних обработок (файлов EPF и ERF):
Если вам необходимо получить байт-код из внешней обработки или отчета, напрямую выгрузить их в файлы аналогичным образом не получится. Однако мы можем применить простую хитрость:
.epf или .erf. Обработка временно станет частью метаданных конфигурации.СatalogВыгрузки\DataProcessors\ИмяВашейОбработки. Там вы обнаружите заветные бинарные файлы модулей (например, ObjectModule.bin или Form.bin для старых версий форм), содержащие байт-код, если модули обработки были закрыты.Просто получить файл .bin часто бывает недостаточно, ведь внутри него находится нечитаемый бинарный массив данных. Для того чтобы проанализировать инструкции байт-кода, разработчики используют специализированный инструментарий, созданный сообществом.
Выясним, какие инструменты помогают работать с байт-кодом на профессиональном уровне:
.cf, .epf, .erf). Она позволяет «раздеть» любой файл контейнера на составные элементы без использования конфигуратора. Это бывает полезно для автоматизации сборки и разборки проектов..bin на вход и получить на выходе текстовое представление инструкций виртуальной машины (ассемблерный листинг), детально описывающий работу алгоритмов. Также он позволяет скомпилировать измененный ассемблерный текст обратно в бинарный файл .bin..bin и пытаются воссоздать логически эквивалентный читаемый код на встроенном языке 1С.Важно учитывать особенности декомпиляции: при компиляции в байт-код информация о комментариях разработчика, структуре форматирования текста (отступах) и исходном регистре символов безвозвратно удаляется. Восстановленный декомпилятором код будет работоспособным и сохранит всю логику, но будет лишен авторских комментариев и красивой структуры.
Поскольку структура байт-кода 1С хорошо изучена сообществом, обычные закрытые паролем модули не обеспечивают стопроцентной защиты интеллектуальной собственности. Опытный специалист может легко восстановить алгоритм работы программы.
Для защиты тиражных решений разработчики применяют обфускацию (запутывание) непосредственно на уровне байт-кода:
Таким образом, мы детально изучили, как устроена работа с байт-кодом в платформе «1С:Предприятие». Штатная выгрузка конфигурации в файлы позволяет легко и легально извлекать бинарные файлы модулей для последующего анализа, развертывания систем контроля версий или исследования низкоуровневой архитектуры платформы.