Заимствование документа целиком: реквизиты, табличные части, формы и модули в расширении
Содержание
Добавить в расширение 1С документ целиком одной командой нельзя. В Конфигураторе вы заимствуете сам документ (Добавить в расширение в контекстном меню основной конфигурации), а затем отдельно — те реквизиты, табличные части, формы и модули, с которыми будете работать. Платформа сознательно не тянет весь объект со всеми подчинёнными: каждый заимствованный элемент становится точкой контроля при обновлении.
Поэтому правильный вопрос звучит не «как перенести весь документ», а «какие части документа нужны расширению». Ниже — порядок действий для 1С:Предприятия 8.3 в Конфигураторе, правила для кода и данных и то, что ломается после обновления типовой.
Что проверить до заимствования документа
Расширения появились в платформе 8.3.6, но заимствовать объекты и добавлять к ним свои реквизиты можно только на более новых версиях. Если база работает на актуальной 8.3.2x, ограничений по версии не будет.
Перед стартом ответьте себе на три вопроса:
- 🎯 Что именно меняем. Логику проведения, форму, печать, состав данных? От этого зависит, какие части документа заимствовать.
- 📦 Есть ли уже расширение. Лучше добавлять документ в существующее расширение с той же задачей, чем плодить новые.
- 🔒 Режим совместимости. Свойство
Режим совместимостив корне конфигурации влияет на то, какие возможности расширений доступны. Если в типовой стоит старый режим, часть приёмов ниже может быть недоступна.
Расширение открывается через меню Конфигурация → Расширения конфигурации. Если нужного расширения нет, создайте его кнопкой Добавить и сразу задайте два свойства:
| Свойство | Что указать | Зачем |
|---|---|---|
Префикс | Короткая строка, например Расш1_ | Имена ваших объектов и процедур начинаются с него, конфликтов с основной конфигурацией не будет |
Назначение | Адаптация или Дополнение | Влияет на порядок применения расширений и подсказывает коллегам, зачем оно |
Префикс задаётся один раз. Менять его на живом расширении неудобно: придётся переименовывать всё, что уже создано.
Как добавить документ в расширение: пошагово
Заимствование выполняется из дерева основной конфигурации, а не из дерева расширения.
- Откройте основную конфигурацию:
Конфигурация → Открыть конфигурацию. - Откройте дерево расширения: в окне
Расширения конфигурациивыделите расширение и нажмитеКонфигурация(или откройте его двойным щелчком). - В дереве основной конфигурации разверните ветку
Документыи найдите нужный документ. - Щёлкните по нему правой кнопкой и выберите
Добавить в расширение. Если расширений несколько, Конфигуратор предложит выбрать, в какое добавить. - Документ появится в дереве расширения в ветке
Документысо значком заимствованного объекта. - Сохраните расширение и выполните
Конфигурация → Обновить конфигурацию базы данных(F7) именно в окне расширения.
После шестого шага в расширении есть «оболочка» документа. Своих реквизитов основной конфигурации у неё пока нет: ветки Реквизиты, Табличные части и Формы пустые.
Что значит «заимствованный» объект
Заимствованный документ — это ссылка на объект основной конфигурации плюс набор свойств, которые расширение обещает не нарушать. Сам документ в базе один. Данные, записанные пользователями, не копируются и не дублируются.
В палитре свойств заимствованного объекта часть свойств можно отметить как контролируемые. Если при обновлении основной конфигурации контролируемое свойство изменится, расширение перестанет применяться и платформа сообщит, какое свойство разошлось.
Реквизиты, табличные части и формы документа в расширении
«Весь документ» собирается по частям. Каждый элемент заимствуется так же, как сам документ: в дереве основной конфигурации разверните документ, щёлкните по реквизиту, табличной части или форме и выберите Добавить в расширение.
Что заимствовать в типовых задачах:
| Задача | Что добавить в расширение |
|---|---|
| Доработать форму документа (новое поле, кнопка) | Форму документа — она заимствуется вместе с основным реквизитом формы Объект |
| Дописать логику проведения или записи | Модуль объекта документа |
| Добавить свой реквизит или табличную часть | Сам документ (достаточно его), затем создать свои элементы внутри |
| Вывести существующий реквизит в своём запросе или отчёте расширения | Обычно ничего: запрос обращается к таблице документа по имени |
| Добавить печатную форму | Сам документ и свой макет или общую команду |
Заимствовать все реквизиты и табличные части «на всякий случай» не нужно. Чем больше заимствовано, тем больше элементов платформа сверяет при каждом обновлении типовой и тем выше шанс, что расширение отвалится из-за изменения, которое вас вообще не касалось.
Не заимствуйте форму документа, если её можно не трогать. Заимствованную форму платформа сверяет с исходной. Типовые формы меняются почти в каждом крупном релизе, и именно они чаще всего ломают расширения.
Как работать с заимствованной формой
В заимствованной форме можно добавлять свои элементы, реквизиты формы и команды. Удалить или изменить свойства элементов основной формы нельзя, но можно скрыть элемент из кода или поменять его видимость.
Обработчики событий формы подключаются в свойствах формы или элемента. Для события расширения выбирают, когда вызвать свой обработчик: до исходного, после него или вместо. Сам обработчик пишется в модуле заимствованной формы и получает имя с префиксом расширения.
Код документа в расширении: аннотации и модули
Модуль объекта, модуль менеджера и модули форм в расширении не заменяют исходные. Расширение добавляет свои процедуры и привязывает их к процедурам основной конфигурации через аннотации.
| Аннотация | Как работает | Когда выбирать |
|---|---|---|
&Перед("Имя") | Ваш код выполняется до исходной процедуры | Проверки, подготовка данных |
&После("Имя") | Ваш код выполняется после исходной | Дополнительные движения, заполнение своих реквизитов |
&Вместо("Имя") | Исходная процедура не выполняется, если вы её сами не вызвали через ПродолжитьВызов() | Когда нужно полностью заменить поведение |
&ИзменениеИКонтроль("Имя") | В расширении лежит копия тела процедуры с вашими вставками и удалениями | Точечная правка внутри длинной процедуры |
Пример: дописать логику после проведения. Модуль объекта документа сначала нужно создать в дереве расширения — откройте заимствованный документ и на вкладке Прочее откройте Модуль объекта.
&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведенияПосле(Отказ, РежимПроведения)
Если Отказ Тогда
Возврат;
КонецЕсли;
// Здесь — дополнительные движения или проверки расширения
КонецПроцедуры
Аннотация ссылается на процедуру основного модуля по имени. Если процедуры с таким именем в модуле основной конфигурации нет, Конфигуратор сообщит об ошибке при проверке модулей.
Пример точечной правки внутри процедуры через &ИзменениеИКонтроль:
&ИзменениеИКонтроль("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// ... исходный код процедуры без изменений ...
#Вставка
Если Не ЗначениеЗаполнено(Комментарий) Тогда
Комментарий = "Создан через расширение";
КонецЕсли;
#КонецВставки
// ... продолжение исходного кода ...
КонецПроцедуры
Строки между #Вставка и #КонецВставки добавляются. Строки между #Удаление и #КонецУдаления исключаются из выполнения. Остальной текст должен совпадать с исходной процедурой построчно.
Копию тела не набирайте руками. В модуле основной конфигурации щёлкните правой кнопкой по имени процедуры и добавьте её в расширение с нужным типом вызова: Конфигуратор сам создаст процедуру с аннотацией и перенесёт текст.
Какую аннотацию выбирать
- ✅
&Послеи&Перед— самые устойчивые к обновлениям. Исходный код может меняться как угодно, ваш вызов останется рабочим. - ⚠️
&ИзменениеИКонтроль— удобна, но при любом изменении исходной процедуры в новом релизе расширение перестанет применяться, пока вы не синхронизируете копию. - ❌
&ВместобезПродолжитьВызов()— крайний вариант. Исправления, которые фирма-разработчик внесёт в процедуру, до пользователей уже не дойдут, и никто об этом не узнает.
Свои реквизиты и табличные части в заимствованном документе
Кроме заимствования существующих частей, документу в расширении можно добавить свои данные. Это то, что обычно имеют в виду под «расширить документ».
Что можно добавить к заимствованному документу:
- 📝 свои реквизиты документа;
- 📋 свои табличные части;
- ➕ свои реквизиты в заимствованную табличную часть (для этого её саму сначала добавляют в расширение);
- 🖨 свои формы, команды и макеты.
Порядок для нового реквизита:
- В дереве расширения откройте заимствованный документ.
- На вкладке
Данныедобавьте реквизит. Имя начните с префикса:Расш1_НомерДоговораПоставщика. - Задайте тип, как у обычного реквизита.
- Если реквизит нужен на форме — заимствуйте форму и перетащите реквизит из
Объектв дерево элементов. - Сохраните расширение и обновите конфигурацию базы данных расширения (F7).
После обновления платформа создаёт для данных расширения дополнительные таблицы в базе. Пользователи увидят новое поле при следующем входе.
Отключение или удаление расширения с данными удаляет и сами данные. Всё, что пользователи успели ввести в реквизиты расширения, пропадёт. Перед удалением выгрузите данные или перенесите их в основную конфигурацию.
Когда расширение — неудачная идея
Расширение хорошо для доработок, которые живут рядом с типовой. Если документ нужно перестроить радикально — сменить тип существующего реквизита, удалить табличную часть, поменять периодичность нумерации — это уже правка основной конфигурации. Через расширение такие свойства исходного объекта не меняются.
Как это влияет на обновления и скорость базы
Цена заимствования проявляется в двух местах: при обновлении типовой конфигурации и при работе с данными.
Обновление основной конфигурации
При запуске базы после обновления платформа проверяет каждое расширение. Если заимствованный объект в новой версии изменился в контролируемых свойствах, исчез реквизит или поменялся текст процедуры под &ИзменениеИКонтроль, расширение не применяется. Пользователи при этом работают на чистой типовой и теряют ваши доработки до исправления.
Что помогает пройти обновление без сюрпризов:
- Перед обновлением рабочей базы обновите копию и откройте окно
Расширения конфигурации— там видно, применимо ли каждое расширение. - Для
&ИзменениеИКонтрольиспользуйте сравнение текста исходной процедуры в старой и новой версии и перенесите вставки в новую копию. - Держите в расширении только то, что реально используется. Неиспользуемые заимствованные реквизиты удаляйте.
Производительность
Сам факт заимствования документа на скорость почти не влияет. Заметнее три вещи:
- 🐢 Свои реквизиты. Данные расширения лежат в отдельных таблицах, при чтении документа платформа соединяет их с основной. На документах с миллионами строк и широкими табличными частями это может замедлить списки и отчёты.
- 🐢 Тяжёлый код в событиях. Запрос внутри
ПередЗаписьюилиОбработкаПроведениявыполняется на каждой записи. Ровно так же, как в основной конфигурации. - 🐢 Много расширений на один объект. Каждое добавляет свои вызовы. Цепочка из пяти
&Переди&Послек одной процедуре усложняет отладку больше, чем замедляет работу.
Ошибки при добавлении документа в расширение
Конфигурация → Расширения конфигурации, выделите расширение и откройте его конфигурацию, затем повторите команду в дереве основной конфигурации.Объект.&ИзменениеИКонтроль.Активно у расширения в окне расширений и сохранено ли расширение в базе (F7). Для привилегированных операций проверьте, не мешает ли Безопасный режим расширения.Ещё одна частая ловушка — изменения сохранены в Конфигураторе, но база не обновлена. Расширение хранится в базе отдельно от основной конфигурации, и его нужно обновлять командой F7 именно из окна расширения, а не из окна основной конфигурации.
Частые вопросы
Можно ли заимствовать один документ в несколько расширений?
Нужно ли заимствовать реквизит, чтобы прочитать его в коде расширения?
Можно ли создать в расширении новый документ, а не заимствовать существующий?
Документы нажмите Добавить. Это будет собственный объект расширения, его имя должно начинаться с префикса.Что будет с документами, если отключить расширение?
Как перенести расширение с документом в другую базу?
.cfe командой сохранения в окне Расширения конфигурации. В другой базе загрузите файл командой загрузки в том же окне, затем отдельно обновите конфигурацию базы данных расширения.