Заимствование объекта целиком: конфигуратор, XML-выгрузка и установка .cfe

· 9 мин

Содержание

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

Способов три. Конфигуратор — для одного-двух объектов. Выгрузка расширения в XML и пакетная загрузка — когда объектов десятки или нужен повторяемый сценарий. Установка готового .cfe обработкой из пользовательского режима — когда доступа к конфигуратору у исполнителя нет. Механизм общий для платформы 8.3 (расширения появились в 8.3.6) и не зависит от того, Бухгалтерия у вас, ЗУП или УТ.

Что подготовить перед добавлением объекта в расширение

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

Перед началом проверьте:

  • 🧩 Версию платформы. Чем новее платформа, тем больше можно сделать в расширении: добавлять свои реквизиты и табличные части к заимствованным объектам, использовать аннотацию &ИзменениеИКонтроль. Номер платформы смотрите в Справка → О программе.
  • ⚙️ Режим совместимости. У расширения он не должен быть новее, чем у основной конфигурации. Иначе расширение не применится.
  • 🔐 Права. Нужна роль с административными правами: в конфигураторе — пользователь с полными правами, в пользовательском режиме — право администрирования.
  • 💾 Копию базы . Если расширение будет менять структуру данных, при его подключении база обновит таблицы. Перед первым применением такого расширения в рабочей базе сделайте выгрузку .dt.
  • 🧪 Тестовую копию. Отладку заимствования ведите на копии, а в рабочую базу загружайте готовый .cfe.

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

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

Способ 1. Заимствование объекта целиком через конфигуратор

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

Заимствуем сам объект

  1. Откройте расширение: Конфигурация → Расширения конфигурации, выделите строку, кнопка «Конфигурация» → «Открыть конфигурацию».
  2. Откройте основную конфигурацию (Конфигурация → Открыть конфигурацию). Удобно расположить оба дерева рядом.
  3. В дереве основной конфигурации найдите справочник, щёлкните правой кнопкой → Добавить в расширение.
  4. Если расширений несколько, платформа спросит, в какое добавить. Выберите нужное.

В дереве расширения появится справочник со значком заимствования. В его свойствах видно, какие свойства основного объекта контролируются расширением.

Добираем подчинённые части

Объект в расширении пока «пустой»: форм, макетов и модулей в нём нет. Заимствуйте каждую нужную часть той же командой:

Что нужноГде щёлкнуть в основной конфигурацииЧто получится в расширении
Форма элементаСправочник → Формы → ФормаЭлемента → Добавить в расширениеКопия структуры формы, в которую можно добавлять элементы и обработчики
Макет печатиСправочник → Макеты → нужный макетСвой экземпляр макета, который замещает исходный
КомандаСправочник → Команды → нужная командаВозможность переопределить обработчик
РеквизитСправочник → Реквизиты → нужный реквизитРеквизит доступен для вывода на заимствованную форму

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

&После("ПередЗаписью")
Процедура мр_ПередЗаписью(Отказ)
    Если ПустаяСтрока(Артикул) Тогда
        Сообщить("Заполните артикул.");
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

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

Сохраняем и применяем

  1. Нажмите Обновить конфигурацию базы данных (F7) в окне расширения. Это отдельный шаг от сохранения.
  2. Проверьте расширение: в его меню Конфигурация → Проверка модулей и синтаксический контроль.
  3. Выгрузите расширение в файл .cfe: в окне расширения Конфигурация → Сохранить конфигурацию в файл.

Способ 2. Пакетно: выгрузка расширения в XML и обратная загрузка

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

Выгрузка и загрузка из командной строки

Пакетный режим конфигуратора умеет работать с расширением через ключ -Extension:

set V8="C:\Program Files\1cv8\<версия>\bin\1cv8.exe"
set BASE=/F"D:\Bases\Test"
set AUTH=/N"Администратор" /P""

rem 1. Выгрузить расширение в каталог XML
%V8% DESIGNER %BASE% %AUTH% /DumpConfigToFiles "D:\ext_src" -Extension "МоёРасширение" /Out "D:\log_dump.txt"

rem 2. ...правка файлов скриптом...

rem 3. Загрузить обратно и применить
%V8% DESIGNER %BASE% %AUTH% /LoadConfigFromFiles "D:\ext_src" -Extension "МоёРасширение" /Out "D:\log_load.txt"
%V8% DESIGNER %BASE% %AUTH% /UpdateDBCfg -Extension "МоёРасширение" /Out "D:\log_upd.txt"

Для серверной базы вместо /F укажите /S"сервер\база". Готовый .cfe загружается ключом /LoadCfg "файл.cfe" -Extension "МоёРасширение".

Как выглядит заимствованный объект в XML

В файле объекта заимствование задают два свойства: принадлежность и ссылка на исходный объект.

<Properties>
    <ObjectBelonging>Adopted</ObjectBelonging>
    <Name>Номенклатура</Name>
    <ExtendedConfigurationObject>uuid-объекта-основной-конфигурации</ExtendedConfigurationObject>
</Properties>

Кроме файла объекта, его имя должно появиться в списке ChildObjects файла Configuration.xml расширения. Uuid исходного объекта берите из выгрузки основной конфигурации (/DumpConfigToFiles без ключа -Extension).

Не пишите XML с нуля. Возьмите файл, который создал конфигуратор при ручном заимствовании, и меняйте в нём только имя, uuid и состав подчинённых элементов. Структура зависит от версии формата выгрузки, и ручная сборка с нуля чаще ломается.

Этот же каталог удобно держать в Git: видно, что именно заимствовано, и легко откатить неудачную правку. Тот же сценарий умеет 1С:EDT — там команда «Добавить в расширение» есть в контекстном меню объекта, и проект расширения хранится в файлах изначально.

Способ 3. Установка готового расширения обработкой

Внешняя обработка не умеет заимствовать объекты — это делает только конфигуратор или EDT. Зато она может установить готовый .cfe в базу без запуска конфигуратора. Это удобно, когда расширение разработано на копии, а в рабочей базе у сотрудника есть только пользовательский режим.

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

Если нужна своя обработка (например, для массовой раскатки по нескольким базам), ядро такое:

&НаСервере
Процедура УстановитьРасширение(АдресВХранилище, ИмяРасширения)

    Данные = ПолучитьИзВременногоХранилища(АдресВХранилище);

    Найденные = РасширенияКонфигурации.Получить(Новый Структура("Имя", ИмяРасширения));
    Если Найденные.Количество() > 0 Тогда
        Расширение = Найденные[0];
    Иначе
        Расширение = РасширенияКонфигурации.Создать();
    КонецЕсли;

    Расширение.БезопасныйРежим = Ложь;
    Расширение.Записать(Данные);

КонецПроцедуры

Изменения вступят в силу после перезапуска сеансов. Пользователям, которые работают в базе, нужно перезайти.

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

Ошибки при добавлении объекта в расширение и что с ними делать

Диагностика: выберите симптом

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

Как не утонуть в заимствованиях: порядок в расширениях

Чем больше объектов заимствовано, тем дольше проверка после каждого обновления типовой. Несколько правил, которые экономят время на сопровождении:

  • 🎯 Заимствуйте минимум. Нужна одна процедура из модуля — пишите её с аннотацией, а не берите все формы «на всякий случай». Каждая заимствованная форма — это слепок, который придётся сверять после обновления.
  • 📦 Делите по задачам. Одно расширение на одну доработку: печатные формы отдельно, контроль проведения отдельно. Сломалось одно — остальные работают.
  • 🏷 Держите префикс. Все свои реквизиты, процедуры и объекты — с префиксом расширения.
  • 🔁 Проверяйте после каждого обновления. Сначала обновите копию, примените расширения, выполните проверку модулей, затем — рабочую базу.
  • 📝 Комментируйте. В шапке каждой процедуры с &Вместо пишите, почему не подошёл &После.

Перенос данных, когда объект становится частью расширения

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

Заполнить новый реквизит у старых записей можно так:

  1. Напишите обработку или процедуру обновления в самом расширении.
  2. Выберите элементы запросом порциями (например, по 1000), чтобы не держать долгую транзакцию.
  3. Для каждого получите объект, заполните реквизит, запишите с ОбменДанными.Загрузка = Истина, если не нужны проверки и подписки при записи.

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

Перед загрузкой расширения в рабочую базу
Выполнено: 0 / 6

Когда расширение — не лучший выбор

Расширение решает многое, но не всё. Альтернативы:

ЗадачаЧто выбрать вместо расширенияПочему
Нужен отчёт или печатная форма без правки объектовВнешний отчёт или обработка, подключённые через дополнительные отчёты и обработкиНе трогает конфигурацию совсем
Нужно хранить пару дополнительных полей у справочникаДополнительные реквизиты и сведения в типовой конфигурации на БСПНастраивается пользователем, без разработки
Доработка меняет типовой механизм глубоко, во многих модуляхСнятие с поддержки (включение возможности изменения) и правка основной конфигурацииДесятки &Вместо сопровождать тяжелее, чем аккуратное объединение при обновлении
Нужно поменять тип реквизита или удалить типовой реквизитПравка основной конфигурацииРасширение не меняет тип и состав существующих реквизитов исходного объекта

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

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

Можно ли заимствовать объект в расширение без снятия конфигурации с поддержки?
Да. Для этого расширения и придуманы: основная конфигурация остаётся на полной поддержке и обновляется автоматически.
Можно ли заимствовать один объект в два расширения?
Можно. Но если оба меняют одну и ту же процедуру, порядок срабатывания станет неочевидным. Лучше держать такие доработки в одном расширении.
Переносятся ли права ролей при заимствовании объекта?
Нет. Права на собственные объекты расширения задают в заимствованных ролях или в своей роли расширения. Права на заимствованные объекты берутся из основной конфигурации.
Работают ли расширения в файловой базе?
Да, в файловом и клиент-серверном вариантах одинаково. Порядок заимствования объектов не отличается.
Как убрать заимствованный объект из расширения?
Удалите его в дереве расширения, предварительно убрав все ссылки на него из своих модулей и форм, затем обновите конфигурацию базы данных.