Как программно или пакетно изменить код в модулях внешних обработок (EPF)?

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

При сопровождении множества информационных баз или при обновлении платформы 1С разработчики нередко сталкиваются с ситуацией, когда десятки внешних отчетов и обработок (файлы .epf и .erpf) требуют однотипной правки исходного кода. Выполнять такие изменения вручную через открытие каждого файла в Конфигураторе долго и трудоемко. Рассмотрим, почему возникает необходимость массовой корректировки кода, с какими ограничениями платформы приходится сталкиваться и какими практическими способами можно автоматизировать замену текста модулей.

Причина проблемы: снятие режима совместимости и ошибка ХранилищаЗначения

Выясним причину, которая чаще всего приводит к массовой поломке внешних обработок при переходе на новые версии платформы. При повышении версии или полном снятии режима совместимости нередко перестает выполняться код вида:

Хранилище = Новый ХранилищеЗначения(СохраняемыйОбъект);

В этот момент платформа вызывает исключение: «Переданное значение не может быть помещено в ХранилищеЗначения, поскольку не сериализуется или содержит вложенный несериализуемый элемент».

Разберем механизм возникновения этой ошибки. Платформа 1С строго разделяет операции сериализации и десериализации:

  1. Асимметрия сериализации: для обеспечения обратной совместимости платформа умеет читать (распаковывать) ранее сохраненные данные практически любых типов, даже устаревших. Однако при вызове конструктора Новый ХранилищеЗначения(...) выполняется строгая валидация. Если переданный тип утратил статус сериализуемого в новом режиме совместимости, повторная запись блокируется.
  2. Несериализуемые типы: чаще всего проблему вызывают такие объекты, как ПостроительОтчета, ПостроительЗапроса, таблицы и деревья значений с колонками несериализуемых типов, элементы форм, контексты динамических списков, COM-объекты или структуры, куда разработчики случайно поместили ссылки на элементы управления интерфейса.

Чтобы восстановить работоспособность, требуется зайти в модуль обработки и перед помещением в ХранилищеЗначения либо очистить объект от несериализуемых реквизитов, либо перевести сохранение параметров на сериализуемые типы (например, строки XML через СериализаторXDTO или структуры с примитивными типами данных).

Ограничения платформы: почему нельзя изменить код прямо в сеансе 1С:Предприятия

Проанализируем архитектурные ограничения встроенного языка. В среде «1С:Предприятие» объект ВнешняяОбработкаОбъект предназначен исключительно для запуска алгоритмов и чтения реквизитов. Встроенный язык не предоставляет объектной модели для правки метаданных или изменения текста модулей открытой обработки «на лету».

Файл .epf представляет собой структурированный контейнер (compound document), в котором программные модули хранятся в виде сжатых потоков данных (сжатие zlib/deflate). Поэтому просто перезаписать файл текстовым редактором или выполнить строковую замену в двоичных данных без распаковки контейнера невозможно. Для модификации модулей применяются внешние инструменты или штатный пакетный режим Конфигуратора.

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

Штатный механизм платформы 1С позволяет выгружать внешние отчеты и обработки в набор исходных файлов и собирать их обратно в бинарный файл .epf через командную строку. Модули при этом сохраняются в виде обычных текстовых файлов с расширением .bsl в кодировке UTF-8.

Разберем последовательность действий:

  1. Выгрузка обработки в исходные файлы: запускаем Конфигуратор с параметром /DumpExternalDataProcessorOrReportToFiles:
    
    "C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" DESIGNER /IBConnectionString "..." /DumpExternalDataProcessorOrReportToFiles "C:\Source\Files" "C:\Processors\MyProcessor.epf"
    
  2. Замена текста модуля: после выполнения команды в каталоге выгрузки появится файл модуля с расширением .bsl. Теперь любой скрипт, регулярное выражение или программа на любом доступном языке может открыть текстовый файл, найти нужные строки кода и перезаписать их.
  3. Сборка обработки обратно: выполняем обратную сборку модифицированных файлов в результирующий .epf с помощью параметра /LoadExternalDataProcessorOrReportFromFiles:
    
    "C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" DESIGNER /IBConnectionString "..." /LoadExternalDataProcessorOrReportFromFiles "C:\Processors\MyProcessor_Updated.epf" "C:\Source\Files"
    

Обратите внимание: данный способ требует свободной клиентской лицензии на запуск Конфигуратора и прав на исполнение внешних процессов операционной системы.

Способ 2. Автоматизация разборки и сборки через OneScript

Если требуется обработать каталог с сотнями внешних обработок без ручного вызова Конфигуратора для каждого файла, удобно использовать скрипты на базе OneScript (oscript). Данный подход широко распространен в среде непрерывной интеграции (CI/CD):

  1. Скрипт перебирает все файлы с расширением *.epf в заданном каталоге.
  2. Для каждого файла вызывается утилита разборки (пакетный режим Конфигуратора либо низкоуровневые утилиты сборки/разборки контейнеров v8, например, v8unpack).
  3. Скрипт читает полученный .bsl файл, производит замену проблемных участков кода (например, исправляет вызов Новый ХранилищеЗначения).
  4. Производится сборка обработок обратно в контейнеры .epf.

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

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

Если количество внешних обработок невелико и они расположены в общей сетевой или локальной папке, можно воспользоваться встроенным интерактивным инструментом Конфигуратора:

  1. В главном меню Конфигуратора выбираем пункт Правка — Глобальный поиск (или сочетание клавиш Ctrl + Shift + F).
  2. В поле «Искать» вводим строку, требующую замены.
  3. В области поиска переключаем радиокнопку на «В файлах» и указываем путь к каталогу с внешними обработками.
  4. В поле маски файлов задаем *.epf.
  5. На вкладке параметров замены задаем новый текст модуля и выполняем операцию «Заменить».

Платформа сама откроет контейнеры, внесет изменения в модули и сохранит файлы. Этот способ отлично подходит для разовых оперативных правок без написания командных сценариев.

Альтернатива: централизованное обновление обработок через БСП

Если внешние отчеты и обработки подключены в конфигурации на базе Библиотеки стандартных подсистем (в справочнике ДополнительныеОтчетыИОбработки), файлы обработок физически хранятся внутри базы данных в реквизите с типом ХранилищеЗначения.

В этом случае нет необходимости ходить по рабочим местам пользователей и менять локальные файлы. Достаточно подготовить обновленный эталонный файл обработки, поместить его в макет конфигурации и написать штатную процедуру обновления информационной базы (обработчик обновления), которая программно заменит двоичные данные в справочнике ДополнительныеОтчетыИОбработки во время первого запуска обновленной конфигурации.

← На главную