Как программно выгрузить тексты модулей из внешних обработок и отчетов 1С в текстовые файлы

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

При сопровождении крупных систем на базе 1С, таких как УПП 1.2 или современные редакции ERP, программисты часто сталкиваются с накоплением огромного количества внешних печатных форм, отчетов и обработок. Со временем возникает необходимость провести полную ревизию этого кода: найти огрехи, устаревшие конструкции или специфические ошибки. Открывать вручную каждую из 300 обработок в Конфигураторе — задача крайне трудозатратная. В этой статье мы разберем, как автоматизировать процесс выгрузки программного кода всех внешних файлов в текстовый формат для последующего анализа.

Ограничения встроенного языка 1С

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

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

Способ 1: Пакетный режим Конфигуратора (версии 8.3.7 и выше)

Начиная с версии платформы 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"

Разберем параметры по шагам:

  1. DESIGNER — запуск в режиме Конфигуратора.
  2. /F "C:\Bases\EmptyBase" — путь к файловой информационной базе. Выясним важный нюанс: платформа отказывается выполнять выгрузку без указания базы. Рекомендуем создать пустую базу специально для таких технических нужд.
  3. /DumpExternalDataProcessorOrReportToFiles — основной ключ, указывающий на необходимость разборки файла.
  4. Первый аргумент после ключа ("C:\Export\MyReportFiles") — это папка, куда будут помещены исходники.
  5. Второй аргумент ("C:\ExternalFiles\MyReport.erf") — путь к исходному файлу внешней обработки или отчета.
  6. /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 """ + ПутьКРезультату + """ """ + Файл.ПолноеИмя + """";
    ЗапуститьПриложение(КомандаЗапуска, , Истина); // Ждем завершения каждого процесса
КонецЦикла;

Способ 2: Использование сторонних утилит (V8Unpack и V8Reader)

До появления штатного механизма в платформе 8.3.7, программисты использовали утилиты сообщества, такие как V8Unpack. Эти инструменты работают напрямую со структурой файла 1С, который, по сути, является упакованным хранилищем. Рассмотрим, в чем их преимущество:

Одной из популярных доработок является V8Reader — это внешняя обработка 1С, которая служит графической оболочкой над V8Unpack. С её помощью можно массово «распаковать» файлы и собрать тексты модулей в одну структуру для поиска (например, с помощью программ типа Grep или Total Commander). В качестве альтернативного решения для распаковки файлов без запуска 1С подойдёт утилита для разборки файлов 1С.

Способ 3: Современные инструменты (OneScript и EDT)

Если вы идете в ногу со временем, обратите внимание на OneScript. Это независимая среда исполнения скриптов на языке 1С. Для неё написаны библиотеки (например, v8reader в виде консольной утилиты), которые позволяют разбирать файлы одной командой в терминале. Это стандарт де-факто для систем контроля версий (Git), где файлы .epf обязательно нужно хранить в разобранном текстовом виде, чтобы видеть историю изменений каждой строки кода.

Также не стоит забывать про 1C:Enterprise Development Tools (EDT). Если вы импортируете внешнюю обработку в проект EDT, среда автоматически разложит её на составляющие. В проводнике проекта вы увидите папку Pyramids (или аналогичную), где каждый модуль будет представлен отдельным файлом .bsl. В EDT очень удобно использовать глобальный поиск по всем модулям проекта для поиска тех самых «огрехов», о которых упоминал автор темы.

Обратная загрузка модулей

Часто задача стоит не только в выгрузке, но и в автоматизированном внесении правок. Выясним, как собрать файл обратно из измененных текстовых исходников. Для этого используется симметричный ключ:


/LoadExternalDataProcessorOrReportFromFiles "C:\Export\MyReportFiles" "C:\ExternalFiles\MyNewReport.erf"

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

Нюанс с хранением в справочниках (БСП)

Проанализируем ситуацию, когда обработки хранятся не на диске, а внутри базы данных (справочник «Дополнительные отчеты и обработки»). В этом случае алгоритм действий будет следующим:

  1. Программно извлечь двоичные данные из реквизита справочника (обычно это ХранилищеЗначения).
  2. Сохранить эти данные во временный файл на диске с расширением .epf или .erf.
  3. Применить к этому файлу описанный выше метод /DumpExternalDataProcessorOrReportToFiles.

Таким образом, мы выяснили, что наиболее эффективным современным способом является использование штатных ключей командной строки платформы 8.3. Это гарантирует корректность разбора и избавляет от необходимости поиска стороннего софта. Для массовой обработки используйте простые циклы обхода файлов, и задача по ревизии сотен модулей превратится из многодневной рутины в автоматический процесс, занимающий несколько минут.

← На главную