При разработке функционала в конфигурациях 1С, таких как 1С:ERP Управление предприятием, разработчики часто стараются выносить любые доработки в расширения конфигурации, чтобы не снимать типовую конфигурацию с поддержки и облегчить последующие обновления. Однако при попытке добавить новый реквизит в типовой заимствованный план видов характеристик (ПВХ) конфигуратор блокирует эту возможность. Разберем причины такого поведения платформы и выясним, как решить задачу хранения дополнительных данных без изменения типовой конфигурации.
Проанализируем архитектурные ограничения механизма расширений конфигурации. В платформе 1С действует строгое правило: добавлять новые реквизиты и табличные части к заимствованным объектам метаданных разрешено только для справочников, документов и планов обмена.
Для заимствованных планов видов характеристик (а также планов счетов и планов видов расчетов) возможность создания собственных реквизитов и табличных частей в расширении платформой не поддерживается. При добавлении типового объекта в расширение нам доступны только следующие действия:
Тип значения характеристик (данная возможность доступна начиная с версии платформы 8.3.20 при соответствующем режиме совместимости).Поскольку добавить реквизит напрямую к заимствованному ПВХ в расширении технически невозможно, рассмотрим альтернативные варианты решения поставленной задачи.
Рассмотрим наиболее надежный и гибкий способ обхода ограничения без изменения основной конфигурации. Мы можем вынести хранение необходимых реквизитов в отдельный регистр сведений, созданный прямо в расширении.
Разберем реализацию этого решения по шагам:
Объект), тип которого указываем как ссылку на заимствованный план видов характеристик: ПланВидовХарактеристикСсылка.... Обязательно устанавливаем флаг Ведущее, чтобы при удалении элемента ПВХ запись в регистре удалялась автоматически.Посмотрим на пример программного кода для чтения и записи данных в обработчиках формы элемента:
&НаСервере
Процедура Расш1_ПриЧтенииНаСервереПосле(ТекущийОбъект)
// Считываем значения из нашего независимого регистра сведений
Отбор = Новый Структура("Объект", ТекущийОбъект.Ссылка);
Значения = РегистрыСведений.Расш1_ДополнительныеРеквизитыПВХ.Получить(Отбор);
РеквизитФормыЗначение = Значения.ИмяПоля;
КонецПроцедуры
&НаСервере
Процедура Расш1_ПослеЗаписиНаСервереПосле(ТекущийОбъект, ПараметрыЗаписи)
// Записываем данные в регистр сведений после сохранения элемента
МенеджерЗаписи = РегистрыСведений.Расш1_ДополнительныеРеквизитыПВХ.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = ТекущийОбъект.Ссылка;
МенеджерЗаписи.ИмяПоля = РеквизитФормыЗначение;
МенеджерЗаписи.Записать(Истина);
КонецПроцедуры
Данный подход позволяет полностью сохранить типовую конфигурацию на замке и обеспечивает беспрепятственное типовое обновление.
Проанализируем типовые возможности конфигурации 1С:ERP Управление предприятием. Если исследуемый план видов характеристик подключен к подсистеме Библиотеки Стандартных Подсистем (БСП) «Свойства», мы можем использовать типовой регистр ДополнительныеСведения.
В этом случае добавление дополнительных полей осуществляется в режиме «1С:Предприятие» через раздел администрирования без внесения изменений в конфигураторе. Программное чтение и запись таких сведений выполняется с помощью вызовов функций общего модуля БСП УправлениеСвойствами.
Если бизнес-логика позволяет не привязываться к типовому объекту метаданных, а требует независимого набора характеристик, оптимальным выходом будет создание абсолютно нового плана видов характеристик непосредственно внутри расширения.
Для собственных объектов расширения платформа не накладывает ограничений: в свой план видов характеристик можно добавлять любые реквизиты, табличные части и формы.
Если по условиям архитектуры реквизит должен быть физически расположен в самом объекте (например, к нему обращаются тяжелые типовые запросы без возможности соединения с внешними таблицами), обойти платформенное ограничение не удастся.
В таком случае потребуется включить возможность изменения основной конфигурации, добавить реквизит непосредственно в план видов характеристик в конфигураторе основной базы и оставить объект на поддержке с сохранением возможности изменений.