Как получить байт-код модуля объекта 1С или конфигурационного файла CF

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработчики в среде «1С:Предприятие» рано или поздно сталкиваются с вопросами внутренней кухни платформы. Одним из наиболее интригующих вопросов является устройство исполняемого кода: как устроен компилятор 1С, где физически хранится скомпилированный код и как получить байт-код конкретного модуля или всей конфигурации? В этой статье мы подробно разберем, как устроена виртуальная машина 1С, в каких случаях генерируется байт-код, и как извлечь его штатными средствами платформы, а также с помощью специализированных инструментов.

Теория: Природа виртуальной машины 1С и байт-кода

Для начала давайте разберем, что представляет собой исполняемый код в системе «1С:Предприятие». Виртуальная машина 1С работает по принципу, схожему с JVM (Java Virtual Machine) или CLR (.NET). Это классическая стековая машина. Когда программный код на встроенном языке 1С запускается на выполнение, он не транслируется напрямую в машинные инструкции процессора (x86/x64). Вместо этого он компилируется в промежуточный низкоуровневый код — байт-код.

Этот байт-код имеет строгую структуру и состоит из нескольких ключевых элементов:

  1. Заголовок модуля: содержит общую информацию о версии формата и свойствах модуля.
  2. Таблица констант: здесь хранятся все строковые литералы, числа, даты, а также имена вызываемых процедур, функций, переменных и свойств объектов.
  3. Таблица локальных переменных: список переменных, используемых внутри процедур и функций модуля.
  4. Набор инструкций: линейная последовательность команд стековой машины, управляющая логикой выполнения (загрузка значений в стек, арифметические операции, вызов методов, условные переходы).

Рассмотрим на простом примере, как привычная нам строка кода на языке 1С транслируется в низкоуровневые инструкции стековой машины:


// Исходный код 1С
Результат = Число1 + 10;

В байт-коде эта операция преобразуется в следующую последовательность команд:


PushVar Число1    ; Поместить значение переменной 'Число1' на вершину стека
PushConst 10      ; Поместить константу '10' на вершину стека
Add               ; Сложить два верхних значения в стеке, результат поместить на вершину
PopVar Результат  ; Извлечь значение из стека и записать его в переменную 'Результат'

Важно понимать: если модуль в конфигурации открыт для редактирования и не имеет защиты, платформа компилирует его в байт-код непосредственно в оперативной памяти во время запуска сеанса Предприятия. В самих файлах конфигурации (файле базы данных или файле поставки .cf) открытый модуль хранится в виде обычного исходного текста. Но если модуль закрыт паролем или полностью исключен из поставки (в режиме создания поставки конфигурации), исходный текст удаляется, а в файле базы данных сохраняется исключительно скомпилированный байт-код.

Шаг 1. Получение байт-кода штатными средствами Конфигуратора

Многие разработчики не догадываются, что для извлечения скомпилированного байт-кода (файлов с расширением .bin) не требуется использовать сторонние хакерские утилиты. Платформа предоставляет для этого стандартный инструмент — выгрузку файлов конфигурации. Рассмотрим этот процесс по шагам.

Выгрузка модулей конфигурации (файла CF):

  1. Откройте информационную базу в режиме Конфигуратор.
  2. В главном меню выберите пункт Конфигурация -> Выгрузить конфигурацию в файлы....
  3. Укажите пустой каталог на диске, куда будут извлечены файлы, и нажмите кнопку Выгрузить.
  4. Дождитесь завершения процесса. Платформа полностью декомпозирует структуру метаданных на диске.

Проанализируем структуру полученного каталога. В созданной папке вы обнаружите иерархию папок и файлов, соответствующих объектам метаданных. Обратите внимание на расширения файлов:

Выгрузка внешних обработок (файлов EPF и ERF):

Если вам необходимо получить байт-код из внешней обработки или отчета, напрямую выгрузить их в файлы аналогичным образом не получится. Однако мы можем применить простую хитрость:

  1. Откройте Конфигуратор и дерево метаданных конфигурации.
  2. Перейдите к ветке Обработки (или Отчеты), нажмите правой кнопкой мыши и выберите команду Добавить.
  3. В свойствах новой обработки нажмите кнопку Заменить на внешнюю обработку/отчет... и выберите ваш файл .epf или .erf. Обработка временно станет частью метаданных конфигурации.
  4. Выполните команду Конфигурация -> Выгрузить конфигурацию в файлы... в новый каталог.
  5. В каталоге выгрузки перейдите по пути СatalogВыгрузки\DataProcessors\ИмяВашейОбработки. Там вы обнаружите заветные бинарные файлы модулей (например, ObjectModule.bin или Form.bin для старых версий форм), содержащие байт-код, если модули обработки были закрыты.

Шаг 2. Низкоуровневый анализ байт-кода и специализированные утилиты

Просто получить файл .bin часто бывает недостаточно, ведь внутри него находится нечитаемый бинарный массив данных. Для того чтобы проанализировать инструкции байт-кода, разработчики используют специализированный инструментарий, созданный сообществом.

Выясним, какие инструменты помогают работать с байт-кодом на профессиональном уровне:

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

Защита и обфускация байт-кода

Поскольку структура байт-кода 1С хорошо изучена сообществом, обычные закрытые паролем модули не обеспечивают стопроцентной защиты интеллектуальной собственности. Опытный специалист может легко восстановить алгоритм работы программы.

Для защиты тиражных решений разработчики применяют обфускацию (запутывание) непосредственно на уровне байт-кода:

Таким образом, мы детально изучили, как устроена работа с байт-кодом в платформе «1С:Предприятие». Штатная выгрузка конфигурации в файлы позволяет легко и легально извлекать бинарные файлы модулей для последующего анализа, развертывания систем контроля версий или исследования низкоуровневой архитектуры платформы.

← На главную