Перенос доработок из расширения в основную конфигурацию без потери кода и данных

· 10 мин

Содержание

Расширение объединяют с конфигурацией в Конфигураторе: сохраняют расширение в файл .cfe, включают возможность изменения основной конфигурации и через Конфигурация → Сравнить, объединить с конфигурацией из файла… переносят его объекты. Код с аннотациями &Перед, &После, &Вместо и &ИзменениеИКонтроль почти всегда приходится доводить руками, а данные, которые расширение успело накопить, выгружают заранее. Потом расширение отключают и обновляют конфигурацию базы данных.

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

Что проверить, прежде чем объединять расширение с конфигурацией

Объединение — операция необратимая в рамках базы. Откатиться можно только из резервной копии. Поэтому до первого клика соберите ответы на пять вопросов.

  1. Есть ли свежая выгрузка базы. Сделайте Администрирование → Выгрузить информационную базу… в файл .dt. Для этого нужен монопольный доступ, так что пользователей придётся отключить на время выгрузки.
  2. На поддержке ли конфигурация. Откройте Конфигурация → Поддержка → Настройка поддержки. Если там стоит «Изменения не разрешены», объединить ничего не получится, пока не включите возможность изменения.
  3. Хранит ли расширение данные. Посмотрите дерево расширения: собственные справочники, документы, регистры, а также реквизиты, добавленные к заимствованным объектам. Если они есть и в них уже что-то записано, нужен отдельный план переноса данных.
  4. Какие механизмы перехвата используются. Откройте модули расширения и найдите аннотации. Каждая &ИзменениеИКонтроль или &Вместо — это место ручной работы.
  5. Сколько расширений в базе. Если их несколько и они заимствуют одни и те же объекты, объединяйте по одному и после каждого проверяйте результат.

Включение возможности изменения снимает конфигурацию с «чистой» поддержки. Дальше каждое обновление типовой придётся ставить через сравнение и объединение, а не простой загрузкой. Если раньше конфигурация обновлялась в один клик именно благодаря расширениям, взвесьте это до начала работ.

Чтобы снять запрет, в окне настройки поддержки нажмите Включить возможность изменения и выберите для объектов режим «Редактируется с сохранением поддержки». Так поставщик останется привязан, а ваши правки будут видны при следующих обновлениях.

Способы объединения расширения с конфигурацией: сравнение

Способов по сути три. Их часто комбинируют: сначала автоматическое объединение, потом ручная доводка модулей.

СпособКогда подходитРиски
Сравнение и объединение с файлом .cfeРасширение добавляет свои объекты, реквизиты, формы, ролиАннотированный код переносится не так, как нужно; придётся проверять каждый модуль
Ручной переносНебольшое расширение или правки только в коде через перехват методовЛегко пропустить метод или форму; нужна внимательность
Выгрузка в XML-файлы и перенос в EDT или через систему контроля версийКоманда разработчиков, большие расширенияТребует навыков работы с выгрузкой в файлы и Git

Для типичной ситуации — расширение на 10–30 объектов от внешнего программиста — хватает первого способа с последующей ручной доводкой.

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

Пошаговое объединение расширения через «Сравнение и объединение конфигураций»

Шаг 1. Сохраните расширение в файл

В Конфигураторе откройте Конфигурация → Расширения конфигурации. Выделите нужное расширение и через меню Конфигурация этого окна сохраните его в файл .cfe. Положите файл рядом с .dt — это вторая точка отката.

То же самое можно сделать без Конфигуратора: в конфигурациях на БСП откройте Администрирование → Печатные формы, отчеты и обработки → Расширения, выделите строку и сохраните расширение командой из меню списка.

Шаг 2. Разверните тестовую копию и откройте конфигурацию

Создайте новую пустую информационную базу и загрузите в неё сделанный .dt через Администрирование → Загрузить информационную базу…. Все шаги ниже сначала выполняйте на этой копии.

Затем Конфигурация → Открыть конфигурацию. Убедитесь, что поддержка уже позволяет изменения (см. раздел о подготовке).

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

Шаг 3. Запустите сравнение

Конфигурация → Сравнить, объединить с конфигурацией из файла… и укажите сохранённый .cfe. Платформа построит дерево сравнения: слева основная конфигурация, справа расширение.

Шаг 4. Разберите дерево сравнения

  • 🟢 Собственные объекты расширения (с префиксом вроде Расш1_) — отмечайте флажками, они просто добавятся.
  • 🟡 Заимствованные объекты сопоставляются по имени. Раскройте каждый и отмечайте только то, что расширение действительно меняло: новые реквизиты, табличные части, формы.
  • 🔴 Модули открывайте через двойной клик и смотрите различия. Тут решается, что перенести автоматически, а что — руками.

Объектов в типовой конфигурации тысячи, а отличий — десятки. Включите в окне сравнения отбор, который показывает только отличающиеся объекты, иначе нужное легко потерять в дереве.

Шаг 5. Выполните объединение

Нажмите Выполнить. Если платформа сообщит о конфликтах имён — значит, в конфигурации уже есть объект или реквизит с тем же именем. Переименуйте один из них до повторной попытки.

Шаг 6. Отключите расширение

Вернитесь в Конфигурация → Расширения конфигурации и снимите флажок «Активно» у перенесённого расширения. Удалять его сразу не стоит: удаление стирает данные расширения, а их, возможно, ещё нужно перенести.

Шаг 7. Обновите конфигурацию базы данных

Конфигурация → Обновить конфигурацию базы данных (F7). Реструктуризация требует монопольного режима — предупредите пользователей, что их сеансы будут завершены, и делайте это вне рабочего времени.

Ручной перенос кода из расширения: когда без него не обойтись

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

Аннотация в расширенииЧто сделать в основной конфигурации
&Перед("Метод")Вставить код в начало исходного метода
&После("Метод")Вставить код в конец исходного метода, перед последним Возврат, если он есть
&Вместо("Метод") без ПродолжитьВызовЗаменить тело исходного метода кодом из расширения
&Вместо("Метод") с ПродолжитьВызовВстроить код вокруг исходного тела: что до вызова — в начало, что после — в конец
&ИзменениеИКонтроль("Метод")Применить блоки #Вставка и #Удаление к исходному методу построчно

Пример. В расширении было так:

&ИзменениеИКонтроль("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
	Если Не ЗначениеЗаполнено(Контрагент) Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	#Вставка
	Если СуммаДокумента > 1000000 Тогда
		ОбщегоНазначения.СообщитьПользователю("Сумма больше лимита, нужен согласующий.");
		Отказ = Истина;
	КонецЕсли;
	#КонецВставки
КонецПроцедуры

В модуле объекта основной конфигурации остаётся одна процедура ПередЗаписью, а блок из #Вставка … #КонецВставки переезжает в неё на то же место. Сами маркеры #Вставка в основную конфигурацию не переносят. Метод Расш1_ПередЗаписью удаляют.

Аналогично с формами. Если расширение добавило на заимствованную форму поле и обработчик Расш1_ПриИзменении, перенесите элемент на форму основной конфигурации, а обработчик назовите по правилам самой конфигурации и привяжите заново в свойствах элемента.

Перед ручным переносом выгрузите расширение в файлы (Конфигурация → Выгрузить конфигурацию в файлы в окне расширения). Поиск по папке с XML и модулями *.bsl быстро находит все места с аннотациями: ищите строку &Перед, &После, &Вместо, &ИзменениеИКонтроль.

Ещё два момента, которые часто забывают:

  • 🔑 Роли расширения. После переноса это обычные роли конфигурации. Их нужно добавить в профили групп доступа или назначить пользователям — иначе новые объекты будут недоступны.
  • 🏷️ Префиксы имён. Объекты вроде Расш1_РеестрЗаявок останутся с префиксом. Переименовать можно, но только до того, как в них появятся данные, и с правкой всех ссылок в коде.

Данные расширения при объединении: как не потерять

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

Если расширение работало хотя бы неделю, данные почти наверняка есть. Схема переноса такая:

  1. До объединения выгрузите данные объектов расширения в файл. Подходит обработка выгрузки и загрузки данных в XML или собственная обработка, которая пишет значения в табличный документ вместе с уникальными идентификаторами ссылок.
  2. Выполните объединение и обновите конфигурацию базы данных.
  3. Загрузите данные обратно в новые объекты основной конфигурации. Имена объектов и реквизитов должны совпадать с теми, что были в расширении, иначе сопоставление придётся настраивать вручную.
  4. Сверьте количество: сколько было элементов справочника или записей регистра в расширении и сколько стало после загрузки.
  5. Только после сверки удалите расширение.

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

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

Тестирование после объединения расширения и конфигурации

После F7 база должна открыться без ошибок, но это ещё не проверка. Пройдите по списку на тестовой копии, прежде чем повторять всё в рабочей базе.

Проверка после объединения
Выполнено: 0 / 8

Отдельно проверьте задвоение логики. Типичная картина: код перенесли в основную конфигурацию, а расширение осталось активным. Тогда проверка суммы срабатывает дважды, а движения документа могут записаться с ошибкой. Отключённое расширение снимает эту проблему.

Для замеров удобно сделать одно и то же действие — провести документ , записать элемент — до объединения и после. Время и результат должны совпасть.

Когда объединять расширение с конфигурацией нецелесообразно

Объединение не всегда шаг вперёд. Расширения придумали как раз для того, чтобы типовая оставалась на поддержке и обновлялась быстро. Оставьте расширение как есть, если:

  • 📦 конфигурация типовая и обновляется регулярно. Снятие с поддержки увеличит время каждого обновления в разы;
  • 🔧 доработки точечные: пара печатных форм, одна проверка при записи, кнопка на форме;
  • ☁️ база работает в облачном сервисе, где правка основной конфигурации недоступна;
  • 🧩 расширение поставляет сторонний разработчик и выпускает к нему обновления.

Объединять имеет смысл, когда:

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

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

Частые ошибки при переносе расширения

  • ❌ Удалили расширение сразу после объединения. Данные пропали. Восстановление — только из .dt.
  • ❌ Оставили расширение активным. Основная конфигурация получила те же реквизиты, и при запуске платформа сообщает, что расширение не может быть применено из-за конфликта имён.
  • ❌ Перенесли метод с аннотацией как есть. Процедура Расш1_ПередЗаписью в основной конфигурации — это просто неиспользуемый метод. Логика молча перестаёт работать.
  • ❌ Забыли про роли. У администратора всё работает, у бухгалтера — «Недостаточно прав».
  • ❌ Объединяли сразу в рабочей базе. Всегда сначала копия, потом рабочая база по уже отработанному сценарию.

Частые вопросы

Можно ли объединить расширение с конфигурацией, не снимая её с поддержки?
Нет. Чтобы что-то добавить в основную конфигурацию, нужна возможность изменения. Минимальный вариант — режим «Редактируется с сохранением поддержки» только для затронутых объектов.
Сохранится ли история изменений после объединения?
Нет. Для основной конфигурации перенесённые объекты выглядят как новые правки. Если история важна, ведите конфигурацию в хранилище или выгружайте её в файлы под Git.
Что делать с расширением, у которого стоит безопасный режим?
Безопасный режим ограничивает только само расширение. Код, перенесённый в основную конфигурацию, выполняется без этих ограничений, поэтому проверьте его на обращения к файлам и внешним ресурсам.
Можно ли потом снова вынести доработки в расширение?
Можно, но это отдельная работа: в расширении создают заимствованные объекты и переносят код обратно с аннотациями. Автоматического обратного преобразования нет.
Нужно ли объединять несколько расширений в одно перед переносом?
Не нужно. Переносите по одному, начиная с того, от которого зависят остальные, и проверяйте базу после каждого.