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