Как добавить и отобразить новые реквизиты объекта в расширении формы 1С

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

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

Суть проблемы: почему реквизит «не виден» в форме

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

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

Решение 1: Добавление реквизита «Объект» в расширение

Самый быстрый и эффективный способ решить проблему — это «заимствовать» сам основной реквизит формы. Разберем по шагам, как это сделать:

  1. Откроем редактор заимствованной формы в расширении.
  2. Перейдем на закладку «Реквизиты» (правая верхняя часть редактора формы).
  3. Найдем основной реквизит формы — обычно это «Объект» (он выделен жирным шрифтом).
  4. Нажмем на него правой кнопкой мыши и выберем команду «Добавить в расширение».

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

Решение 2: Принудительное обновление типа данных

Иногда простое добавление в расширение не срабатывает (особенно в старых релизах платформы 8.3.12–8.3.14) или кнопка добавления неактивна. В этом случае рассмотрим альтернативный метод — обновление типа реквизита:

  1. В редакторе формы на закладке «Реквизиты» выделим наш Объект.
  2. В палитре свойств найдем свойство «Тип» и нажмем на кнопку выбора (три точки).
  3. В открывшемся окне выбора типа данных ничего не меняя (тип уже будет выбран правильно), просто нажмем «ОК».

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

Важные технические нюансы работы с данными в расширении

Разберем ситуацию, которая часто пугает начинающих разработчиков: использование команды «Обновить расширение формы». В некоторых случаях после визуальной правки формы платформа может выдать предупреждение: «Форма была изменена в основной конфигурации. Обновить форму?».

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

Также проанализируем аспект хранения данных. Важно понимать, что новые реквизиты, созданные в расширении:

Программное добавление элементов формы как альтернатива

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

Пример кода для добавления поля на форму программно:


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

Используя такой подход, мы минимизируем количество заимствованных визуальных объектов, что существенно облегчает дальнейшую поддержку и обновление конфигурации. В этом случае нам даже не нужно открывать визуальный редактор формы и бороться с отображением реквизитов в дереве данных.

Проверка режима совместимости

Если вы столкнулись с тем, что добавить реквизит в расширение вообще не получается (выдается ошибка), проверим настройки режима совместимости. Возможность добавлять реквизиты объектов в расширения появилась в платформе полноценно, начиная с версии 8.3.11. Рассмотрим необходимые настройки:

  1. Режим совместимости основной конфигурации должен быть не ниже 8.3.11.
  2. Режим совместимости самого расширения должен совпадать с основной конфигурацией или быть выше.
  3. В свойствах расширения должен стоять флаг «Изменяет структуру данных».

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

← На главную