Как добавить дополнительные реквизиты к справочнику в расширении конфигурации 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Шаг 1. Анализ проблемы и стандартного механизма

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

  1. На уровне конфигуратора: При попытке создать в справочнике табличную часть ДополнительныеРеквизиты по аналогии с типовыми объектами, мы не можем указать для реквизита Значение тип Характеристика.ДополнительныеРеквизитыИСведения. Этот тип просто отсутствует в палитре свойств.
  2. На уровне пользователя: Даже если бы удалось создать нужную структуру, наш справочник не отображается в форме Наборы дополнительных реквизитов и сведений, что не позволяет пользователям управлять реквизитами.

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

Шаг 2. Заимствование необходимых объектов в расширение

Механизм дополнительных реквизитов основан на Плане видов характеристик (ПВХ) ДополнительныеРеквизитыИСведения. Именно он определяет, какие свойства могут быть у объектов, и хранит их. Чтобы наше расширение "узнало" об этом механизме, первым делом необходимо заимствовать сам ПВХ.

Для этого в дереве конфигурации расширения найдите узел "Планы видов характеристик", нажмите "Добавить" и выберите из списка основной конфигурации ДополнительныеРеквизитыИСведения. После этого в расширении появится ссылка на этот объект.

Важный момент: само по себе это действие решит только часть проблемы. У вас появится возможность указать тип ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения для реквизита Свойство в табличной части. Однако производный от него тип Характеристика.ДополнительныеРеквизитыИСведения, необходимый для реквизита Значение, так и не появится.

Шаг 3. Изменение режима совместимости расширения — ключевое решение

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

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

  1. Откройте свойства вашего расширения (правой кнопкой мыши на корневом узле расширения -> "Свойства").
  2. Найдите свойство "Режим совместимости". По умолчанию оно может стоять в значении, соответствующем версии основной конфигурации.
  3. Измените это значение на "Не использовать".

После применения этого изменения и обновления конфигурации базы данных, в палитре типов станет доступен тип Характеристика.ДополнительныеРеквизитыИСведения. Теперь вы можете правильно настроить реквизиты табличной части.

Создайте в своем справочнике табличную часть, например, с именем ДополнительныеРеквизиты, и добавьте в нее два реквизита:

Шаг 4. Регистрация справочника в подсистеме "Свойства"

Теперь, когда структура объекта метаданных готова, нужно "сообщить" подсистеме БСП, что наш новый справочник тоже может иметь дополнительные реквизиты. Это делается программно, так как подсистема хранит список "владельцев" свойств в справочнике НаборыСвойствОбъектов.

Для этого нужно вызвать процедуру из общего модуля УправлениеСвойствамиСлужебный. Лучше всего это сделать один раз при обновлении или запуске системы.

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


// Процедуру нужно разместить в общем модуле расширения
// с установленными флагами "Сервер", "Внешнее соединение", "Вызов сервера" и "Привилегированный"
Процедура СоздатьНаборСвойствДляСправочникаРасширения() Экспорт

    // Указываем полное имя нашего справочника, созданного в расширении
    ИмяОбъекта = "Справочник.МойСправочникВРасширении";
    
    // Проверяем, существует ли уже набор свойств для нашего объекта, чтобы не создавать дубли
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    НаборыСвойствОбъектов.Ссылка
        |ИЗ
        |    Справочник.НаборыСвойствОбъектов КАК НаборыСвойствОбъектов
        |ГДЕ
        |    НаборыСвойствОбъектов.ИмяОбъекта = &ИмяОбъекта";
    
    Запрос.УстановитьПараметр("ИмяОбъекта", ИмяОбъекта);
    
    Результат = Запрос.Выполнить();
    
    Если Результат.Пустой() Тогда
        // Если набора нет, вызываем процедуру БСП для его создания
        УправлениеСвойствамиСлужебный.СоздатьНаборСвойств(ИмяОбъекта);
        // Можно также использовать УправлениеСвойствамиСлужебный.СоздатьПредопределенныеНаборыСвойств(),
        // которая проходит по метаданным и создает наборы для тех, у кого их нет.
        // Но точечное создание надежнее.
    КонецЕсли;

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

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

Шаг 5. Отображение реквизитов на форме элемента

Последний шаг — вывести добавленные пользователем реквизиты на форму элемента вашего справочника. Это также делается с помощью стандартных процедур БСП.

  1. Откройте форму элемента вашего справочника в расширении.
  2. Добавьте на форму новую группу, например, с именем ГруппаДополнительныеРеквизиты. Именно в нее БСП будет программно добавлять элементы управления.
  3. Перейдите в модуль формы и создайте обработчик события ПриСозданииНаСервере.
  4. В этом обработчике вызовите процедуру УправлениеСвойствами.ПриСозданииНаСервере.

Пример кода для модуля формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Вызываем типовую процедуру БСП, передавая в нее форму и основной реквизит (Объект)
    УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, Объект);

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

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

Итог

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

  1. Заимствовать ПВХ ДополнительныеРеквизитыИСведения в расширение.
  2. Установить режим совместимости расширения в значение "Не использовать", чтобы получить доступ к типу Характеристика.
  3. Создать в справочнике табличную часть с реквизитами Свойство и Значение правильных типов.
  4. Программно создать набор свойств для нового справочника через вызов процедур БСП.
  5. Вызвать процедуру инициализации дополнительных реквизитов на форме элемента справочника.

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

← На главную