При работе с большим количеством внешних печатных форм или обработок заполнения табличных частей часто возникает задача внести однотипные изменения в программный код. Если таких файлов десятки или сотни, открывать каждый из них в Конфигураторе, вносить изменения и сохранять — крайне неэффективно. В этой статье мы подробно разберем, как автоматизировать этот процесс, изучим структуру файлов .epf и .erf и рассмотрим инструменты для работы с ними как с обычным текстом.
Проанализируем структуру файлов внешних обработок. Файлы с расширением .epf (обработки) и .erf (отчеты) представляют собой специализированное структурированное хранилище (Compound File). Этот формат аналогичен формату файлов конфигурации .cf. Если вы попробуете открыть такой файл через Notepad++, то увидите бинарные данные или «кракозябры». Это происходит потому, что содержимое внутри контейнера сжато алгоритмом Deflate (zlib).
Внутри этого контейнера находятся различные потоки данных:
Чтобы программно изменить код, нам нужно сначала извлечь его из этого контейнера, отредактировать и собрать файл обратно.
Разберем самый надежный и «родной» способ, который предоставили разработчики платформы начиная с версии 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"
Преимущества этого способа: гарантированная корректность структуры файла, так как сборку выполняет сама платформа.
Проанализируем ситуацию, когда запуск Конфигуратора неудобен (например, процесс должен происходить на сервере без установленной платформы или в среде CI/CD). В этом случае помогут сторонние утилиты для разборки контейнеров.
Одной из самых известных является v8unpack. Она позволяет распаковать файл .epf до состояния текстовых потоков. Посмотрим на алгоритм работы с ней:
Сегодня на смену классическому v8unpack пришли более продвинутые инструменты, такие как V8FilesExtractor или библиотеки для OneScript. Рассмотрим подробнее подход с OneScript. Это среда исполнения языка 1С вне платформы, которая позволяет писать скрипты для автоматизации подобных задач.
Пример логики скрипта на OneScript для массовой правки:
// Пример логики (псевдокод)
Для Каждого ФайлИзПапки Из МассивФайлов Цикл
// Используем библиотеку v8unpack для OneScript
Утилита.Распаковать(ФайлИзПапки.ПолноеИмя, ПутьРаспаковки);
ТекстМодуля = ЧтениеТекста.Прочитать(ПутьРаспаковки + "/Module.bsl");
Если Найти(ТекстМодуля, "Процедура Старая()") > 0 Тогда
ТекстМодуля = СтрЗаменить(ТекстМодуля, "Процедура Старая()", "Процедура Новая()");
ЗаписьТекста.Записать(ПутьРаспаковки + "/Module.bsl", ТекстМодуля);
КонецЕсли;
Утилита.Запаковать(ПутьРаспаковки, ФайлИзПапки.ПолноеИмя);
КонецЦикла;
Если ваша задача сводится к замене одной строки на другую (например, вызов одной процедуры на другую), выясним, можно ли обойтись стандартным поиском. В Конфигураторе есть инструмент «Глобальный поиск и замена».
Важно помнить: чтобы Конфигуратор «увидел» внешние обработки при глобальном поиске, они должны быть добавлены в состав текущей конфигурации или открыты в редакторе. Однако для сотен файлов этот метод не подходит, так как он требует интерактивного подтверждения или предварительного открытия всех файлов. Именно поэтому пакетная выгрузка в файлы (Способ 1) является приоритетной.
Выясним причину, по которой нам приходится править сотни файлов. Если во множестве внешних обработок дублируется одна и та же процедура, это признак избыточности кода. Рассмотрим, как это оптимизировать:
ОбщийМодуль конфигурации. В самих обработках оставьте только вызов: ИмяОбщегоМодуля.ОбщаяПроцедура(Параметры);.
Библиотека = ВнешниеОбработки.Создать("C:\Libs\GlobalLogic.epf");
Библиотека.ВыполнитьНужнуюФункцию();
Важное замечание по безопасности: Если вы столкнулись с файлами, в которых при сохранении была установлена опция «Без исходных текстов», то внутри контейнера вы обнаружите не читаемый текст модуля, а байт-код. В этом случае обычное текстовое редактирование невозможно. Вам потребуется декомпилятор, однако восстановленный код может потерять комментарии и оригинальные имена переменных, что сильно усложнит поддержку.
Таким образом, для массового редактирования мы рекомендуем использовать пакетный режим Конфигуратора в связке со скриптом на любом удобном языке программирования для модификации текстовых .bsl файлов. Это обеспечит стабильность результата и позволит быстро обрабатывать любое количество внешних отчетов и обработок.