Как обновить измененное расширение поставщика в 1С?

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

В типовой практике разработки на платформе 1С:Предприятие расширения конфигурации (файлы *.cfe) часто используются для быстрой адаптации решений. Однако при использовании тиражных расширений от сторонних разработчиков или вендоров возникает серьезная сложность: механизм поддержки с правилами поставщика и трехсторонним объединением («конфигурация поставщика — старая конфигурация с доработками — новая конфигурация поставщика») в платформе реализован исключительно для основных конфигураций (файлы *.cf и *.cfu).

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

Опасности и риски потери данных в таблицах расширений

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

Если выполнить команду Загрузить конфигурацию из файла вместо операции объединения или пересоздать расширение с нуля, платформа воспримет это как удаление старых объектов метаданных и создание абсолютно новых. В результате физические таблицы с данными в базе будут безвозвратно очищены. Поэтому любые манипуляции следует выполнять либо через штатное объединение, либо через контролируемое текстовое слияние исходников с сохранением исходных UUID.

Способ 1. Выгрузка в файлы и трехстороннее слияние через KDiff3 или P4Merge

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

  1. Base: Чистое исходное расширение поставщика старой версии (например, 1.20).
  2. Changes: Доработанное расширение на базе версии 1.20 с вашими изменениями.
  3. Base2: Новое чистое расширение поставщика (версия 1.21).

Выгрузим каждое из трех расширений в файлы XML через конфигуратор (команда Конфигурация — Выгрузить конфигурацию в файлы... в контексте нужного расширения) в соответствующие каталоги. Далее воспользуемся утилитой KDiff3, которая умеет выполнять слияние каталогов в пакетном режиме.

Посмотрим на пример командного файла (bat-скрипта), автоматизирующего вызов утилиты для выполнения слияния:


@echo off
echo Starting three-way merge of extensions...

set BASE=C:\TEMP\Merge\Base
set CHANGES=C:\TEMP\Merge\Changes
set BASE2=C:\TEMP\Merge\Base2
set RESULT=C:\TEMP\Merge\Result

if not exist "%BASE%" (
    echo Error: Base folder not found: %BASE%
    pause
    exit /b 1
)
if not exist "%CHANGES%" (
    echo Error: Changes folder not found: %CHANGES%
    pause
    exit /b 1
)
if not exist "%BASE2%" (
    echo Error: Base2 folder not found: %BASE2%
    pause
    exit /b 1
)

if not exist "%RESULT%" mkdir "%RESULT%"

echo Merging folders:
echo   Base   : %BASE%
echo   Changes: %CHANGES%
echo   Base2  : %BASE2%
echo   Result : %RESULT%

"C:\Program Files\KDiff3\kdiff3.exe" --merge --auto "%BASE%" "%CHANGES%" "%BASE2%" -o "%RESULT%"

echo.
echo Merge completed. Check the Result folder.
pause

Разберем важные нюансы этого подхода:

  1. В настройках программы KDiff3 рекомендуется отключить избыточные подтверждения автоматического слияния, а также настроить игнорирование пробельных символов и переводов строк.
  2. Если доработки были оформлены корректно (свои процедуры, явные комментарии, минимальное вмешательство в типовой код модулей), слияние пройдет в полностью автоматическом режиме.
  3. При возникновении конфликтов утилита откроет визуальный интерфейс, где можно вручную выбрать, какой блок кода или метаданных должен попасть в результирующий каталог Result.
  4. Полученный результат из каталога Result загружаем обратно в расширение базы через команду Конфигурация — Загрузить конфигурацию из файлов... на копии информационной базы для тестирования.

Способ 2. Конвертация CFE в CF для штатного обновления на поддержке

Если проект требует строгого использования платформенного окна сравнения и объединения 1С, применим обходной путь через временную конвертацию расширения в полноценную конфигурацию. Это позволит поставить расширение на стандартную поддержку поставщика.

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

  1. Берем исходный файл cfe поставщика версии 1.20 и конвертируем его структуру в формат cf. Выполнить это можно с помощью специализированных конвертеров или путем выгрузки в исходные XML-файлы с корректировкой корневого файла Configuration.xml.
  2. Загружаем полученный cf в чистую базу. Создаем файл поставки (Конфигурация — Поставка конфигурации — Создать файлы поставки...). На выходе получаем файл поставщика.
  3. Аналогичным образом подготавливаем файл поставки для новой версии поставщика 1.21.
  4. В пустую рабочую базу загружаем cf старого поставщика (версия 1.20). Конфигурация встает на полную поддержку с замком.
  5. Включаем возможность изменения конфигурации и накатываем через Сравнить, объединить с конфигурацией из файла наши доработки версии 1.20.
  6. Вызываем стандартный механизм Конфигурация — Поддержка — Обновить конфигурацию и выбираем подготовленный файл новой версии поставщика 1.21. Платформа открывает привычное окно трехстороннего сравнения и объединения.
  7. Выполняем объединение с контролем дважды измененных свойств, процедур и форм.
  8. После успешного обновления выгружаем конфигурацию обратно в файлы, приводим Configuration.xml к виду расширения и загружаем обратно в целевую базу в качестве обновленного cfe.

Способ 3. Версионирование через Git (подход Vendor Branch)

Если команда использует версионирование исходных кодов в Git или среду разработки 1C:Enterprise Development Tools (1C:EDT), задача обновления решается архитектурно с помощью так называемой «ветки поставщика» (Vendor Branch):

  1. В репозитории создается изолированная ветка vendor, в которую последовательно коммитятся только чистые версии расширения от разработчика (сначала 1.20, затем 1.21) в виде выгруженных XML-исходников.
  2. В основной рабочей ветке проекта ведутся доработки поверх версии 1.20.
  3. Когда выходит релиз 1.21, в ветку vendor фиксируется новый коммит с чистыми исходниками 1.21.
  4. Переключаемся в рабочую ветку и выполняем стандартную команду слияния: git merge vendor.
  5. Система контроля версий автоматически выполняет трехстороннее слияние. Все совпавшие участки объединяются автоматически, а пересечения логики попадают в конфликтные файлы, которые быстро разрешаются в привычном редакторе кода.

Способ 4. Ручное сопоставление в двух окнах сравнения

Если объем доработок невелик, а внешние утилиты использовать нельзя, воспользуемся штатным сравнением конфигураций в одном конфигураторе без создания лишних баз:

  1. В конфигураторе переходим в меню Конфигурация — Сравнить конфигурации...
  2. В качестве первой конфигурации выбираем опцию Файл и указываем доработанное расширение 1.20.
  3. В качестве второй конфигурации выбираем Файл и указываем новое типовое расширение 1.21.
  4. Снимаем флаг Устанавливать соответствие по именам при необходимости сопоставления переименованных элементов.
  5. Параллельно в соседнем окне сравниваем чистый cfe 1.20 и чистый cfe 1.21, чтобы четко видеть, какие именно методы переписал поставщик, и перенести только собственные изменения.

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

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

  1. Использование подключаемых модулей (ПМ): Большинство крупных тиражных решений (включая сервисы логистики, интеграции и документооборота) содержат механизм внешних обработок и переопределяемых модулей. Всю прикладную логику следует реализовывать внутри алгоритмов подключаемого модуля, не прикасаясь к исходному расширению.
  2. Создание отдельного расширения «поверх»: Оставляем расширение поставщика полностью типовым и обновляем его простой заменой. Все кастомные документы, регистры и алгоритмы создаем во втором собственном расширении. Взаимодействие с модулями и данными типового расширения организуется программно через экспортные методы и общие процедуры.
  3. Переход на подсистему конфигурации: Если поставщик предоставляет решение не только в виде cfe, но и в виде подсистемы (файла cf), интеграция в основную конфигурацию второй конфигурацией поставщика обеспечит штатную трехстороннюю поддержку средствами платформы «из коробки».
← На главную