Как объединить расширение с основной конфигурацией в 1С:Предприятие 8.3?

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

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда функционал, изначально реализованный в расширении, необходимо «впитать» в основную конфигурацию. Это может быть связано с переходом на новый этап поддержки, требованием производительности или необходимостью реструктуризации кода. Однако многие разработчики сталкиваются с тем, что стандартного механизма «Сравнить и объединить» для пары «Конфигурация — Расширение» в обычном «Конфигураторе» не существует.

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

Почему нельзя просто нажать кнопку «Объединить»?

Разберем причину ограничения. Платформа 1С хранит расширения (файлы .cfe) отдельно от основной конфигурации (.cf). Механизм расширений задуман как аддитивный слой, который «накладывается» на основную структуру. При попытке сравнить их через стандартное меню Конфигуратор выдает предупреждение: «Сравнение конфигурации и расширения конфигурации не поддерживается». Это связано с разной логикой хранения метаданных и идентификаторов (UUID) объектов в этих сущностях.

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

Способ 1. Использование фильтров в «Конфигураторе» (ручной перенос)

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

Рассмотрим пошагово, как упростить этот процесс:

  1. Откроем конфигурацию расширения.
  2. В окне дерева объектов расширения найдем кнопку «Фильтровать по измененным и добавленным в расширении».
  3. После включения этого фильтра в дереве останутся только те объекты, которые действительно содержат ваш код или измененные свойства (также можно получить список измененных объектов из отчета о сравнении).
  4. Теперь, ориентируясь на этот список, последовательно переносим изменения в основную конфигурацию.

Важный совет: При ручном переносе программного кода из модулей расширения (где используются аннотации &Перед, &После или &Вместо), не забудьте адаптировать код. В основной конфигурации эти аннотации не нужны — код должен быть интегрирован непосредственно в тело процедур или функций.

Способ 2. Использование 1C:Enterprise Development Tool (EDT)

Проанализируем возможности современной среды разработки EDT. В отличие от классического «Конфигуратора», EDT представляет все объекты в виде набора текстовых XML-файлов и скриптов. Это кардинально меняет подход к объединению.

Посмотрим, как это работает в среде EDT:

  1. Проект основной конфигурации и проект расширения импортируются в EDT.
  2. Поскольку оба проекта являются, по сути, наборами файлов на диске, мы можем использовать встроенные инструменты сравнения или внешние системы контроля версий (Git).
  3. Мы можем просто скопировать файлы новых объектов из папки расширения в папку основной конфигурации.
  4. Для измененных модулей используется стандартный Merge Tool или внешние утилиты, позволяющие выполнить объединение модулей в разрезе методов. Это позволяет построчно переносить строки кода из файла расширения в файл основной конфигурации.

Этот метод является наиболее «профессиональным» и надежным, так как позволяет видеть изменения на уровне текста и не пропускать мелкие правки в свойствах объектов.

Способ 3. Выгрузка в файлы XML и внешнее сравнение

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

Выполним следующие действия:

  1. Выберем в меню: Конфигурация — Разработка конфигурации — Выгрузить конфигурацию в файлы. Выполним это для основной конфигурации.
  2. Аналогичную операцию проведем для расширения (выгрузим его в отдельную папку).
  3. Используем сторонние утилиты для сравнения каталогов, такие как WinMerge или Beyond Compare.

Проанализировав различия в папках src, вы сможете точно определить, какие модули (.bsl) и какие описания форм (.xml) были изменены. Хотя загружать изменения обратно в 1С через XML-файлы новичкам не рекомендуется, этот метод незаменим для глубокого аудита сделанных в расширении правок перед их ручным дублированием в основную базу.

Способ 4. Промежуточное расширение

Выясним причину, почему иногда полезно создать «пустое» расширение для сравнения. Хотя напрямую сравнить «CF — CFE» нельзя, платформа позволяет сравнивать два расширения между собой («Сравнить и объединить с расширением из файла»).

Некоторые разработчики используют такой трюк:

  1. Создают копию основной конфигурации.
  2. Создают для этой копии новое расширение и заимствуют туда все объекты (через скрипты или массовое выделение).
  3. Сравнивают полученное «тяжелое» расширение со своим рабочим расширением.

Однако этот метод довольно трудоемок и часто приводит к ошибкам из-за ограничений на типы заимствуемых объектов.

Критически важные рекомендации по завершению объединения

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

Разберем обязательные шаги:

  1. Синхронизация структуры метаданных: Убедитесь, что все новые реквизиты, справочники и документы созданы в основной конфигурации с теми же именами и типами данных.
  2. Перенос программного кода: Особое внимание уделите подпискам на события. Если в расширении была подписка, ее нужно создать в основной конфигурации.
  3. Удаление объектов из расширения: Это самый важный этап. Если вы перенесли процедуру ПриЗаписи из расширения в конфигурацию, но не удалили её из расширения, код выполнится дважды.
  4. Удаление расширения: Если весь функционал перенесен, расширение следует удалить из списка, предварительно убедившись, что данные, хранившиеся в реквизитах расширения (если они были), успешно перенесены в новые реквизиты основной конфигурации с помощью обработки переноса данных.

Рассмотрим пример кода, который часто встречается в расширениях и требует адаптации при переносе:


// Так код выглядит в расширении
&Вместо("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведения(Отказ, РежимПроведения)
    // Наш новый код
    ПровестиПоДополнительномуРегистру();
    
    // Вызов основной логики
    ПродолжитьВызов(Отказ, РежимПроведения);
КонецПроцедуры

// Так он должен выглядеть в основной конфигурации после переноса
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    // Стандартный код конфигурации...
    
    // Вставленный нами код из расширения
    ПровестиПоДополнительномуРегистру();
КонецПроцедуры

Подведем итог: На текущий момент платформа не предоставляет «волшебной кнопки» для слияния. Наиболее надежным способом для крупных проектов является использование EDT и систем контроля версий, а для небольших правок — использование фильтров измененных объектов в Конфигураторе и внимательный ручной перенос.

← На главную