Заимствование документа целиком: реквизиты, табличные части, формы и модули в расширении

· 9 мин

Содержание

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

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

Что проверить до заимствования документа

Расширения появились в платформе 8.3.6, но заимствовать объекты и добавлять к ним свои реквизиты можно только на более новых версиях. Если база работает на актуальной 8.3.2x, ограничений по версии не будет.

Перед стартом ответьте себе на три вопроса:

  • 🎯 Что именно меняем. Логику проведения, форму, печать, состав данных? От этого зависит, какие части документа заимствовать.
  • 📦 Есть ли уже расширение. Лучше добавлять документ в существующее расширение с той же задачей, чем плодить новые.
  • 🔒 Режим совместимости. Свойство Режим совместимости в корне конфигурации влияет на то, какие возможности расширений доступны. Если в типовой стоит старый режим, часть приёмов ниже может быть недоступна.

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

СвойствоЧто указатьЗачем
ПрефиксКороткая строка, например Расш1_Имена ваших объектов и процедур начинаются с него, конфликтов с основной конфигурацией не будет
НазначениеАдаптация или ДополнениеВлияет на порядок применения расширений и подсказывает коллегам, зачем оно

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

Как добавить документ в расширение: пошагово

Заимствование выполняется из дерева основной конфигурации, а не из дерева расширения.

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

После шестого шага в расширении есть «оболочка» документа. Своих реквизитов основной конфигурации у неё пока нет: ветки Реквизиты, Табличные части и Формы пустые.

Что значит «заимствованный» объект

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

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

Реквизиты, табличные части и формы документа в расширении

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

Что заимствовать в типовых задачах:

ЗадачаЧто добавить в расширение
Доработать форму документа (новое поле, кнопка)Форму документа — она заимствуется вместе с основным реквизитом формы Объект
Дописать логику проведения или записиМодуль объекта документа
Добавить свой реквизит или табличную частьСам документ (достаточно его), затем создать свои элементы внутри
Вывести существующий реквизит в своём запросе или отчёте расширенияОбычно ничего: запрос обращается к таблице документа по имени
Добавить печатную формуСам документ и свой макет или общую команду

Заимствовать все реквизиты и табличные части «на всякий случай» не нужно. Чем больше заимствовано, тем больше элементов платформа сверяет при каждом обновлении типовой и тем выше шанс, что расширение отвалится из-за изменения, которое вас вообще не касалось.

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

Как работать с заимствованной формой

В заимствованной форме можно добавлять свои элементы, реквизиты формы и команды. Удалить или изменить свойства элементов основной формы нельзя, но можно скрыть элемент из кода или поменять его видимость.

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

Код документа в расширении: аннотации и модули

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

АннотацияКак работаетКогда выбирать
&Перед("Имя")Ваш код выполняется до исходной процедурыПроверки, подготовка данных
&После("Имя")Ваш код выполняется после исходнойДополнительные движения, заполнение своих реквизитов
&Вместо("Имя")Исходная процедура не выполняется, если вы её сами не вызвали через ПродолжитьВызов()Когда нужно полностью заменить поведение
&ИзменениеИКонтроль("Имя")В расширении лежит копия тела процедуры с вашими вставками и удалениямиТочечная правка внутри длинной процедуры

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

&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведенияПосле(Отказ, РежимПроведения)

    Если Отказ Тогда
        Возврат;
    КонецЕсли;

    // Здесь — дополнительные движения или проверки расширения

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

Аннотация ссылается на процедуру основного модуля по имени. Если процедуры с таким именем в модуле основной конфигурации нет, Конфигуратор сообщит об ошибке при проверке модулей.

Пример точечной правки внутри процедуры через &ИзменениеИКонтроль:

&ИзменениеИКонтроль("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

    // ... исходный код процедуры без изменений ...

    #Вставка
    Если Не ЗначениеЗаполнено(Комментарий) Тогда
        Комментарий = "Создан через расширение";
    КонецЕсли;
    #КонецВставки

    // ... продолжение исходного кода ...

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

Строки между #Вставка и #КонецВставки добавляются. Строки между #Удаление и #КонецУдаления исключаются из выполнения. Остальной текст должен совпадать с исходной процедурой построчно.

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

Какую аннотацию выбирать

  • ✅ &После и &Перед — самые устойчивые к обновлениям. Исходный код может меняться как угодно, ваш вызов останется рабочим.
  • ⚠️ &ИзменениеИКонтроль — удобна, но при любом изменении исходной процедуры в новом релизе расширение перестанет применяться, пока вы не синхронизируете копию.
  • ❌ &Вместо без ПродолжитьВызов() — крайний вариант. Исправления, которые фирма-разработчик внесёт в процедуру, до пользователей уже не дойдут, и никто об этом не узнает.

Свои реквизиты и табличные части в заимствованном документе

Кроме заимствования существующих частей, документу в расширении можно добавить свои данные. Это то, что обычно имеют в виду под «расширить документ».

Что можно добавить к заимствованному документу:

  • 📝 свои реквизиты документа;
  • 📋 свои табличные части;
  • ➕ свои реквизиты в заимствованную табличную часть (для этого её саму сначала добавляют в расширение);
  • 🖨 свои формы, команды и макеты.

Порядок для нового реквизита:

  1. В дереве расширения откройте заимствованный документ.
  2. На вкладке Данные добавьте реквизит. Имя начните с префикса: Расш1_НомерДоговораПоставщика.
  3. Задайте тип, как у обычного реквизита.
  4. Если реквизит нужен на форме — заимствуйте форму и перетащите реквизит из Объект в дерево элементов.
  5. Сохраните расширение и обновите конфигурацию базы данных расширения (F7).

После обновления платформа создаёт для данных расширения дополнительные таблицы в базе. Пользователи увидят новое поле при следующем входе.

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

Когда расширение — неудачная идея

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

Как это влияет на обновления и скорость базы

Цена заимствования проявляется в двух местах: при обновлении типовой конфигурации и при работе с данными.

Обновление основной конфигурации

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

Что помогает пройти обновление без сюрпризов:

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

Производительность

Сам факт заимствования документа на скорость почти не влияет. Заметнее три вещи:

  • 🐢 Свои реквизиты. Данные расширения лежат в отдельных таблицах, при чтении документа платформа соединяет их с основной. На документах с миллионами строк и широкими табличными частями это может замедлить списки и отчёты.
  • 🐢 Тяжёлый код в событиях. Запрос внутри ПередЗаписью или ОбработкаПроведения выполняется на каждой записи. Ровно так же, как в основной конфигурации.
  • 🐢 Много расширений на один объект. Каждое добавляет свои вызовы. Цепочка из пяти &Перед и &После к одной процедуре усложняет отладку больше, чем замедляет работу.

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

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

Ещё одна частая ловушка — изменения сохранены в Конфигураторе, но база не обновлена. Расширение хранится в базе отдельно от основной конфигурации, и его нужно обновлять командой F7 именно из окна расширения, а не из окна основной конфигурации.

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

Можно ли заимствовать один документ в несколько расширений?
Да. Каждое расширение заимствует документ независимо. Но если два расширения перехватывают одну процедуру, порядок их вызовов зависит от назначения и порядка применения расширений — проверяйте результат на копии.
Нужно ли заимствовать реквизит, чтобы прочитать его в коде расширения?
Нет. В модуле объекта расширения доступен весь объект, а запросы обращаются к таблице документа по имени. Заимствование нужно для формы и для контроля при обновлении.
Можно ли создать в расширении новый документ, а не заимствовать существующий?
Да. В дереве расширения в ветке Документы нажмите Добавить. Это будет собственный объект расширения, его имя должно начинаться с префикса.
Что будет с документами, если отключить расширение?
Документы основной конфигурации останутся. Пропадут доработки расширения, а данные его собственных реквизитов будут удалены при удалении расширения.
Как перенести расширение с документом в другую базу?
Сохраните расширение в файл .cfe командой сохранения в окне Расширения конфигурации. В другой базе загрузите файл командой загрузки в том же окне, затем отдельно обновите конфигурацию базы данных расширения.