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