Модули 1С: форматы хранения и способы анализа кода

· 9 мин

Содержание

«Расшифровать модуль» в 1С почти всегда значит не снять шифр, а прочитать и понять код. Модули не шифруются — они лежат в двоичном контейнере обработки, отчёта или конфигурации. Чтобы увидеть текст, достаточно открыть файл в Конфигураторе или выгрузить конфигурацию в текстовые файлы. Для своего кода этого хватает полностью.

Отдельная история — чужой модуль, закрытый паролем разработчика. Это не криптография, а флаг защиты от просмотра, и обойти его без разрешения автора нельзя: код защищён как объект интеллектуальной собственности.

Что именно вам нужно от модуля?

Где в 1С хранится код: виды модулей

Код в 1С разложен по модулям разных типов, и у каждого своя область видимости и момент запуска. Понимание, какой модуль за что отвечает, — половина «расшифровки», потому что искать процедуру наугад по всей конфигурации бессмысленно.

Основные виды модулей:

  • 🚀 Модуль управляемого приложения (и модуль обычного приложения) — срабатывает при старте программы, в нём обработчики начала и завершения работы системы.
  • 🔌 Модуль внешнего соединения и модуль сеанса — запуск в режиме COM-соединения и установка параметров сеанса.
  • 🧩 Общие модули — переиспользуемые процедуры и функции. У каждого стоят флаги Клиент, Сервер, Вызов сервера, Привилегированный — по ним видно, где код выполняется.
  • 📄 Модуль объекта (справочника, документа) и модуль набора записей регистра — логика конкретного объекта: проведение, заполнение, проверка.
  • 🗂️ Модуль менеджера — методы, общие для всех объектов вида (например, создание документа «с нуля»).
  • 🖥️ Модуль формы и модуль команды — поведение интерфейса: обработчики кнопок, событий полей, команд.

Когда открываете незнакомую обработку, начинайте с модуля объекта и модулей форм: там лежит основная бизнес-логика. Общие модули — это «библиотека», её читают по мере того, как встречаются вызовы.

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

Форматы файлов 1С: .epf, .erf, .cf, .cfe, .cfu

Код путешествует между базами в виде файлов. Чтобы разобрать модуль, сначала определите, что у вас за файл — от этого зависит, чем его открывать.

РасширениеЧто этоЧем открыть
.epfВнешняя обработкаКонфигуратор → Файл → Открыть
.erfВнешний отчётКонфигуратор → Файл → Открыть
.cfФайл поставки конфигурации (полная)Загрузка/сравнение конфигурации
.cfeРасширение конфигурации (с версии 8.3.6)Конфигурация → Расширения
.cfuФайл обновления (разница между версиями)Поддержка → Обновить конфигурацию
.dtВыгрузка информационной базы (данные + конфигурация)Администрирование → Загрузить ИБ
.1cdФайл файловой информационной базыЗапуск базы, Конфигуратор

Все эти форматы — двоичные контейнеры, а не шифртекст. Внутри .epf и .erf упакованы реквизиты, формы, макеты и, собственно, модули с кодом. Платформа умеет распаковывать их сама, поэтому «ломать шифрование» не нужно — нужно открыть правильным инструментом.

Если файл не открывается и выдаёт ошибку формата, частая причина — несовпадение версии платформы. Обработку, сохранённую на 8.3.21, старая платформа 8.3.14 открыть не даст. Смотрите номер платформы в свойствах файла поставки.

Как открыть и разобрать внешнюю обработку или отчёт

Самый прямой путь — Конфигуратор. Он показывает структуру .epf/.erf так же, как объекты обычной конфигурации.

  1. Откройте Конфигуратор нужной базы (или пустой базы подходящей версии).
  2. Меню Файл → Открыть, выберите файл обработки или отчёта.
  3. В дереве слева раскройте объект: реквизиты, табличные части, формы, макеты, модуль объекта.
  4. Двойным щелчком по модулю откройте код. Для поиска по тексту используйте Правка → Глобальный поиск (Ctrl+Shift+F) — он ищет подстроку сразу по всем модулям открытого файла.

Чтобы понять логику, а не только прочитать строки, включите синтаксический контроль: Конфигурация → Синтаксический контроль. Он подсветит неописанные переменные и разорванные вызовы — это помогает увидеть, какие процедуры вызывают друг друга.

Кроме модулей, у обработки есть формы и макеты. Форма — это и разметка, и собственный модуль с обработчиками событий полей. Макеты хранят печатные формы и шаблоны: табличные документы, текстовые шаблоны, иногда двоичные данные. Если вас интересует, как формируется печатная форма, смотрите макет и процедуру, которая его заполняет в модуле объекта или менеджера.

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

Внешние обработки из неизвестного источника запускайте только в тестовой копии базы. Код во внешнем файле выполняется с правами текущего пользователя и может изменить данные.

Хранилище значений и двоичные данные: как достать содержимое

Часто под «расшифровкой» имеют в виду не код, а картинку, макет или вложенный файл, спрятанный в реквизите. В 1С такие данные хранят в типе ХранилищеЗначения — это обёртка, в которую можно положить произвольное значение, в том числе двоичные данные, и при желании сжать их.

Достать содержимое можно встроенным языком. Метод Получить() возвращает исходное значение, а если это ДвоичныеДанные — его записывают в файл:

Значение = РеквизитСсылка.ХранилищеФайла.Получить();

Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
    Значение.Записать("C:\temp\out.bin");
КонецЕсли;

Если в хранилище лежит картинка, результатом будет КартинкаВстроенная или ДвоичныеДанные — и то и другое выгружается в файл методом Записать(). Макет, сохранённый как табличный документ, пишется в формате .mxl методом ТабличныйДокумент.Записать().

Степень сжатия задаётся при создании хранилища вторым параметром, но при чтении это неважно: Получить() сам распаковывает. Отдельного «декодера» для ХранилищеЗначения не существует и не требуется — всё делает платформа.

Сложность обычно не в чтении, а в том, чтобы найти нужный реквизит. Откройте структуру объекта в Конфигураторе и посмотрите, у каких реквизитов тип ХранилищеЗначения — именно в них прячут присоединённые файлы, картинки и настройки. Если реквизитов несколько, пройдитесь по ним в коде и запишите каждый во временный файл, а потом смотрите по расширению и сигнатуре, что получилось.

Если тип значения заранее неизвестен, сначала проверьте его через ТипЗнч(), а уже потом вызывайте специфичный для типа метод записи. Иначе получите ошибку преобразования.

Контрольные суммы, подписи и защита от опасных действий

Второй смысл «декодирования» — контрольные суммы и подписи, по которым 1С проверяет целостность и доверенность файлов.

Обновления. Файл .cfu содержит разницу между версиями конфигурации. При установке через Конфигурация → Поддержка → Обновить конфигурацию платформа сама сверяет версию текущей конфигурации и контрольные суммы поставки. Если версия не та, обновление просто не применится — вручную «подбирать» сумму не нужно и бессмысленно.

Внешние обработки. С версии 8.3.9 работает механизм «Защита от опасных действий»: при открытии неподписанного внешнего файла платформа предупреждает пользователя. Снять предупреждение можно, подписав файл или добавив его в доверенные через настройки администрирования.

Дополнительные обработки в базе. Когда внешнюю обработку подключают через подсистему «Дополнительные отчёты и обработки» (есть в конфигурациях на БСП), система сохраняет её хэш — контрольную сумму содержимого. Если файл потом изменили, сумма не совпадёт, и обработка перестанет запускаться. Это защита от подмены, а не шифр: сумму считает платформа, вручную её не «декодируют».

Не пытайтесь подогнать контрольную сумму чужого обновления под свою базу — вы получите неработающую конфигурацию без поддержки. Корректный путь — установить штатный .cfu подходящей версии.

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

Для серьёзного разбора код удобнее превратить в обычные текстовые файлы — их можно сравнивать, искать и держать в системе контроля версий.

  • 📤 Выгрузка в файлы. Конфигурация → Выгрузить конфигурацию в файлы. Платформа разложит объекты по папкам, а модули сохранит как текстовые файлы .bsl. Это лучший способ прочитать большой объём кода и сравнить две версии построчно обычным diff-инструментом.
  • 🧮 Сравнение и объединение. Конфигурация → Сравнить, объединить с конфигурацией из файла. Показывает, чем отличаются два .cf по объектам и по строкам модулей — удобно, когда нужно понять, что изменил предыдущий программист.
  • 🧰 1С:EDT. Среда на базе Eclipse, где конфигурация представлена текстом. Даёт навигацию по вызовам, переход к определению процедуры и поиск использований — для разбора незнакомого кода это сильно быстрее Конфигуратора.
  • 🔎 Статический анализ. Открытый BSL Language Server разбирает модули и находит типовые проблемы: пустые блоки, подозрительные конструкции, нарушения стиля. Подключается к редакторам кода и помогает оценить качество чужого модуля.

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

Выбор зависит от задачи. Прочитать одну обработку — хватит Конфигуратора. Разобрать и поддерживать большую конфигурацию — выгрузка в файлы плюс EDT или внешний редактор. Если нужно сравнить две версии одной обработки, выгрузите обе в текст и сравните файлы .bsl: так видно каждую изменённую строку, а не только список отличий по объектам.

Частые ошибки при разборе модулей

Диагностика: выберите симптом

Главная ошибка по сути — путать защиту с шифрованием. Открытый модуль читается штатными средствами за минуты, а закрытый паролем не «расшифровывается» никакими инструментами: защита проверяется на уровне платформы, и легальный путь один — получить код или снятие пароля у правообладателя. Попытки обойти защиту нарушают лицензию и законодательство об интеллектуальной собственности.

Частые вопросы

Модуль 1С правда зашифрован?
Нет. Код хранится в двоичном контейнере обработки или конфигурации, но это упаковка, а не шифр. Платформа распаковывает его сама при открытии файла.
Можно ли открыть модуль, закрытый паролем разработчика?
Без пароля автора — нет. Это защита от просмотра, а не криптозамок, который подбирается. Легальный путь — запросить исходники или снятие защиты у того, кто поставил пароль.
Чем отличается `.cf` от `.cfu`?
.cf — полная поставка конфигурации, её можно загрузить целиком. .cfu — только разница между версиями, применяется поверх существующей конфигурации-основы.
Как вытащить картинку из реквизита типа `ХранилищеЗначения`?
Получите значение методом .Получить(), проверьте тип через ТипЗнч() и запишите в файл методом .Записать(), если это ДвоичныеДанные или встроенная картинка.
Что безопаснее для разбора большого кода — Конфигуратор или выгрузка в файлы?
Для чтения всей конфигурации удобнее выгрузка в текстовые .bsl и сравнение diff-инструментом или работа в 1С:EDT. Конфигуратор лучше подходит для одной обработки и отладки.