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

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

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

Почему нельзя просто открыть файл обработки в текстовом редакторе

Проанализируем структуру файлов внешних обработок. Файлы с расширением .epf (обработки) и .erf (отчеты) представляют собой специализированное структурированное хранилище (Compound File). Этот формат аналогичен формату файлов конфигурации .cf. Если вы попробуете открыть такой файл через Notepad++, то увидите бинарные данные или «кракозябры». Это происходит потому, что содержимое внутри контейнера сжато алгоритмом Deflate (zlib).

Внутри этого контейнера находятся различные потоки данных:

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

Способ 1: Использование штатного пакетного режима Конфигуратора

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

Для выгрузки обработки в файлы используем команду /DumpExternalDataProcessorOrReportToFiles. Рассмотрим пример командной строки:


"C:\Program Files\1cv8\8.3.x.x\bin\1cv8.exe" DESIGNER /F "D:\Base1C" /N "Admin" /P "Pass" /DumpExternalDataProcessorOrReportToFiles "D:\Unpacked\MyReport" "D:\External\MyReport.erf"

После выполнения этой команды в папке D:\Unpacked\MyReport появится древовидная структура XML-файлов и текстовых файлов с расширением .bsl. Именно в файлах .bsl хранится программный код модулей в обычном текстовом виде (UTF-8).

Теперь мы можем программно (например, скриптом на Python или на самой 1С) найти нужный фрагмент кода и заменить его или вставить новый. После внесения правок необходимо собрать обработку обратно, используя команду /LoadExternalDataProcessorOrReportFromFiles:


"C:\Program Files\1cv8\8.3.x.x\bin\1cv8.exe" DESIGNER /F "D:\Base1C" /N "Admin" /P "Pass" /LoadExternalDataProcessorOrReportFromFiles "D:\Unpacked\MyReport" "D:\External\MyReport_Modified.erf"

Преимущества этого способа: гарантированная корректность структуры файла, так как сборку выполняет сама платформа.

Способ 2: Использование утилиты v8unpack и современных аналогов

Проанализируем ситуацию, когда запуск Конфигуратора неудобен (например, процесс должен происходить на сервере без установленной платформы или в среде CI/CD). В этом случае помогут сторонние утилиты для разборки контейнеров.

Одной из самых известных является v8unpack. Она позволяет распаковать файл .epf до состояния текстовых потоков. Посмотрим на алгоритм работы с ней:

  1. Распаковываем основной контейнер в промежуточную папку.
  2. Распаковываем вложенные сжатые файлы (те самые потоки с кодом).
  3. Находим файл с модулем (обычно это текстовый файл без расширения внутри структуры).
  4. Вносим изменения.
  5. Выполняем упаковку в обратном порядке.

Сегодня на смену классическому v8unpack пришли более продвинутые инструменты, такие как V8FilesExtractor или библиотеки для OneScript. Рассмотрим подробнее подход с OneScript. Это среда исполнения языка 1С вне платформы, которая позволяет писать скрипты для автоматизации подобных задач.

Пример логики скрипта на OneScript для массовой правки:


// Пример логики (псевдокод)
Для Каждого ФайлИзПапки Из МассивФайлов Цикл
    // Используем библиотеку v8unpack для OneScript
    Утилита.Распаковать(ФайлИзПапки.ПолноеИмя, ПутьРаспаковки);
    
    ТекстМодуля = ЧтениеТекста.Прочитать(ПутьРаспаковки + "/Module.bsl");
    Если Найти(ТекстМодуля, "Процедура Старая()") > 0 Тогда
        ТекстМодуля = СтрЗаменить(ТекстМодуля, "Процедура Старая()", "Процедура Новая()");
        ЗаписьТекста.Записать(ПутьРаспаковки + "/Module.bsl", ТекстМодуля);
    КонецЕсли;
    
    Утилита.Запаковать(ПутьРаспаковки, ФайлИзПапки.ПолноеИмя);
КонецЦикла;

Способ 3: Глобальная замена в Конфигураторе

Если ваша задача сводится к замене одной строки на другую (например, вызов одной процедуры на другую), выясним, можно ли обойтись стандартным поиском. В Конфигураторе есть инструмент «Глобальный поиск и замена».

Важно помнить: чтобы Конфигуратор «увидел» внешние обработки при глобальном поиске, они должны быть добавлены в состав текущей конфигурации или открыты в редакторе. Однако для сотен файлов этот метод не подходит, так как он требует интерактивного подтверждения или предварительного открытия всех файлов. Именно поэтому пакетная выгрузка в файлы (Способ 1) является приоритетной.

Архитектурный совет: как избежать подобных задач в будущем

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

  1. Использование общих модулей: Если обработки используются в одной конкретной базе, вынесите общую процедуру в ОбщийМодуль конфигурации. В самих обработках оставьте только вызов: ИмяОбщегоМодуля.ОбщаяПроцедура(Параметры);.
  2. Внешняя библиотека функций: Создайте одну «базовую» внешнюю обработку, в которой сосредоточена вся логика. Остальные обработки будут подключать её динамически:
    
    Библиотека = ВнешниеОбработки.Создать("C:\Libs\GlobalLogic.epf");
    Библиотека.ВыполнитьНужнуюФункцию();
    
  3. Механизм расширений: Используйте расширения конфигурации для перехвата вызовов или добавления общей логики, которая будет доступна всем внешним объектам.

Важное замечание по безопасности: Если вы столкнулись с файлами, в которых при сохранении была установлена опция «Без исходных текстов», то внутри контейнера вы обнаружите не читаемый текст модуля, а байт-код. В этом случае обычное текстовое редактирование невозможно. Вам потребуется декомпилятор, однако восстановленный код может потерять комментарии и оригинальные имена переменных, что сильно усложнит поддержку.

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

← На главную