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