Перенос доработок из расширения в основную конфигурацию без потери кода и данных
Содержание
Расширение объединяют с конфигурацией в Конфигураторе: сохраняют расширение в файл .cfe, включают возможность изменения основной конфигурации и через Конфигурация → Сравнить, объединить с конфигурацией из файла… переносят его объекты. Код с аннотациями &Перед, &После, &Вместо и &ИзменениеИКонтроль почти всегда приходится доводить руками, а данные, которые расширение успело накопить, выгружают заранее. Потом расширение отключают и обновляют конфигурацию базы данных.
Порядок действий одинаков для любой типовой или самописной конфигурации на платформе 8.3. Сами расширения появились в 8.3.6, так что в более ранних версиях платформы вопрос не возникает.
Что проверить, прежде чем объединять расширение с конфигурацией
Объединение — операция необратимая в рамках базы. Откатиться можно только из резервной копии. Поэтому до первого клика соберите ответы на пять вопросов.
- Есть ли свежая выгрузка базы. Сделайте
Администрирование → Выгрузить информационную базу…в файл.dt. Для этого нужен монопольный доступ, так что пользователей придётся отключить на время выгрузки. - На поддержке ли конфигурация. Откройте
Конфигурация → Поддержка → Настройка поддержки. Если там стоит «Изменения не разрешены», объединить ничего не получится, пока не включите возможность изменения. - Хранит ли расширение данные. Посмотрите дерево расширения: собственные справочники, документы, регистры, а также реквизиты, добавленные к заимствованным объектам. Если они есть и в них уже что-то записано, нужен отдельный план переноса данных.
- Какие механизмы перехвата используются. Откройте модули расширения и найдите аннотации. Каждая
&ИзменениеИКонтрольили&Вместо— это место ручной работы. - Сколько расширений в базе. Если их несколько и они заимствуют одни и те же объекты, объединяйте по одному и после каждого проверяйте результат.
Включение возможности изменения снимает конфигурацию с «чистой» поддержки. Дальше каждое обновление типовой придётся ставить через сравнение и объединение, а не простой загрузкой. Если раньше конфигурация обновлялась в один клик именно благодаря расширениям, взвесьте это до начала работ.
Чтобы снять запрет, в окне настройки поддержки нажмите Включить возможность изменения и выберите для объектов режим «Редактируется с сохранением поддержки». Так поставщик останется привязан, а ваши правки будут видны при следующих обновлениях.
Способы объединения расширения с конфигурацией: сравнение
Способов по сути три. Их часто комбинируют: сначала автоматическое объединение, потом ручная доводка модулей.
| Способ | Когда подходит | Риски |
|---|---|---|
Сравнение и объединение с файлом .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_РеестрЗаявокостанутся с префиксом. Переименовать можно, но только до того, как в них появятся данные, и с правкой всех ссылок в коде.
Данные расширения при объединении: как не потерять
Это самый недооценённый этап. Собственные объекты расширения и реквизиты, добавленные им к заимствованным объектам, хранятся в отдельных таблицах. После объединения в основной конфигурации появятся новые, пустые таблицы. Старые данные туда сами не переедут.
Если расширение работало хотя бы неделю, данные почти наверняка есть. Схема переноса такая:
- До объединения выгрузите данные объектов расширения в файл. Подходит обработка выгрузки и загрузки данных в XML или собственная обработка, которая пишет значения в табличный документ вместе с уникальными идентификаторами ссылок.
- Выполните объединение и обновите конфигурацию базы данных.
- Загрузите данные обратно в новые объекты основной конфигурации. Имена объектов и реквизитов должны совпадать с теми, что были в расширении, иначе сопоставление придётся настраивать вручную.
- Сверьте количество: сколько было элементов справочника или записей регистра в расширении и сколько стало после загрузки.
- Только после сверки удалите расширение.
Удаление расширения безвозвратно удаляет все его данные. Платформа предупреждает об этом, но предупреждение легко пролистать. Пока данные не перенесены и не сверены, расширение только отключают.
Если реквизит расширения хранил ссылку на справочник основной конфигурации, ссылка при переносе сохранится: справочник никуда не делся. Если наоборот — объект основной конфигурации ссылался на справочник расширения, — перенос возможен только с сохранением уникальных идентификаторов. Поэтому выгрузку делайте именно с GUID, а не по наименованиям.
Тестирование после объединения расширения и конфигурации
После F7 база должна открыться без ошибок, но это ещё не проверка. Пройдите по списку на тестовой копии, прежде чем повторять всё в рабочей базе.
Отдельно проверьте задвоение логики. Типичная картина: код перенесли в основную конфигурацию, а расширение осталось активным. Тогда проверка суммы срабатывает дважды, а движения документа могут записаться с ошибкой. Отключённое расширение снимает эту проблему.
Для замеров удобно сделать одно и то же действие — провести документ , записать элемент — до объединения и после. Время и результат должны совпасть.
Когда объединять расширение с конфигурацией нецелесообразно
Объединение не всегда шаг вперёд. Расширения придумали как раз для того, чтобы типовая оставалась на поддержке и обновлялась быстро. Оставьте расширение как есть, если:
- 📦 конфигурация типовая и обновляется регулярно. Снятие с поддержки увеличит время каждого обновления в разы;
- 🔧 доработки точечные: пара печатных форм, одна проверка при записи, кнопка на форме;
- ☁️ база работает в облачном сервисе, где правка основной конфигурации недоступна;
- 🧩 расширение поставляет сторонний разработчик и выпускает к нему обновления.
Объединять имеет смысл, когда:
- конфигурация давно самописная или снята с поддержки, и расширение — просто лишняя прослойка;
- расширение перехватывает так много методов, что при каждом обновлении платформа сообщает о нарушении контроля, и разбираться с этим дороже, чем держать код в основной конфигурации;
- нужны возможности, которые расширению недоступны или ограничены, например изменение некоторых свойств заимствованных объектов.
Промежуточный вариант — разделить: тяжёлую переработку перенести в основную конфигурацию, а мелочь оставить в расширении.
Частые ошибки при переносе расширения
- ❌ Удалили расширение сразу после объединения. Данные пропали. Восстановление — только из
.dt. - ❌ Оставили расширение активным. Основная конфигурация получила те же реквизиты, и при запуске платформа сообщает, что расширение не может быть применено из-за конфликта имён.
- ❌ Перенесли метод с аннотацией как есть. Процедура
Расш1_ПередЗаписьюв основной конфигурации — это просто неиспользуемый метод. Логика молча перестаёт работать. - ❌ Забыли про роли. У администратора всё работает, у бухгалтера — «Недостаточно прав».
- ❌ Объединяли сразу в рабочей базе. Всегда сначала копия, потом рабочая база по уже отработанному сценарию.