Как создать в расширении 1С новый справочник или документ и дополнить чужие объекты реквизитами
Содержание
Частое заблуждение: «чтобы добавить реквизит в типовой справочник, нужно снять конфигурацию с поддержки». Не нужно. Реквизит, табличную часть или целый новый объект можно положить в расширение, и типовая конфигурация останется на поддержке с обычным обновлением.
Для этого есть две разные операции. Новый объект расширение создаёт целиком. Существующий типовой объект его нужно сначала заимствовать, и только потом дополнять реквизитами, табличными частями, формами и командами. Ниже обе операции по порядку, с ограничениями, на которых спотыкаются чаще всего.
Как устроены объекты в расширении: свои и заимствованные
В дереве расширения встречаются объекты двух видов.
| Вид объекта | Откуда | Что можно менять |
|---|---|---|
| Собственный | Создан в расширении с нуля | Всё: состав реквизитов, типы, формы, модули, права |
| Заимствованный | Взят из основной конфигурации | Только добавлять своё и перехватывать поведение |
У заимствованного объекта в расширении хранится только «след»: ссылка на оригинал плюс ваши добавления. Поэтому его родные реквизиты нельзя удалить и нельзя поменять им тип. Свойства оригинала расширение может лишь переопределить там, где платформа это разрешает, и такие свойства помечены отдельно.
Из этого следует главное правило: то, что есть в типовой конфигурации, расширение не ломает, а надстраивает. Если вам нужно изменить родной реквизит (например, сделать другим его тип), расширение тут не поможет. Придётся искать обходной путь: добавить свой реквизит и вести данные в нём.
Подготовьте перед работой три вещи:
- 🧩 расширение, созданное в Конфигураторе (меню
Конфигурация → Расширения конфигурации); - 🏷 короткий префикс для всех своих имён, например
Расш1_. Он защищает от конфликта, если в будущем релизе типовой конфигурации появится объект с таким же именем; - 🔑 возможность открыть расширение на редактирование в том же окне Конфигуратора, где открыта основная конфигурация.
Префикс стоит ставить и на реквизиты, добавленные к типовым объектам. В списках, отборах и запросах сразу видно, где родное, а где ваше.
Добавление новых реквизитов к существующему объекту
Это самый частый сценарий: в справочнике «Контрагенты» нужно поле «Менеджер по претензиям», а в документе реализации — «Номер заказа на сайте».
Шаг 1. Заимствуйте объект
В дереве основной конфигурации найдите нужный объект, вызовите контекстное меню и выберите заимствование в расширение. Объект появится в дереве расширения. Платформа заодно заимствует то, без чего он не работает : например, типы, на которые он ссылается.
Шаг 2. Добавьте реквизит
Откройте заимствованный объект в расширении (двойной щелчок), перейдите на закладку Данные и добавьте реквизит как обычно. Реквизиты оригинала там тоже видны, но они недоступны для удаления.
Для каждого нового реквизита задайте:
- Имя с префиксом, например
Расш1_МенеджерПретензий. - Тип. Можно выбрать примитивный тип, ссылку на типовой справочник или на объект самого расширения.
- Нужные свойства: проверку заполнения, отбор по выбору, историю изменений.
Шаг 3. Табличные части и реквизиты внутри них
К заимствованному объекту допускается добавить собственную табличную часть. Так же можно добавить реквизит в табличную часть, которая пришла из оригинала: родные колонки останутся, ваша дополнит их.
Составной тип реквизита задаётся там же, в палитре типов: отметьте несколько типов или целую группу. Чем шире набор, тем сложнее потом работать с запросами к этому полю, поэтому составные типы берите только там, где действительно нужны разные ссылки.
Шаг 4. Выведите реквизит на форму
Здесь начинающие чаще всего думают, что всё сломалось: реквизит добавлен, а в справочнике его нет. Дело в том, что на заимствованную форму новый реквизит автоматически не попадает.
- Заимствуйте форму элемента (или списка) в расширение.
- Откройте её, в панели реквизитов раскройте раздел
Объект. - Перетащите свой реквизит в нужное место на форме.
- Если реквизит нужен в списке, добавьте колонку в форму списка так же.
В заимствованной форме нельзя удалить родной элемент, но его можно скрыть: снимите видимость в свойствах элемента.
Создание нового объекта метаданных с нуля
Новый справочник, документ, регистр или перечисление создаются в расширении тем же способом, что и в обычной конфигурации: Добавить в контекстном меню нужной ветки.
Что важно сделать сразу:
- дать имя с префиксом и понятный синоним для пользователя;
- настроить права, иначе никто, кроме администратора, объект не увидит. Включите объект в нужные роли расширения;
- добавить объект в подсистему. Если в расширении нет своей подсистемы, объект не появится в командном интерфейсе. Создайте подсистему расширения или добавьте команду в заимствованную типовую подсистему;
- сразу создать формы: платформа сгенерирует их автоматически, но с минимальным набором полей.
Своими объектами можно пользоваться из реквизитов заимствованных. Например, новый справочник Расш1_ПричиныПретензий легко подставить типом в реквизит заимствованного справочника контрагентов.
Выбирайте метод по задаче:
| Задача | Что добавлять |
|---|---|
| Одно-два поля у существующей сущности | Реквизиты к заимствованному объекту |
| Своя классификация, список причин, статусов | Новый справочник или перечисление |
| Свой учётный документ с проведением | Новый документ и регистр |
| Нужен простой отчёт или обработка | Отдельный объект расширения без заимствования |
Перечисления подходят для фиксированных вариантов, справочники для списков, которые пользователь пополняет сам.
Объекты и реквизиты расширения хранят данные в базе. Если вы удалите расширение, эти данные пропадут вместе с ним. Перед удалением или заменой расширения сделайте выгрузку информационной базы.
Формы и интерфейс для добавленных реквизитов
Кроме перетаскивания реквизита, в форме обычно нужно:
- 🎛 задать условное оформление или доступность через свойства элемента, если поле нужно показывать не всем;
- 🧮 добавить команду на форму, если над реквизитом выполняется действие;
- 📋 подключить поле к печатной форме: для этого расширение дополняет макет и модуль печати, об этом отдельная тема;
- 🔎 включить реквизит в поиск и отбор, отметив нужные свойства.
Видимость элемента формы часто завязана на данные. Тогда её управление пишут в обработчике, о котором речь пойдёт ниже.
События, обработчики и модули новых объектов
Для собственных объектов модули пишутся как обычно. Для заимствованных используется перехват: в модуле расширения вы пишете процедуру с аннотацией, и платформа вызывает её до, после или вместо оригинала.
| Аннотация | Когда выполняется оригинальная процедура |
|---|---|
&Перед | Сначала ваш код, затем оригинал |
&После | Сначала оригинал, затем ваш код |
&Вместо | Выполняется только ваш код, оригинал вызывается из него по желанию |
&ИзменениеИКонтроль | Копия кода оригинала, в которой отмечены вставки и удаления |
Пример: после создания формы заимствованного справочника скрыть поле для пользователей без нужной роли.
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Расш1_МенеджерПретензий.Видимость =
РольДоступна("Расш1_РедактированиеПретензий");
КонецПроцедуры
А так проверяют заполнение нового реквизита перед записью элемента, используя модуль объекта:
&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
Если ЭтотОбъект.Расш1_ПричинаПретензии.Пустая() Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Заполните причину претензии";
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Три практических замечания:
- Имя перехватывающей процедуры может быть любым, а в аннотации стоит имя оригинала. Префикс в имени процедуры избавляет от случайного совпадения.
- Если нужно реагировать на запись любого объекта определённого типа, добавьте в расширение подписку на событие. Обработчик подписки лежит в общем модуле расширения.
&Вместоотключает логику оригинала, пока вы сами её не вызовете. Для обычных дополнений хватает&Переди&После, они менее рискованны при обновлении типовой конфигурации.
&Перед("ПередЗаписью") или подписку на событие.Сквозной пример: претензии по контрагентам
Задача: в карточке контрагента хранить менеджера по претензиям и причину последней претензии, причём причины выбирать из списка.
- В расширении создаём справочник
Расш1_ПричиныПретензийс одним реквизитомОписаниеи формой списка. - Заимствуем справочник контрагентов вместе с формой элемента.
- Добавляем два реквизита:
Расш1_МенеджерПретензий(ссылка на справочник пользователей ) иРасш1_ПричинаПретензии(ссылка на наш новый справочник). - На форме элемента создаём группу «Претензии» и переносим в неё оба реквизита.
- Создаём роль
Расш1_РедактированиеПретензий, даём ей право просмотра и редактирования новых реквизитов и права на справочник причин. - Добавляем в модуль объекта проверку из примера выше и обновляем конфигурацию базы данных.
Получилось пять новых элементов в расширении, ни одной правки в типовом коде. Через год, когда выйдет новый релиз конфигурации, обновление поставится стандартным путём, а расширение придётся лишь проверить на совместимость.
Как проверить результат перед выкладкой на рабочую базу
Расширение лучше сначала прогнать в копии базы. Порядок проверки короткий:
- 📂 откройте карточку объекта и убедитесь, что реквизит виден, а выбор из справочника работает;
- 💾 запишите элемент с пустым и заполненным значением, проверьте срабатывание вашего обработчика;
- 👤 зайдите под пользователем без особых прав и проверьте, что скрытые поля действительно скрыты;
- 🖨 откройте списки и отчёты, где участвует объект: новые реквизиты не должны ломать типовые отборы;
- 🔁 загрузите в копию свежий релиз конфигурации, если он есть, и откройте расширение: Конфигуратор покажет заимствованные объекты, которые изменились в оригинале.
Применение расширения и типичные препятствия
После правок расширение нужно применить к базе. В Конфигураторе это обновление конфигурации
базы данных (по умолчанию клавиша F7): для изменений структуры, то есть новых реквизитов и объектов, платформа перестраивает таблицы. Делайте это в удобное время, когда пользователи не работают: структуру базы приходится обновлять в монопольном режиме.
Что чаще всего идёт не так:
- 🔸 Реквизит не виден на форме. Форма не заимствована, или поле не перетащено на неё. См. шаг 4.
- 🔸 Объекта нет в интерфейсе. Не добавлен в подсистему или нет прав в роли.
- 🔸 Нельзя выбрать нужный тип. Тип зависит от объекта, которого в расширении нет. Заимствуйте его.
- 🔸 Нельзя удалить или изменить родной реквизит. Это ограничение заимствованных объектов, обходится только своим реквизитом.
- 🔸 После обновления типовой конфигурации расширение ругается. Оригинальная процедура, которую вы перехватывали, изменилась. Откройте расширение и проверьте, какие заимствованные объекты платформа помечает как требующие внимания, затем поправьте код перехвата.
Если перехват через &ИзменениеИКонтроль перестал совпадать с новым оригиналом, лучше перенести правку на &Перед или &После: они не зависят от строк оригинального кода.