При длительной работе с платформой 1С у любого разработчика накапливается внушительный архив внешних отчетов (.erf) и обработок (.epf). Со временем возникает необходимость систематизировать эти наработки: найти дублирующийся код, выявить используемые методы или просто провести ревизию логики без ручного открытия каждого файла в конфигураторе. В этой статье мы подробно разберем, как автоматизировать процесс получения исходного кода из бинарных файлов 1С.
Наиболее надежный и «легальный» способ программного получения текста модулей — использование встроенных возможностей платформы 1С. Начиная с версии 8.3.12, в платформе реализован специальный ключ командной строки для выгрузки внешних файлов в текстовый формат (XML). Рассмотрим, как это работает.
Для автоматизации мы можем использовать команду /DumpExternalDataProcessorOrReportToFiles. Проанализируем структуру команды:
"C:\Program Files\1cv8\8.3.x.x\bin\1cv8.exe" DESIGNER /F "ПутьКБазе" /N "Логин" /P "Пароль" /DumpExternalDataProcessorOrReportToFiles "ПутьКПапкеВыгрузки" "ПутьКФайлуОбработки"
Разберем по шагам, что происходит при выполнении этой команды. Платформа запускается в режиме «Конфигуратор» (DESIGNER), подключается к указанной базе и выполняет экспорт структуры обработки в указанный каталог. В результате вы получите набор XML-файлов, среди которых будут и тексты модулей.
Важный момент: Текст модуля в таких XML-файлах обычно находится внутри тега sourceText. Рассмотрим пример структуры результирующего файла:
<Subsystems/>
<Properties>
<Name>МояОбработка</Name>
</Properties>
<ChildObjects>
<Module>
<sourceText>
// Здесь будет ваш программный код на 1С
Процедура ПриКомпоновкеРезультата(...)
...
</sourceText>
</Module>
</ChildObjects>
Для массовой обработки сотен файлов мы рекомендуем написать простой скрипт на языке 1С или cmd/PowerShell, который в цикле будет обходить папку с вашими .epf и запускать конфигуратор для каждого файла.
Если вам нужно решение «красивее» и быстрее, чем запуск тяжелого конфигуратора для каждого файла, обратим внимание на OneScript. Это независимый движок, позволяющий исполнять код на языке 1С вне среды самой платформы. Для него сообществом разработана отличная библиотека v8files-extractor.
Проанализируем преимущества этого подхода:
.bsl.Пример использования в командной строке после установки OneScript:
oscript v8files-extractor.os extract --src "C:\MyReports" --dest "C:\ExtractedCode"
После выполнения этой команды вы получите четкую структуру папок, где для каждой вашей обработки будет создан отдельный каталог с чистым текстовым кодом. Это идеальный формат для последующего поиска через grep или любыми средствами полнотекстового поиска.
Для тех, кто хочет понимать внутреннее устройство файлов 1С, существует классический инструмент — V8Unpack. Эта утилита позволяет «распаковать» бинарный контейнер обработки на составляющие потоки данных.
Выясним причину, по которой этот способ до сих пор актуален. Файлы .epf и .erf — это структурированные хранилища (compound files). Внутри них модули хранятся в сжатом виде. V8Unpack последовательно выполняет следующие действия:
-unpack).-inflate).Хотя этот инструмент требует больше «ручной» работы по парсингу имен файлов внутри контейнера, он позволяет добраться до кода даже в тех случаях, когда штатные средства платформы дают сбой или работают слишком медленно. Для этой задачи также подойдет инструмент для распаковки файлов внешних обработок и конфигураций.
Рассмотрим современный профессиональный подход. Если ваша цель не просто «посмотреть строки», а провести качественную систематизацию, воспользуйтесь 1C:EDT на базе Eclipse.
Разберем алгоритм действий:
Search -> File.... Вы сможете искать вхождения методов, переменных или строковых констант сразу по всем файлам с использованием регулярных выражений.Кроме того, EDT сразу подсветит ошибки синтаксиса и неиспользуемые переменные, что само по себе является отличным инструментом для code review.
Многие разработчики ищут способ получить текст модуля прямо в коде 1С, используя объектную модель Метаданные. К сожалению, напрямую свойство МодульОбъекта в рантайме недоступно для чтения как строка. Однако можно использовать хитрость с объектом V83.Application через COM-соединение, если ваша цель — создать некую внутреннюю «читалку» кода.
Но наиболее эффективным «внутренним» решением будет использование обработки V8Reader. Рассмотрим принцип её работы: она программно эмулирует парсинг структуры файла, находит нужные смещения (offsets) в бинарном файле, где лежит текст модуля, и выводит его в текстовое поле формы. Это позволяет просматривать код, не выходя из режима «Предприятие».
Подведем итог: для разовой задачи систематизации лучше всего подойдет выгрузка в файлы через пакетный режим конфигуратора или OneScript. Это даст вам набор обычных текстовых файлов, с которыми можно работать любыми привычными инструментами — от блокнота до систем контроля версий и статических анализаторов кода (таких как SonarQube с плагином для 1С). При необходимости можно воспользоваться инструментом для статического анализа кода обработок и отчетов.