При сопровождении крупных систем на базе 1С, таких как УПП 1.2 или современные редакции ERP, программисты часто сталкиваются с накоплением огромного количества внешних печатных форм, отчетов и обработок. Со временем возникает необходимость провести полную ревизию этого кода: найти огрехи, устаревшие конструкции или специфические ошибки. Открывать вручную каждую из 300 обработок в Конфигураторе — задача крайне трудозатратная. В этой статье мы разберем, как автоматизировать процесс выгрузки программного кода всех внешних файлов в текстовый формат для последующего анализа.
Прежде всего, проанализируем стандартные возможности встроенного языка. Если мы попытаемся обратиться к объекту метаданных внешней обработки программно, например, через свойство МодульОбъекта, мы столкнемся с ограничением платформы. Как указано в документации, тип этого свойства — Неопределено, и работа с ним во встроенном языке не предусмотрена. Свойство доступно только для чтения и не позволяет получить текст модуля напрямую в переменную.
Следовательно, для решения нашей задачи нам придется выйти за рамки обычного пользовательского режима и воспользоваться возможностями пакетного запуска Конфигуратора или специализированными утилитами.
Начиная с версии платформы 8.3.7, разработчики добавили штатную возможность выгрузки внешних файлов на исходные составляющие (включая модули в формате .bsl и описания в .xml). Это самый надежный и «чистый» способ, так как он использует механизмы самой платформы.
Для выгрузки используется ключ командной строки /DumpExternalDataProcessorOrReportToFiles. Рассмотрим синтаксис этой команды подробнее. Нам потребуется указать путь к информационной базе (даже если мы работаем с внешним файлом, база необходима для запуска контекста Конфигуратора), каталог назначения и путь к самому файлу обработки.
Проанализируем пример команды для запуска из командной строки Windows:
"C:\Program Files\1cv8\8.3.X.XXXX\bin\1cv8.exe" DESIGNER /F "C:\Bases\EmptyBase" /DumpExternalDataProcessorOrReportToFiles "C:\Export\MyReportFiles" "C:\ExternalFiles\MyReport.erf" /Out "C:\Export\log.txt"
Разберем параметры по шагам:
DESIGNER — запуск в режиме Конфигуратора./F "C:\Bases\EmptyBase" — путь к файловой информационной базе. Выясним важный нюанс: платформа отказывается выполнять выгрузку без указания базы. Рекомендуем создать пустую базу специально для таких технических нужд./DumpExternalDataProcessorOrReportToFiles — основной ключ, указывающий на необходимость разборки файла."C:\Export\MyReportFiles") — это папка, куда будут помещены исходники."C:\ExternalFiles\MyReport.erf") — путь к исходному файлу внешней обработки или отчета./Out "C:\Export\log.txt" — файл лога, в который запишутся ошибки, если что-то пойдет не так (например, если файл поврежден).Если нам нужно обработать целый каталог с 300 файлами, мы можем написать простой .bat скрипт, который в цикле будет вызывать Конфигуратор для каждого файла. Однако стоит помнить, что запуск Конфигуратора — процедура тяжелая, и для большого количества файлов это может занять значительное время.
Пример логики скрипта на встроенном языке 1С, который формирует такую команду для всех файлов в папке:
КаталогФайлов = "D:\AllExternalForms\";
МассивФайлов = НайтиФайлы(КаталогФайлов, "*.epf"); // Ищем все обработки
Для Каждого Файл Из МассивФайлов Цикл
ПутьКРезультату = "D:\OutText\" + Файл.ИмяБезРасширения;
КомандаЗапуска = """C:\Program Files\1cv8\8.3.10.2561\bin\1cv8.exe"" DESIGNER /F ""D:\Base1C"" /DumpExternalDataProcessorOrReportToFiles """ + ПутьКРезультату + """ """ + Файл.ПолноеИмя + """";
ЗапуститьПриложение(КомандаЗапуска, , Истина); // Ждем завершения каждого процесса
КонецЦикла;
До появления штатного механизма в платформе 8.3.7, программисты использовали утилиты сообщества, такие как V8Unpack. Эти инструменты работают напрямую со структурой файла 1С, который, по сути, является упакованным хранилищем. Рассмотрим, в чем их преимущество:
Одной из популярных доработок является V8Reader — это внешняя обработка 1С, которая служит графической оболочкой над V8Unpack. С её помощью можно массово «распаковать» файлы и собрать тексты модулей в одну структуру для поиска (например, с помощью программ типа Grep или Total Commander). В качестве альтернативного решения для распаковки файлов без запуска 1С подойдёт утилита для разборки файлов 1С.
Если вы идете в ногу со временем, обратите внимание на OneScript. Это независимая среда исполнения скриптов на языке 1С. Для неё написаны библиотеки (например, v8reader в виде консольной утилиты), которые позволяют разбирать файлы одной командой в терминале. Это стандарт де-факто для систем контроля версий (Git), где файлы .epf обязательно нужно хранить в разобранном текстовом виде, чтобы видеть историю изменений каждой строки кода.
Также не стоит забывать про 1C:Enterprise Development Tools (EDT). Если вы импортируете внешнюю обработку в проект EDT, среда автоматически разложит её на составляющие. В проводнике проекта вы увидите папку Pyramids (или аналогичную), где каждый модуль будет представлен отдельным файлом .bsl. В EDT очень удобно использовать глобальный поиск по всем модулям проекта для поиска тех самых «огрехов», о которых упоминал автор темы.
Часто задача стоит не только в выгрузке, но и в автоматизированном внесении правок. Выясним, как собрать файл обратно из измененных текстовых исходников. Для этого используется симметричный ключ:
/LoadExternalDataProcessorOrReportFromFiles "C:\Export\MyReportFiles" "C:\ExternalFiles\MyNewReport.erf"
Эта команда соберет новый файл .erf на основе тех текстовых файлов, которые вы отредактировали. Это позволяет реализовать цикл: выгрузка -> автоматическая замена текста (например, замена имени функции) -> сборка. Для автоматизации такого цикла можно использовать обработку для массовой правки модулей внешних обработок через Конфигуратор.
Проанализируем ситуацию, когда обработки хранятся не на диске, а внутри базы данных (справочник «Дополнительные отчеты и обработки»). В этом случае алгоритм действий будет следующим:
.epf или .erf./DumpExternalDataProcessorOrReportToFiles.Таким образом, мы выяснили, что наиболее эффективным современным способом является использование штатных ключей командной строки платформы 8.3. Это гарантирует корректность разбора и избавляет от необходимости поиска стороннего софта. Для массовой обработки используйте простые циклы обхода файлов, и задача по ревизии сотен модулей превратится из многодневной рутины в автоматический процесс, занимающий несколько минут.