Модули 1С: форматы хранения и способы анализа кода
Содержание
«Расшифровать модуль» в 1С почти всегда значит не снять шифр, а прочитать и понять код. Модули не шифруются — они лежат в двоичном контейнере обработки, отчёта или конфигурации. Чтобы увидеть текст, достаточно открыть файл в Конфигураторе или выгрузить конфигурацию в текстовые файлы. Для своего кода этого хватает полностью.
Отдельная история — чужой модуль, закрытый паролем разработчика. Это не криптография, а флаг защиты от просмотра, и обойти его без разрешения автора нельзя: код защищён как объект интеллектуальной собственности.
.epf/.erf в Конфигураторе или выгрузите конфигурацию в файлы — код станет обычным текстом .bsl.ХранилищеЗначения. Получите его методом .Получить() и запишите в файл методом .Записать().Где в 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 так же, как объекты обычной конфигурации.
- Откройте Конфигуратор нужной базы (или пустой базы подходящей версии).
- Меню
Файл → Открыть, выберите файл обработки или отчёта. - В дереве слева раскройте объект: реквизиты, табличные части, формы, макеты, модуль объекта.
- Двойным щелчком по модулю откройте код. Для поиска по тексту используйте
Правка → Глобальный поиск(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. Конфигуратор лучше подходит для одной обработки и отладки.