Как подключить дополнительные реквизиты для объектов из расширений в БСП

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

При разработке расширений для типовых конфигураций (например, БП 3.0, ERP 2.5 или ЗУП 3.1) часто возникает необходимость предоставить пользователю возможность самостоятельно добавлять поля в документы или справочники, созданные в самом расширении. Стандартный механизм Библиотеки Стандартных Подсистем (БСП) «Дополнительные реквизиты и сведения» отлично справляется с этой задачей, а для более глубокого изучения программного взаимодействия с платформой можно использовать справочник по методам БСП с примерами использования. Однако при работе с объектами расширений программисты часто сталкиваются с тем, что новые объекты не отображаются в дереве настроек или не сохраняют значения.

Рассмотрим подробно, как правильно интегрировать подсистему свойств для объектов расширения, избегая «костылей» и прямого изменения основной конфигурации. Мы разберем шаги от настройки метаданных до написания программного кода в переопределяемых модулях.

Анализ проблемы: почему объект не виден в дереве свойств

Выясним причину, по которой программно созданный набор в справочнике НаборыДополнительныхРеквизитовИСведений может не отображаться в стандартном интерфейсе администрирования. Основная причина кроется в фильтрации. Форма настройки дополнительных реквизитов строит список (дерево) объектов на основании предопределенных типов, которые «заявлены» в системе как поддерживающие свойства. Если ваш документ из расширения не зарегистрирован в реестрах БСП, подсистема просто игнорирует его, считая «чужеродным».

Вопреки распространенному заблуждению, коллекция Метаданные.Документы видит объекты из расширений. Однако БСП использует внутренние кэши и проверки на соответствие определяемым типам. Следовательно, наша задача — «подружить» расширение и механизмы БСП через штатные точки расширения.

Шаг 1. Настройка метаданных в расширении

Проанализируем необходимые изменения в структуре метаданных самого расширения. Для того чтобы объект (например, документ ПР_МойДокумент) мог обладать дополнительными реквизитами, нужно выполнить следующие действия:

  1. Добавим документ в расширение.
  2. Найдем в основной конфигурации определяемый тип ВладелецДополнительныхРеквизитовИСведений и добавим его в наше расширение.
  3. В расширении включим наш новый документ ДокументОбъект.ПР_МойДокумент в состав этого определяемого типа. Это критически важный шаг. Если же вашей задачей является не просто добавление полей, а универсальное добавление табличных частей через расширение, то подход к метаданным будет схожим — для решения подобных задач подойдёт инструмент управления реквизитами и автозаполнения в 1С.
  4. Проверим наличие функциональной опции ИспользоватьДополнительныеРеквизитыИСведения. Она должна быть включена в базе, чтобы механизмы подсистемы работали в принципе.

Шаг 2. Регистрация объекта в переопределяемом модуле

Теперь разберем, как программно сообщить системе о новом объекте. В БСП существует общий модуль УправлениеСвойствамиПереопределяемый. Нам необходимо создать аналогичный модуль в нашем расширении и использовать механизм «После» для процедуры ПриДобавленииОбъектовМетаданныхС_Свойствами.

Посмотрим на пример кода, который необходимо разместить в расширении:


&После("ПриДобавленииОбъектовМетаданныхС_Свойствами")
Процедура ПР_ПриДобавленииОбъектовМетаданныхС_Свойствами(Объекты)
    
    // Добавляем наш документ из расширения в общий список объектов, поддерживающих свойства
    НоваяСтрока = Объекты.Добавить();
    НоваяСтрока.ПолноеИмя = "Документ.ПР_МойДокумент";
    
    // Если нужно, чтобы набор создавался автоматически с определенным именем
    // НоваяСтрока.ИмяНабора = "Документ_ПР_МойДокумент"; 
    
КонецПроцедуры

Этот код позволяет стандартной форме «Дополнительные реквизиты» увидеть ваш документ в общем списке. Теперь пользователь сможет выбрать его в дереве слева и нажать кнопку «Добавить», чтобы создать новые поля.

Шаг 3. Программное создание набора (если требуется автоматизация)

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


Процедура СоздатьНаборРеквизитовДляРасширения()
    
    ИмяНабора = "Документ_ПР_МойДокумент";
    НаборСсылка = Справочники.НаборыДополнительныхРеквизитовИСведений.НайтиПоНаименованию(ИмяНабора);
    
    Если НаборСсылка.Пустая() Тогда
        НаборОбъект = Справочники.НаборыДополнительныхРеквизитовИСведений.СоздатьЭлемент();
        НаборОбъект.Наименование = "Мой документ (из расширения)";
        НаборОбъект.ИмяПредопределенногоНабора = ИмяНабора;
        НаборОбъект.Используется = Истина;
        
        // Важно: для новых версий БСП может потребоваться заполнение владельца или родителя
        // в зависимости от структуры справочника в конкретной конфигурации.
        
        НаборОбъект.Записать();
    КонецЕсли;
    
КонецПроцедуры

Важный момент: если вы создаете набор программно, убедитесь, что ИмяПредопределенногоНабора совпадает с тем, что ожидает система (обычно это ТипОбъекта_ИмяОбъекта).

Шаг 4. Вывод дополнительных реквизитов на форму документа

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

  1. ПриСозданииНаСервере: инициализируем подсистему и динамически создаем элементы формы для доп. реквизитов.
  2. ПриЧтенииНаСервере: заполняем значения реквизитов из базы данных.
  3. ПередЗаписьюНаСервере: переносим измененные на форме значения обратно в объект для сохранения.

Рассмотрим пример реализации в модуле формы документа:


&НаСервере
Процедура ПР_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Подготавливаем параметры для отрисовки свойств
    ПараметрыСвойств = УправлениеСвойствами.ПараметрыРедактированияСвойств();
    ПараметрыСвойств.ИмяГруппыДляРазмещения = "ГруппаДополнительныеРеквизиты"; // Имя группы на вашей форме
    
    УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма, ПараметрыСвойств);
    
КонецПроцедуры

&НаСервере
Процедура ПР_ПриЧтенииНаСервереПосле(ТекущийОбъект)
    
    УправлениеСвойствами.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
    
КонецПроцедуры

&НаСервере
Процедура ПР_ПередЗаписьюНаСервереПосле(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект);
    
КонецПроцедуры

Особенности работы с метаданными в расширениях

Проанализируем ситуацию, описанную в обсуждении: «Метаданные видят только основную конфигурацию». Это часто происходит, когда разработчик обращается к закэшированным данным БСП. Если вам необходимо отслеживать историю изменений этих реквизитов, рекомендуем выполнить переход на механизм версионирования объектов БСП, который корректно работает с доп. сведениями. Для отладки структуры метаданных и быстрого поиска ошибок пригодится инструментарий разработчика для редактирования объектов 1С.

Если вы используете БСП версии 3.1.9 и выше, помните, что система активно использует справочник ИдентификаторыОбъектовМетаданных. Для объектов расширения существуют свои идентификаторы в справочнике ИдентификаторыОбъектовРасширений. Если ваш документ не попал в этот справочник, то УправлениеСвойствами не сможет сопоставить форму с набором реквизитов.

Выясним еще один нюанс: при программном создании элементов в расширении старайтесь использовать префиксы. Это поможет избежать конфликтов имен. А для вывода данных в печатные формы можно использовать заполнение Word-макетов при помощи БСП за 3 шага, что значительно упростит формирование документов для пользователя.

Резюме решения

Подведем итог нашей совместной работы. Чтобы дополнительные реквизиты полноценно заработали для объекта из расширения (в этом поможет управление логикой заполнения и обязательности реквизитов), мы должны:

Использование этих штатных механизмов позволяет сохранить конфигурацию на поддержке и гарантирует стабильную работу при обновлениях 1С.

← На главную