К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как перенести доработки в расширение 1С

Как перенести доработки из конфигурации 1С в расширение: подготовка, перенос объектов и кода, подмена методов, проверка результата и типичные ошибки.

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

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

Что можно и что нельзя перенести в расширение

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

Ограничения существенны. Нельзя изменять состав измерений и ресурсов регистров накопления и бухгалтерии, нельзя менять тип реквизитов типовых объектов, нельзя расширять планы счетов и планы видов расчёта в полном объёме, нельзя изменять код модулей, вызываемых в контексте, где расширение не подключено (например, фоновые задания с отключёнными расширениями). Добавленные в расширении реквизиты объектов требуют режима совместимости расширения не ниже используемого платформой.

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

Как зафиксировать все существующие доработки

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

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

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

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

Как создать расширение и заимствовать объекты

Создайте новое расширение: меню «Конфигурация» → «Расширения конфигурации» → «Создать». Задайте имя и обязательно укажите префикс — он будет добавляться к именам всех новых объектов расширения и предотвратит конфликты имён при обновлении типовой конфигурации. Префикс должен быть коротким и уникальным, например «Расш1_» или префикс вашей организации.

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

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

Как перенести изменения кода через аннотации

Основной инструмент переноса правок типовых модулей — аннотации перехвата методов. Платформа предоставляет три варианта: &Вместо (полная замена типового метода), &После и &Перед (выполнение кода до или после типового метода), &ИзменениеИКонтроль (точечная правка с сохранением контроля соответствия типовому методу).

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

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

bsl
&ИзменениеИКонтроль("ЗаполнитьДокументПоДаннымОснования")
Процедура Расш1_ЗаполнитьДокументПоДаннымОснования(Основание)
	#Вставка
	// Наша доработка: заполнение проекта из основания
	Проект = Основание.Проект;
	#КонецВставки
	// Далее типовой код метода без изменений
КонецПроцедуры

Как заменить прямые правки типового кода

Не всякая правка модуля переносится перехватом метода. Если доработка встроена в середину большого типового метода и перехват даст громоздкую конструкцию, рассмотрите альтернативы. Подписки на события (ПриЗаписи, ОбработкаПроведения, ПередЗаписью) позволяют добавить логику без изменения типового модуля вообще — создайте подписку в расширении и вынесите туда свой код.

Изменения в интерфейсе часто заменяются программным созданием элементов формы. Изменения в печатных формах переносятся через механизм дополнительных печатных форм (в конфигурациях на БСП) — тогда правка макета в типовой конфигурации вообще не нужна. Изменения в отчётах решаются созданием своего варианта отчёта или внешнего отчёта вместо правки типового.

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

Маршрут решения

Как выбрать способ переноса

Нужно изменить отдельный метод типового модуляИспользуйте &ИзменениеИКонтроль с пометками #Вставка и #Удаление
Нужно добавить действие при записи или проведении объектаСоздайте подписку на событие в расширении
Изменена печатная форма или отчётПеренесите в дополнительную печатную форму или внешний отчёт
Правка затрагивает то, что расширения не поддерживаютОставьте минимальную правку в конфигурации и задокументируйте её для обновления

Как вернуть конфигурацию на поддержку и проверить результат

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

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

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

Контрольные точки

Как проверить результат

Сравнение с конфигурацией поставщика
Норма

Различий нет, конфигурация на полной поддержке

Тревожный признак

Остались изменённые объекты — доработки перенесены не полностью

Список расширений в базе
Норма

Расширение активно, ошибок применения нет

Тревожный признак

Расширение отключено или показывает ошибки контроля

Функциональное тестирование
Норма

Все сценарии из реестра работают как раньше

Тревожный признак

Часть логики не срабатывает — проверьте аннотации и подписки

Данные в перенесённых реквизитах
Норма

Значения на месте и доступны в формах и отчётах

Тревожный признак

Данные пусты — реквизиты не совпали по именам или типам

Типичные ошибки при переносе и их последствия

Самая частая ошибка — перенос доработок без реестра изменений, «по памяти». В результате часть правок теряется, и обнаруживается это только при работе пользователей. Вторая типичная ошибка — злоупотребление аннотацией &Вместо: при каждом обновлении такие перехваты требуют ручной сверки с типовым кодом, и пропущенное изменение приводит к потере новых исправлений вендора.

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

Типичные ошибки
01
Перенос без реестра доработок — часть изменений теряется и обнаруживается только у пользователей.
02
Массовое использование &Вместо — при обновлении теряются исправления вендора в перехваченных методах.
03
Заимствование объектов «про запас» — лишние точки контроля и конфликты при каждом обновлении.
04
Возврат на поддержку до переноса реквизитов с данными — безвозвратная потеря данных.
05
Тестирование только в конфигураторе — ошибки применения расширения всплывают в пользовательском режиме.

Часто задаваемые вопросы

Можно ли перенести в расширение изменения типового регистра накопления?

Частично. В расширении можно добавить свои реквизиты к регистру и перехватить методы его модуля, но нельзя изменять состав измерений, ресурсов и реквизитов типового регистра. Если доработка требует нового измерения, придётся создать в расширении собственный регистр и дублировать движения через подписку на проведение.

Что произойдёт с расширением при обновлении типовой конфигурации?

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

Нужно ли снимать конфигурацию с поддержки для работы расширения?

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

Можно ли подключить несколько расширений к одной базе?

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

Как перенести расширение из тестовой базы в рабочую?

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

Что делать, если доработка не переносится в расширение никаким способом?

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

Итог

Что важно запомнить

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