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

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

Разберем актуальную задачу автоматизации разработки в среде «1С:Предприятие 8». Довольно часто в процессе настройки систем непрерывной интеграции (CI/CD) или при регулярных доработках возникает необходимость обновить конкретную внутреннюю обработку конфигурации, используя готовый файл внешней обработки (формата .epf). Выполнять эти действия вручную через конфигуратор (команда контекстного меню «Заменить на внешнюю обработку») неэффективно, особенно если процесс нужно поставить на поток. Нам требуется полностью автоматическое решение, запускаемое из командной строки.

Стандартный интерфейс командной строки конфигуратора 1С не имеет прямой "секретной" команды вида /ReplaceWithExternalProcessing. Тем не менее эту задачу можно решить автоматическими средствами платформы. Проанализируем два наиболее надежных технических сценария: пакетное объединение конфигураций и частичную загрузку через XML-файлы метаданных.

Способ 1. Объединение конфигураций через пакетный ключ /MergeCfg

Рассмотрим первый метод, который основан на штатном механизме сравнения и объединения конфигураций. Он отлично подходит, если мы хотим действовать в рамках стандартных возможностей конфигуратора, не прибегая к ручной модификации структуры XML-файлов.

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

Разберем по шагам алгоритм настройки этого процесса:

  1. Создание эталонного файла конфигурации. Создадим пустую файловую базу данных (базу-донор). В ее конфигурации должна быть создана обработка с точно таким же именем, как и в целевой базе данных (например, Обработка1). Сохраним эту конфигурацию в файл template.cf. Это действие выполняется один раз.
  2. Автоматическое обновление базы-донора. При изменении нашей внешней обработки Обработка1.epf мы можем программно (например, через COM-соединение или временный запуск конфигуратора с автозапуском внешней обработки) загрузить ее код в базу-донор. Либо мы можем подготовить мини-конфигурацию .cf, содержащую только один этот объект.
  3. Настройка файла правил объединения. Чтобы процесс объединения прошел в автоматическом режиме без вывода интерактивных диалоговых окон конфигуратора, нам понадобится файл настроек объединения. Для этого один раз выполним объединение вручную в конфигураторе, снимем флажки со всех объектов, кроме нашей обработки Обработка1, и нажмем кнопку «Сохранить настройки» (получим файл settings.xml).
  4. Запуск пакетного объединения. Напишем командный файл (bat-скрипт) для автоматического объединения конфигураций:

"C:\Program Files\1cv8\8.3.22.1709\bin\1cv8.exe" DESIGNER /F "C:\Base\TargetBase" /N "Администратор" /P "Пароль" /MergeCfg "C:\Temp\temp_config.cf" /Settings "C:\Temp\settings.xml" /UpdateDBCfg

Параметр /MergeCfg выполнит слияние объектов, параметр /Settings укажет платформе взять только нужную обработку, а ключ /UpdateDBCfg применит изменения к базе данных.

Способ 2. Частичная загрузка измененных XML-файлов метаданных

Проанализируем второй способ. Он более элегантен, работает значительно быстрее на крупных конфигурациях и использует современный механизм выгрузки/загрузки конфигурации в файлы XML (доступный в платформе начиная с версии 8.3.8).

При обычной выгрузке внешней обработки в XML-формат платформа создает структуру, описывающую объект типа ExternalDataProcessor (Внешняя обработка). Наша задача — превратить ее в структуру внутренней обработки DataProcessor и загрузить обратно в конфигурацию.

Разберем этот процесс по шагам:

  1. Разбор внешней обработки на файлы. Используем пакетную команду платформы для конвертации файла .epf в XML-каталог:

"C:\Program Files\1cv8\8.3.22.1709\bin\1cv8.exe" DESIGNER /F "C:\Base\TargetBase" /DumpExternalDataProcessorOrReportToFiles "C:\Temp\UnpackedEPF" "C:\Temp\Обработка1.epf"
  1. Преобразование структуры XML. В каталоге C:\Temp\UnpackedEPF появится файл метаданных с именем ExternalDataProcessor.Обработка1.xml и одноименная папка. Выполним автоматическую замену в именах и содержимом этих файлов, используя любой скриптовый язык (например, OneScript или PowerShell):
    • Переименуем файл ExternalDataProcessor.Обработка1.xml в DataProcessor.Обработка1.xml.
    • Переименуем каталог ExternalDataProcessor.Обработка1 в DataProcessor.Обработка1 (если он был создан).
    • Внутри файла DataProcessor.Обработка1.xml заменим корневые теги <ExternalDataProcessor> на <DataProcessor> и закрывающий тег </ExternalDataProcessor> на </DataProcessor>.
    • Важный момент: Чтобы конфигуратор при загрузке понял, что мы обновляем существующую в конфигурации обработку, а не создаем новую, нам нужно сохранить уникальный идентификатор объекта (UUID). Для этого найдем в файле тег <xr:ObjectId> и заменим его значение на UUID нашей встроенной обработки (его можно заранее один раз подсмотреть в файлах выгрузки целевой конфигурации).

Посмотрим на пример простого скрипта на языке OneScript, который автоматизирует переименование и замену тегов в файле конфигурации:


ФайлПриемник = Новый Файл("C:\Temp\UnpackedEPF\ExternalDataProcessor.Обработка1.xml");
Если ФайлПриемник.Существует() Тогда
    Текст = Новый ТекстовыйДокумент();
    Текст.Прочитать("C:\Temp\UnpackedEPF\ExternalDataProcessor.Обработка1.xml");
    ПолныйТекст = Текст.ПолучитьТекст();
    
    // Выполняем замену типа объекта метаданных
    ПолныйТекст = СтрЗаменить(ПолныйТекст, "ExternalDataProcessor", "DataProcessor");
    
    Текст.УстановитьТекст(ПолныйТекст);
    Текст.Записать("C:\Temp\UnpackedEPF\DataProcessor.Обработка1.xml");
    
    // Удаляем старый файл внешней обработки, чтобы он не мешал загрузке
    УдалитьФайлы("C:\Temp\UnpackedEPF\ExternalDataProcessor.Обработка1.xml");
КонецЕсли;
  1. Частичная загрузка измененного файла в конфигурацию. Теперь воспользуемся возможностью частичной загрузки метаданных с помощью ключа -files. Это избавит нас от необходимости загружать всю конфигурацию целиком:

"C:\Program Files\1cv8\8.3.22.1709\bin\1cv8.exe" DESIGNER /F "C:\Base\TargetBase" /N "Администратор" /P "Пароль" /LoadConfigFromFiles "C:\Temp\UnpackedEPF" -files "DataProcessor.Обработка1" /UpdateDBCfg

При таком вызове платформа обновит исключительно метаданные и модули нашей обработки Обработка1, оставив остальные объекты конфигурации нетронутыми. Это происходит за секунды.

Интеграция в современные инструменты CI/CD

Если вы строите полноценный пайплайн сборки, использовать «сырые» bat-файлы может быть неудобно из-за сложности обработки ошибок. В современной практике разработки на платформе «1С:Предприятие» для этих целей применяют специализированные инструменты автоматизации, такие как Vanessa-Runner.

Vanessa-Runner позволяет выполнять те же самые команды взаимодействия с конфигуратором через лаконичные конфигурационные файлы формата JSON или YAML, самостоятельно контролируя коды возврата утилит 1С и выводя подробные логи в консоль сборщика (например, Jenkins или GitLab CI).

Выясним преимущества каждого подхода. Способ с пакетным объединением (/MergeCfg) проще в реализации "на коленке", так как не требует детального разбора структуры XML-файлов метаданных 1С. Однако способ с частичной загрузкой измененных XML-файлов через /LoadConfigFromFiles значительно быстрее и профессиональнее, так как позволяет версионировать исходный код обработки в Git и обновлять систему точечно.

← На главную