Как вывести реквизит, добавленный в расширении, на форму элемента без заимствования лишних объектов?

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

При разработке в расширениях 1С программисты часто сталкиваются с дилеммой: как вывести новый реквизит объекта на существующую форму так, чтобы расширение оставалось «чистым» и легко обновляемым. Стандартный визуальный метод (перетаскивание мышкой) часто требует заимствования реквизита Объект, что в свою очередь тянет за собой огромное количество связанных метаданных. Рассмотрим детально, как решить эту задачу максимально эффективно.

Проблема избыточного заимствования метаданных

Когда мы захватываем форму в расширение и хотим добавить на нее новый реквизит справочника, мы обнаруживаем, что основной реквизит формы Объект (имеющий тип СправочникОбъект) отображается серым цветом. Он недоступен для редактирования, пока мы его не заимствуем. Однако, как только мы нажимаем «Добавить в расширение» для реквизита Объект, платформа начинает подтягивать в расширение все типы данных, которые используются в этом объекте: другие справочники, перечисления, документы. Это приводит к тому, что расширение раздувается, становится зависимым от изменений в основной конфигурации и усложняет процесс обновления. Наша задача — вывести данные, сохранив независимость расширения.

Способ 1: Программное создание элементов формы

Проанализируем наиболее гибкий и профессиональный подход — программное добавление элементов управления в процедуре ПриСозданииНаСервере. Этот метод позволяет нам не заимствовать реквизит Объект в расширении, при этом реквизит, добавленный нами в расширении к самому справочнику, будет доступен через ПутьКДанным.

Рассмотрим пример кода, который необходимо разместить в модуле заимствованной формы:


&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Определим место, куда мы хотим вставить наш реквизит
    // Например, рядом с полем "Наименование"
    ЭлементРодитель = Элементы.ГруппаШапка; 
    ЭлементПеред = Элементы.Наименование;
    
    // Вставляем новый элемент формы
    НовыйЭлемент = Элементы.Вставить("Расш1_ВиртуальныйСклад", Тип("ПолеФормы"), ЭлементРодитель, ЭлементПеред);
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
    
    // Указываем путь к данным. Несмотря на то, что Объект не заимствован,
    // платформа увидит расширенный реквизит в структуре данных.
    НовыйЭлемент.ПутьКДанным = "Объект.Расш1_Виртуальный";
    
КонецПроцедуры

Преимущества этого метода:

  1. Минимум объектов в расширении (только форма и сам новый реквизит в справочнике).
  2. Отсутствие конфликтов при обновлении типовой конфигурации.
  3. Высокая скорость работы платформы при компиляции расширения.

Способ 2: Использование прокси-реквизитов формы

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

Разберем, как связать этот реквизит с реальными данными объекта. Нам потребуется синхронизация в двух точках:

1. Заполнение при открытии:


&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереСинхронизация(Отказ, СтандартнаяОбработка)
    // Копируем значение из объекта в реквизит формы
    ЭтаФорма.РеквизитФормыВиртуальный = Объект.Расш1_Виртуальный;
КонецПроцедуры

2. Сохранение при записи:

Важный нюанс: при записи на сервере в управляемых формах нужно работать с ТекущийОбъект, а не напрямую с Объект, так как именно ТекущийОбъект попадает в базу данных.


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

Этот способ дает ту самую «наглядность», о которой часто просят разработчики, но требует написания кода для синхронизации и дублирования реквизитов.

Способ 3: Модификация через механизмы БСП (без захвата формы)

Выясним, как сделать доработку еще более «чистой», если ваша конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП). В современных типовых решениях (ERP, УТ 11, КА) существует общий модуль МодификацияКонфигурацииПереопределяемый. Мы можем заимствовать только его.

Проанализируем алгоритм действий:

  1. Захватываем в расширение справочник и добавляем реквизит Расш1_Виртуальный.
  2. Захватываем общий модуль МодификацияКонфигурацииПереопределяемый.
  3. В процедуре ПриСозданииНаСервере прописываем условие на тип формы.

Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка)
    Если Форма.ИмяФормы = "Справочник.Склады.Форма.ФормаЭлемента" Тогда
        // Здесь мы пишем тот же программный код добавления элементов, 
        // что и в первом способе.
        НовыйЭлемент = Форма.Элементы.Вставить(...);
    КонецЕсли;
КонецПроцедуры

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

Рекомендации по работе с платформой 8.3.15 и выше

Начиная с версии платформы 8.3.15, механизм связи элементов с данными расширения стал стабильнее. Если вы используете программное создание (Способ 1), убедитесь, что в свойствах расширения установлен тип «Адаптация» или «Дополнение».

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

Подводя итог, можно сказать: для разовых и простых задач идеально подходит программное добавление через ПутьКДанным. Для сложных интерфейсных решений, где важен визуальный контроль в конфигураторе, используйте прокси-реквизиты формы с ручной синхронизацией в событиях записи.

← На главную