При сопровождении множества информационных баз или при обновлении платформы 1С разработчики нередко сталкиваются с ситуацией, когда десятки внешних отчетов и обработок (файлы .epf и .erpf) требуют однотипной правки исходного кода. Выполнять такие изменения вручную через открытие каждого файла в Конфигураторе долго и трудоемко. Рассмотрим, почему возникает необходимость массовой корректировки кода, с какими ограничениями платформы приходится сталкиваться и какими практическими способами можно автоматизировать замену текста модулей.
Выясним причину, которая чаще всего приводит к массовой поломке внешних обработок при переходе на новые версии платформы. При повышении версии или полном снятии режима совместимости нередко перестает выполняться код вида:
Хранилище = Новый ХранилищеЗначения(СохраняемыйОбъект);
В этот момент платформа вызывает исключение: «Переданное значение не может быть помещено в ХранилищеЗначения, поскольку не сериализуется или содержит вложенный несериализуемый элемент».
Разберем механизм возникновения этой ошибки. Платформа 1С строго разделяет операции сериализации и десериализации:
Новый ХранилищеЗначения(...) выполняется строгая валидация. Если переданный тип утратил статус сериализуемого в новом режиме совместимости, повторная запись блокируется.ПостроительОтчета, ПостроительЗапроса, таблицы и деревья значений с колонками несериализуемых типов, элементы форм, контексты динамических списков, COM-объекты или структуры, куда разработчики случайно поместили ссылки на элементы управления интерфейса.Чтобы восстановить работоспособность, требуется зайти в модуль обработки и перед помещением в ХранилищеЗначения либо очистить объект от несериализуемых реквизитов, либо перевести сохранение параметров на сериализуемые типы (например, строки XML через СериализаторXDTO или структуры с примитивными типами данных).
Проанализируем архитектурные ограничения встроенного языка. В среде «1С:Предприятие» объект ВнешняяОбработкаОбъект предназначен исключительно для запуска алгоритмов и чтения реквизитов. Встроенный язык не предоставляет объектной модели для правки метаданных или изменения текста модулей открытой обработки «на лету».
Файл .epf представляет собой структурированный контейнер (compound document), в котором программные модули хранятся в виде сжатых потоков данных (сжатие zlib/deflate). Поэтому просто перезаписать файл текстовым редактором или выполнить строковую замену в двоичных данных без распаковки контейнера невозможно. Для модификации модулей применяются внешние инструменты или штатный пакетный режим Конфигуратора.
Штатный механизм платформы 1С позволяет выгружать внешние отчеты и обработки в набор исходных файлов и собирать их обратно в бинарный файл .epf через командную строку. Модули при этом сохраняются в виде обычных текстовых файлов с расширением .bsl в кодировке UTF-8.
Разберем последовательность действий:
/DumpExternalDataProcessorOrReportToFiles:
"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" DESIGNER /IBConnectionString "..." /DumpExternalDataProcessorOrReportToFiles "C:\Source\Files" "C:\Processors\MyProcessor.epf"
.bsl. Теперь любой скрипт, регулярное выражение или программа на любом доступном языке может открыть текстовый файл, найти нужные строки кода и перезаписать их..epf с помощью параметра /LoadExternalDataProcessorOrReportFromFiles:
"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" DESIGNER /IBConnectionString "..." /LoadExternalDataProcessorOrReportFromFiles "C:\Processors\MyProcessor_Updated.epf" "C:\Source\Files"
Обратите внимание: данный способ требует свободной клиентской лицензии на запуск Конфигуратора и прав на исполнение внешних процессов операционной системы.
Если требуется обработать каталог с сотнями внешних обработок без ручного вызова Конфигуратора для каждого файла, удобно использовать скрипты на базе OneScript (oscript). Данный подход широко распространен в среде непрерывной интеграции (CI/CD):
*.epf в заданном каталоге.v8unpack)..bsl файл, производит замену проблемных участков кода (например, исправляет вызов Новый ХранилищеЗначения)..epf.Этот метод исключает рутинные действия и позволяет встроить обновление внешних обработок в единый пайплайн подготовки релизов.
Если количество внешних обработок невелико и они расположены в общей сетевой или локальной папке, можно воспользоваться встроенным интерактивным инструментом Конфигуратора:
Ctrl + Shift + F).*.epf.Платформа сама откроет контейнеры, внесет изменения в модули и сохранит файлы. Этот способ отлично подходит для разовых оперативных правок без написания командных сценариев.
Если внешние отчеты и обработки подключены в конфигурации на базе Библиотеки стандартных подсистем (в справочнике ДополнительныеОтчетыИОбработки), файлы обработок физически хранятся внутри базы данных в реквизите с типом ХранилищеЗначения.
В этом случае нет необходимости ходить по рабочим местам пользователей и менять локальные файлы. Достаточно подготовить обновленный эталонный файл обработки, поместить его в макет конфигурации и написать штатную процедуру обновления информационной базы (обработчик обновления), которая программно заменит двоичные данные в справочнике ДополнительныеОтчетыИОбработки во время первого запуска обновленной конфигурации.