Как создать в расширении 1С новый справочник или документ и дополнить чужие объекты реквизитами

· 9 мин

Содержание

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

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

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

В дереве расширения встречаются объекты двух видов.

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

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

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

Подготовьте перед работой три вещи:

  • 🧩 расширение, созданное в Конфигураторе (меню Конфигурация → Расширения конфигурации);
  • 🏷 короткий префикс для всех своих имён, например Расш1_. Он защищает от конфликта, если в будущем релизе типовой конфигурации появится объект с таким же именем;
  • 🔑 возможность открыть расширение на редактирование в том же окне Конфигуратора, где открыта основная конфигурация.

Префикс стоит ставить и на реквизиты, добавленные к типовым объектам. В списках, отборах и запросах сразу видно, где родное, а где ваше.

Добавление новых реквизитов к существующему объекту

Это самый частый сценарий: в справочнике «Контрагенты» нужно поле «Менеджер по претензиям», а в документе реализации — «Номер заказа на сайте».

Шаг 1. Заимствуйте объект

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

Шаг 2. Добавьте реквизит

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

Для каждого нового реквизита задайте:

  1. Имя с префиксом, например Расш1_МенеджерПретензий.
  2. Тип. Можно выбрать примитивный тип, ссылку на типовой справочник или на объект самого расширения.
  3. Нужные свойства: проверку заполнения, отбор по выбору, историю изменений.

Шаг 3. Табличные части и реквизиты внутри них

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

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

Шаг 4. Выведите реквизит на форму

Здесь начинающие чаще всего думают, что всё сломалось: реквизит добавлен, а в справочнике его нет. Дело в том, что на заимствованную форму новый реквизит автоматически не попадает.

  1. Заимствуйте форму элемента (или списка) в расширение.
  2. Откройте её, в панели реквизитов раскройте раздел Объект.
  3. Перетащите свой реквизит в нужное место на форме.
  4. Если реквизит нужен в списке, добавьте колонку в форму списка так же.

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

Создание нового объекта метаданных с нуля

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

Что важно сделать сразу:

  • дать имя с префиксом и понятный синоним для пользователя;
  • настроить права, иначе никто, кроме администратора, объект не увидит. Включите объект в нужные роли расширения;
  • добавить объект в подсистему. Если в расширении нет своей подсистемы, объект не появится в командном интерфейсе. Создайте подсистему расширения или добавьте команду в заимствованную типовую подсистему;
  • сразу создать формы: платформа сгенерирует их автоматически, но с минимальным набором полей.

Своими объектами можно пользоваться из реквизитов заимствованных. Например, новый справочник Расш1_ПричиныПретензий легко подставить типом в реквизит заимствованного справочника контрагентов.

Выбирайте метод по задаче:

ЗадачаЧто добавлять
Одно-два поля у существующей сущностиРеквизиты к заимствованному объекту
Своя классификация, список причин, статусовНовый справочник или перечисление
Свой учётный документ с проведениемНовый документ и регистр
Нужен простой отчёт или обработкаОтдельный объект расширения без заимствования

Перечисления подходят для фиксированных вариантов, справочники для списков, которые пользователь пополняет сам.

Объекты и реквизиты расширения хранят данные в базе. Если вы удалите расширение, эти данные пропадут вместе с ним. Перед удалением или заменой расширения сделайте выгрузку информационной базы.

Формы и интерфейс для добавленных реквизитов

Кроме перетаскивания реквизита, в форме обычно нужно:

  • 🎛 задать условное оформление или доступность через свойства элемента, если поле нужно показывать не всем;
  • 🧮 добавить команду на форму, если над реквизитом выполняется действие;
  • 📋 подключить поле к печатной форме: для этого расширение дополняет макет и модуль печати, об этом отдельная тема;
  • 🔎 включить реквизит в поиск и отбор, отметив нужные свойства.

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

События, обработчики и модули новых объектов

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

АннотацияКогда выполняется оригинальная процедура
&ПередСначала ваш код, затем оригинал
&ПослеСначала оригинал, затем ваш код
&ВместоВыполняется только ваш код, оригинал вызывается из него по желанию
&ИзменениеИКонтрольКопия кода оригинала, в которой отмечены вставки и удаления

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

&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Элементы.Расш1_МенеджерПретензий.Видимость =
        РольДоступна("Расш1_РедактированиеПретензий");
КонецПроцедуры

А так проверяют заполнение нового реквизита перед записью элемента, используя модуль объекта:

&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
    Если ЭтотОбъект.Расш1_ПричинаПретензии.Пустая() Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Заполните причину претензии";
        Сообщение.Сообщить();
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Три практических замечания:

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

Сквозной пример: претензии по контрагентам

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

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

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

Как проверить результат перед выкладкой на рабочую базу

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

  • 📂 откройте карточку объекта и убедитесь, что реквизит виден, а выбор из справочника работает;
  • 💾 запишите элемент с пустым и заполненным значением, проверьте срабатывание вашего обработчика;
  • 👤 зайдите под пользователем без особых прав и проверьте, что скрытые поля действительно скрыты;
  • 🖨 откройте списки и отчёты, где участвует объект: новые реквизиты не должны ломать типовые отборы;
  • 🔁 загрузите в копию свежий релиз конфигурации, если он есть, и откройте расширение: Конфигуратор покажет заимствованные объекты, которые изменились в оригинале.

Применение расширения и типичные препятствия

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

Что чаще всего идёт не так:

  • 🔸 Реквизит не виден на форме. Форма не заимствована, или поле не перетащено на неё. См. шаг 4.
  • 🔸 Объекта нет в интерфейсе. Не добавлен в подсистему или нет прав в роли.
  • 🔸 Нельзя выбрать нужный тип. Тип зависит от объекта, которого в расширении нет. Заимствуйте его.
  • 🔸 Нельзя удалить или изменить родной реквизит. Это ограничение заимствованных объектов, обходится только своим реквизитом.
  • 🔸 После обновления типовой конфигурации расширение ругается. Оригинальная процедура, которую вы перехватывали, изменилась. Откройте расширение и проверьте, какие заимствованные объекты платформа помечает как требующие внимания, затем поправьте код перехвата.

Если перехват через &ИзменениеИКонтроль перестал совпадать с новым оригиналом, лучше перенести правку на &Перед или &После: они не зависят от строк оригинального кода.

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

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